YOLOv4—object detection tricks set

GitHub地址:https://github.com/AlexeyAB/darknet
论文地址:https://arxiv.org/pdf/2004.10934.pdf

1.Backbone&Neck&Head

(1)CSPDarkNet
在这里插入图片描述
在这里插入图片描述

参考:https://blog.csdn.net/haha0825/article/details/106102762

(2)Neck
Additional blocks: SPP, ASPP, RFB, SAM

Path-aggregation blocks:FPN, PAN, NAS-FPN, fully-connected FPN, BiFPN, ASFF, SFAM

(3)head
One-Stage:

  • RPN,SSD,YOLO,RetinaNet (anchor based)
  • CornetNet,CenterNet,MatrixNet(anchor free)

Two-Stage:

  • RCNN, Fast RCNN,Faster RCNN, Mask-RCNN, R-FCN

2. Bag-of-Freebies

Bag of freebies的字面上的意思就是免费赠品。在目标检测中是指:用一些比较有用的训练技巧来训练模型,从而使得模型取得更好的准确率但是不增加模型的复杂度,也就是不增加推理(inference)时的计算量(cost)。

2.1 Data augmentation

几何增强:

  • 随机翻转(水平翻转较多,垂直翻转较少)
  • 随机裁剪(crop)
  • 拉伸
  • 旋转

色彩增强:

  • 对比度增强
  • 亮度增强
  • HSV空间增强(在HSV空间中,Hue(色彩)通道的取值从0-360°变化时,颜色从红->黄->绿->青->蓝逐步变化。Saturation(饱和度)从0->1变化时,色彩逐渐加深变成纯色(pure)。Value值从0->1变化时,图像整体亮度增加,V值为0时,图像为全黑,V值为1时,图像为全白)

这些data augmentation的方式都属于pixel-wise的增强。

扫描二维码关注公众号,回复: 12906357 查看本文章

解决目标遮挡的增强(在图像中):

  • random erase:对图像中随机选取一个矩形区域用随机值进行覆盖。在这里插入图片描述
  • CutOut:对图像中随机选取一个矩形区域用0进行覆盖。在这里插入图片描述
  • hide-and-seek:对图像进行网格划分,选取其中部分网格用特定值(0)进行填充。在这里插入图片描述
  • grid mask:与Hide-and-seek类似,也是先对图像划分网格,有规律地、均匀地选取部分区域进行填充。在这里插入图片描述

解决目标遮挡的增强(在特征图中):

  • DropOut:在这里插入图片描述
  • DropConnect:在这里插入图片描述
  • DropBlock:在这里插入图片描述

Mix-Up:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Cut-Mix:
简单来讲,就是从A图中随机截取一个矩形区域,用该矩形区域的像素替换掉B图中对应的矩形区域,从而形成一张新的组合图片。同时,把标签按照一定的比例(矩形区域所占整张图的面积)进行线性组合计算损失。

几种数据增强对比:
在这里插入图片描述

Mosaic:

  • 一次整合了4张图片,相较于只合了两张的CutMix,这使模型能够检测到更多的物体
  • 同时在计算BN的时候,一次相当于计算了四张,那么就减少了对大batch-size的依赖

在这里插入图片描述

Self-Adversarial Training (SAT):
SAT是新的数据增广技术,流程包括两个forward backward stages。第一阶段,网络调整输入图像而不是权重。此时网络自身执行对抗攻击,调整原始图像去欺骗网络图中没有预期目标。第二阶段,网络以正常的方式在调整的图片中检测目标。
在这里插入图片描述

2.2 class-label-smoothing

label smoothing就是一种正则化的方法而已,让分类之间的cluster更加紧凑,增加类间距离,减少类内距离,避免over high confidence的adversarial examples。

假设我们的分类只有两个,一个是猫一个不是猫,分别用1和0表示。Label Smoothing的工作原理是对原来的[0 1]这种标注做一个改动,假设我们给定Label Smoothing的值为0.1:

[ 0 , 1 ] × ( 1 − 0.1 ) + 0.1 / 2 = [ 0.05 , 0.95 ] [0, 1] \times (1-0.1) + 0.1/2 = [0.05, 0.95] [0,1]×(10.1)+0.1/2=[0.05,0.95]

可以看到,原来的[0,1]编码变成了[0.05,0.95]了。这个label_smoothing的值假设为 ϵ \epsilon ϵ,那么就是说,原来分类准确的时候, p = 1 p=1 p=1,不准确为 p = 0 p=0 p=0,现在变成了 p = 1 − ϵ p=1-\epsilon p=1ϵ ϵ \epsilon ϵ,也就是说对分类准确做了一点惩罚。

参考:https://www.datalearner.com/blog/1051561454844661

2.3 不平衡问题

