Windows10+YOLOv4+Darknet训练自己的数据(二)

这篇文章主要讲怎样使用YOLOv4算法作者提供的YOLOv4源码来训练自己的数据集
运行环境的搭建和源码的测试可以参考我的上一篇文章Windows10+YOLOv4+Darknet训练自己的数据(一)

一、数据集制作

数据集制作的前半部分可以参考我的上一篇文章VOC数据集制作
这里我就接着VOC数据集制作这篇文章来讲接下来对数据集的操作。
第一步: 将我们制作好的数据集VOCData数据集放到darknet-master\build\darknet\x64\data\voc 文件夹下,这里我把VOCData文件夹名字改成了VOCdevkit,改不改都没关系,我当时不知道为啥改了个名儿,这不重要。
第二步: 使用data/voc文件夹下的voc_label.py文件可以将图片和注释文件转换为训练需要的txt文件。打开voc_label.py文件,进行如下修改:
1、修改第9行class为自己的类别

classes = [自己的类别]

2、观察第47-55行的代码,确定文件路径中“year”和“image_set”对应的自己文件夹中的路径名称:

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

根据观察结果,修改第7行代码

sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

例如:我的ImageSets/Main文件夹的准确路径为:
训练集:“VOCdevkit\VOCTrainVal\ImageSets\Main”,Main文件夹下有train.txt、val.txt两个文件
测试集:“VOCdevkit\VOCTest\ImageSets\Main”,Main文件下有test.txt一个文件,那么我的第7行就改成:

sets=[('TrainVal', 'train'), ('TrainVal', 'val'), ('Test', 'test')]

第三步: 运行voc_label.py文件,在该路径下将会出现几个数据集的描述文件
在这里插入图片描述

二、建立训练文件

2.1 新建xxx.names 文件

darknet-master\build\darknet\x64\data目录下新建xxx.names(我的文件名为obj.names)文件,其中储存了所有样本的目标类别,格式如下:

person
car
truck
bicycle
...
...

2.2 新建xxx.data文件

darknet-master\build\darknet\x64\data目录下新建xxx.data(我的文件名为obj.data)文件,格式如下:

classes= 20   #你的类别数,不加背景
train  = data/voc/TrainVal_train.txt #数据集制作中生成的描述训练集的文件的路径
valid  = data/voc/Test_test.txt ##数据集制作中生成的描述测试集的文件的路径
names = data/obj.names  #2.1中建立的xxx.names文件的路径
backup = backup/   #训练后权重文件的保存路径

三、修改训练的配置文件

darknet-master\build\darknet\x64\cfg文件夹下,找到yolov4.cfg文件,可以直接打开这个文件进行修改,但是建议复制一下这个文件,建立一个副本,只对副本进行修改。这里我将副本名称修改为yolov4_obj.cfg,然后打开yolov4_obj.cfg文件,进行了如下修改:
1、修改第二行batch的值,根据自己电脑的性能进行修改,这里我的batch=64。
2、修改第三行subdivisions的值,也是根据自己电脑的性能进行修改,这里我的subdivisions=32。(解释一下batch和subdivisions的意思,这里batch表示每次训练的图片数量,subdivisions表示将batch分成多少组去训练(缓解内存压力),也就是说每次经过batch个样本更新一次参数。电脑配置跟不上的可以适当增大subdivisions。但一般来说subdivisions的取值为32或64)。
3、修改第19行max_batches的值,根据你自己的检测类别设置max_batches=classes*2000,比如类别数量为4,则max_batches=8000,但是一般不能少于训练样本的数量。
4、修改第21行steps的大小,一般是取max_batches大小的80%和90%。比如max_batches=8000,则steps=6400,7200。
5、第7、8行设置width和height为可以整除32的任意数,比如width=416 height=416
6、在每个[yolo]层(第968、1056、1144行)中更改classes的大小为你自己的检测类别数,共需要更改三处,可以通过ctrl + F键查找然后更改,快捷高效。
7、在每个[yolo]层之前的最后一个[convolutional]层(第961、1049、1137行)中更改filters的大小为 (classes+5)x3,(比如,classes=4,filters=27)共需要更改三处,注意是[yolo]层前的最后一个[convolutional]层,不是每个[convolutional]层里都需要修改,只需要改三处。

