一:搭建环境
一:Opencv安装
- 下载3.4.0版本:https://zh.osdn.net/projects/sfnet_opencvlibrary/releases/
- 接着配置opencv环境变量:
- 我的电脑--->属性--->高级系统设置--->高级--->环境变量--->系统变量--->path--->编辑
- 将OpenCV安装目录的bin目录添加进去
-
二、显卡驱动、CUDA(版本 >= 7.5)、CUDNN
-
三、下载darknet
- 安装VS
- 步骤1:打开 darknet-master\build\darknet\darknet.vcxproj用记事本修改
- 修改CUDA 后面的版本,原来写的是10.0,改成自己的版本就好
- 步骤2:如果要使用GPU的话,用VS打开同目录下的darknet.exe,在项目上右键选择”重定向项目“,修改如下:
- 注意的是一定要选择”无升级“。如果不甚选择了升级的话,下一次再次选择”重定向项目“就没这个选项了,这个时候项目右键选择”属性“,在配置属性->常规->平台工具集处选择Visual Studio 2015(v140)
- 注意的是一定要选择”无升级“。如果不甚选择了升级的话,下一次再次选择”重定向项目“就没这个选项了,这个时候项目右键选择”属性“,在配置属性->常规->平台工具集处选择Visual Studio 2015(v140)
- 步骤3:将…\opencv\build\x64\vc14\bin下的opencv_world340.dll 和opencv_ffmpeg340_64.dll 复制到 \darknet-master\build\darknet\x64 目录下
- 步骤4:将将 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\visual_studio_integration\MSBuildExtensions 下的四个文件复制到VS的目录下:
- 步骤5:
- 包含目录:在darknet项目上点击鼠标右键->属性,弹出如下界面:然后VC++目录-->包含目录-->编辑
- 添加的目录:
- ...\opencv\build\include(...代表opencv的安装路径,下文同理)
- ...\opencv\build\include\opencv2
- ...\opencv\build\include\opencv
- 步骤6:库目录:方法与包含目录类似,添加的目录为:...\opencv\build\x64\vc14\lib
- 步骤7:链接器:添加目录...\opencv\build\x64\vc14\lib下库的名字:opencv_world340 .lib
- 步骤8:
- 在...\darknet-master\build\darknet\x64目录下,然后将..\opencv\build\x64\vc14\bin下的opencv_world340.dll 和opencv_ffmpeg340_64.dll 复制到 darknet.exe的同级别目录下。
- 在...\darknet-master\build\darknet\x64目录下,然后将..\opencv\build\x64\vc14\bin下的opencv_world340.dll 和opencv_ffmpeg340_64.dll 复制到 darknet.exe的同级别目录下。
- 步骤9:右键项目,生成,在:\darknet-master\build\darknet\x64下,成功后会生成一个darknet.exe
- 步骤10:下权重模型yolov3.weights文件
- 下载预训练权重文件:https://pjreddie.com/media/files/yolov3.weights,下载后放在.\darknet\build\darknet\build\darknet\x64下,
- 在.\darknet\build\darknet\build\darknet\x64下,打开该目录,双击darknet_yolo_v3.cmd会出现那张狗狗的照片及检测结果,说明编译成功了
- 在\darknet-master\build\darknet\x64下生成了一个darknet.exe,这东西就和Ubuntu下通过make生成的darknet可执行文件一样的啦。在该目录下测试一下来一个快捷键,shift按住,然后鼠标右键,选择”在此处打开powershell 窗口“,虽然可能打开出来有点丑,但是能用的。输入:.\darknet.exe detect .\cfg\yolov3.cfg .\yolov3.weights .\data\dog.jpg
- 步骤1:打开 darknet-master\build\darknet\darknet.vcxproj用记事本修改
- 安装VS
二:训练自己的数据集
- 1:数据集构成
- 先标记,生成txt文件。标记完成构建以下目录:
- 把所有的样本图片和对应的txt文件放到:darknet-master\build\darknet\x64\data\obj\下面,一张图对应一个txt。(新建obj文件夹,复制训练的图片和生成的txt文件到darknet\x64\data\obj下面)
- 在darknet-master\build\darknet\x64\data\下新建train.txt。将所有训练图片和对应的txt文件一起放在. \darknet\build\darknet\x64\data\obj中,测试图片放在. \darknet\build\darknet\x64\data\test中,生成train.txt和test.txt(路径在obj和test):
- 在darknet-master\build\darknet\x64\data目录下新建train.py文件和train,txt文件,路径改为绝对路径。把训练图片的路径写在文件里面,每行一个路径,如图
- 在darknet-master\build\darknet\x64\data目录下新建train.py文件和train,txt文件,路径改为绝对路径。把训练图片的路径写在文件里面,每行一个路径,如图
- 在. \darknet\build\darknet\x64中新建backup文件夹,存放训练的权重文件,新建log文件夹存放训练过程的数据。
- 先标记,生成txt文件。标记完成构建以下目录:
- 步骤1:下载http://pjreddie.com/media/files/darknet53.conv.74预训练权重文件到. \darknet\build\darknet\x64
- 步骤2:从.\ darknet\build\darknet\x64\cfg中复制yolo3.cfg到.\ darknet\build\darknet\x64并命名为yolo-obj.cfg(名字自己随意)。修改每一个yolo层上面一层的filters和yolo层的classes,classes是类别数,filters = (classes+5)*3。改成train模式,可以修改batch_size和subdivisions。max_batches修改为classes*2000,这个也可以自己定。steps=max_batches*80%,max_batches*90%:查找每个yolo下(共有3处)的classes改成你自己的类的数量 :classes = N,查找每个yolo上面第一个convolutional下的filters(如图)改成你自己的大小,计算方法是: filters=(classes + 5)x3 ,由于我的是4类,所以我的filters=27. (这个也是只有3处)
- batch 改成64 :batch=64
- subdivisions 改成8 :subdivisions=8
- 训练的时候如果出现内存溢出错误(Out of memory),可以,将batch改小些(64,32,16,8),将random改成0关闭多尺度训练。
- 若遇到cuda error:out of memory错误,调整batch_size和subdivisions,batch_size改小,分批数subdivisions可以设置成等于batch_size。每批训练的个数=batch/subvisions,根据GPU修改,显存不够值就大一些
- 步骤3:从. \darknet\cfg中复制voc.names到. \darknet\build\darknet\x64\data中,命名为obj.names,修改,每一行是一个类别名。
- 步骤4:复制voc.data到. \darknet\build\darknet\x64\data中,命名为obj.data,根据自己的路径修改里面的内容。
- 步骤5:修改Makefile,在\darknet-master路径下
- 步骤6:训练。下载复制darknet53.conv.74文件到darknet-master\build\darknet\x64目录下。打开win10终端,cd进入darknet-master\build\darknet\x64路径,然后输入:./darknet.exe detector train data/hat.data yolov3-hat.cfg darknet53.conv.74 开始训练。
- 训练过程中输出的参数的意义
- Avg IOU:预测出的bbox和实际标注的bbox的交集除以它们的并集,这个值越大说明预测的效果越好。
- Avg Recall:平均召回率,检测出的物体个数除以标注的所有物体个数。
- count:前面写的大写的Count也是这个参数,一般都是写的小写。这个参数表示标注的所有物体的个数,例如:如果count=6,recall=0.66667,就表示一共有6个物体(可能包含不同类别,这里不考虑类别)。如果预测出4个,那么recall=4/6=0.66667。
- train loss和Avg train loss这两个参数应该随着iteration增加而降低,如果loss增大到几百就说明是发散了,如果loss在一段时间内不变,就需要降低learning_rate和改变batch来加强学习效果,但是也有可能是训练已经充分。
- 训练过程中输出的参数的意义
- 测试:./darknet.exe detector test data/hat.data yolov3-hat.cfg backup/yolov3-hat_10000.weights
- 摄像头测试:./darknet.exe detector demo data/hat.data yolov3-hat.cfg backup/yolov3-hat_10000.weights
注意事项 :
- 报错1:找不到opencv_world340.dll。到opencv的安装目录下找到两个文件:D:\opencv-3.4.1\opencv\build\x64\vc15\bin下复制opencv_world340.dll和opencv_ffmpeg340_64.dll到.\darknet\build\darknet\x64\darknet.exe所在目录下。
- 报错2:如果CUDA不是10.0版本的话,要把compute_75,sm_75移除掉。那就试试吧再次打开属性->配置属性->CUDA C/C++ ->Device->Code Generation,删掉compute_75,sm_75
- 报错3:没有下载yolov3.weights文件。下载预训练权重文件:https://pjreddie.com/media/files/yolov3.weights,下载后放在.\darknet\build\darknet\build\darknet\x64下,打开该目录,双击darknet_yolo_v3.cmd会出现那张狗狗的照片及检测结果,说明编译成功了
- 成功
- 成功
- 报错4: .\darknet\build\darknet修改darknet.vcxproj文件,由于darknet.vcxproj 中使用的是CUDA 9.1,所以要将所有CUDA 9.1修改为自己对应的CUDA版本。
- 报错:the windows sdk version 10.0 was not found install the required version of …
- 下载了最新的Window SDK,安装后把 配置属性->常规->目标平台版本改成安装的版本后,不报错了
- 下载了最新的Window SDK,安装后把 配置属性->常规->目标平台版本改成安装的版本后,不报错了