资源:
配置工程:Python&Qt——yolov5手势识别隔空操纵车载音乐播放器(点击查看)
工程资源:YOLOv5 & Qt 手势车载中控音乐播放器v2(点此下载)
老工程资源:YOLO+datasets_labelImg手势识别(点此下载)
老工程资源:YOLOv5+datasets_labelImg_Hands_identify(点此下载)
效果
V2:
YOLOv5 & Qt 手势车载中控音乐播放器V2
V1:
V1版本
作品内容简介:
这当前车载中控大部分采用实体或虚拟按键实现操控,此类基于二维平面的人机交互方式存在许多不便,且语音识别的识别率堪忧。为解决中控台操纵困难的痛点,本作品基于YOLOv5神经网络训练和Qt开发框架,实现通过手势操控车载中控的音乐播放器,使用户摆脱功能按键束缚,无需发声进行语音控制,就能进行歌曲播放和切换控制,音量控制,歌词展示以及雨刷器的控制。
通过机器学习,上位机手势识别部分共可识别7种手势,并可进行离线识别。下位机音乐播放器部分除可手势控制的功能外,还具有其他拓展功能,程序整体内存占用小,兼容Windows系统和树莓派3B+中的Linux系统。
作品安装说明
- Intel® Core™ i7-8750H CPU @ 2.20GHz 2.21GHz,采用主机集显而非独显进行手势识别
设计思路
1. 上位机实现手势识别
YOLO是You Only Look
Once的缩写。这也是为了特别突出YOLO区别于两阶段算法的特点。基于回归方法整张图片信息进行预测,且不用复杂的框架。相较滑窗式的检测框架,基于局部图片信息进行推理更加完善。YOLO学到的图片特征也更为通用。而YOLOv5在模型的快速部署上更具有极强优势。
本次上位机模块就基于YOLOv5神经网络并训练出模型进行识别,按照配置训练模型yaml,定义特征标签,卷积神经网络训练,离线训练集实时识别的顺序进行,最终完成手势识别功能模块设计与实现。
- 1.1配置训练模型yaml
通过用.yaml文件来配置训练模型。写入训练数据集相对地址、测试数据集相对地址、输出模型相对地址,预设训练类别数nc和类别名names。在yaml文件里面分别定义各个参数:depth_multiple作为网络深度控制channel的缩放系数,而width_multiple作为网络宽度控制BottleneckCSP模块的层缩放系数,将所有的BottleneckCSP模块的number系数乘此参数获得最终的层数。通过此参数就可以实现不同大小不同复杂度的模型设计,4个版本的YOLOv5也做了不同的设计。预设Anchors锚定框后,拟出640×640图像大小下的多种锚定框的尺寸。
模型的主干网络backbone和通用检测层head用于最终检测部分。旨在特征图上应用锚定框并生成带有类概率、对象得分和边界框的最终输出向量结果。
- 1.2定义特征标签
在安装Python和Pycharm后,通过labelImg.py对收集的数据集进行人工标注,标注过程中需基于训练模型yaml中预设定义好的对应训练类别名称,同时写入标注后数据存放的相对路径即可获得已标注数据集,存入对应的相对路径中并将需要训练的动作顺序和动作名称同步.
- 1.3卷积神经网络训练
在装配CUDA和Anaconda等相关环境后,通过train.py对模型进行训练,训练前定义epochs迭代次数600次、batch-size参数、yaml文件相对地址、已标注相对地址即可获得生成对应的权重文件last.pt.
- 1.4离线训练集实时识别
成功测试权重文件稳定后,基于权重文件通过detect3.py对实时视频进行识别并通过TCP通信将识别数据传输到下位机。在识别前初始化一些配置,定义权重文件相对地址,视频流取消默认关闭并打开,限制帧数减少处理压力,在性能足够的条件下开启半精度Float16推理,缩短推理时间。最后将识别输出的类别信息进行处理发送至下位机。
2. 下位机实现音乐播放器核心功能
- 基于Qt编写C++代码,实现核心功能包括程序初始化,TCP通信,SQLite初始化,核心播放功能,手势识别功能简介,更换背景等功能。歌词载入,清空等展示功能。对歌曲信息的载入和修改。歌曲数据的加载,歌曲列表的清空等操作功能。创建新歌单列表。目标列表歌曲导入当前播放。手势识别状态的动作识别提示。预留嵌入式雨刷器功能展示,代码逻辑架构如下。
LightMusicPlayer.pro 用来存储项目设置和基本配置文件。
main.cpp 实现main( )函数和按键逻辑功能实现,同时TCP通信从上位机发送过来的信号接收处理。
widget.ui 通过Qt设计交互界面并实现,通过槽函数等实现按键功能。
3. 上位机与下位机采用TCP通信
由于手势仅用于对播放器进行信号控制,数据量小,所以采用TCP通信实现数据同步,同时基于TCP Socket通信使连接更稳定。Qt
中Socket此版本可以使用外部TCP套接字,方便通讯。
4. 数据库采用SQLite
在设计播放器时,歌曲列表等结构需要使用数据库,秉承简单高效无需配置环境的理念,最终选用SQLite实现对数据的管理。
设计重点和难点
1. 上位机手势识别功能中提升识别识别精确度和识别效率
在迭代600次后,7种手势准确率均达到99.5%。
如果是在训练集上表现很差,可能是欠拟合导致的,因为泛化能力太强,误识别率较高,需要通过增加数据集的正样本数,
增加主要特征的样本数量,同时增加训练次数,并尽量减小正则化参数。
如果是在训练集上表现很好,在测试集上表现很差,则极有可能是因为模型太复杂,训练需要通过增加其他的特征的样本数,
重新训练网络,如果是训练数据占总数据的比例过小,则需要增加数据的训练量。模型是用相对较小的数据训练的。
综上所述,基于足够的数据和较长的训练时间,则很有可能在此训练过程中产生良好的结果。
2. 下位机音乐播放器功能中响应手势较慢
需要分类讨论并提出解决办法。通过查看TCP通信是否异常,信号接收后业务逻辑是否异常,调用函数可用性等操作逐步解决,并在测试阶段多版本备份,以提高软测质量和回滚修复速度。
其它说明
该项目由于采用Qt架构,具有跨平台性,由C++编写,拥有良好的内存控制机制,整体可在Windows平台运行。