毕业设计(三):基于YOLO算法的手势识别技术

Windows下实现YOLOv3的手势识别

毕业设计(一):基于YOLO算法的手势识别技术
毕业设计(二):基于YOLO算法的手势识别技术
Yolov3参数理解

这篇文章就来讲一讲我自己电脑上运行YOLOv3的代码,并实现用例测试。

系统环境

Windows10、VS2017,CUDA11.0(与之匹配的CUDNN)、OPENCV3.4.0、有GUP

VS2017

这个安装过程就不详说了,这种平台太基础了。VS2017版本我已经用了几年了,去网上搜一搜就可以找到相应的安装教程。不过在这里注意一点。
在安装过程中,选择“使用C++的桌面开发
毕业设计(三):基于YOLO算法的手势识别技术_第1张图片
选择单个组件,找到“适用于桌面的VC++2015.3 v14.00(v140)工具集”,勾选后进行安装。因为这个项目要求使用到这一功能。
毕业设计(三):基于YOLO算法的手势识别技术_第2张图片

CUDA与CUDNN

  • CUDA

首先要确认下计算机是否有独立显卡(而且是英伟达显卡),查看适合自己的CUDA版本
控制面板->NVIDIA设置->帮助->系统信息->组件->3D设置。(这里我放不了自己的图,因为不知道怎么打不开了,不过只要知道我的版本是CUDA11.0
毕业设计(三):基于YOLO算法的手势识别技术_第3张图片
下载对应的版本:注意这里要选local版本,因为下面要下载安装包里的东西,我最开始是下载的net版本,所以打开安装包发现里面是空的,这浪费我不少时间。
毕业设计(三):基于YOLO算法的手势识别技术_第4张图片

选择自己的下载路径,选择自定义安装
毕业设计(三):基于YOLO算法的手势识别技术_第5张图片
毕业设计(三):基于YOLO算法的手势识别技术_第6张图片

找到Visual studio Integration,取消勾选。因为这是下载会出错的。我自己没有试过,看网上其他人都是出错。但这一步部分我们是需要的,所以还是要下载。怎么下载呢?找到你从网上下载的安装包,对其进行解压。找到visual_studio_integration\MSBuildExtensions(…\visual_studio_integration\CUDAVisualStudioIntegration\extras\visual_studio_integration\MSBuildExtensions),复制里面的所有文件。

毕业设计(三):基于YOLO算法的手势识别技术_第7张图片

打开自己VS2017的安装目录,我的目录是D:\vs\Common7\IDE\VC\VCTargets\BuildCustomizations,将刚才的文件复制进来。
如果没有做这一步骤,后来的测试会报错。
毕业设计(三):基于YOLO算法的手势识别技术_第8张图片

安装最后,要记住自己的安装目录,记住自己的安装目录,别到时候找不到。

  • CUDNN

cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算,所以我们还要下载同一版本的cuDNN。
下载链接

这里的图,我用了其他人的,因为我自己的已经被我给删掉了。
毕业设计(三):基于YOLO算法的手势识别技术_第9张图片
毕业设计(三):基于YOLO算法的手势识别技术_第10张图片
CUDNN安装后要编辑系统环境变量。

最后,查看自己的CUDA和CUDNN是否安装成功。Windows10检查Cuda和cuDNN是否安装成功?

OpenCV配置

OpenCV的安装过程我就不说了,网上也有。这里我也找一篇文章,可以对照着来看。Windows下 OpenCV 的下载安装教程(详细)

不过有一点要注意,一定要下载OpenCV3.4.0OpenCV3.4.0OpenCV3.4.0的版本,我刚开始使用的是OpenCV3.4.2的版本,但是最后没有运行成功。似乎是版本不在支持3.4.0以上的版本。
下面我也给出了我自己在先下载OpenCV3.4.2,再下载OpenCV3.4.0的过程。

vs2017配置

  1. 下载windows版yolov3源码:https://github.com/AlexeyAB/darknet
  2. 修改darknet.vcxproj文件
    进入…\darknet-master\darknet-master\build\darknet目录,修改darknet.vcxproj文件,我使用记事本打开。修改CUDA的版本,一共有两处地方。
    毕业设计(三):基于YOLO算法的手势识别技术_第11张图片
  3. 打开解压后…\darknet-master\build\darknet目录下的darknet.sln,配置平台改为Release x64
    如果是第一次打开,会显示如下,选择无升级。若不小心关掉,右键darknet项目,选择重定向。
    毕业设计(三):基于YOLO算法的手势识别技术_第12张图片
    VS2017属性配置:
    右键Darknet,选择属性,找到平台工具集,选择上面要求下载的2015版本。
    毕业设计(三):基于YOLO算法的手势识别技术_第13张图片

然后,C++目录–>包含目录–>编辑 添加的目录:…\opencv\build\include
毕业设计(三):基于YOLO算法的手势识别技术_第14张图片
然后在配置库目录,方法与包含目录类似(上面),添加的为:…\opencv\build\x64\vc14\lib。我这里是因为当初不知道添加哪一个lib,所以把VC14和vc15的都添加了。
毕业设计(三):基于YOLO算法的手势识别技术_第15张图片

接着添加附加包含库,选择C/C++常规->附加包含目录,添加…\opencv\build\include

毕业设计(三):基于YOLO算法的手势识别技术_第16张图片
然后是链接器添加方法:添加目录…\opencv\build\x64\vc14\lib下库的名字:opencv_world340.lib
这里我之前是配置OpenCV3.4.2,所以在继承的值中是存在对应的配置,之前的删除3.4.2的配置没有全部做完,所以这里要把“从父级或项目默认设置继承”取消勾选
毕业设计(三):基于YOLO算法的手势识别技术_第17张图片 最后,拷贝其他配置文件
将…\opencv\build\x64\vc14\bin下的opencv_world340.dllopencv_ffmpeg340_64.dll 复制到 D:\darknet\darknet-master\build\darknet\x64 目录下。

上述完成后,入VS在darknet工程上右键——>生成。然后在工程目录下×64下多了些darknet.exe等文件。

毕业设计(三):基于YOLO算法的手势识别技术_第18张图片

下载yolo3.weights,下载后放在…\darknet-master\build\darknet\x64下。

下面就可以开始测试了!

测试

打开cmd,进入dark.exe目录下面。输入

darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

然后就会出现用例测试

恭喜做到这里基本就可以说明已经超过一半了!

训练自己的数据集

制作VOC数据集

这里使用Labelimg,来制作数据集。我没有自己去制作数据集,因为时间的限制,就自己去找了数据集去实现。手势0到6的识别

如果想自己去制作数据集,推荐去网上找一找相关的文章。

1.在…\darknet-master\scripts目录下新建一个文件夹,命名为:VOCdevkit。在这个目录下创建VOC2007文件夹。在VOC2007文件夹下创建如下4个文件夹
毕业设计(三):基于YOLO算法的手势识别技术_第19张图片

Annotation文件夹下存放的是根据数据集制作的XML文件。 JPEGImages文件夹存放图片,格式为jpg。labels文件夹存放图片对应的TXT文件。ImageSets文件夹存放如下三个文件,但是我发现只利用到了其中一个Main,其他的两个不知道是什么用。
毕业设计(三):基于YOLO算法的手势识别技术_第20张图片
2. 在上上面的图片中,可以看到有一个test.py。这是干什么的呢?最开始我也是跟着做,后来发现他只是生成4个txt文件,里面现在是空的,所以这一步主要目的是创建4个txt文件。目录为…\darknet-master\darknet-master\scripts\VOCdevkit\VOC2007\ImageSets\Main
毕业设计(三):基于YOLO算法的手势识别技术_第21张图片
3. 在目录D:\darknet-master\darknet-master\scripts下有个叫voc_label.py的文件。该文件用于将Main目录下的txt的图片名的绝对路径保存到scripts目录下的train.txt、2007_train.txt 、2007_val.txt、 2007_test.txt、train.all.txt文件中来,同时将xml文件转换为labels文件夹中对应的txt文件,txt文件中存放的是每个标记的类别下标,以及归一化的标记矩形框的坐标。

这一步我与网上的教程是不同的,他们是将voc_label.py文件拷贝到…\darknet-master\build\darknet\VOCdevkit2007目录下进行操作,但因为我运行上面的文件后,无法得到2007_train.txt、2007_val.txt、2007_train.txt、2007_val.txt、 2007_test.txt这五个文件,所以我修改…\darknet-master\darknet-master\scripts目录下的voc_label.py(这里面应该是路径问题),最后在scripts文件夹下生成要求的文件。

修改该voc_label.py文件,并运行:

# 第7行修改所需sets
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
# 第9行修改为自己的类别
classes = ["0", "1", "2", "3", "4", "5"]
# 第26、27行修改路径,可改为绝对路径
 in_file = open('D:/darknet-master/darknet-master/build/darknet/VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('D:/darknet-master/darknet-master/build/darknet/VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
# 第48、49、50行修改路径,可改为绝对路径
if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('D:/darknet-master/darknet-master/build/darknet/VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()

# 第53行修改路径,可改为绝对路径
 list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))

#删除有关2012的内容
os.system("cat 2007_train.txt 2007_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")

毕业设计(三):基于YOLO算法的手势识别技术_第22张图片
4. 下载训练所需的预权重文件
darknet53.conv.74,我放到…\darknet-master\darknet-master\build\darknet\x64目录下
5. 修改voc.data和voc.names
打开…\darknet-master\build\darknet\x64\data中的voc.data,修改自己的类别。
打开…\darknet-master\build\darknet\x64\data中的voc.names,替换成自己的类。

classes= 1  # 自己数据集的类别数
train  = /home/xxx/darknet/train.txt  # train文件的路径
valid  = /home/xxx/darknet/2007_test.txt   # test文件的路径
names = /home/xxx/darknet/data/voc.names #用绝对路径
backup = backup #模型保存的文件夹

毕业设计(三):基于YOLO算法的手势识别技术_第23张图片
毕业设计(三):基于YOLO算法的手势识别技术_第24张图片

  1. 修改yolov3-voc.cfg
    打开…\darknet-master\build\darknet\x64中的yolov3-voc.cfg,并重命名为yolov3-num.cfg.做如下修改:
    一共需要改三处,每处有三个地方需要修改。每次都是先修改[yolo]下的classes为对应的类别数,再修改[yolo]对应上面 [convolutional]下的filters为(classes+5)*3 ,random=1 # 多尺度输出为1,显存小时改为0关闭。(我是六个类)

CUDA: out of memory 以及 resizing 问题?显存不够,调小batch,关闭多尺度训练:random = 0。

毕业设计(三):基于YOLO算法的手势识别技术_第25张图片

训练自己的数据

打开cmd,cd到…\darknet-master\build\darknet\x64目录下,在此目录下新建results_mine文件夹,输入命令

darknet.exe detector train .\data\voc.data yolov3-voc.cfg .\weights_pr\darknet53.conv.74 .\results_mine

每迭代1000次在results_mine中生成一个权重文件。因为我先迭代了1380次,(速度比较慢,花了大概4个小时)
这是第一次迭代的图片,这里可以看出图片的比例不太好,这也是我后续要进行修改的。
毕业设计(三):基于YOLO算法的手势识别技术_第26张图片

第二天,我在此基础上进行训练,又迭代1000次。
毕业设计(三):基于YOLO算法的手势识别技术_第27张图片

看到loss已经降到0.04以下了,可以停止了。在results_mine文件夹下回生成权重文件。(这里应该是两个的,只不过我第二天训练要在第一天的基础上继续,所以把第一天训练的文件放入上层目录中去了)
毕业设计(三):基于YOLO算法的手势识别技术_第28张图片

测试

打开cmd,cd到…\darknet-master\build\darknet\x64目录下,输入命令

darknet.exe detector test data\voc.data yolov3-num.cfg results_mine\yolov3-num_last.weights

按照提示输入测试图片的绝对路径:
在这里插入图片描述

最终我的测试结果:
毕业设计(三):基于YOLO算法的手势识别技术_第29张图片

到这里基本就结束了。

你可能感兴趣的:(毕业设计)