Yolov4: Optimal Speed and Accuracy of Object Detection

论文地址:https://arxiv.org/pdf/2004.10934.pdf

代码地址:https://github.com/AlexeyAB/darknet

大家应该都知道,Yolov4没有理论创新,而是在对近年来所有比较好的目标检测方法总结的基础上,取各家之所长,从数据处理到网络backbone选择再到训练,损失函数的设计,都是挑比较好的来直接用,并且作者写的一手好代码,实验设置也非常有说服力!笔者实践了一下,在单张图像上,效果貌似比EfficientDets还要好些,如下,上面是YoloV4,下面是EfficientDets官方给的结果。




yolov8 实例分割 返回结果_yolov8 实例分割 返回结果


注意右边那几个电瓶车

yolov8 实例分割 返回结果_yolov8 实例分割 返回结果_02

同注意右边那几个电瓶车


论文中提到在MS COCO数据集上达到了43.5% AP,速度也很快,在Tesla V100上是~65FPS。


yolov8 实例分割 返回结果_CUDA_03


注意看之前霸榜的EfficientDets和Yolov4,相同AP的情况下,yolov4相比前者FPS差不多是两倍的样子,但是精度最好还是比D4要差一些。

论文大致解析

大神不愧是大神,论文写的干货如此之多,把这些年目标检测的整个方法论(套路。。)大致梳理了下,如下图:


yolov8 实例分割 返回结果_github_04


无论是one-stage还是two-stage的目标检测方法,其大致都由以下几个part组成:


yolov8 实例分割 返回结果_yolov4论文_05


作者分别介绍了两种套路:

  • 一种是bag of freebies,指的是在训练上增加一些策略,达到更高的精度并且在测试的时候不会增加额外的时间的策略;比如数据增广的方法图像几何变换、CutOut、grid mask等,网络正则化的方法DropOut、DropBlock等,类别不平衡的处理方法、hard sample 挖掘方法、损失函数的设计等。
  • 一种是bag of specials 值得是会稍微增加测试时间,但是可以提高较多的精度的方法。比如增大模型感受野的SPP、ASPP、RFB等,引入注意力机制Squeeze-and-Excitation (SE) 、Spatial Attention Module (SAM)等 ,特征集成方法SFAM , ASFF , BiFPN等,改进的激活函数Swish、Mish等,或者是后处理方法如soft NMS、DIoU NMS等。

在此基础上,作者定下了Yolov4的整体架构和使用的套路:


yolov8 实例分割 返回结果_github_06


最后就是实验部分了,实验设置的非常丰富,感兴趣的可以去论文自己看。笔者一直觉得算法工程师最需要掌握的技能之一就是实验设置,如何证明你的策略/想法是有效的,需要设置严谨有说服力的实验才行。希望大家都能细读这片论文,收获肯定会很大!

实测步骤

首先打开前面提供的Github地址,https://github.com/AlexeyAB/darknet,在一个配置是这样的机器上:

  • CMake>=3.8
  • CUDA 10.0(如果这个版本不符合的话,可以参考笔者的一篇博客介绍如何配置多版本的CUDA并且在多版本之间切换,地址如下:

完美解决由于CUDA版本不匹配造成的各种坑mbd.baidu.com

yolov8 实例分割 返回结果_yolov8 实例分割 返回结果_07


  • OpenCV>2.4,这个笔者试过,没有也是可以跑的。如果有的话,路径得按照这样的去配((on Windows set system variableOpenCV_DIR=C:opencvbuild- where are theincludeandx64foldersimage)
  • cuDNN>7.0 for CUDA 10.0
  • GPU with CC>=3.0
  • Linux GCC/Clang , windows MSVC 2015/2017/2019

然后需要下载yolo_weights:

https://drive.google.com/file/d/1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT/viewdrive.google.com


git clone https://github.com/AlexeyAB/darknet
cd darknet 
make
wget https://20190524.oss-cn-hangzhou.aliyuncs.com/test_img.png
./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights


按照上面代码输入后,打印相关信息之后会提示输入图像路径,输入 test_img.png 就好了!

在视频上测试结果,笔者使用的环境是Tesla P100 一张。