文章目录[隐藏]
这篇文章主要讲怎样使用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.png和chart.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
暂无评论