【⽬标检测】你想知道的⼿势识别都在这⾥【YOLO】⽹络
基于YOLO+ResNet50的⼿势识别
⽬录
(⼀)项⽬背景以及系统环境
本⽂所使⽤的深度学习框架为pytorch-gpu-1.7.1版本,python3.7版本,需要在特定的系统环境中运⾏。本⽂搭建实验所需要的系统环境如下所⽰。
1.1 项⽬背景
近年来,计算机视觉技术蓬勃发展,为⽣产和⽣活带来了巨⼤的变⾰。像是刷脸⽀付、⽆⼈驾驶等已经上市或即将⾛向成熟的技术,极⼤便利了我们的⽇常⽣活。但是我们观察到,⽬前市场上尚未出现⼀款完善的针对会议演⽰控制的计算机视觉产品。同时,由于新冠疫情的影响,加深了⼈们对于⾮接触式交互的需求,⼈们迫切需要⼀款⾮接触式的⼈机交互系统,来解决传统以键⿏为代表的接触式交互带来的卫⽣隐患。于是,为了填补这⼀⼤市场漏洞,我们团队研究并开发出了这⼀款基于⼿势识别的会议控制系统,借此提⾼会议的操作便利性和直观性。
1.2 硬件环境
系统最低配置要求:
GPU:GTX 550Ti(不⽀持A卡); CPU:i3三代及以上。
推荐配置:
GPU:GTX 1050Ti及以上(不⽀持A卡);CPU:i3五代及以上。
1.3 操作系统
实验平台所使⽤的操作系统为windows10。安装的⽀持库只要有python3.7,OpenCV-Python以Pytorch-gpu-1.7.1版本。
1.4 主要界⾯
1:程序调⽤默认摄像头。
2:确保开始时,⽤户⼿臂处于放松状态,程序将通过⼈物的位置⾃动确定基准参数,如:起始左右⼿锁定、⼈物起始位置、动作启动线等。
3:通过算法,程序实时追踪⼿的位置和特征状态并和对左右⼿的区分,并将结果实时反馈给预测对象。⼿离开动作起始线(即图中横线)后开始捕获动作轨迹,再次回到起始线下后输出预测结果到终端。
4:也可以设置控制模式,可以选择进⾏对PPT和图⽚管理器的操作(详情参考演⽰视频)。
1.5 开发⼯具
开发⼯具:
硬件信息表
未识别的网络硬件名称规格⽤途
摄像头杂牌720P获取视频流
影驰显卡GTX1660 骁将提供算⼒
CPU I3-9100F完成预测
软件信息表
软件名称版本说明
Python  3.7主要运⾏环境
JDK  1.8实现预测输出
Pytorch  1.7.1算法使⽤框架
CUDA11.0提供GPU指令集架构
算法技术:
模型作⽤
YoloV3⽬标检测v1.0
YoloV5s⽬标检测v2.0
MoblieNetV3_YoloV5s⽬标检测v3.0
模型作⽤
Resnet50特征提取
(⼆)前期准备
2.1 前⾔
深度学习是⼀种通过⼤量数据不断的学习从⽽能够对未知数据进⾏检测识别的技术。因此为使⼿势识别模型能够⾃动及有效地对⼿势进⾏识别,需要先对⼿数据采取⼤量的⾼质量的数据,以便能够得到良好的识别模型。我们使⽤Yolo模型对⽬标进⾏检测,再从检测的结果的基础上使⽤ResNet50模型对⼿的⼆⼗⼀点进⾏特征的提取,再根据输出的⼆⼗⼀点的坐标进⾏⼿势的判断。
2.2 数据集准备
本项⽬所采集的⼿为会议场景下的基本⼿势。Yolo模型的数据集使⽤LabelImg⼯具进⾏标识图⽚。
2.3 Yolo数据集的标注
【数据标注】
本⽂采⽤的YoloV3算法是⼀种监督式学习⽅法,因此需要对输⼊到Yolo⽹络的图像数据进⾏标注即添上对应的标签,并且还需要满⾜该⽹络对图像数据格式的要求。本⽂使⽤LabelImg⼯具完成对⼿图像数据的标注⼯作,标注⽰意图如下图所⽰。
注意⽂件路径不要有中⽂!!
【标注⽂件】
在使⽤LabelImg⼯具对⼿进⾏图像数据进⾏标注时,会⽣成.xml⽂件。其内容如下所⽰。
<annotation>
<folder>JPEGImages</folder>
<filename>0-19.jpg</filename>
<path>D:\data\JPEGImages\0-19.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>624</width>
<height>832</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Hand</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>384</xmin>
<ymin>241</ymin>
<xmax>426</xmax>
<ymax>286</ymax>
</bndbox>
</object>
</annotation>
在使⽤LabelImg⼯具对⼿进⾏标注⽽⽣成的.xml⽂件中记录的内容如上所⽰。其中‘folder’标识所在⽂件夹的名称;‘filename’表⽰⼿图像的名称;‘path’表⽰⼿语图像数据存放的路径;‘size’表⽰图像的⼤⼩和深度;‘object’中的name为⽬标物体;最后
的‘bndbox’存放的是边框坐标信息。⽰例中⽬标物体Hand的坐标信息为(384,241) (426,286),其中前者表⽰边框的左上⾓坐标信息,后者代表边框的右下边的坐标信息。
2.4 ResNet50数据集
(三)Yolo V3
简介
Yolo (You Only Look Once)。
【Darknet-53】
Yolo V3 采⽤了 Darknet-53 的⽹络结构(含有 5 组残差模块)来提取特征。其⽹络结构采⽤了横纵交叉结构,并采⽤了连串的 3×3 和1×1 卷积。其中, 3×3 的卷积增加通道数,⽽ 1×1 的卷积在于压缩 3×3 卷积后的特征表⽰,同时 Darknet-53 为了防⽌池化带来的低级特征的丢失,采⽤了全卷积层,并且引 ⼊了 residual 结构。这意味着⽹络结构可以更好地利⽤ GPU,从⽽使其评估效率更⾼、速度更快。Darknet-53 作为特征提取层,最终每个预测任务得到的特 征⼤⼩为 [3×(4+1+C)]。每个 grid cell 预测 3 个预测框,4 代表 4是边界框中⼼坐标 bx,by,以及边界框 bw,bh,1 代表预测值,C 代表预测类别。最终 YoloV3 可以获取
(16×10+32×20+64×40)个特征向量
【⽹络结构】
模型结构如下图:
3.1 模型训练
由于训练数据集仅有1000张左右,担⼼数据量较少不⾜以⽀撑模型的训练,因此通过对数据集进⾏左右与上下镜像处理来增强训练数据集,运⾏数据处理⽂ 件后,得到数据增强后的图⽚共4000张左右。
训练过程batch_size设置为8,初始learn_rate设置为1e-3。主⼲特征提取⽹络中,冻结训练可以加快训练速度,也可以在训练初期防⽌权重被破坏,所以我们的 Init_Epoch起始世代设置为0,Freeze_Ep
och冻结训练世代设置为50。训练完⼀个Epoch之后,batch_size设置为4,将初始learn_rate设置为1e-4, Init_Epoch 起始世代设置为50,Freeze_Epoch冻结训练世代设置为100。
下图为三次训练后保存的模型⽂件,最终的Total_Loss在2.2左右。
从此可以看出loss收敛在2附近,考虑到继续训练可能会产⽣过拟合现象,训练完三次之后,停⽌训练。训练结束,得到最终的检测模型。
3.2 模型测试
通过测试集上测试模型的检测效果,如下图所⽰。