本文基于最原始AB大神版本的YOLO v4,其实AB大神在github上已经给出了很详尽的介绍,这里只是更方便大家上手而已。
源代码:YOLO v4
首先,我们要安装配置好Yolo v4
git clone https://github.com/AlexeyAB/darknet
cd darknet
make
下载作者的预训练权值 yolov4.weights 提取码:08nu 后,我们可以使用CPU进行初步的测试
./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights data/dog.jpg
darknet目录下的predictions.jpg是产生的测试结果图像文件,测试结果如下:
当然,目前使用的是CPU进行检测,远远发挥不了YOLO v4的检测能力。接下来我们安装CUDA,Opencv,使用GPU进行模型的训练和检测。
注意:yolov4需要CUDA10.0以上版本支持,cuDNN也需要安装对应的版本
OpenCV的安装也有一堆大坑,在这里不展开讲解,稍后会根据大家的需求单独放一篇文章。
注意:OepnCV最好不要超过4.0版本
安装好Cuda、cuDNN以及OpenCV后,修改darknet目录下的Makefile文件
vim Makefile
GPU=1
CUDNN=1
OPENCV=1
重新编译
make clean
make
首先准备自己的数据集,使用PASCAL VOC数据集的目录结构
|-- VOCdevkit
|-- VOC2007
|-- Annotations
|-- ImageSets
|-- JPEGImages
|-- labels
其中JPEGImages文件夹内是所有图像,Annotations文件夹内是标注后产生的xml文件,Labels文件夹内是xml文件转换而成的yolo格式txt标注文件。并且我们需要两个txt文件:train.txt与valid.txt分别记录训练图片文件和验证图片文件的列表,包含每个图片的路径+文件名,可以放在darknet目录下。
实际上最终训练我们需要:train.txt, valid.txt, labels内的标注文件以及 VOCdevkit/VOC2007/JPEGImages下的图像文件。
首先修改配置文件:
复制并修改 data/voc.names 文件,可根据自己数据集情况重新命名,如: data/voc-PD.names
这里面包含需要检测的各类别物体名称、原始文件内包含的是COCO数据集内20个检测目标。
复制并修改 cfg/voc.data 文件,可根据自己数据集情况重新命名,如:cfg/voc-PD.data
这里面包含检测类别数,train.txt, valid.txt, voc.names的文件路径,以及保存权值的backup文件夹路径
原文件:
classes = 20
train = /home/pjreddie/data/voc/train.txt
valid = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/pjreddie/backup/
按照自己的文件路径进行修改
./darknet detector calc_anchors cfg/voc-PD.data -num_of_clusters 9 -width 416 -height 416
4.我们可以正式开始模型的训练了
可以选择下载作者的137层预训练权重 yolov4.conv.137 提取码:crj5 作为训练起始值
单卡训练:
./darknet detector train cfg/voc-PD.data cfg/yolov4-voc-PD.cfg yolov4.conv.137
此时模型正式进入训练阶段,同时会弹出训练曲线
如果希望绘制的曲线包含map变化曲线,在命令末尾可以添加 -map,另外在没有图形显示器的操作系统中或本身不希望在训练过程中显示曲线图像,可以继续添加-dont show,训练图像曲线会保存在darknet目录下
./darknet detector train cfg/voc-PD.data cfg/yolov4-voc-PD.cfg yolov4.conv.137 -map -dont_show
多卡训练
官方建议我们先单卡训练1000个iteration后再进行多卡训练,此时backup文件夹里应该存储了一些权重值,可以为这些文件添加权限以防万一:sudo chmod +x xxxx.weights
,再继续训练
./darknet detector train cfg/voc-PD.data cfg/yolov4-voc-PD.cfg backup/yolov4-voc-PD_1000.weights -gpus 0,1,2,3 -map -dont_show
官方建议不要使用超过4个以上的GPU进行并行训练。
迁移训练
我们可以自行提取yolo 162层网络结构的任意前n层参数,作为finetuning的初始权重,一般习惯在yolo层前提取参数,即37层、87层、137层等
./darknet partial cfg/yolov4-voc-PD.cfg backup/yolov4-voc-PD_best.weights myyolov4.conv.137 137
测试前我们要将cfg文件中的batch和subdivisions更改为1(当然也可以复制重命名一个新的test.cfg文件)
测试单张图片
./darknet detector test cfg/voc-PD.data cfg/yolov4-voc-PD-test.cfg backup/yolov4-voc-PD_best.weights xxxxx.jpg
测试多张图片,需要将测试图片路径及名称写入到test.txt文件中,可将结果汇总到txt或者json文件中
./darknet detector test cfg/voc-PD.data cfg/yolov4-voc-PD-test.cfg backup/yolov4-voc-PD_best.weights -dont_show -ext_output <data/test.txt> result.txt
./darknet detector test cfg/voc-PD.data cfg/yolov4-voc-PD-test.cfg backup/yolov4-voc-PD_best.weights -ext_output -dont_show -out result.json < data/test.txt
测试视频
./darknet detector demo cfg/voc-PD.data cfg/yolov4-voc-PD-test.cfg backup/yolov4-voc-PD_best.weights testvideo.mp4
可根据不同IoU阈值统计mAP
./darknet detector map cfg/voc-PD.data cfg/yolov4-voc-PD-test.cfg backup/yolov4-voc-PD_best.weights -iou_thresh 0.75
其实总体来看,YOLO的指令主要包括 1.darknet.exe 2.具体指令 train/test/demo/map 3.data文件路径 4.具体设置cfg文件路径 5.权值文件路径 6.载入文件路径 (要测试的图像、视频等)7.额外指令 -dont show 等