主要有:

  • 类别(class)不均衡: 背景和物体之间的不均衡;物体与物体之间的不均衡
  • 尺度(scale)比例不均衡:object/box-level Imbalance; feature-level imbalance
  • 空间(spatial)尺寸不均衡:Imbalance in regression loss; IoU Distribution Imbalance; Object Location Imbalance
  • 目标函数(loss function)不均衡: Objective Imbalance

OHEM:
HEM:先训练模型收敛于当前的数据集合,然后固定模型,去除简单样本(能够轻易区分的),添加困难样本(不能够区分的)继续训练。OHEM则为在线难例挖掘。
在这里插入图片描述
Focal Loss:
One stage detector 不好的原因在于:

  • 极度不均衡的正负样本比例:那种近似于sliding window的方式会使得正负样本的比例接近于1000:1,而且绝大部份的负样本都是easy example。这就导致了接下来的问题:
  • Gradient被easy example所主导:即使easy example loss的数值很小,但是数量多,对于 loss占主导了地步,从而导致了收敛不够好。

Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。在交叉熵基础上改进两点:

  • 在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。
  • 此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均。文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分。

只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。而gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优。
在这里插入图片描述

参考:https://www.cnblogs.com/king-lps/p/9497836.html

ATSS:
在仔细比对了anchor-based和anchor-free目标检测方法后,结合实验结果,论文认为两者的性能差异主要来源于正负样本的定义,假如训练过程中使用相同的正负样本,两者的最终性能将会相差无几。
在这里插入图片描述

参考:https://blog.csdn.net/haha0825/article/details/106034574

2.4 loss function

IOU Loss:
BBOX 预测的时候,检测框的坐标是(x1,y1,x2,y2),与真实框的四个坐标计算loss。但是

  • MSE loss 将四个点当作孤立的点,没有考虑四个点之间的联系
  • 对于不同尺度的目标检测框所造成的损失是不一样的

而IOU具有尺度不变性,也就是对尺度不敏感(scale invariant), 在regression任务中,判断predict box和gt的距离最直接的指标就是IoU。(满足非负性;同一性;对称性;三角不等性)
在这里插入图片描述
G-IOU Loss:
IOU Loss存在两个缺点:

  • 如果两个框没有相交,根据定义,IoU=0,不能反映两者的距离大小(重合度)。同时因为loss=0,没有梯度回传,无法进行学习训练。
  • IoU无法精确的反映两者的重合度大小。如下图所示,三种情况IoU都相等,但看得出来他们的重合度是不一样的,左边的图回归的效果最好,右边的最差。在这里插入图片描述
    提出GIOU Loss,先计算两个框的最小闭包区域面积,再计算出IoU,再计算闭包区域中不属于两个框的区域占闭包区域的比重,最后用IoU减去这个比重得到GIoU。GIoU 在[-1, 1]区间范围内。
    在这里插入图片描述
    D-IOU Loss:
    在这里插入图片描述
    从图中可以看到,在GIoU的回归过程中,从损失函数的形式我们发现,当IoU为0时,GIoU会先尽可能让anchor能够和目标框产生重叠,之后GIoU会渐渐退化成IoU回归策略,因此整个过程会非常缓慢而且存在发散的风险。所以DIoU考虑到anchor和目标之间的中心点距离,可以更快更有效更稳定的进行回归。
    在这里插入图片描述
    和GIoU Loss类似,DIoU Loss在和目标框不重叠时,仍然可以为边界框提供移动方向。
    • DIoU Loss可以直接最小化两个目标框的距离,因此比GIoU Loss收敛快得多。
    • 对于包含两个框在水平方向和垂直方向上这种情况,DIoU Loss可以使回归Loss 下降非常快,而GIoU Loss几乎退化为IoU Loss。

C-IOU Loss:
一个好的目标框回归损失应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比。GIoU为了归一化坐标尺度,利用IOU并初步解决了IoU为0无法优化的问题。然后DIoU损失在GIoU Loss的基础上考虑了边界框的重叠面积和中心点距离。所以还有最后一个点上面的Loss没有考虑到,即Anchor的长宽比和目标框之间的长宽比的一致性。
在这里插入图片描述
α 是一个正的权衡参数,v 是测量预测框和真实框的宽高比的一致性。从参数 α 的定义可以看出,损失函数会更加倾向于往重叠区域增多方向优化,尤其是IoU为零的时候(不重叠时)。

参考:https://blog.csdn.net/haha0825/article/details/106098731

2.5 learning rate

等间隔调整:

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size = 20, gamma = 0.1, last_epoch=-1)
 for epoch in range(60):
        scheduler.step()
        train()

固定epoch调整:

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer,  milestones = [50, 80], gamma = 0.1, last_epoch=-1)
 for epoch in range(100):
        scheduler.step()
        train()

