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官方给的结果。
注意右边那几个电瓶车
同注意右边那几个电瓶车
论文中提到在MS COCO数据集上达到了43.5% AP,速度也很快,在Tesla V100上是~65FPS。
注意看之前霸榜的EfficientDets和Yolov4,相同AP的情况下,yolov4相比前者FPS差不多是两倍的样子,但是精度最好还是比D4要差一些。
论文大致解析
大神不愧是大神,论文写的干货如此之多,把这些年目标检测的整个方法论(套路。。)大致梳理了下,如下图:
无论是one-stage还是two-stage的目标检测方法,其大致都由以下几个part组成:
作者分别介绍了两种套路:
- 一种是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的整体架构和使用的套路:
最后就是实验部分了,实验设置的非常丰富,感兴趣的可以去论文自己看。笔者一直觉得算法工程师最需要掌握的技能之一就是实验设置,如何证明你的策略/想法是有效的,需要设置严谨有说服力的实验才行。希望大家都能细读这片论文,收获肯定会很大!
实测步骤
首先打开前面提供的Github地址,https://github.com/AlexeyAB/darknet,在一个配置是这样的机器上:
- CMake>=3.8
- CUDA 10.0(如果这个版本不符合的话,可以参考笔者的一篇博客介绍如何配置多版本的CUDA并且在多版本之间切换,地址如下:
完美解决由于CUDA版本不匹配造成的各种坑mbd.baidu.com
- OpenCV>2.4,这个笔者试过,没有也是可以跑的。如果有的话,路径得按照这样的去配((on Windows set system variable
OpenCV_DIR
=C:opencvbuild
- where are theinclude
andx64
foldersimage) - 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 一张。