Win10+vs2017+opencv+darknet做目标检测

一、环境配置
开始之前,我先把我的百度云链接分享出来,如果有不想用我这些的,后面我也写明了具体的下载方式和下载地址,可以自己下载。
链接:https://pan.baidu.com/s/1UzOMT3l3vnPYzD6j1oFgjQ
提取码:cpkx
复制这段内容后打开百度网盘手机App,操作更方便哦
安装vs2017,如图必须勾选这几项,C++和python的支持就不用说了,这是必须的,适用于vs2015是因为darknet支持的是vs2015,所以要勾选这一项才可以。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装opencv3.2.0,这里解释一下为什么是3.2.0,其实现在opencv已经发展到4.0+了,但是有很多跟不上时代的东西,只能支持一些老版本,darknet就是了,darknet只能支持3.4.0以下的opencv版本。这个安装也简单可以选择自己到官网下载自己喜欢的版本。
附网址:https://opencv.org/releases/
在这里插入图片描述

就是这个软件,记得自己下载要自己选择系统,我的是windows。无需安装编译,直接双击打开即可使用。
安装cuda
下载地址:
Cuda地址:
https://developer.nvidia.com/cuda-10.0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal
Cudnn地址:
https://developer.nvidia.com/cudnn
大家可以选择自己喜欢的cuda版本,darkNet源码中默认的是cuda10.1的版本,当然其他版本也没有关系,后面会告诉大家怎么做。
安装cuda时基本就是傻瓜操作
在这里插入图片描述

这一步选择自定义,接下来就继续下一步就好了:
在这里插入图片描述

但是安装完之后还需要将cudnn中的三个文件分别复制到cuda的同名文件夹下,这里要注意下载cudnn的时候一定要选择与cuda版本搭配的版本,否则容易出现错误。
在这里插入图片描述

如图将cudnn中的这三个文件分别放置到cuda的同名文件下,cuda的安装地址如果你在安装时没有自己设置的话,那就在你C盘中C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0这个地址下面
在这里插入图片描述

如图将cudnn中的几个文件分别复制到cuda的同名文件夹下
二、下载darkNet
直接附上下载地址:
darknet: https://github.com/AlexeyAB/darknet
下载好darkNet并解压,打开之后去找build,熟悉C++的都知道build中就是已经编译好的东西了,这里可以看出源码作者还是很人性化的,没有让我们自己去编译。
三、在VS2017上配置
环境准备的差不多之后,就要开始配置了,首先用vs2017打开E:\darknet-master\build\darknet这个地址下的darknet.sln,打开之后,选择菜单栏视图>其他窗口>属性管理器,然后在右侧可以看到
在这里插入图片描述

右键点击darknet,选择属性,选择VC++目录中的包含目录并如下图配置
在这里插入图片描述

然后选择库目录进行如下配置:
在这里插入图片描述

再选择链接器里的输入>附加依赖项添加opencv_world320.lib:
在这里插入图片描述

到这里vs2017中的opencv3.2.0就配置完成了,然后将平台调整为release / x64
这时候还需要再加一些其他配置,首先需要添加两个环境变量,一个是cudnn的,另一个是opencv的,如图,在系统环境变量的path中新建两个环境变量
在这里插入图片描述

这个要根据自己的cudnn和opencv的位置创建。
然后还需要在vs2017中配置cuda,将cuda中:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\visual_studio_integration\MSBuildExtensions
文件夹下的所有文件复制到vs2017的这一目录下:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\BuildCustomizations
如图:
在这里插入图片描述

这里特别说一下,因为这里默认的cuda是cuda10.1,但是我安装的是cuda10.0,这个时候怎么办呢,很简单,重命名就好了,直接把图中这两个文件改成10.1即可,另外两个不要改,否则会报错。
在这里插入图片描述

