前言

  • 该项目是对先前手势识别控制音乐播放器项目的进一步完善并在Edgeboard上进行部署,主体思路是通过摄像头实时读取手势信息,再调用自训练的手势识别模型(paddlex yolov3模型)通过edgeboard fz3计算卡进行计算得出手势对应的操作信息,最后操控音乐播放器。

  • 本项目前期模型训练见:做个手势,让音乐播放器言听计从?

一、项目效果展示

Edgeboard部署演示

前半部分的是手势图片在Edgeboard上的预测

后半部分是通过摄像头在Edgeboard上预测(本人对着摄像头做手势)

本地补充演示

由于Edgeboard上连接音响发不了声音(解决了的好兄弟麻烦教教我),而我这个项目又比较依赖音响,所以选择在本地进行了补充的部署,来补充展示模型预测效果。

二、开发环境

(1)硬件

  • EdgeBoard Lite FZ3A
  • 笔记本电脑
  • 串口转USB数据线
  • 1080P摄像头

(2)软件环境

EdgeBoard
  1. Ubuntu18.04
  2. Edgeboard软核1.8.1版本
  3. Python3.6.9
笔记本电脑
  1. win10
  2. Python3.8.0

三、部署流程和原理剖析

部署流程

原理剖析

通过摄像头实时读取手势信息,再调用自训练的手势识别模型(paddlex yolov3模型)通过edgeboard fz3计算卡进行计算得出手势对应的操作信息,最后操控音乐播放器。

四、核心文件及部分代码展示

Edgeboard部署部分

使用MobaXterm连接Edgeboard(默认密码为root)

运用cd指令进入/root/workspace/PaddleLiteDemo/res/models/detection/yolov3路径,并用ls指令查看目录下的文件如下

替换 /root/workspace/PaddleLiteDemo/res/models/detection/yolov3/路径下的_model_ params label.txt文件

设置好config.json

配置/root/workspace/PaddleLiteDemo/Python/路径下的detection.py

找到对应的image.json文件进行图片路径的配置

设置好测试图片的路径

然后在Edgeboard下运行以下代码,便可实现图片预测以及摄像头读取图片预测,预测展示见上文结果演示


五、本地部署的python程序代码以及模型文件已上传到文档中,有兴趣的同学可自行下载,此处摘选核心代码进行展示

import time
import pygame
import numpy as np
import cv2
import paddlex as pdx
import os
import time
import paddlehub as hub

def playMusic(path):

    pygame.mixer.music.load(path)
    pygame.mixer.music.play()

def pauseMusic():
    pygame.mixer.music.pause()

def unpauseMusic():
    pygame.mixer.music.unpause()

def stopMusic():
    pygame.mixer.music.stop()


def nextMusic(musciList,index):
    if index>=len(musciList)-1:
        print("已经是最后一曲了")
        index=0
        return index
    else:
        index += 1
    playMusic(musicList[index])
    return index

def perMusic(musicList,index):
    if index <= 0:
        print("已经是第一首了")
        return index
    else:
        index -= 1
    playMusic(musicList[index])
    return index

def addVome(volume):
    print("当前音量值%f"%volume)
    if round(volume,1)>=1.0:
        print("已经是最大音量了")
    else:
        volume += 0.1
    pygame.mixer.music.set_volume(volume)
    return volume

def subVome(volume):
    if round(volume,1)<=0:
        print("已经是最小音量了")
    else:
        volume -= 0.1
    pygame.mixer.music.set_volume(volume)
    print("当前音量值%f" % volume)
    return volume

def __init__(self,path,index=0,volum=0.5):
        pathList = []
        fileList = os.listdir(path)
        for filename in fileList:
            pathList.append(os.path.join(path,filename))
        self.pathList = pathList
        self.index = index
        self.volum = volum
def gtcontrol(musicList,index):
    model = pdx.load_model("E:\code (1)\demo\inference_model2")
    volume2=0.5
    countgo=0
    countpause=0
    countvoicedown=0
    countvoiceup=0
    countmodel2=0
    countnext=0
    while (True):
        ret, frame = cap.read()
        new_img = video_mirror_output(frame)
        cv2.imshow('frame', new_img)
        result = model.predict(new_img)
        for dt in np.array(result):
            cname, bbox, score = dt['category'], dt['bbox'], dt['score']
            if score < 0.5:
                continue

            if (str(cname) == "go"):
                countgo=countgo+1
                if countgo==2:
                    countgo = 0
                    countpause = 0
                    countvoicedown = 0
                    countmodel2 = 0
                    countnext = 0
                    print(cname)
                    playMusic(musicList[index])

            if (str(cname) == "pause"):
                countpause = countpause + 1
                if countpause == 2:
                    countgo = 0
                    countpause = 0
                    countvoicedown = 0
                    countmodel2 = 0
                    countnext = 0
                    print(cname)
                    pauseMusic()
            if (str(cname) == "voicedown"):
                countvoicedown = countvoicedown + 1
                if countvoicedown == 1:
                    countgo = 0
                    countpause = 0
                    countvoicedown = 0
                    countmodel2 = 0
                    countnext = 0
                    print("减少音量")
                    print(cname)
                    volume2 = subVome(volume2)

            if (str(cname) == "voiceup"):
                print("添加音量")
                print(cname)
                volume2 = addVome(volume2)

            if (str(cname) == "model2"):
                countmodel2=countmodel2+1
                if countmodel2==3:
                    countgo = 0
                    countpause = 0
                    countvoicedown = 0
                    countmodel2 = 0
                    countnext = 0
                    print(cname)
                    print("点歌")
                    model2()

            if (str(cname) == "next"):
                countnext=countnext+1
                if countnext==3:
                    countgo = 0
                    countpause = 0
                    countvoicedown = 0
                    countmodel2 = 0
                    countnext = 0
                    print(cname)
                    print("下一首")
                    index=nextMusic(musicList,index)

        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按q键退出
            break


    cap.release()

                    index=nextMusic(musicList,index)

        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按q键退出
            break


    cap.release()
    cv2.destroyAllWindows()

六、参考链接

七、个人简介

作者:萧泽锋

嘉应学院 2018级 本科生

感兴趣方向:计算机视觉、深度学习

我在AI Studio上获得白银等级,来互关呀~

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