论文链接
代码链接
先盗一张大佬总结的图:
个人如何看待yolov4
Yolov4的作者在论文中通篇都在强调其实用性,它并不是一篇面向学术界的paper,从学术角度看待它确实令人大失所望,但是它在工业界是具有一定价值和指导意义的。虽不是出自Joseph Redmon之手,但仍然继承了yolo系列算法的核心思想:快速、高效、实用性。只是在大量的tricks的堆积下,显得有点臃肿,这些tricks迁移到自己的数据集上还是要去验证其有效性的。这可能也是让大家觉得yolov4没了之前那个味的主要原因吧,失去了简洁和优雅的特点。个人将它视为一本优秀的目标检测trick指导手册,配上大量的消融实验,也给各位炼丹师指了一条明路。
个人实验
初步跑了一下,,未调参,相比Yolov3提升1-2个百分点,416X256的输入在GTX1080上/[email protected]大概40FPS。之前的pytorch-yolov3大概是58FPS。不知道是不是使用的姿势不对,还是darknet本身就慢于pytorch。后续会补更多的测试结果。
一、主要贡献
目前最好的目标检测网络无法满足实时性,并且需要大量的GPU进行大批量的训练。追求的是满足实时生产环境下的高效目标检测器,而不是追求降低理论指标(BFLOP)。因此yolov4主要贡献:
- 提出速度更快、精度更好的检测模型,仅需要单张1080Ti或2080Ti即可完成训练
- 验证了目前SOTA的Bag-of-Freebies(不增加推理成本的trick)和Bag-of-Specials(增加推理成本的trick)的有效性
- 修改了SOTA方法,让其更高效且更合适地在单卡进行训练,包括CBN、PAN、SAM等
二、相关工作
2.1、目标检测模型
目前的检测模型通常由两部分组成:
- Backbone:在ImageNet上预训练的网络主干(pre-trained on ImageNet)
- GPU:VGG、ResNet、ResNeXt、DenseNet
- CPU:SqueezeNet、MobileNet、ShuffleNet
- Head:预测类别及目标边界框(predict classes and bounding boxes of objects)
- Two-stage:faster R-CNN、Libra R-CNN
- One-stage:YOLO、SSD、RetinaNet
- anchor-free one-stage:CenterNet、CornerNet、FCOS
近几年发展起来的目标检测网络还会在Backbone和Head中间插入一些层,用于收集不同阶段的特征图
- Neck:由几个自下而上的路径和几个自上而下的路径组成(several bottom-up paths and several top- down paths.),如FPN、PAN、BiFPN、NAS-FPN
综上所述,通常目标检测由几个部分组成:
2.2 Bag of freebies(不增加推理成本的trick)
- 调整图像的亮度、对比度、色调、饱和度和噪声;添加了随机缩放、裁剪、偏移和旋转。
- random erase、CutOut、hide-and-seek、grid mask
- CutMix、MixUp
- GAN
- 数据不平衡的处理:hard negative example mining、online hard example mining、focal loss
- Label smooth
- 边界框损失函数:GIOU、DIOU、CIOU
我们将只改变训练策略或只增加训练成本的方法称为“Bag of freebies”,目标检测中满足Bag of freebies最直接的方法就是数据增强。数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性。例如,光照畸变和几何畸变是两种常用的数据增强方法,它们有利于目标检测任务。在处理光照失真时,本文调整图像的亮度、对比度、色调、饱和度和噪声。对于几何失真,本文添加了随机缩放、裁剪、偏移和旋转。上面提到的数据增强方法都是逐像素调整,并且保留了调整区域中的所有原始像素信息。
此外,一些从事数据增强的研究者把重点放在模拟物体遮挡问题上。在图像分类和目标检测方面取得了良好的效果。例如,random erase和CutOut可以随机选择图像中的矩形区域,并以随机区域或者0进行填充。对于hide-and-seek和grid mask,它们随机或均匀地选择图像中的多个矩形区域,并将它们替换为全部零。如果将类似的概念应用于featuremap,则有DropOut、DropConnect和DropBlock方法。
此外,一些研究者还提出了利用多幅图像进行数据增强的方法。例如,MixUp使用两个图像以不同的系数比率进行乘法和叠加,然后使用这些叠加比率调整标签。对于CutMix,它是将裁剪后的图像覆盖到另一张图像的矩形区域,并根据混合区域的大小调整标签。
除了上述方法外,样式转移GAN还用于数据增强,这样的使用可以有效地减少CNN学习到的纹理偏差。
与以上提出的各种方法不同,一些其他的Bag of freebies方法致力于解决这些数据集中的原始分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类之间存在数据不平衡的问题,这一问题通常通过two-stage中的hard negative example mining或online hard example mining来解决。但这种方法不适用于one-stage的方法,因为one-stage属于密集预测结构,因此提出了focal loss去解决不同类别之间的数据不平衡问题。
另一个非常重要的问题是用one-hot对不同类别进行编码很难表达不同类别之间的关联程度,因此提出了label smoothing,在训练中将hard label变成soft label,可以使模型更加鲁棒。为了获得更好的soft label,引入了知识蒸馏的概念来设计网络。
最后一个bag of freebies的方法是边界框损失函数。传统的目标检测通常采用均方误差(MSE)直接对BBox的中心点坐标和高度、宽度进行回归。然而,直接估计BBox中每个点的坐标值就是把这些点单独作为自变量来处理,但实际上并没有考虑到对象本身的完整性。为了更好的解决这个问题,一些研究人员最近提出了IoU损失,其中考虑了预测BBox面积和地面真实BBox面积的IOU,由于IoU是尺度不变的表示,它可以解决传统方法计算{x,y,w,h}的l1或l2损失时,损失会随着尺度的增大而增大的问题。最近,一些研究人员继续改善借据损失。例如,GIoU loss是除了覆盖区域之外还包括对象的形状和方向。他们建议找出能同时覆盖预测BBox和地面真值BBox的最小面积BBox,并使用此BBox作为分母来代替IoU损失中最初使用的分母。对于DIoU损失,它另外考虑了物体中心的距离,而CIoU损失,它同时考虑了重叠区域、中心点之间的距离和光谱。CIoU算法在BBox回归问题上具有较好的收敛速度和精度。
2.3 Bag of specials(增加推理成本的trick)
Bag of specials是指只会增加少量推理成本但能显著提高目标检测精度的插件模块和后处理方法。
-
增强感受野的常见模块:
- SPP(不同大小的最大池化):YOLOv3-608在MS-COCO目标检测任务中以0.5%的额外计算代价将AP50升级了2.7%。
- ASPP(不同大小的空洞卷积)
- RFB(空洞卷积+inception):RFB[47]仅需7%的额外推断时间,即可将MS-COCO上SSD的AP50提高5.7%。
-
引入注意力机制:
- Squeeze-and-Excitation (SE) :虽然SE模块可以在ImageNet图像分类任务中以仅增加2%的计算量为代价提高ResNet50的功率1%top-1精度,但在GPU上,它通常会增加约10%的推理时间,因此更适合在移动设备中使用。
- Spatial Attention Module (SAM):0.1%的额外计算,并且它可以提高ResNet50 SE 0.5%在ImageNet图像分类任务中的top-1精度。最重要的是,它根本不影响GPU上的推理速度。
-
特征集成方法:
-
SFAM:利用SE模块对多尺度级联特征映射进行通道级重加权。
ASFF:使用softmax作为逐点重加权,然后添加不同尺度的特征映射。
-
- BiFPN:提出了多输入加权残差连接来进行尺度层次的加权,然后加入不同尺度的特征映射。
- 激活函数:LReLU、PReLU、ReLU6、SELU、Swish、hard-Swish、Mish
- NMS:greedy NMS、soft NMS、DIoU NMS
三、方法
yolov4的基本目标是在实际生产环境中快速运行和并行计算的优化,而不是低计算量理论指标(BFLOP),本文提出了两种实时神经网络方案:
- 对于GPU:使用少量的分组卷积(1-8):CSPResNeXt50/CSPDarknet53
- 对于VPU:使用分组卷积,不使用Squeeze-and-excitement(SE)。主要包括以下模型:Ef ficientnet lite/MixNet/GhostNe/mobilenet3
3.1 网络结构选择
yolov4的最终结构:
- Backbone:CSPDarknet53
- Neck:SPP、PANet
- HEAD:YOLOv3(anchor based)
我们的目标是在网络输入分辨率,卷积层数,参数量和层输出通道数量之间找到最佳平衡。例如,我们的实验表明,在ImageNet的分类数据集上,CSPResNext50比CSPDarknet53要好得多。然而,在MS-COCO目标检测数据集上CSPDarknet53上要好于CSPResNext50。
针对不同的检测器,从不同的主干中选择合适的模块以增加感受野和不同feature map的最佳参数融合方法。如PAN、ASFF、BiFPN。
对于检测来说,分类最佳的参考模型并不总是最优的。与分类任务不同的是,检测任务要求如下:
- 更大的输入分辨率,用于检测多个小尺寸物体
- 更多的层,更大的感受野,以覆不同大小的输入
- 更多的参数,提高模型在单个图像中检测不同大小的多个对象的能力
我们可以假设一个具有较大感受野的(包含大量3×3的卷积)和大量参数的模型主干。表1显示了CSPResNeXt50,CSPDarknet53和EfficientNet B3的信息。 CSPResNext50仅包含16个3×3卷积层,一个425×425感受野和20.6 M参数,而CSPDarknet53包含29个3×3卷积层,一个725×725感受野和27.6 M参数。这种理论上的论证,再加上我们的众多实验,表明CSPDarknet53神经网络是两者作为检测器主干的最佳模型。
不同大小的感受野的影响总结如下:
- 提高目标对象的大小,允许查看整个目标对象
- 提高网络大小,允许查看整个对象的上下文信息
- 非常大的网络,增加图像点和最终激活值之间的连接
最后,我们提出了yolov4的最终结构
- Backbone:CSPDarknet53
- Neck:SPP、PANet
- HEAD:YOLOv3(anchor based)
3.2 选择 BoF and BoS
为了改进对象检测训练过程,CNN通常使用以下方法:
- 激活函数:ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish
- 边界框损失函数:MSE, IoU, GIoU, CIoU, DIoU
- 数据增强:CutOut, MixUp, CutMix
- 正则化方法:DropOut, DropPat,Spatial DropOut, or DropBlock
- Normalization:Batch Normalization (BN) , Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN) , or Cross-Iteration Batch Normalization (CBN)
- Skip-connections:Residual connections, Weighted residual connections, Multi-input weighted residual connections, or Cross stage partial connections (CSP)
对于激活函数,PReLU和SELU难以训练,ReLU6是专门为量化网络设计,因此我们从候选列表中删除了这些激活函数。
对于正则化方法,DropBlock的作者已经和其他方法进行了比较,并且优于其他方法,因此我们直接选择DropBlock作为我们的正则化方法。
对于Normalization,我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。
3.3 其他的改进
为了使设计的检测器更适合在单个GPU上进行训练,我们进行了以下附加设计和改进:
-
引入了一种新的数据增强方法:Mosic,以及自我对抗训练(SAT)
- Mosaic 表示一种新的数据增强方法,该方法混合了4个训练图像。然而 CutMix 只有两个输入图像。这样就可以检测到超出其正常上下文的对象。此外,批量归一化从每层上的4张不同图像计算激活统计信息。这大大减少了对大批量生产的需求。
自我对抗训练(SAT)也代表了一项新的数据增强技术,它分为两个前后阶段。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自身进行对抗性攻击,改变原始图像,从而产生图像上存在节点所需对象的欺骗。在第二阶段中,训练神经网络以正常方式检测该修改图像上的目标。
应用遗传算法选择最佳超参数
-
修改了一些现有方法,使我们的设计适合进行有效的训练和检测,修改了SAM、PAN和Cross mini-Batch Normalization。
- Cross mini-Batch Normalization:其实就是累计多个mini-batch的梯度,然后作为一个batch进行一次梯度更新,对应的BN也是综合多个mini-batch的统计量,更新一次BN的参数。解决单卡大batch size训练显存溢出的问题。
- 改进的SAM:from spatial-wise attention to point- wise attention
- 改进的PAN:replace shortcut connection of PAN to concatenation
3.4 YOLOv4
yolov4的最终结构:
- Backbone:CSPDarknet53
- Neck:SPP、PANet
- HEAD:YOLOv3(anchor based)
四、实验
我们测试了不同训练改进技术对ImageNet(ILSVRC2012val)数据集分类精度的影响,然后测试了MS COCO(test dev 2017)数据集上检测的精度。
4.1 实验设置
在ImageNet图像分类实验中,默认的超参数如下:训练步骤为8,000,000;批量大小和最小批量大小分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1。预热步骤为1000;动量和重量偏差分别设置为0.9和0.005。我们所有的BoS实验都使用与默认设置相同的超参数,并且在BoF实验中,我们添加了额外的50%训练步骤。在BoF实验中,我们验证了MixUp,CutMix,Mosaic,模糊数据增强和标签平滑正则化方法。在BoS实验中,我们比较了LReLU,Swish和Mish激活功能的效果。所有实验均使用1080 Ti或2080 Ti GPU进行培训。
-
在MS COCO目标检测实验中,默认超参数如下:training steps为500500。采用step decay learning rate scheduling学习率衰减策略,初始学习率为0.01,分别在40万步和45万步上乘以系数0.1。momentum和weight decay分别设置为0.9和0.0005。使用单个GPU以batch size为64进行多尺度训练,而最小批处理大小为8或4则取决于架构和GPU内存限制。除了使用遗传算法进行超参数搜索实验外,所有其他实验均使用默认设置。遗传算法使用YOLOv3-SPP训练GIoU损失,并搜索300个纪元的最小值5k集。对于遗传算法实验,我们采用搜索学习率0.00261,momentum为0.949,IoU threshold为0.213,loss normalizer为0.07。我们已经验证了许多BoF和BoS
BoF BoS grid sensitivity elimination Mish mosaic data augmentation SPP IoU threshold SAM genetic algorithm RFB class label smoothing BiFPN cross mini-batch normalization Gaussian YOLO self- adversarial training cosine annealing scheduler dynamic mini-batch size DropBlock Optimized Anchors different kind of IoU losses
4.2 不同方法对于图像分类训练的影响
比较有效的是:CutMix and Mosaic data augmentation and Class label smoothing and Mish
4.3 不同方法对于目标检测训练的影响
- BOF
- BOS
4.4 不同的backbones和预训练权重对目标检测训练的影响
4.5 不同的mini-batch size对目标检测训练的影响
我们发现在添加BoF和BoS训练策略之后,小批量大小对检测器的性能几乎没有影响。
五、结果
不同架构的GPU对比
- Maxwell:GTX Titan X 、Tesla M40
- Pascal:Titan X、Titan Xp, GTX 1080 Ti, or Tesla P100
- Volta:Titan Volta 、Tesla V100
六、结论
YOLOv4牛逼