指数衰减调整:
学习率=上一epoch的学习率*gamma^epoch

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma = 0.1, last_epoch=-1)
 for epoch in range(100):
        scheduler.step()
        train()

余弦退火调整:
以余弦函数的周期为周期,在每个周期的最大值时重新设置学习率,初始学习率为最大学习率,以2*T_max为周期,周期内先下降后上升。
在这里插入图片描述

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max = 10, eta_min=0, last_epoch=-1)
 for epoch in range(100):
        scheduler.step()
        train()

自适应调整学习率

optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
 for epoch in range(100):
        train()
        val_loss = val()
        scheduler.step(val_loss)

这种方式较为复杂,是当某些指标不再发生变化时使用的策略,如损失函数和精度等。
mode:模式,min:当指标(如损失)不再降低;
max:当指标(如精度)不再上升
factor:学习率调整倍数,相当于gamma
patience:当10个epoch后指标不再发生变化时,调整学习率
verbose:是否打印学习率信息
threshold_mode:判断指标是否达到最优的模式

要注意的是,scheduler.step(val_loss)需要定义一个参数,即需要衡量的指标,一般选择验证集上的损失。

参考:https://zhuanlan.zhihu.com/p/80876299

3. Bag-of- specials

就是指一些plugin modules(例如特征增强模型,或者一些后处理),这部分增加的计算量(cost)很少,但是能有效地增加物体检测的准确率,将这部分称之为Bag of specials。

特征增强模型:

  • 增强感受域
  • 引入注意力机制
  • 特征融合or 特征集成
  • 激活函数

后处理方法:

  • NMS
  • soft NMS
  • DIoU NMS

3.1 增强感受野

SPP:
解决了在测试的时候,输入尺寸可以与训练的时候不一样的问题。

一般情况下当网络中有FC的时候,尺寸必须是固定的,这时候,SPP按照比例划分pooling,即使输入尺寸不一样但是最后输出的结果就是一致的了。
在这里插入图片描述

参考:https://blog.csdn.net/qq_26898461/article/details/50424240

ASPP:Atrous spatial pyramid pooling:
对所给定的输入以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文。
在这里插入图片描述
RFB:Receptive Field Block
引入RFB的出发点是通过模拟人类视觉的感受野加强网络的特征提取能力,在结构上RFB借鉴了Inception的思想,主要是在Inception的基础上加入了dilated卷积层(dilated convolution),从而有效增大了感受野(receptive field)。
在这里插入图片描述
在这里插入图片描述

参考:https://blog.csdn.net/u014380165/article/details/81556769

3.2 注意力机制

Channel Attention:SENet
在这里插入图片描述

参考:https://blog.csdn.net/haha0825/article/details/105564117

Spatial Attention:Residual Attention Network
每个注意力模块包含了两个分支:掩膜分支(mask branch)和主干分支(trunk branch)。其中主干分支可以是当前的任何一种SOTA卷积神经网络模型,掩膜分支通过对特征图的处理输出维度一致的注意力特征图(Attention Feature Map)),然后使用点乘操作将两个分支的特征图组合在一起,得到最终的输出特征图。
在这里插入图片描述

参考:https://blog.csdn.net/u013738531/article/details/81293271

Channel + Spatial Attention:CBAM
在这里插入图片描述
channel:
在这里插入图片描述
spatial:
在这里插入图片描述

参考:https://blog.csdn.net/qq_14845119/article/details/81393127

Dual-Attenetion:
在这里插入图片描述

3.3 特征融合 or 特征集成

Skip-connection:U-Net
在这里插入图片描述
hyper-column:inception
inception是通过增加网络的宽度来提高网络性能,在每个inception模块中,使用了不同大小的卷积核,可以理解成不同的感受野,然后将其concentrate起来,丰富了每层的信息。之后,使用了BN算法(BN使用在conv之后,relu之前),来加速网络的收敛速度。在V3版本中,还使用了卷积因子分解的思想,将大卷积核分解成小卷积,节省了参数,降低了模型大小。在V4版本中,使用了更加统一的inception模块,并结合了resnet的残差思想,能将网络做得更深。
在这里插入图片描述
在这里插入图片描述

参考:https://www.cnblogs.com/dengshunge/p/10808191.html

multi-scale aggression:
(1)FPN:在这里插入图片描述
(2)ASFF:
为了更加充分的利用高层特征的语义信息和底层特征的细粒度特征,很多网络都会采用FPN的方式输出多层特征,但是无论是类似于YOLOv3还是RetinaNet,它们都多用concatenation或者element-wise这种直接连接或者相加的方式,论文认为这样并不能充分的利用不同尺度的特征,所以提出了Adaptively Spatial Feature Fusion(自适应特征融合方式)。以ASFF-3为例,其结构可以表示为:在这里插入图片描述

参考:https://zhuanlan.zhihu.com/p/110205719

