Yolov3 win10+vs17 运行及训练自己的数据集

Yolov3 win10+vs17+OpenCV3.4运行及训练自己的数据集

由于yolov3的源码对window环境并不友好,采用在window下可以较好运行的项目,项目地址为:https://github.com/AlexeyAB/darknet。将其git clone。

环境配置

采用项目中老版本的window编译方法,如下:

1.先安装visual studio2017(先于CUDA)

在安装CUDA之前要先安装VS2017,在安装CUDA时要会有关于visual studio的相关选项。

2.安装适合自己GPU的CUDA和cudnn

安装和配置CUDA,详见之前的配置过程,可参考:

CUDA安装:https://blog.csdn.net/abc13526222160/article/details/88780278

cudnn配置:https://blog.csdn.net/weixin_43318717/article/details/94433790

注意

在安装CUDA中要勾选visual studio intergration选项:

在先后安装完vs2017和CUDA、cudnn后,如果设置正确的话,在visual studio的安装路径中(我的为D:\vs17\IDE\Common7\IDE\VC\VCTargets\BuildCustomizations)会有你下载CUDA版本相关的.props等文件,如下:

因为我先后下载过两个版本的CUDA,所有显示有两个版本。如果路径中没有相关CUDA文件,需要在CUDA的安装路径下找到文件并copy到此路径下。

3.安装配置OpenCV3.4.0

如果不采用cmake方式编译此yolov3项目,推荐安装opencv的3.4.0版本。

安装及配置OpenCV详细见:

https://blog.csdn.net/weixin_41991128/article/details/83656543

注意

在配置完成后还有一项额外的操作,将opencv_ffmpeg340_64.dll和opencv_world340.dll复制到项目地址中最终生成darknet.exe文件夹下,介于darknet.exe生成在项目的darkent\build\darknet\x64下(D:\vs_workstation\yolov3\darknet\build\darknet\x64),将opencv_ffmpeg340_64.dll和opencv_world340.dll复制到x64文件下。

(实际没复制也成了)

4.VS下设置编译和生成运行文件

此部分参考:

https://blog.csdn.net/KID_yuan/article/details/88380269

其中有所不同的是,vs2017打开darknet.sln会自动弹出重定向项目,大致内如下图:

工具集采用升级到v141,确定后vs会自动将darknet.vcxproj中v140进行替换为v141,无需再使用Notepad打开darknet.vcxproj进行替换。

其他操作如配置opencv操作按照以上参考博文进行,配置好darknet.sln下的opencv相关库设置后,点击生成,最后成功生成darknet.exe并下载训练好的权重文件后在cmd中切换到x64文件路径下,输入:

.\darknet.exe detector test data\coco.data yolov3.cfg .\weights\yolov3.weights .\data\dog.jpg

制作自己的数据集

以上Yolov3项目需要的数据集格式要求将图片和同名的.txt文件放到同一文夹下(x64\data\obj)

其中.txt中内容形式为:

1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667
#类别号  box中心点x相对坐标  box中心点y相对坐标  box相对宽  box相对高

= <absolute_x> / <image_width>,其中的x、y、weight和height都介于0与1之间。

这就需要可以生成此形式的标注工具,有两种生成yolov3所需标注.txt文件的项目工具,可根据自己环境择优选择,第一种为C++形式的图形界面程序需要编译一下,第二种为python编写的QT程序,第二种标注工具功能更全面,既可生成yolov3所需形式也可生成VOC数据集所需.xml文件,推荐第二种。

标注工具1使用方法

项目为:https://github.com/AlexeyAB/Yolo_mark

将项目git clone到一定路径下,用vs打开yolo_mark.sln,配置相关的opencv库设置(同之前配置opencv的操作一样),注意选择x64&release后右键生成。

生成成功后会生成yolo_mark.cmd,点击即可运行标注工具:

想要在自己的图片集上进行box的标注,只需删除x64/Release/data/img中的图片,将自己的图片放入,并对x64/Release/data/obj.data 和x64/Release/data/obj.names进行对应修改即可。将obj.data中的classes修改为自己数据集中标注的种类个数,obj.names中每行输入一个类的名字,注意:此处中的obj.names和obj.data和此后yolov3项目中要生成的obj.names和obj.data相同,后面在yolov3项目中创建这两个文件时应该想到此处

当修改好后,即可运行对img中的图片进行标注,标注的同时会在图片的同一文件下生成所需的同名.txt文件,效果图如下:

标注错误或者想修改,找到对应图片同名的.txt文件删除,再重新标注即可。

标注工具2使用方法

项目为:https://github.com/tzutalin/labelImg

要先通过pip install or conda install 安装pyqt5和lxml库

在windows下的命令行切换到项目路径,输入以下即可运行:

python labelImg.py

训练自己的数据集

训练前数据集配置

  1. 在yolov3项目路径下的build/darknet/x64/data文件夹下创建obj文件夹,将上一步标注好的图片和同名.txt文件放入obj中。

  2. 在build/darknet/x64/data文件夹下创建obj.data和obj.names。(和标注时设置一致)

  3. build/darknet/x64/data中还需要有train.txt,其中存放的为训练的图片名称,格式如下:

    data/obj/img1.jpg
    data/obj/img2.jpg
    data/obj/img3.jpg
    

    可通过在build/darknet/x64下创建一段python代码generate_train.py来自动生成train.txt,代码项目中没有,需要自己创建,如下:

    import os
    
    image_files = []
    os.chdir(os.path.join("data", "obj"))
    for filename in os.listdir(os.getcwd()):
        if filename.endswith(".jpg"):
            image_files.append("data/obj/" + filename)
    os.chdir("..")
    with open("train.txt", "w") as outfile:
        for image in image_files:
            outfile.write(image)
            outfile.write("\n")
        outfile.close()
    os.chdir("..")
    

    运行以上generate_trian.py即可在x64/data下生成trian.txt。

  4. 在build/darknet/x64(darknet.exe所在路径)下创建backup文件,此文件内将存放训练时产生的weights权重文件。

训练前yolov3模型结构相关修改

对yolov3原理有一定了解的话,会知道yolov3有三个尺度的模型输出,除了这三个尺度最后的输出层由训练种类数决定外,其他部分的网络结构基本上是固定的,我们只需要修改三个不同尺度下最后输出层的卷积核个数即可。filter个数计算:

filters=(classes + 5)x3  # yolov3 每个网格三个anchor 

在x64/cfg下复制yolov3.cfg(创建相同内容的.cfg文件,在此基础上修改),并命名yolov3_custom.cfg,对其中以下根据自己训练数据集进行修改:

  1. 修改训练相关参数:

    其中max_batches=classes*2000(种类个数 *2000),我自己的数据集种类个数为6故max_batches=12000;其中steps分别为80%和90%的max_batches。

  2. 修改类个数及三个最后输出层的filter个数(都为三处)

    其中filter=(classes +5)*3 =11 *3=33,共有三处需要对classes和filter进行修改。

    对于ramdom,yolov3.cfg中设置为1,可以不进行修改。

  3. out of memory情况

    如果设置好并下载好预训练权重后,训练出现这种情况,可以考虑修改上面的ramdom,将random设置为0;或者去修改subdivisions,将其增加为32or64。

  4. 下载预训练的权重,下载地址:https://pjreddie.com/media/files/darknet53.conv.74将其放到build\darknet\x64下:

训练

./darknet.exe detector train  data/obj.data  cfg/yolov3_custom.cfg darknet53.conv.74

训练可能要进行好长时间,其中loss图像保存为x64/chart,训练了近两个小时的loss图如下:

用训练好的权重来测试

训练好的权重文件将存放在x64/backup中:

其中yolov3_custom_last.weights为训练停止后的权重,如果训练因为某些原因中断,下次训练时可从此权重开始:

./darknet.exe detector train data/obj.data cfg/yolov3_custom.cfg  
backup/yolov3_custom_last.weights   

在cfg中复制yolov3_custom.cfg并重命名为yolov3_custom_test.cfg,并修改前几行,将training注释将testing取消注释

将测试图片放到darknet\x64下,运行:

./darknet.exe detector test data/obj.data cfg/yolov3_custom_test.cfg  
backup/yolov3_custom_last.weights   xxx.jpg

最终结果图

发布了8 篇原创文章 · 获赞 0 · 访问量 213
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览