在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程。
提纲:
1.下载适用于Windows的darknet
2.安装VS和CUDA、CUDNN、OpenCV
1)安装VS2017
2)安装OpenCV
3)VS配置OpenCV
4)安装CUDA10.0和CUDNN7.5
5)VS配置CUDA
3. 编译darknet
4.训练自己的数据集
5.开始训练
6.测试
1.下载适用于Windows的darknet
git clone https://github.com/AlexeyAB/darknet
这个适用于Windows和Linux
而前面博客中的:https://github.com/pjreddie/darknet
是只适用于Linux的。
2.安装VS和CUDA、CUDNN、OpenCV
1)安装VS2017
可以在官网找:vs2017:https://visualstudio.microsoft.com/zh-hans/downloads/
我是在学校的软件中心找的安装包。
2)安装OpenCV
opencv-3.4.1-vc14_vc15.exe,vc15表示VS2017(vc10表示VS2010,vc11表示VS2012,vc12表示VS2013,vc14表示VS2015),其他opencv的版本也可以的。
https://opencv.org/releases.html
直接双击安装,安装好之后要添加环境变量。选择控制面板->系统和安全->系统->高级系统设置->环境变量->系统变量,找到Path,编辑Path变量,在变量值中添加路径“D:opencv-3.4.1opencvuildx64vc15in”其中D:opencv-3.4.1opencv是opencv的安装路径。
3)VS配置OpenCV
VS2017中新建项目
把配置改成release和x64,现在的电脑应该大部分都是64位的。如果是32位,选x86
左菜单栏选择视图—>其它窗口—>属性管理器,点击项目名字左边的小三角形——debug|x64,如果是32位系统,选Win32。双击 Microsoft.Cpp.x64.user弹出属性页
VC++ 目录—>包含目录—>编辑,添加以下三项(对于自己的安装路径)
D:opencv-3.4.1opencvuildincludeopencv
D:opencv-3.4.1opencvuildinclude
D:opencv-3.4.1opencvuildincludeopencv2
在库目录中添加:
D:opencv-3.4.1opencvuildx64vc15lib
然后选择连接器—>输入—>附加依赖项,复制以下两个:opencv_world341d.lib表示debug,opencv_world341.lib表示release。也可以只添加opencv_world341d.lib,因为前面我们选择的debug|x64,我这里两个都放进去了。D:opencv-3.4.1opencvuildx64vc15lib(路径根据自己的)中确认一下这两个文件有没有。
opencv_world341d.lib
opencv_world341.lib
最后点击右下角的应用,再点确认就会生效!
4)安装CUDA10.0和CUDNN7.5
CUDA下载地址:https://developer.nvidia.com/cuda-downloads
默认安装就行,记住安装的位置,安装完成后要配置环境变量:控制面板->系统和安全->系统->高级系统设置->环境变量->系统变量,找到Path,编辑Path变量,在变量值中添加路径:
验证是否安装成功:
cmd下输入:
nvcc -V
有如下信息表示安装成功
验证环境变量:
CUDNN下载地址:https://developer.nvidia.com/rdp/cudnn-download,要注册账号才能下载。
(由于我的账号现在不记得密码了,就不放截图了~~)
将下载下来的包解压缩后应该是三个文件夹,对应名称copy到CUDA的安装目录下的对应文件夹。最后把C:Program FilesNVIDIA GPU Computing ToolkitCUDAv10.0libx64添加到环境变量中。
5)VS配置CUDA
这部分我参考的这篇博客:https://blog.csdn.net/HaleyDong/article/details/86093520
3. 编译darknet
按照官网的步骤进行编译:
有几点要注意:
.darknetuilddarknet修改darknet.vcxproj文件,由于darknet.vcxproj 中使用的是CUDA 9.1,所以要将所有CUDA 9.1修改为自己对应的CUDA版本。
用VS2017打开darknet.sln,因为这个是VS2015版本的,所以打开后需要进行重定向,在项目上右键-重定向项目,然后设置 x64 and Release模式,再编译:生成-生成darknet。成功后会在. darknetuilddarknetx64中生成darknet.exe,完成编译。
到opencv的安装目录下找到两个文件:D:opencv-3.4.1opencvuildx64vc15in下复制opencv_world341.dll和opencv_ffmpeg341_64.dll到.darknetuilddarknetx64darknet.exe所在目录下。
下载预训练权重文件:https://pjreddie.com/media/files/yolov3.weights,下载后放在.darknetuilddarknetuilddarknetx64下,打开该目录,双击darknet_yolo_v3.cmd会出现那张狗狗的照片及检测结果,说明编译成功了。
4.训练自己的数据集
1)下载http://pjreddie.com/media/files/darknet53.conv.74预训练权重文件到. darknetuilddarknetx64
2)从. darknetuilddarknetx64cfg中复制yolo3.cfg到. darknetuilddarknetx64并命名为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%
从. darknetcfg中复制voc.names到. darknetuilddarknetx64data中,命名为obj.names,修改,每一行是一个类别名。复制voc.data到. darknetuilddarknetx64data中,命名为obj.data,根据自己的路径修改里面的内容。
3)将所有训练图片和对应的txt文件一起放在. darknetuilddarknetx64dataobj中,测试图片放在. darknetuilddarknetx64data est中,生成train.txt和test.txt(路径在obj和test):
import os # 遍历指定目录,目录下的所有文件 def eachFile(filepath): pathDir = os.listdir(filepath) for allDir in pathDir: if filetype in allDir: child = os.path.join('%s%s' % (filepath, allDir)) #print(child.decode('gbk')) # .decode('gbk')是解决中文显示乱码问题 #print(child) fopen.write(child+' ') fopen.close() if __name__ == '__main__': filePath = "路径\train.txt"#这里替换成你的路径,test.txt对应改路径 filePathC = "路径\darknet\build\darknet\x64\data\obj\"#这里替换成你的路径,训练或测试图片的路径 filetype ='.jpeg'#图片后缀 fopen = open(filePath, 'a') eachFile(filePathC)
在. darknetuilddarknetx64中新建backup文件夹,存放训练的权重文件,新建log文件夹存放训练过程的数据。
4)修改保存权重文件的迭代间隔,在. darknetsrcdetector.c的第271行左右修改。
5.开始训练
打开cmd,cd到darknetuilddarknetx64中,执行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
若不想显示average loss曲线,执行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show
若要保存log日志,执行:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 >> log/train_yolov3.log
现在就开始训练啦!!
中断训练后再次训练时将上述命令的权重文件修改成backup/权重文件名。
若遇到cuda error:out of memory错误,调整batch_size和subdivisions,batch_size改小,分批数subdivisions可以设置成等于batch_size。
6.测试
命令行测试方法:在. darknetuilddarknetx64下游很多.cmd文件,里面就是一些命令,可以打开查看,选择对应的一些命令进行测试!
我们还可以连接摄像头(USB摄像头)进行实时检测:
darknet.exe detector demo cfg/coco.data yolov3.cfg yolov3.weights
当然,大多数时候我们都需要用脚本来测试,才能达到目的,这就涉及到yolo的封装,另外一篇博文里会详细讲解!