到这一步之后,就可以编译生成项目解决方案了。这个时候如果没什么问题,就会在E:\darknet-master\build\darknet\x64这一目录下生成一个darknet.exe,应该有人会好奇这exe是个什么,其实我也不太确定,但是以我的经验来看,这个exe就是darknet的网络框架,里面是不带有任何权重的,所以运行的时候还需要自己去输入权重。
生成exe之后,也就代表环境配置基本没有问题了,那接下来就该开始测试和训练了。
四、测试初始权重
在做测试之前,先介绍几个文件。
yolov3.weights:yolov3的权重文件,我上传的这个是coco数据集训练的权重文件,共有80个分类,可以直接调用来检测结果。
coco.data/voc.data:这个文件中存放了coco或者voc数据的具体信息的文件名,方便训练或测试的过程中调用,也是为了方便使用者对其进行更改。
yolov3.cfg:这个文件中保存的是yolov3的配置参数,cfg中还有很多模型的cfg,分别存放了不同模型的配置参数,因为我们这里测试的是yolov3,所以只使用了yolov3的配置参数。
测试的时候,需要用到的命令是:
darknet.exe detector test cfg/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 dog.jpg -ext_output
其中test就是测试的意思,训练则要用train,0.25是表示检测到的准确度大于0.25的结果要输出,dog.jpg表示测试调用的图像,剩下的一些参数我也还没搞明白,有懂王可以在后面给我留言,谢谢。接下来展示一下测试结果。
在这里插入图片描述

在这里插入图片描述

这个测试可以直接在E:\darknet-master\build\darknet\x64下打开终端输入我上面的命令运行,也可以直接运行darknet_yolo_v3的脚本,效果是一样的,通过上面的图可以看到,运行的时候可以看到你配置的所有环境以及电脑的GPU,还有使用的一些参数。
既然测试没有问题了,那么久进入最关键的一步,训练。
五、用自己的数据集进行训练
在用自己的数据集训练之前,先来尝试一下官方数据集的效果,因为coco数据集实在是太大了,所以我用了voc数据集来测试。附voc百度链接,各位也可自己到官网下载,但是一定要把2007和2012的三个文件都下载了。
链接:https://pan.baidu.com/s/135DAKUQRktQ8YnMfuA-aLQ
提取码:zdal
在这里插入图片描述

下载好voc之后,复制到E:\darknet-master\build\darknet\x64\data\voc这一地址下,将压缩包全部解压,会得到一个文件夹VOCdevkit,打开之后可以看见里面的数据,其中主要用到的是下面这三个文件夹里的东西,Annotations中存放的xml文件记录的是图像中的标注信息,JPEGImages中保存的是原图,ImageSets中保存的是分配好的训练集和测试集。
在这里插入图片描述

然后退回到voc文件夹下,可以看见一个py的文件,voc_label.py,直接cmd打开终端运行这个文件,输入python voc_label.py运行
在这里插入图片描述

运行完毕就会生成训练所需的数据集了,然后还需更改一些参数,因为原来的参数是适用于coco的,所以需要改一下。打开cfg文件夹,可以看见很多的配置文件
在这里插入图片描述

在这里找到voc.data, yolov3-voc.cfg,首先修改voc.data,打开之后看见这些信息
在这里插入图片描述

第一行表示训练数据的类别数,因为voc有20类,所以用20,train和valid分别表示保存有训练数据和验证数据信息的文件地址,names表示分类的名字,因为voc.names中名字是写好的,暂时不需要更改,如果用自己的数据集进行训练,就需要更改这个名字。更改之后的信息如下:
在这里插入图片描述

这个是按照自己的地址来配置的,千万不要弄错了。接下来修改yolov3-voc.cfg文件,这里需要更改的主要有两个参数:batch和subdivisions。
在这里插入图片描述

yolov3-voc.cfg文件定义了yolo的卷积神经网络模型,和超参数配置等。这里需要注意,训练时需要将#Testing区块下的batch和subvisions注释掉;测试和验证时则放开注释,同时注释掉#Training区块下的内容。 训练时,可以根据自己GPU的内存来设置批的大小batch,可设为16、32、64、128 验证时,batch和subvisions同时设为1即可。
然后在E:\darknet-master\build\darknet\x64地址下打开终端,输入命令:
darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
这里的darknet53.conv.74是darknet的初始权重,我在开头的百度云链接中已经上传了这个文件,当然也可以自己下载,如果配置没有什么问题,那么就可以正常的训练了。训练过程中会持续往backup/下生成权重文件,如:yolov3-voc_100.weights、yolov3-voc_200.weights…

接下来才是重点,用自己的数据进行训练,话不多说,先奉上我自己的数据集:
我用的是自己制作的,线条粗细不同背景不同的十字叉图片,大概200张左右:
在这里插入图片描述

