YOLOv4网址:https://github.com/AlexeyAB/darknet
如果安装了Git软件,可直接克隆项目到本地:
nvcc -V
git clone https://github.com/AlexeyAB/darknet
在C:\Users\lindsay\Desktop\darknet_yolov4\darknet\build\darknet目录下使用vs2019打开sln文件
打开后如图
点击重新生成,然后就会在C:\Users\lindsay\Desktop\darknet_yolov4\darknet\build\darknet\x64下生成darknet.exe文件
使用PASCAL VOC数据集的目录结构:
建立文件夹层次为 C:\Users\lindsay\Desktop\darknet_yolov4\darknet\build\darknet\x64\VOCdevkit\VOC2007
VOC2007下面建立两个文件夹:Annotations和JPEGImages
JPEGImages放所有的训练和测试图片;Annotations放所有的xml标记文件
在C:\Users\lindsay\Desktop\darknet_yolov4\darknet\build\darknet\x64目录下执行
python genfiles.py
在VOCdevkit \ VOC2007目录下可以看到生成了文件夹labels ,同时在darknet下生成了两个文件2007_train.txt和2007_test.txt。
2007_train.txt和2007_test.txt分别给出了训练图片文件和测试图片文件的列表,含有每个图片的路径和文件名。
另外,在VOCdevkit\VOC2007\ImageSets\Main目录下生产了两个文件test.txt和train.txt,分别给出了训练图片文件和测试图片文件的列表,但只含有每个图片的文件名(不含路径和扩展名)。
labels下的文件是images文件夹下每一个图像的yolo格式的标注文件,这是由annotations的xml标注文件转换来的。
最终训练只需要:2007_train.txt,2007_test.txt,labels下的标注文件和 VOCdevkit\VOC2007\JPEGImages下的图像文件。
1)新建data\voc.names文件
可以复制data\voc.names再根据自己情况的修改;可以重新命名如:data\voc_ship.names
2)新建 data\voc.data文件
可以复制data\voc.data再根据自己情况的修改;可以重新命名如:data\voc_ship.data
3)新建cfg\yolov4-voc.cfg
可以复制cfg\yolov4-custom.cfg再根据自己情况的修改;可以重新命名cfg\yolov4_ship.cfg:
batch=64 subdivisions=64 (如果显存溢出改为16)
max_batches = 2000(这里为2000乘以类别数)
steps=1600,1800(这里为max_batches的百分之80和90)
在Darknet中,batch和subdivisions是结合使用的,例如这儿的batch=64,subdivisions=16表示训练的过程中将一次性加载64张图片进内存,然后分16次完成前向传播,意思是每次4张,前向传播的循环过程中累加loss求平均,待64张图片都完成前向传播后,再一次性后传更新参数。
subdivisions一般设置16,根据尝试,通常设置为8的倍数,batch的值可以根据显存占用情况动态调整,一次性加减subdivisions大小即可,通常情况下batch越大越好,还需注意一点,在测试的时候修改batch和subdivisions参数为1,避免发生错误。
width也可以设置为不等于height,通常情况下,width和height的值越大,对于小目标的识别效果越好,但受到了显存的限制,读者可以自行尝试不同组合。一次为跑完一个batch,训练次数达到max_batches后停止学习。
在cfg\yolov4_ship.cfg文件中,三个yolo层和各自前面的convolutional层的参数需要修改:
三个yolo层都要改:yolo层中的classes为类别数,每一个yolo层前的convolutional层中的filters =(类别+5)* 3
例如:
yolo层 classes=1, convolutional层 filters=18
1)下载预训练权重文件
yolov4.conv.137
放置在C:\Users\lindsay\Desktop\darknet_yolov4\darknet\build\darknet\x64目录下
这里的训练使用迁移学习,所以下载的yolov4在coco数据集上的预训练权重文件(不含全连接层)
2)训练网络
darknet.exe detector train data\voc_ship.data cfg\yolov4_ship.cfg backup\yolov4.conv.137 -map
如需要显示训练过程的map变化,在命令末尾加-map
整个训练如下图所示:
由于我是中断后在训练的,所以前面的chart被更新了,只剩下后面的chart
断点训练命令如下:
darknet.exe detector train data\voc_ship.data cfg\yolov4_ship.cfg backup\yolov4_ship_last.weights -map
以下为训练完的权重文件
训练好后可以在backup目录下看到权重文件。
尝试test前要修改cfg文件,切换到test模式。可以重新建立一个测试cfg文件, 如yolov4-ballship.cfg
设置:
batch=1 subdivisions=1
运行命令
darknet.exe detector test data\voc_ship.data cfg\yolov4_ship_test.cfg backup\yolov4_ship_last.weights testfiles\000678.jpg
当报显存满的错误时,我调节batch并没有解决问题,我降低了网络的输入大小为320*320解决的这个问题,但是训练出来的模型明显对小目标不太鲁棒。
一起开启新世界的大门吧