PaddlePaddle官方复现:
https://github.com/PaddlePaddle/PaddleDetection/blob/master/configs/yolo/README.md
DarkNet:https://github.com/AlexeyAB/darknet
PyTorch 网友复现:
https://github.com/Tianxiaomo/pytorch-YOLOv4
https://github.com/GZQ0723/YoloV4
https://github.com/miki998/YoloV4_PyTorch
TensorFlow 网友复现:
https://github.com/klauspa/Yolov4-tensorflow
https://github.com/xiao9616/yolo4_tensorflow2
https://github.com/rrddcc/YOLOv4_tensorflow
https://github.com/hunglc007/tensorflow-yolov4-tflite
Keras网友复现:
https://github.com/Ma-Dan/keras-yolo4
QtGUI网友复现:
https://github.com/scutlrr/Yolov4-QtGUI
更多内容,欢迎关注公众号:
论文翻译:
YOLOv4: Optimal Speed and Accuracy of Object Detection
YOLOv4:优化目标检测的速度和精度
论文下载地址:https://arxiv.org/abs/2004.10934
摘要:
有大量的特征被认为可以提升卷积神经网络的精度。
将这些特征进行组合后在大规模数据集上进行实际的测试,并给出理论层面的正当理由,是必要的。
有些特征针对特定问题、特定模型,或者仅仅是针对小规模数据集起作用。
与此同时,有些特征,例如批标准化、残差链接能够在绝大多数模型、任务和数据集上发挥作用。
我们假设这些普适性的特征包括权重残差连接WRC、跨级部分连接CSP、交叉小批量标准化cmBN、自我对抗训练SAT、Mish激活函数。
我们将上述特征与马赛克数据增强、卷积正则化方法DropBlock、CIoU损失等进行联合,得到了最先进的结果:在MS COCO数据集上基于 Tesla V100,实现了精度为 43.5%AP (65.7% AP50) ,实时速度 ∼65 FPS的目标检测 . 源码连接https://github.com/AlexeyAB/darknet
1、引言
大多数基于卷积神经网络的目标检测仅大规模应用在推荐系统中。
例如,利用低速精确模型通过城市摄像头可以搜索空闲停车位 ,高速不准确模型可用于车辆碰撞预警。
提升实时目标检测的精度可以使它们不仅用于提示生成推荐系统,而且可以独立流程管理和减少人力投入。
基于传统GPU的实时目标检测允许它们以可接受的价格处理高负荷任务。
最精确的现代化神经网络并非实时运算,并且需要大量的GPU训练较大的小批量尺寸。
我们通过创造一个能够在传统GPU上实时运算的卷积神经网络来解决这些问题,训练阶段仅使用一个传统的GPU。
这篇论文的主要目标是设计一个用于生产系统、并行计算优化的高速计算的目标检测器,而不是理论上较低计算能力系数 BFLOP。
我们期望设计出来的目标检测器能够易于训练和使用。
例如,任何人使用一个传统的GPU进行训练和测试都能够达到实时、高质量、可信服的目标检测结果,YOLOv4的结果如图1所示。
我们的贡献总结如下:
1.我们开发了一个高效强有力的目标检测模型。任何人能够使用一块1080Ti或2080Ti的GPU训练一个超快的精确目标检测器。
2.我们验证了当前最先进的免费策略和特色策略在目标检测训练阶段的影响。
3.我们修改了当前最先进的方法,使得它们更加适应单个GPU的训练,包括CBN,PAN,SAM等。
2.相关工作
2.1 目标检测模型
一个现代的目标检测器通常由2部分组成,一个基于ImageNet数据集的预训练骨干网络和一个用于预测类别和目标边框的检测头。
对于那些在GPU平台上运行的检测器,它们的骨干网络可以是VGG,ResNet,ResNeXt或者DenseNet。
对于那些在CPU平台上运行的检测器,它们的骨干网络可以是SqueezeNet,MobileNet或者ShuffleNet。
对于检测头,通常分类两类,即单阶段目标检测和两阶段目标检测。
最具代表性的两阶段目标检测器是R-CNN系列,包括了fast R-CNN,faster R-CNN,R-FCN,和Libra R-CNN。
将一个两阶段目标检测器变成anchor-free目标检测器是可能的,例如RepPoints。
最具代表性的单阶段目标检测器是YOLO,SSD和RetinaNet。
近些年来,anchor-free单阶段目标检测器得以发展。
这类检测器有CenterNet,CornetNet,FCOS等等。
近年来发展的目标检测器通常在骨干网络和检测头之间插入一些层,这些层通常用于在不同阶段收集特征图。
我们称之为目标检测器的瓶颈。
通常,一个瓶颈由多个自底向上的路径和多个自顶向下的路径。
具备这种机制的网络包括FPN,PAN,BiFPN和NAS-FPN。
除了上述的模型,一些研究人员聚焦于直接构建一个新的骨干网络(DetNet,DetNAS)或者一个新的完整模型(SpineNet,HitDetector)用于目标检测。
总的来说,一个常见的目标检测器由多个部分组成:
输入:图像、批、图像金字塔
骨干网:VGG16,ResNet-50,SpineNet,EfficientNet-B0/B7,CSPResNeXt50,CSPDarknet53
瓶颈:
附加块:SPP,ASPP,RFB,SAM
路径融合块:FPN,PAN,NAS-FPN,全连接FPN,BiFPN,ASFF,SFAM
检测头:
密度预测(单阶段):
基于锚框的:RPN,SSD,YOLO,RetinaNet
无锚框的:CornerNet,CenterNet,MatrixNet,FCOS
稀疏预测(两阶段):
基于锚框的:Faster R-CNN,R-FCN, Mask R-CNN
无锚框的:RepPoints
2.2 赠品包
通常,一个常见的目标检测器是离线训练的。因此,研究人员常常喜欢利用这个优势开发出更好的训练方法使得目标检测器能够获得更好的精度而不会增加推理时间。我们称这些方法为仅仅改变训练策略或者仅仅增加训练时长的赠品包。
经常被目标检测采用的方法并且满足赠品包定义的是数据增强。
数据增强的目的是增加输入图片的变化性,使得设计出来的目标检测模型对于不同环境下获取的图片有更强的鲁棒性。
例如,感光畸变和几何扭曲是两个常用的图像增强方法,她们的确会对目标检测任务有好处。
在处理感光畸变中,调整亮度、对比度、色调、饱和度和图像的噪点。
在几何畸变中,增加随机缩放、裁剪、翻转和旋转。
上述的数据增强方法都是像素级别的调整,所有原始的像素信息在被调整的区域内是被保留的。
此外,一些研究人员从事数据增强时关注仿真目标遮挡的问题。
他们在图像分类和目标检测中取得了不错的结果。
例如,random erase 和 CutOut 能够在一张图片中随机选取矩形区域并以随机数或与零互补的数进行填充。
对于hide-and-seek 和grid mask, 它们随机地或者均匀地在一张图片中选择多个矩形区域并将其替换为全零值。
如果相似的概念被应用在特征图上,它们是DropOut,DropConnect 和DropBlock方法。
此外,一些研究人员提出同时使用多个图片实现数据增强的方法。
例如,MixUp使用两张图片相乘并以不同的系数进行叠加,然后根据叠加的系数调整标签。
CutMix 将裁剪后的图片覆盖到其他图片上,依据混合区域的尺寸调整标签。
除了上述提及的方法,风格迁移GAN同样被用于数据增强,可以有效减少CNN学习到的纹理偏差。
与上述多种方法不同,有些免费方法献身于解决数据集中语义分布存在偏差的问题。
在解决语义分布偏差问题时,一个关键问题是不同类别的数据之间存在不均衡的问题,这个问题通常在两阶段目标检测器中被难例挖掘或者在线难例挖掘所解决。
但是,这种样例挖掘方法在单阶段目标检测器中不可用,因为这种检测器属于密集预测架构。
因此Lin等人提出了focol loss来解决不同类别数据存在不均衡的问题。
另一个非常重要的问题是,独热编码很难表达不同类别之间的关联程度。
这种表达方式常常在执行打标签时被使用。
标签平滑化[73]被学者提出,用于将硬标签转换为软标签用于训练,能够让模型更加鲁棒。
为了获得一个更好的软标签,Islam等人引入了知识蒸馏的概念来设计标签改良网络.
最后一个免费策略包是边界框回归目标函数.传统的目标检测器使用均方误差对bbox的中心点坐标和宽高直接展开回归,或者是左上右下点.
对于基于anchor的方法,需要估计偏移量.
然而,对bbox的每个点直接估计坐标值,使得每个点变成了独立的变量,但实际上没有考虑目标的整体性.
为了让这个问题更好的处理,一些研究人员提出了IoU损失函数,将预测的bbox与标注的bbox的覆盖情况考虑进来。
IoU损失的计算过程会 以 计算与标注框的IOU的方式 触发四个坐标点的计算, 然后连接生成的结果得到一个完整的代码。
由于IoU是一个尺度不变的表示,它能够解决问题:传统的方法计算l1或l2损失会随着尺度增加而增大。
最近,一些研究人员持续改进IoU损失。
例如,GIoU损失将形状和目标的朝向附加到覆盖区域。
他们提出找到最小的bbox同时覆盖预测bbox和标注的bbox,然后使用这个bbox作为分母替换IoU损失中的分母。
对于DIoU损失,而外考虑了目标中心的距离,CIoU损失,从另一个方面同时考虑了相交的区域,中心点的距离和宽高比。
CIoU在bbox回归问题上能够达到最好的收敛速度和精度。
2.3 特色包
对于那些 仅让推理时间增加一点点但是能够显著提升目标检测精度的 插件模块和后处理方法,我们称之为特色包。
一般来说,这些插件模块 用于在一个模型中增强特定的属性,例如扩大感受野、引入注意力机制,或者强化特征融合能力等等,后处理是一个 筛选模型预测结果 的方法。
可被用于提升感受野的常见的模块有 SPP、ASPP以及RFB。 SPP模块来自于空间金字塔匹配SPM[39],SPM最初被用于分割特征图至多个d*d相等大小的块,因此形成了空间金字塔,然后提取词袋特征。
SPP结合SPM进入CNN并使用最大池化操作而不是词袋操作。
SPP模块由He等人提出,将输出一维特征向量,应用在全卷积网络中是不可行的。
因此YOLO V3的设计中,改进了SPP模块为附加的最大池化输出,核大小为k*k,k={1,5,9,13},
步长都是1.
在这种设计下,相对较大的k*k最大池化有效的增加了骨干特征的感受野。
增加改进版本的SPP模块后,YOLOV3-608在MSCOCO目标检测任务上提升了AP50 2.7%在增加了0.5%而外计算量的情况下。
ASPP与改进版SPP在操作上的差异主要是来自于原始的k*k核尺寸,最大池化的步长等于1对于多个3*3大小,膨胀比例等于k,步长等于1在空洞卷积操作中。
RFB模块用多个k*k膨胀卷积,膨胀比例是k,步长是1来获取比ASPP更加详尽的空间覆盖。
RFB仅仅增加了7%的推理时间,换来了SSD在MSCOCO上5.7%的AP50提升。
注意力模块经常被用于目标检测,主要被分为通道注意力和点注意力,这两种注意力模型的代表是SE网络[29]和空间注意力模型SAM[85].
尽管SE模型可以使得仅仅增加2%的计算量的前提下使得ResNet50在ImageNet图像分类任务上提升1%的精度,但是在GPU上通常会增加10%的推理时间,因此更加适用于移动端。
但对于SAM,仅仅增加0.1%的计算量,可以使ResNet50-SE在ImageNet图像分类任务上提升0.5%的精度。
最好的是,SAM不会影响GPU上的推理速度.
特征融合,早期的实践是使用跳跃连接或者超级列将低级别的物理特征与高级别的语义特征进行融合。
自从诸如FPN的多尺度预测方法变得流行,很多轻量级的集成了不同特征金字塔的模块逐渐被提出。
包括SFAM,ASFF以及BiFPN。
SFAM的主要思想是使用SE模块执行通道级别的重赋权在多尺度拼接特征图上。
ASFF,使用softmax作为点级别的重赋权然后将不同尺度的特征图相加。
BiFPN,多输入权重的残差连接被提出,用于执行尺度级别的重赋权,然后将不同尺度的特征图进行相加。
在深度学习的研究中,一些人聚焦于搜索更好的激活函数。一个好的激活函数能够是的梯度更加有效的传播,同时,不会造成太多而外的计算量。
2010年,ReLU被提出用于解决梯度消失的问题,它经常与tanh和sigmoid函数同时被提到。
随后,LReLU,PReLU,ReLU6,SELU,Swish,硬-swish以及mish等同样被用于解决梯度消失问题的函数被相继提出。
LReLU和PReLU的主要目的是解决ReLU小于零时梯度为0的问题。
对于ReLU6和硬-swish,他们是专门被设计用于量化网络的。
对于自我标准化一个神经网络,SELU激活函数被提出来满足这个目标。
需要强调的是 swish和mish是连续可微的激活函数。
后处理方法通常被用于基于深度学习的目标检测是NMS算法,可以被用于过滤bbox较差的预测相同的目标,仅仅保留候选bbox中拥有较高反馈的结果。
NMS尝试改进的方式 与优化目标函数 具有一致性。
原始的nms没有考虑到上下文信息,因此Girshick等人[19]增加了分类置信度得分在RCNN中作为参考,根据置信度得分的顺序,贪心算法版本的NMS以置信度得分从高到底的顺序执行。
对于soft-nms,它考虑了贪心的nms算法会因为物体被遮挡,而损坏置信度得分的问题。
DIoU nms开发者在bbox的筛选过程中增加了基于soft nms的中心点的距离信息 。
值得提及的是,上述的后处理方法没有直接引用捕获的图像,在anchor-free方法中,后处理不再需要后处理算法。
3.方法论
基本目标是神经网络快速计算速度,在生产系统中优化并行计算,而不是低级的理论计算速度指标。
我们展示两种实时神经网络的选择:
GPU,我们使用了少量的分组,在卷积层:
VPU,我们使用分组卷积,但是避免使用SE模块,具体来说,包括以下模型:EfficientNet-lite、MixNet、GhostNet、MobileNet v3.
3.1 架构选择
我们的目标是 在 输入网络的分辨率、卷积层数目、参数数量、卷积核的个数 之间找到优化的平衡。
例如,我们众多的研究展示了CSPResNext50 在基于ILSVRC2012数据集的目标分类上比CSPDarknet53 更好。
然而,反过来,在COCO数据集上,后者比前者在目标检测领域更好。
下一个目标是选择增加的模块用于增大感受野以及最好的方法用于在不同骨干网络层之间进行参数融合用于不同的检测器层:例如FPN,PAN,ASFF,BiFPN
一个参考模型 在分类上进行了优化 并非总是在检测上取得了优化。
与分类相比,检测器需要满足以下条件:
更高的输入分辨率,用于检测小尺寸物体
更多的网络层,获得更大的感受野来覆盖增大的输入尺寸
更多的参数,获得在单个图片中检测多个不同尺寸的物体更强的能力
我们可以假设一个模型拥有更大的感受野,和更大数量的参数 应该被选为骨干网络。
表格1展示了CSPResNeXt50,CSPDarknet53和EfficientNet B3的信息。
CSPResNeXt50仅仅包含了16层3*3卷积层,425*425感受野,以及20.6M个参数,
CSPDarknet53包含29层3*3卷积层,725*725感受野,27.6M个参数。
这些理论的正当理由,伴随我们的大量实验,表明了CSPDarknet53是二值之间更适合目标检测的网络模型。
不同尺寸感受野的影响总结如下:
对物体尺寸来说:允许看见整个物体
对网络尺寸来说:允许看见物体的周围纹理
超越网络尺寸:增加了图像点和最终激活之间的连接
我们在CSPDarknet53上增加了SPP模块,由于它显著的加了感受野,分离了重要的纹理特征并且几乎没有增加网络的计算速度。
我们使用PANet作为参数融合的方法从不同的骨干网络层之间,用于不同的检测器层,替代了YOLOV3中使用的FPN。
最终,我们选择了CSPDarknet53骨干网,SPP附加模块,PANet路径融合瓶颈,以及YOLOV3的头 作为YOLOV4的架构。
在未来,我们计划扩张赠品包的内容用于检测器,理论上可以解决一些问题以及增加检测器的精度,从而验证每个特征的影响力以一种实验的方式进行。
我们没有使用交叉GPU的批标准化或者昂贵的专用设备。这使得每个人都能够复现我们的SOTA结果在一个常见的图像处理单元上,例如GTX1080Ti或 RTX 2080Ti
3.2 选择BoF和BoS
为了提升目标检测训练,一个CNN常用到下列技术:
激活函数:ReLU,泄露ReLU,参数的ReLU,ReLU6,SELU,swish,mish
边框回归损失函数:MES,Iou,GIoU,CIoU,DIoU
数据增强:CutOut,MixUp,CutMix
正则化方法:DropOut,DropPath,空间DropOut,或者DropBlock
通过均值方差进行网络激活函数的标准化:BN,交叉GPU的BN,过滤响应标准化,交叉迭代BN
跳跃连接:残差连接,权重残差连接,多输入残差连接,交叉阶级空间连接
对于训练激活函数,PReLU和SELU更难训练,ReLU6专门被设计用于量化网络,因此不再考虑上述的激活函数。
在正则化方法中,提出了DropBlock的作者详细地比较了他们的方法与其他方法,他们的方法表现的非常优秀。
因此,我们毫不犹豫的选择了DropBlock作为我们的正则化方法。
对于标准化方法的选择,我们聚焦于仅在单个GPU上训练,因此syncBN不再考虑。
3.3 附加的提升
为了让设计的检测器更加适应单个GPU,我们做出了附加的设计和提升:
引入一个新的数据增强方法:马赛克 和 自我对抗训练
选择最优的超参数,使用遗传算法
修改现有方法让我们的设计更加适应有效的训练和检测,修改版SAM,修改版PAN,以及交叉小批量标准化
马赛克代表了一种新型的数据增强方法,混合4个训练图片。
因此4中不同的背景进行了混合,CutMix仅仅混合了2个输入图片。
这使得检测目标在常规背景之外进行。
此外,批标准化计算激活统计量从不同层上计算4个不同的图片。
这显著减少了更大mini-batch的尺寸的需求。
自我对抗训练也代表了一种新的数据增强技术,在2个前向传播的阶段中进行。
在第一个阶段中,神经网络改变传统的图片替代网络权重。
以这种方式,神经网络自我执行对抗攻击,修改原始图片,创造图片中没有期望目标的骗局。
在第二阶段中,神经网络被训练以正常的方式检测修改后的图片中的目标。
CmBN代表 一种交叉小批量标准化(CBN)的修改版本,如图4所示。仅仅在一个批量内部的多个小批量之间收集统计信息。
我们修改了SAM 从空间注意力机制转向点注意力机制,将PAN中的短路连接替换为拼接,分别如图5、图6所示。
3.4 YOLO V4
在这部分,我们会详细解释YOLOV4的细节。
YOLOV4由以下部分组成:
骨干网络:CSPDarknet53
瓶颈:SPP,PAN
头:YOLOV3
使用了以下技巧:
用于骨干网络的免费包: CutMix 以及模糊化数据增强,DropBlock正则化,类别标签平滑化
用于骨干网络的特色包:mish激活函数,交叉阶段空间连接,多输入权重残差连接
用于检测器的免费包:CIou损失,CmBN,DropBlock正则化,模糊化数据增强,自我对抗训练,消除网格敏感性,对单个gt框使用多个默认框,余弦退火调度,优化超参数,随机训练形状
用于检测器的特色包:mish激活函数,spp,SAM,PAN路径融合,DIoU-NMS,
4 实验
我们测试了不同的训练改进技巧在ImageNet数据集上分类精度的影响,以及在MSCOCO数据集上检测器的精度影响。
欢迎关注我的公众号: