YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)

文章采用的是官方开源代码:
https://github.com/AlexeyAB/darknet
YOLOV4的详细阐述可以阅读原汁原味的论文:
https://arxiv.org/abs/2004.10934

1.Win10下YOLOV4配置教程

本篇文章主要记录从数据集的制作到检测的工作,YOLOV4的环境配置不再详细介绍,推荐我个人亲试很可的一个教程:https://blog.csdn.net/shuaijieer/article/details/106150135?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-5&spm=1001.2101.3001.4242
YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第1张图片
按照这个教程去配置,一般都是可以成功的,若不使用GPU,教程中就可以忽略CUDA和cuDNN的安装。按照步骤进行下去,直到图像测试步骤,这时需要下载作者训练好的网络权重文件yolov4.weights,博文中有下载链接,下载好后放在相应的文件目录下,然后打开cmd命令,输入测试图片的命令,如下红线所示。最后在控制台需要输入你要检测的图片的路径:(比如:你的图片路径/xx.jpg)就可以看见图片的检测效果,至此,说明你的所有安装配置都成功了。
YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第2张图片

2.制作自己的数据集(打标签)

  1. 在目录build\darknet\x64\data\下创建文件obj.name文件,文件内容是你自己的数据集的种类名称,每一行写一个种类名称,比如你的数据集就是检测猫和狗,文件中就写
    cat
    dog

  2. 在目录build\darknet\x64\data\下创建文件obj.data,文件内容如下:
    classes = 2 (PS:classes大小按照你的数据集目标类别个数设置)
    train = data/train.txt
    valid = data/test.txt
    names = data/obj.names
    backup = backup/

  3. 将你的数据集所有的图像(.jpg)文件全部放在build\darknet\x64\data\obj\目录下。然后clone下 https://github.com/AlexeyAB/Yolo_mark这个,按照教程为每个图像生成标签。完成后,每个.jpg文件都对应一个相同名字的.txt文件,文本文件中的内容是相应图片的 【object-class】【x_center】 【y_center】 【width】【height】。第一项是类别标签,第二项和第三项是目标的中心坐标(归一化至0-1),后面两项是目标框的宽度和高度。

  4. 在目录build\darknet\x64\data\下创建文件train.txt,文件的内容是每一行对应一个图像的路径,比如
    data/obj/img1.jpg
    data/obj/img2.jpg
    data/obj/img3.jpg

3.修改配置文件

在目录build\darknet\x64\cfg\下找到yolov4-custom.cfg文件,copy一份后重命名为yolo-obj.cfg。也可以自己创建一个配置文件,然后将yolov4-custom.cfg文件中的内容复制到你的配置文件中。
然后接下来修改配置文件中的内容,以适用于你自己的数据集。

  1. 在配置文件中改 batch的大小,根据自己的数据集数量和自己的机器性能

  2. 在配置文件中改 subdivisions的大小,根据自己的数据集数量和自己的机器性能
    【 这里解释一下batch和subdivisions的意思,这里batch表示每次训练的图片数量,subdivisions表示将batch分成多少组去训练(缓解内存压力),也就是说每次经过batch个样本更新一次参数,用cpu训练时,可能会出现这种错误,这时需要我们更改batch和subdivisions大小。电脑配置跟不上的可以适当增大subdivisions。】
    在这里插入图片描述

  3. 在配置文件中改max_batches=6000(f.e.classes=3),就是通常根据你自己的检测类别设置max_batches=classes*2000,但是一般不能少于训练样本的数量,不能低于6000。(PS:根据自己的需求设置)

  4. 在配置文件中设置steps的大小,一般是取max_batches大小的80%和90%。比如max_batches=6000,则steps=4800,5400。(PS:根据自己的需求设置)

  5. 设置width和height为可以整除32的任意数(f.e.width=608 height=608)

  6. 在每个[yolo]层中更改classes的大小为你自己的检测类别数,共需要更改三处,可以通过ctrl + F键查找然后更改,快捷高效。YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第3张图片

  7. 在每个[yolo]层之前的最后一个[convolutional]层中更改filters的大小为 (classes+5)x3,(比如,classes=2,filters=21)共需要更改三处,注意是[yolo]层前的最后一个[convolutional]层,不是每个[convolutional]层里都需要修改,只需要改三处。
    YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第4张图片

4.开始训练

运行cmd,切换路径进入到darknet.exe所在的目录下,windows下执行命令:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -dont_showYOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第5张图片
训练完成后,训练的权重会保存在build\darknet\x64\backup\目录下。如果我们在训练过程中不小心中断了训练(比如在迭代了1000次后),我们可以查看保存的权重文件,通过命令:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg backup/yolo-obj_1000.weights
然后就可以接着训练。

5.使用自己训练好的权重测试

在build\darknet\x64\backup\目录下保存的是训练输出的权重,有时,我们会在迭代结束之前的某个输出权重获取最好的检测效果,我们可以使用相应的权重进行检测,使用命令:
darknet.exe detector test data/obj.data cfg/yolo-obj.cfg backup/yolo-obj_8000.weights进行测试,这里具体使用哪个权重文件,取决于你自己的训练结果。

最后,如果你的任务是检测很小的物体(图像resize为416x416后,目标小于16x16),在配置文件yolo-obj.cfg需要修改相应位置
为layers=23。修改这个位置为stride=4。修改这个位置为stride=4。
如果你的检测任务区分图像左右翻转后的类别,比如交通标志,由于网络通常会对数据集进行数据增强,所以你需要在配置文件中的这个位置添加一行代码 flip=0

工具

用于标记数据样本的两种工具(亲试可用):

  1. in C++: https://github.com/AlexeyAB/Yolo_mark
  2. in Python: https://github.com/tzutalin/labelImg

最后(就是最后最后…):阅读作者的github时,对于先验框anchor的设置,不太明白,如下:
YOLOV4训练自己的数据集—从环境配置到完成检测任务(Windows)_第6张图片
本来我还特意去根据自己的数据集聚类了9种先验框,但作者的意思是建议使用源码默认的先验框,如果自己重新计算anchors,需要相应更改配置文件中的mask和filters,这个anchors的设置保留个疑问!

你可能感兴趣的:(机器学习深度学习,目标检测,目标检测,YOLOV4,深度学习)