原文链接
源码地址
这篇文章的主要任务是将物体检测任务的各类奇技淫巧进行了总结和详细的实验。
目前很多特征表示都表明可以提升CNN的正确率,但是这些特征(技巧)有时候只适用于一类特定的问题或任务。作者想要在本研究中去探索哪些特征(技巧)会提升物体检测的性能。另外,目前一些准确率很高的物体检测模型不能实时使用,并且需要多GPU进行训练。为了克服这些问题,作者提出了一种可以单GPU训练的高精度模型(Yolov4)。
作者从主要从四个方面(网络结构、Bag of freebies、Bag of specials和其它技术)考虑现有的提点技术,并且组合它们验证在COCO数据集上的表现。
网络结构方面包括:(1)主体网络需要更大的输入尺寸(higher input nework size), 更多的层数以及更多的参数,因此最终选择了CSPDarknet53;(2)增加感受野和特征融合方法分别选择SPP Block和PANet。实际上Yolov4的主体结构就是CSPDarknet53 + SPP + PANet + Yolov3 (anchor based) head。
Bag of freebies指只增加训练时的消耗,例如数据增强和改变Loss函数等。
Bag of specials指增加推理时的耗费,但可以提升算法性能的方法,例如增大感受野,attention机制,特征融合,激活函数,NMS算法等。
其它技术包括:(1)文章引入了一种新的数据增强方法(马赛克&自对抗训练);(2)文章使用遗传算法选择最优参数;(3)文章修改了一些算法使其可以更好的适应训练。最终使用的方法如图。
文章的贡献如下:(1)YoloV4可以在单块GPU上完成训练。(2)文章验证了Bag of freebies和Bag of specials对物体检测的影响。(3)文章修改了一些目前已有的算法,使它们可以更好的完成训练。
OS:Ubuntu
CUDA: 10.1
CUDANN: 7.6.1
2.1.1 git获取源代码 git clone https://github.com/AlexeyAB/darknet.git
2.1.2 安装cmake(目前直接sudo apt install cmake,版本太低,yolo v4需要cmake在3.12以上)
$ sudo apt remove cmake
下载cmake压缩包,解压缩并cd到该文件夹
$ ./configure
$ sudo make
$ sudo make install
输入cmake --version
的时候,服务器报错/usr/bin/cmake: No such file
解决方法:把../cmake-3.16.6/bin/cmake
拷贝到/usr/bin
就可以,代码如下
$ sudo cp cmake /usr/bin/
$ mkdir build-release
$ cd build-release
$ cmake ..
$ make
$ make install
$ ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
主要参考链接为Github代码说明及每一步超详细!制作自己的voc数据集并通过yolov3训练。
VOC数据集格式如下:
文件夹包括:Annotations:所有图片的标注。ImageSets:训练集和验证集划分的train.txt和val.txt。JPEGImages:数据集中图片。labels:程序生成,后面具体介绍。
数据集整理主要包括两步:(1)生成train.txt和val.txt。文件中只包含图片的名字,不需要有路径。(2)生成label文件及用于训练的图片路径。Github中的代码./scripts/voc_label.py
按照自己的需求进行修改,需要修改的内容如图所示(classes改成自己的类别即可,因为是公司内部的标签,一个系统的很容易就知道,为了避免不必要的麻烦,打码了,请谅解)。代码首先根据xml中的标注信息生成label文件,文件存放地址为上图中的labels文件夹;代码还生成训练和验证图像的路径,根据图6a中修改分别存为2020_train.txt和2020_val.txt。
Step 1 生成obj.data
和obj.names
,前者如下图所示,后者内容为每一类的名字。
Step 2 修改yolov4-obj.cfg
文件,主要修改内容:
(1) max_batches
: (classes*2000 but not less than number of training images, and not less than 6000), f.e. max_batches=6000 if you train for 3 classes
(2) steps
: change line steps to 80% and 90% of max_batches
(3) classes
: change line classes=80 to your number of objects in each of 3 [yolo]-layers
(4) filters
: change [filters=255] to filters=(classes + 5)x3 in the 3 [convolutional] before each [yolo] layer, keep in mind that it only has to be the last [convolutional] before each of the [yolo] layers.
到这一步训练配置基本完成,运行训练代码
./darknet detector train cfg/obj.data cfg/yolov4-obj.cfg yolov4.conv.137 -map -gpus 1
该步骤是运用训练中保存的模型计算验证集上的mAP指标。
Step 1:运行darknet的测试代码生成每个类别的检测结果。运行代码是:
./darknet detector valid cfg/obj.data cfg/yolov4-obj.cfg backup/yolov4-obj_last.weights -gpus 0 -map
每个类别会生成一个txt文件保存位置在/darknet/results
。
Step 2:计算mAP指标。上一步生成的results文件夹复制到/darknet/scripts
。运行代码为:
python3 reval_voc_py3.py --voc_dir /home/bd/nsa/09_5w_172G_300G/VOCdevkit --year 2020 --image_set val --classes ../data/obj.names .