(3)PA-Net:Path Aggregation Network:
通过自底向上的路径增强,利用准确的低层定位信号增强整个特征层次,从而缩短了低层与顶层特征之间的信息路径。另外提出了自适应特征池化adaptive feature pooling,它将特征网格和所有的特征层连接起来,使每个特征层中的有用信息直接传播到下面的建议子网络。
在这里插入图片描述

参考:https://blog.csdn.net/weixin_37993251/article/details/88245006

(3)SFAM: Scale-wise Feature Aggregation:
FAM的主要作用是将不同level的特征按照相同scale进行concat,level越大其提取的特征越深,如下图所示,concat之后还有个SE Block操作。
在这里插入图片描述
(4)NAS-FPN,Bi-FPN
使用神经架构搜索(NAS)来自动设计网络结构。
在这里插入图片描述
在这里插入图片描述

3.4 激活函数

常见的有:ReLu, LRelu, PReLU, SELU,ReLu6, Swish, hard-Swish, Mish。

Mish:
在这里插入图片描述
为什么Mish有效?

  • 上无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许可以有更好的梯度流,而不是像ReLU中那样的硬零边界。
  • 最后,可能也是最重要的,目前的想法是,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

3.5 后处理

常见的有:NMS,soft NMS,DIoU NMS

soft NMS:
尤其对密集物体检测的检测效果有一定的提升作用。
在这里插入图片描述
D-IOU Loss:
在这里插入图片描述

3.6 Normalization

常见的有:LN,IN,BN, GN, Cross-GPU BN (CGBN or SyncBN), Filter Response Normalization(FRN), Cross-Iteration Batch Normalization( CBN)。

BN,LN:
在这里插入图片描述
IN,GN:
在这里插入图片描述
Cross-Iteration Batch Normalization( CBN):
为了解决BN在小batchsize时效果不好的问题。

  • 作者认为连续几次训练iteration中模型参数的变化是平滑的。
  • 作者将前几次iteration的BN参数保存起来,当前iteration的BN参数由当前batch数据求出的BN参数和保存的前几次的BN参数共同推算得出(顾名思义 Cross-InterationBN)
  • 训练前期BN参数记忆长度短一些,后期训练稳定了可以保存更长时间的BN参数来参与推算,效果更好

4. yolov4

选择模型的时候,在分类任务中表现优异的模型有时候不适用于检测模型,检测模型要求以下几点:

  • 更大的输入尺寸—为了检测到多个小目标
  • 更多的层— 这样网络的感受域会增加
  • 更多的参数----这样网络模型的学习能力更强,可以检测多一张图像中不同尺寸的多个物体

4.1 YOLOv4选用的网络模型组合

CSPDarknet53(backbone) + SPP,. PAnet (Neck) + YOLOv3 (anchor head)

输入为416*416时网络结构:
在这里插入图片描述
输入为608*608时网络结构:
在这里插入图片描述

4.2 YOLOv4选用的tricks

  • 激活函数:Mish
  • 回归loss:C-IOU Loss
  • Regularization:DropBlock
  • Normalization:Cross-Iteration Batch Normalization( CBN)
  • Skip-Connection:Cross stage partial connection (CSP)
  • 数据增强:Mosaic,Self-Adversarial Training (SAT)
  • 学习率调整:余弦退火衰减
  • 在这里插入图片描述
  • class label smoothing
  • modify some module: SAM, PAN, Cross mini-Batch Normalization (CmBN)在这里插入图片描述在这里插入图片描述

在这里插入图片描述
总的来说:
在这里插入图片描述

5. 实验

5.1 Influence of different features on Classifier training

在这里插入图片描述
在这里插入图片描述

5.2 Influence of different features on Detector training

在这里插入图片描述
其中:

  • S:消除网格对目标检测的影响
  • M:Mosaic data augmentation
  • IT: IoU threshold - using multiple anchors for a single ground truth IoU (truth, anchor) > IoU_threshold
  • GA:遗传算法-使用遗传算法在前10%的时间段内选择网络训练期间的最佳超参数
  • LS: Class label smoothing
  • CBN: CmBN - using Cross mini-Batch Normalization
  • CA:余弦退火衰减调整学习率
  • DM:动态小批量大小-通过使用随机训练形状在小分辨率训练期间自动增加mini-batch大小
  • OA:使用优化的anchor进行训练,网络分辨率为512x512
  • GIoU, CIoU, DIoU, MSE:不同的边界框回归损失

在这里插入图片描述

5.3 Influence of different backbones and pretrained weightings on Detector training

在这里插入图片描述

5.4 Influence of different minibatch size on Detector training

在这里插入图片描述

参考:https://my.oschina.net/u/4581492/blog/4371140
参考:https://zhuanlan.zhihu.com/p/136172670

猜你喜欢

转载自blog.csdn.net/haha0825/article/details/109986404