Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)

在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的封装,另外一篇博文里会详细讲解!

原文地址:https://www.cnblogs.com/taotingz/p/11319410.html