[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录

文章目录

    • 1. 论文内容
    • 2.代码调试
      • 2.1 服务器环境配置
      • 2.2 编译Yolo V4源码
      • 2.3 单帧图像测试
      • 2.4 在自己的数据集上训练和验证
        • 2.4.1 数据整理成VOC的格式
        • 2.4.2 修改配置文件
        • 2.4.3 YoloV4训练
        • 2.4.4 mAP指标计算

原文链接
源码地址

1. 论文内容

  这篇文章的主要任务是将物体检测任务的各类奇技淫巧进行了总结和详细的实验。

  目前很多特征表示都表明可以提升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)文章修改了一些算法使其可以更好的适应训练。最终使用的方法如图。
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第1张图片
  文章的贡献如下:(1)YoloV4可以在单块GPU上完成训练。(2)文章验证了Bag of freebies和Bag of specials对物体检测的影响。(3)文章修改了一些目前已有的算法,使它们可以更好的完成训练。

2.代码调试

2.1 服务器环境配置

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/

2.2 编译Yolo V4源码

$ mkdir build-release
$ cd build-release
$ cmake ..
$ make
$ make install

2.3 单帧图像测试

$ ./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg

得到的结果如下:
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第2张图片

2.4 在自己的数据集上训练和验证

  主要参考链接为Github代码说明及每一步超详细!制作自己的voc数据集并通过yolov3训练。

2.4.1 数据整理成VOC的格式

   VOC数据集格式如下:
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第3张图片
   文件夹包括: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。
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第4张图片

2.4.2 修改配置文件

   Step 1 生成obj.dataobj.names,前者如下图所示,后者内容为每一类的名字。
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第5张图片
   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.

2.4.3 YoloV4训练

  到这一步训练配置基本完成,运行训练代码

./darknet detector train cfg/obj.data cfg/yolov4-obj.cfg yolov4.conv.137 -map -gpus 1

程序开始训练,并出现下图中曲线:
[Arxiv 2020] YOLOv4: Optimal Speed and Accuracy of Object Detection 论文笔记与调试记录_第6张图片

2.4.4 mAP指标计算

  该步骤是运用训练中保存的模型计算验证集上的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 .

你可能感兴趣的:(Object,Detection,论文阅读,环境搭建)