四、获取最佳Anchor

获取最佳Anchor的过程如下:
1、打开命令提示符
在这里插入图片描述
2、切换到darknet-master\build\darknet\x64路径下:
在这里插入图片描述
3、输入下面的命令获取最佳Anchor

darknet.exe detector calc_anchors data/obj.data -num_of_clusters 4 -width 416 -height 416 -show

4、程序运行结束后,会在当前目录下建立一个anchors.txt文件,里面保存了刚刚运行程序得出的最佳Anchor
在这里插入图片描述
5、打开anchors.txt文件,将里面的数据进行复制,再打开yolov4_obj.cfg文件,将第967、1055、1143行的anchors替换为anchor.txt文件中的值。

六、训练

6.1 有预训练权重的训练

为了快速训练好模型,我们可以使用作者训练好的预训练权重yolov4.conv.137进行训练,预训练权重的百度云链接,提取密码:o6hd
打开命令提示符,切换到darknet-master\build\darknet\x64路径下,使用下面的命令进行训练:

darknet.exe detector train data\obj.data cfg\yolov4-obj.cfg weights\yolov4.conv.137

6.2 从头开始训练

如果我们的数据集与coco数据集相差较大,使用了预训练权重训练出来的模型可能准确性不是那么的好,所以就需要从头开始训练。也是打开命令提示符,切换到darknet-master\build\darknet\x64路径下,输入下面的命令进行训练:

darknet.exe detector train data\obj.data cfg\yolov4-obj.cfg

6.3 训练结果

在训练的过程中,会有一张loss的变化图,在训练结束后,该图(有两张一模一样的)保存在darknet-master\build\darknet\x64文件夹下面,图名为chart_yolov4-obj.pngchart.png
在这里插入图片描述
在这里插入图片描述
训练结束后,权重文件保存在了darknet-master\build\darknet\x64\backup路径下。
在这里插入图片描述

七、测试

7.1 图片测试

将测试的图片放在darknet-master\build\darknet\x64\data\voc路径下,然后打开命令提示符,切换到darknet-master\build\darknet\x64路径下,输入下列命令:

darknet.exe detector test data\obj.data cfg\yolov4-obj.cfg backup\yolov4-obj_last.weights data\voc\test1.jpg

7.2 视频测试

将测试的视频放在darknet-master\build\darknet\x64\data\voc路径下,然后打开命令提示符,切换到darknet-master\build\darknet\x64路径下,输入下列命令:

darknet.exe detector demo data\obj.data cfg\yolov4-obj.cfg backup\yolov4-obj_last.weights data\voc\center.mp4 -thresh 0.25 -out_filename data\voc\results\center.mp4

此命令中,data\voc\center.mp4是测试视频的存放位置,data\voc\results\center.mp4是检测后带有检测结果的视频的存放位置。

7.3 计算mAP

打开命令提示符,切换到darknet-master\build\darknet\x64路径下,输入下列命令:

darknet.exe detector map data\obj.data cfg\yolov4-obj.cfg backup\yolov4-obj_last.weights

结数

到此,使用YOLOv4作者提供的源码来训练自己的数据就结束了!!!!

版权声明:本文为CSDN博主「MT_Lucky」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40927867/article/details/114986121

MT_Lucky

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

yolov4训练测试自己的数据集关键点总结

在实习中,有一个任务是训练出一个车辆检测的yolov4模型。感觉yolov4的功能好强大啊!特此记录一下自己在使用过程中的一些改动。 yolov4论文,yolov4源码 首先肯定是要配置相关的环境&#

【darknet】1、yolov4模型训练之数据处理

本文主要写了使用yolov4进行模型训练前的数据准备。darknet框架使用的数据格式是yolo格式,但我们常见的目标检测数据格式是COCO和VOC.所以本文将以车辆检测为例,将coco2017和voc2007及vo