YOLOV4算法Pytorch
实现:https://github.com/codecat0/CV/tree/main/Object_Detection/YOLOV4
1. Introduction
本文的贡献如下:
- 我们开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080 Ti或2080 TiGPU来训练一个超级快速和准确的目标探测器。
- 在检测器的训练过程中,我们验证了最先进的Bag-of-Freebies和Bag-of-Specials
- 我们修改了最先进的方法,使其更有效,更适合于单GPU训练,包括
CBN
、PAN
、SAM
等。
2. Related work
2.1 Object detection models
我们对现有的目标检测算法进行了总结,当前的目标检测器由以下几部分组成:
2.2 Bag of freebies
我们称只改变训练策略或只增加训练成本使目标检测器在不增加推理成本的情况下获得更高的精度的方法为Bag of freebies
。包括:
2.2.1. 数据增强:
增加输入图像的可变性,从而使设计的目标检测模型对不同环境获得的图像具有更高的鲁棒性。
- 逐像素调整
- 光度失真:
brightness
(亮度)、contrast
(对比度)、hue
(色度)、saturation
(饱和度)、noise
(噪声) - 几何失真:
scaling
(缩放尺寸)、cropping
(裁剪)、flipping
(翻转)、rotating
(旋转)
- 光度失真:
- 模拟目标遮挡
erase
(擦除)、CutOut
(剪切):随机选择图像的矩形区域,并填充随机或互补的零值hide-and-seek
和grid mask
:随机或均匀地选择图像中的多个矩形区域,并将它们替换为全零- 将上述方式作用于特征图上:
DropOut
、DropConnect
、DropBlock
- 将多张图像组合在一起:
MixUp
:使用两个图像以不同的系数比率相乘后叠加,利用叠加比率调整标签CutMix
:将裁剪的图像覆盖到其他图像的矩形区域,并根据混合区域大小调整标签
style transfer GAN
2.2.2. 数据不平衡问题
hard negative example mining
online hard example mining
focal loss
label smoothing
2.2.3. box回归损失函数
-
MSE(Smooth L1)
-
IoU
I o U = A ∩ B A ∪ B IoU=\frac {A \cap B} {A \cup B} IoU=A∪BA∩B -
GIoU
G I o U = I o U − ∣ A c − U ∣ A c GIoU=IoU - \frac {|A_c-U|} {A_c} GIoU=IoU−Ac∣Ac−U∣
其中, A c A_c Ac表示两个框的最小闭包面积,即同时包含两个框的最小框的面积(虚线区域); U U U表示不属于两个框但属于最小闭包的面积
-
DIoU
D I o U = I o U − ρ 2 ( b , b g t ) c 2 DIoU=IoU-\frac {\rho ^2(b, b^{gt})} {c^2} DIoU=IoU−c2ρ2(b,bgt)
-
CIoU
一个好的box回归损失应该考虑3个因素:重叠面积,中心点距离,长宽比
C I o U = I o U − ρ 2 ( b , b g t ) c 2 − α v α = v ( 1 − I o U ) + v v = 4 π 2 ( arctan w g t h g t − arctan w h ) 2 CIoU=IoU-\frac {\rho ^2(b, b^{gt})} {c^2}-\alpha v \\ \alpha = \frac {v} {(1-IoU)+v} \\ v=\frac {4} {\pi^2}(\arctan \frac {w^{gt}} {h^{gt}}-\arctan \frac {w} {h})^2 CIoU=IoU−c2ρ2(b,bgt)−αvα=(1−IoU)+vvv=π24(arctanhgtwgt−arctanhw)2
2.3 Bag of specials
我们将通过增加少量推理成本便可极大提升模型精度的方法称为Bag of specials
2.3.1 增大感受野
-
SPP
-
ASPP
-
RFB
2.3.2 注意力机制
-
SE
-
SAM
2.3.3 特征融合
-
skip-connection
-
FPN
-
SFAM:使用SE模块对多尺度拼接特征图在通道维度进行加权
-
ASFF:使用softmax对多尺度拼接特征图在点维度进行加权
-
BiFPN
2.3.4 激活函数
- ReLU
R e L U = m a x { 0 , x } ReLU=max\{0, x\} ReLU=max{0,x} - Leaky-ReLU
L R e L U = m a x ( α x , x ) LReLU=max(\alpha x, x) LReLU=max(αx,x) - Parametric-ReLU
P R e L U ( x ) = { α x x ≤ 0 x x > 0 PReLU(x) = \begin{cases} \alpha x & x \leq 0 \\ x & x > 0 \end{cases} PReLU(x)={αxxx≤0x>0 - ReLU6
R e L U 6 ( x ) = m a x { R e L U ( x ) , 6 } ReLU6(x) = max\{ReLU(x), 6\} ReLU6(x)=max{ReLU(x),6} - SELU
S E L U ( x ) = λ { α ( e x − 1 ) x ≤ 0 x x > 0 SELU(x)=\lambda \begin{cases} \alpha (e^x-1) & x \leq 0\\ x & x > 0 \end{cases} SELU(x)=λ{α(ex−1)xx≤0x>0 - Swish
S w i s h ( x ) = x ⋅ s i g m o i d ( x ) Swish(x) = x \cdot sigmoid(x) Swish(x)=x⋅sigmoid(x) - hard-Swish
h − S w i s h ( x ) = x R e L U ( x + 3 ) 6 h-Swish(x)=x \frac {ReLU(x+3)} {6} h−Swish(x)=x6ReLU(x+3) - Mish
M i s h ( x ) = x ⋅ t a n h ( l n ( 1 + e x ) ) Mish(x) = x \cdot tanh(ln(1+e^x)) Mish(x)=x⋅tanh(ln(1+ex))
2.3.5 后处理
- NMS:将IoU超过阈值进行删除
s i = { s i , I o U ( M , b i ) < N t 0 , I o U ( M , b i ) ≥ N t s_i= \begin{cases} s_i, & IoU(M,b_i) < N_t \\ 0, & IoU(M, b_i) \geq N_t \end{cases} si={si,0,IoU(M,bi)<NtIoU(M,bi)≥Nt - soft NMS:将置信度得分小于阈值的进行删除,由于这个阈值需要人工设置,因此存在很大的局限性
s i = { s i , I o U ( M , b i ) < N t s i ( 1 − I o U ( M , b i ) ) , I o U ( M , b i ) ≥ N t s_i= \begin{cases} s_i, & IoU(M,b_i) < N_t \\ s_i(1-IoU(M, b_i)), & IoU(M, b_i) \geq N_t \end{cases} si={si,si(1−IoU(M,bi)),IoU(M,bi)<NtIoU(M,bi)≥Nt
由于上式不连续,改进后如下:
s i = { s i , I o U ( M , b i ) < N t s i e − I o U ( M , b i ) 2 σ , I o U ( M , b i ) ≥ N t s_i= \begin{cases} s_i, & IoU(M,b_i) < N_t \\ s_ie^{-\frac {IoU(M, b_i)^2} {\sigma}}, & IoU(M, b_i) \geq N_t \end{cases} si={si,sie−σIoU(M,bi)2,IoU(M,bi)<NtIoU(M,bi)≥Nt - DIoU NMS: 将DIoU超过阈值进行删除
s i = { s i , D I o U ( M , b i ) < N t 0 , D I o U ( M , b i ) ≥ N t s_i= \begin{cases} s_i, & DIoU(M,b_i) < N_t \\ 0, & DIoU(M, b_i) \geq N_t \end{cases} si={si,0,DIoU(M,bi)<NtDIoU(M,bi)≥Nt
3. Methodology
3.1 Selection of architecture
一个模型分类效果好不一定检测效果就好,好的检测器需要满足如下几点:
- 更高的输入图像分辨率:有助于检测小物体。
- 更深的网络层:能够覆盖更大面积的感受野
- 更多的参数:更好的检测不同的物体
我们比较了3个backbone模型,最终选择了CSPDarkNet53
3.2 Selection of BoF and BoS
- 对于激活函数,由于
PReLU
和SELU
更难训练,我们选择专门为量化网络设计的ReLU6 - 对于正则化,我们选择
DropBlock
- 在归一化上,由于是单GPU,所以没有考虑
syncBN
3.3 Additional improvements
为了使设计的探测器更适合单 gpu 的训练,我们进行了如下额外的设计和改进:
- 新的数据增强方法:Mosaic和Self-Adversarial Training
- 应用遗传算法选择最优参数
- 改进SAM,改进PAN和交叉小批量标准化(CmBN)
3.3.1 Mosaic
如下图所示,Mosaic方法是将4张训练图像混合成一张新图像,这样可以丰富图像的上下文信息。这种做法的好处是允许检测上下文之外的目标,增强模型的鲁棒性。此外,在每一层从4个不同的图像批处理标准化计算激活统计,这大大减少了对大mini-batch处理size的需求。
3.3.2 Self-Adversarial Training
这是一种新的数据扩充技术,该技术分前后两个阶段进行。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自身执行一种对抗性训练,改变原始图像,从而造成图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。
3.3.3 CmBN
CmBN仅收集mini-batches
中单个batch
的统计信息。
3.3.4 SAM的改进
将SAM从空间上的注意力修改为点上的注意力
3.3.5 PAN的改进
将PAN的short-connect
从相加修改为拼接
3.4 YOLOv4
YOLOV4由以下几部分组成:
- BackBone:CSPDarkNet53
- Neck:SPP、PAN
- Head:YOLOV3
YOLOV3使用到了:
BOF:
- BackBone:
CutMix
Mosaic数据增强
DropBlock正则化
类标签平滑(Class Label Smoothing)
- Detector:
CIoU loss
CmBN
DropBlock正则化
Mosaic数据增强
自对抗训练
消除网格敏感性
为单个GT box使用多个anchor
余弦退火调度器
最优超参数
随机训练形状
BOS:
- BackBone:
Mish激活函数
CSP:Cross-stage partial connections
MiWRC:Multi-input weighted residual connections
- Detector:
Mish激活函数
SPP
SAM
PAN
DIoU NMS