附上数据集的链接以及标注工具labelimg的链接,labelimg的使用方法最后也会简单介绍一下。
链接:https://pan.baidu.com/s/1u5ENSje6Zl3JWW8vSLMFXQ
提取码:38mp
数据集的形式非常简单,就是完全套用voc的数据集形式。怎么制作呢,首先得有一个VOCdevkit文件夹,在这个文件夹里面包含了voc2007和voc2012两个文件夹,voc2007和voc2012这两个文件夹里面各包含三个文件夹,Annotations,ImageSets,JPEGImages,里面具体放的是什么上面都说过了,Annotations文件夹下存放的是标注得到的xml文件,JPEGImages文件夹下存放的是原图,ImageSets文件夹下就不需要自己放了,只需要创建一个Main文件夹,然后找到我的数据中的一个py文件,voc2yolov3.py,无需更改,直接运行即可。然后就会在Main文件夹下生成几个txt。如图:
在这里插入图片描述

其实也没有什么东西,就是图片的名字。分成了训练集,测试集,验证集。接下来把VOCdevkit文件夹复制到E:\darknet-master\build\darknet\x64\data\voc这一目录下,然后打开这一目录下的voc_label.py,修改里面的类别classes,把自己的类别名字像voc那样逐个输入进去:
在这里插入图片描述

修改完之后,还是直接在本目录下打开终端运行voc_label.py,如果运行没有报错,还要看这几个地方,第一个是看txt文件是否生成以及内容是否完整,正常的里面应该存放的是图片的完整路径,然后还要看voc2007和voc2012中是否生成了一个名为labels的文件夹

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

如图:像我这样这些都有就可以了,labels中的文件存的是标签以及标注框的数据,这个一定要有,否则训练不会报错还不会出结果,我就是从这个坑里爬出来的。至此数据就算准备好了,然后就是修改一些参数了。主要需要修改的文件有三个,voc.data,yolov3-voc.cfg,voc.names。首先来看voc.data的修改,这个比较简单。还是上图,E:\darknet-master\build\darknet\x64\cfg在这一文件夹下找到voc.data:
在这里插入图片描述

将classes改成自己的类别数,将train和valid改成自己的数据集地址,这里都是以E:\darknet-master\build\darknet\x64为根目录的。然后是voc.names,voc.names在data文件夹下,这个里面存的是类别的名称,要和voc2yolov3.py的顺序保持一致
在这里插入图片描述

如图:因为我只有两种,所以就这么可怜了。最后需要修改yolov3-voc.cfg,这里需要修改多处地方,先简单说一下,要把training下的batch和subdivisions释放,可以根据自己的情况修改,我用的16,因为图片少,然后就是输出的地方,因为yolov3要输出大中小三种先验框,所以找到三个输出位置,把类别数修改成自己的类别数,另外filter也要修改,filter的计算公式是(classes + 先验框坐标 + 置信度) x 3,因为我只有两个分类,所以是(2 + 4 + 1) x 3 = 21。看图说话
在这里插入图片描述
在这里插入图片描述

修改完这些信息之后,进入到E:\darknet-master\build\darknet\x64地址中,打开终端,输入训练命令:
darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
然后如果没有报错的话,就可以看见一个可视化的窗口,用来输出loss的:
在这里插入图片描述

这是我已经训练了两三个小时的loss,可以看出已经接近于0了。训练过程就没有什么好说的,漫长的等待,然后在E:\darknet-master\build\darknet\x64\backup中可以看见生成weights文件,挑一个最新保存的,然后进行测试。还是在老地方打开终端,预测之前还是要修改一下yolov3-voc.cfg中的batch和subdivisions,释放testing下的,将training下的注释,然后就可以输测试命令了
darknet.exe detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc_1000.weights -i 0 -thresh 0.25 18.jpg -ext_output

可以看一下我的结果,效果还是不错的。
在这里插入图片描述

简单介绍一下labelimg的使用,解压压缩包:
在这里插入图片描述

如图,直接在这里打开终端,输入python labelimg.py运行:
在这里插入图片描述

就可以打开labelimg了,然后可以用open打开图片,也可以用open dir打开图片的文件夹,然后就可以进行标注了。
在这里插入图片描述

点击这个按钮,选择想要标注的区域,输入标签:
在这里插入图片描述

然后点击ok,保存记得保存之前最好选择好保存的文件夹:
在这里插入图片描述

就可以得到xml文件,xml文件中就保存了标注的信息,包括标注框的位置和标签等等:
在这里插入图片描述

有了xml文件,就可以用来训练了,标注的时候一定要仔细,标注的过程枯燥繁琐,千万不要弄错了,否则这错误可是绞尽乳汁也排查不出来的。
本文参考的博客有:
https://zhuanlan.zhihu.com/p/92141879
https://blog.csdn.net/qq_43475606/article/details/109187054
https://blog.csdn.net/qq_42001765/article/details/104250101

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