本文要来介绍很火的目标检测算法YOLOv4,该算法是在原有YOLO目标检测架构的基础上,采用了近些年CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化.
论文题目:YOLOv4: Optimal Speed and Accuracy of Object Detection
YOLOv4在YOLOv3上各个部分做改进,在保证速度的同时,大幅提高了模型的检测精度,并降低硬件使用的要求.
由上图可以看出:
该研究的主要贡献如下:
Tricks一般指在网络训练和测试时所采用的技巧,在作者论文里将tricks分为两大类:Bag-of-Freebies 和 Bag-of-Specials.
Bag-of-Freebies是指在网络训练时所用到的技巧,不影响推理预测的时间,主要包括以下几个方面:
数据增强: Random erase, CutOut,Hide-and-seek,Grid mask,GAN,
MixUp,CutMix
正则化方法: DropOut,DropConnect
处理数据不平衡问题: focal loss, Online hard example mining, hard negative example mining
处理预测框回归问题: MSE,IOU,GIOU,DIOU/CIOU
Bag-of-specials是指在网络设计或处理时所用到的技巧,轻微增加推理预测时间,但可以提升较大的精度,主要包括:
目标检测一般由以下几个部分组成:
下面分别针对三个部分进行详细展开阐述.
为了使网络能够快速操作并并行化优化,作者提供了两种神经网络主干
由下表的实验证明CSPResNeXt50适合用于分类网络,而CSPDarknet53更适合用于检测网络,因此作者最后选择使用CSPDarknet53作为特征提取的主干
Cross Stage Partial Network (CSPNet)
在目标检测任务中通常是运行在小型设备上,因此需要计算量较低的模型,以缩短推理预测时间.CSPNet论文的作者认为预测计算量高的问题是由于网络优化中梯度信息重复导致,因此提出了跨阶段局部网络(CSPNet).
CSPNet的主要目的是使网络架构能够实现获取更丰富的梯度融合信息并降低计算量,作法是先将Base Layer的特征图划分为两个部分,然后在经过transition->concatenation->transition将两个部分融合起来.
上图中的Transition layer代表过度层,主要包含1X1卷积层以及pooling层.
上述作法使得CSPNet解决了三个问题:
上图为CSPNet结合不同的backbone后的结果,由上图中可以看出:
Neck部分的主要作用在于能够扩大感受野以及融合不同尺度特征图的信息(更好的进行特征融合)
下图a为YOLOv2的网络结构,将最后一层摊平后接上全链接层;图b则为使用SPP架构,将最后一层的特征图concat起来.
另外还有将原本相加的部分修改为合并(concat),效果会比相加来的好,但是缺点就是通道数变多,计算量会变大.
YOLOv4的Head和YOLOv3的head部分一样,这里不再累述.
Bag-of-Freebies是指在网络训练时所用到的技巧,不影响推理预测的时间
Bag-of-Specials是指在网络设计或处理时所用到的技巧,轻微增加推理预测时间,但可以提升较大的精度
在对BOF和BOS进行详细展开之前,我们先来看一下YOLOv4所采用的完整方法有哪些:
接着我们对其中的每一项分别进行展开说明.
CutMix是2019年提出的数据增强的方式,
其核心思想是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配.
从下图中可以看出CutMix的Image以及Label是由两张不同的照片组合而成的,此外,数据增强还有另外两个方式: Mixup以及Cutout
Mosaic 是作者新创的数据增强方法,采用随机缩放,裁剪的方式混合拼接4中图像进行训练,可以说是CutMix的加强版.
采用这种方法可以丰富检测数据集,并且因为随机缩放增加了很多小目标,让模型的稳健性更好.此外,作者考虑到可能需要只使用单个GPU的计算也能达到好的效果,因此使用Mosaic训练时,可以直接计算4张图片的数据,使得Mini-batch的大小不需要很大.
DropBlock与Dropout功能类似,也是避免overfitting的一种正则化方法,于2018年提出.
上图中,图b是使用Dropout的方法,会随机删除神经元的数量,但网络仍然可以从相邻的激活单元中学习到相同信息.
图c是使用DropBlock的方法,随机将整个局部区域进行删减,网络就会去注重学习某些特征以实现正确分类而得到更好的泛化效果.
Label Smoothing 是图像分类经常会用到的一种正则化方法.
在分类任务中,通常会将输出用softmax进行归一化处理,再使用one-hot label去计算cross-entropy function来训练模型.但是使用one-hot向量表示容易导致网络overfitting的问题,因此Label Smoothing就是将one-hot label 变得更加soft, 使得计算loss时可以有效抑制overfitting的现象,提高模型的泛化能力.
具体做法如下图所示,降低正确类别的权重,另一方面提高错误类别的权重.
y k L S = y k ( 1 − α ) + α K y_k^{LS}=y_k(1-\alpha)+\frac{\alpha}{K} ykLS=yk(1−α)+Kα
其中,K为类别数,为超参,在 为正确类别时为1,错误类别时为0
Mish是连续可微的非单调激活函数,跟ReLU相比,Mish的梯度更加平滑,并且在负值时允许有较小的负梯度,可以稳定网络的梯度流,具有更好的泛化能力.
公式定义如下:
f ( x ) = x tanh ( ln ( 1 + e x ) ) f(x)=x\tanh(\ln(1+e^x)) f(x)=xtanh(ln(1+ex))
YOLOv4作者使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些.
因为YOLOv4的Backbone中都使用了Mish激活函数,而后面的网络层则还是使用leaky relu函数.
YOLOv4参考了EfficientDet的架构以及方式,使用了多输入加权的残差链接(MiWRC)作为backbone的BOS.
由下图可以看出EfficientNet-B0的架构通过多个MBConv Block构成,MBConv Block就是指MobileNet V2的Inverted Residual Block.
MBConv的主要架构如下右图所示,其设计是先升维再降维,与residual block先降维在升维的操作不同,而这样的设计可以让MobileNet v2能够更好的利用残差连接以提升准确率.
BiFPN是由PANet进行进化,删除贡献程度小的节点,并提出跨尺度融合的优化方法,在输入与输出结点中间加入connection.
MiWRC的思想源自于BiFPN,在FPN中每一层取得的feature都视为平等的,而MiWRC则认为不同层的feature理应有不同的重要性,需针对不同尺度的特征给予不同的权重比例.
在介绍CIOU-loss之前,先说明IOU loss的缺点以及各个IOU loss的演进过程, 框回归loss进化过程如下:
Smooth L1 Loss -> IOU Loss(2016) -> GIOU Loss(2019) -> DIOU Loss(2020) -> CIoU Loss(2020)
接下来对上述loss进行展开说明.
使用IOU Loss会有两个问题:
之后的GIoU,DIoU,CIoU都是基于IOU loss增加一个惩罚项:
L I O U = 1 − I O U L = 1 − I O U + R ( B , B g t ) L_{IOU}=1-IOU \\L=1-IOU+R(B,B^{gt}) LIOU=1−IOUL=1−IOU+R(B,Bgt)
GIOU 为了解决预测框与目标框不重叠的问题,因此在IOU loss的基础上增加一个惩罚项,比IOU 更能反映两个框的接近程度.
由上图可以看到C为目标框Ground Truth与预测框Predict的最小包围框
由上图可以得知,当两个框距离越远,GIOU loss越大,因此GIOU 相比IOU更能反映两个框的接近程度.
虽然GIOU解决了IOU的梯度问题,但是仍存在一些缺点…
基于IOU与GIOU存在的问题,作者提出了两个问题:
DIOU考虑了重叠面积与中心点的距离,增加了一个惩罚项用于最小化两个框的中心点距离
L D I O U = 1 − I O U + ρ 2 ( b , b g t ) c 2 b , b g t 分 别 表 示 B , B g t 的 中 心 点 , ρ 是 欧 式 距 离 , c 是 最 小 距 离 包 围 两 个 框 的 对 角 线 长 度 L_{DIOU}=1-IOU+\frac{\rho^2(b,b^{gt})}{c^2}\\b,b^{gt}分别表示B,B^{gt}的中心点,\\\rho是欧式距离,\\c是最小距离包围两个框的对角线长度 LDIOU=1−IOU+c2ρ2(b,bgt)b,bgt分别表示B,Bgt的中心点,ρ是欧式距离,c是最小距离包围两个框的对角线长度
DIOU loss的优点为:
当预测框在目标框内部时,GIOU loss 与IOU loss的值相同,此时GIOU退化成IOU而无法区分其相对位置,DIOU可以更好地优化此类问题.如下所示:
可以将DIOU替换IOU用于计算NMS算法中,即论文中提出的DIOU-NMS
一个好的目标框损失损失函数应考虑三个因素:重叠面积,中心点距离,长宽比,DIOU loss考虑了重叠面积与中心点距离,但没有考虑长宽比,因此作者提出了CIOU loss将三个因素都考虑到,并且模型的收敛精度更高.
CIOU在DIOU的基础上多增加了一个惩罚项,考虑了长宽比的因素.公式如下:
L C I O U = 1 − I O U + ρ 2 ( b , b g t ) c 2 + α ν , ν = 4 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) 2 , α = ν ( 1 − I O U ) + ν b , b g t 分 别 表 示 B , B g t 的 中 心 点 , ρ 是 欧 式 距 离 , c 是 最 小 距 离 包 围 两 个 框 的 对 角 线 长 度 , α 是 权 重 函 数 , 依 据 两 个 框 之 间 的 距 离 来 调 整 , ν 是 衡 量 长 宽 比 的 相 似 性 L_{CIOU}=1-IOU+\frac{\rho^2(b,b^{gt})}{c^2}+\alpha\nu,\\\nu=\frac{4}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2,\\\alpha=\frac{\nu}{(1-IOU)+\nu}\\b,b^{gt}分别表示B,B^{gt}的中心点,\\\rho是欧式距离,\\c是最小距离包围两个框的对角线长度,\\\alpha是权重函数,依据两个框之间的距离来调整,\\\nu是衡量长宽比的相似性 LCIOU=1−IOU+c2ρ2(b,bgt)+αν,ν=π24(arctanhgtwgt−arctanhw)2,α=(1−IOU)+ννb,bgt分别表示B,Bgt的中心点,ρ是欧式距离,c是最小距离包围两个框的对角线长度,α是权重函数,依据两个框之间的距离来调整,ν是衡量长宽比的相似性
CIOU loss的梯度类似于DIOU loss,但是要考虑v的梯度,以下是v的梯度计算公式:
∂ ν ∂ w = 8 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) ∗ h w 2 + h 2 , ∂ ν ∂ h = − 8 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) ∗ h w 2 + h 2 \frac{\partial\nu}{\partial w}=\frac{8}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*\frac{h}{w^2+h^2},\\\frac{\partial\nu}{\partial h}=-\frac{8}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})*\frac{h}{w^2+h^2} ∂w∂ν=π28(arctanhgtwgt−arctanhw)∗w2+h2h,∂h∂ν=−π28(arctanhgtwgt−arctanhw)∗w2+h2h
w 2 + h 2 w^2+h^2 w2+h2在这种情况下通常是一个小值 h h h和 w w w在[0,1]范围内,可能产生梯度爆炸. 因此在我们的实现中,为了稳定收敛,简单地去除 w 2 + h 2 w^2+h^2 w2+h2 将步长 1 w 2 + h 2 \frac{1}{w^2+h^2} w2+h21替换为1,梯度方向仍然与等式一致
下图表示三种不同的BN方式:
SAT是作者创新的一种数据增强的方法,分成两个阶段完成:
上述训练方式有助于推广模型和降低模型过拟合问题.
作者在观测一段物体检测的影片中发现,因为检测物体的中心点多位于接近Grid中心,而导致在Grid边缘时较难检测,但实际状况物体移动的路线是连续的,所以其中心位置应该也是连续的,也就是说物体可能会出现在Grid边缘.
作者认为之所以有检测物体的中心点多位于接近Grid中心点的问题存在,是因为Sigmoid函数的梯度,由下图可以看到Sigmoid在Grid边缘时倒数接近0,容易发生梯度消失,导致中心点在Grid边缘时很难学习到准确的结果.
因此作者在Sigmoid函数做了些改变,将Sigmoid乘以一个大于1的值,并且考虑到不同的Grid Size对于边界效应的敏感度,采用 ( 1 + x ) ∗ S i g m o i d − ( 0.5 ∗ x ) (1+x)*Sigmoid-(0.5*x) (1+x)∗Sigmoid−(0.5∗x)
Cosine annelaling 是利用余弦函数来调整学习率,一开始会先缓慢的降低学习率,然后中途在加速下降,最后再次缓慢下降.
Pytorch提供了两个版本的Cosine annealing
torch.optim.lr_scheduler.CosineAnnealingLR (optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)
公式如下:
η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + c o s ( T c u r T m a x π ) ) η t 是 指 l e a r n i n g r a t e , η m a x 是 指 最 大 l e a r n i n g r a t e , η m i n 是 指 最 小 l e a r n i n g r a t e , T c u r 是 指 当 前 迭 代 次 数 , T m a x 是 指 最 大 迭 代 次 数 η_t=η_{min}+\frac{1}{2}(η_{max}−η_{min})(1+cos(\frac{T_{cur}}{T_{max}}π))\\η_t是指learning rate,\\η_{max}是指最大learning rate,\\η_{min}是指最小learning rate,\\T_{cur}是指当前迭代次数,\\T_{max}是指最大迭代次数 ηt=ηmin+21(ηmax−ηmin)(1+cos(TmaxTcurπ))ηt是指learningrate,ηmax是指最大learningrate,ηmin是指最小learningrate,Tcur是指当前迭代次数,Tmax是指最大迭代次数
torch.optim.lr_scheduler.CosineAnnealingWarmRestarts (optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1, verbose=False)
它与CosinAnnealingLR()参数有两个不一样的地方:
optimizere 指优化器
T_0是指第一次重新启动的迭代次数
T_mult是指一个因子在重新启动后增加 T i T_i Ti,默认值:1
eta_min是指最小学习率,默认为0
last_epoch是指最后一个epoch的索引,默认为-1
verbose表示是否要印出更新的消息
公式如下:
η t = η m i n + 1 2 ( η m a x − η m i n ) ( 1 + c o s ( T c u r T i π ) ) η t 是 指 l e a r n i n g r a t e , η m a x 是 指 最 大 l e a r n i n g r a t e , η m i n 是 指 最 小 l e a r n i n g r a t e , T c u r 是 指 重 新 启 动 后 的 迭 代 次 数 , T m a x 是 指 第 i 轮 的 迭 代 次 数 η_t=η_{min}+\frac{1}{2}(η_{max}−η_{min})(1+cos(\frac{T_{cur}}{T_i}π))\\\\η_t是指learning rate,\\η_{max}是指最大learning rate,\\η_{min}是指最小learning rate,\\T_{cur}是指重新启动后的迭代次数,\\T_{max}是指第i轮的迭代次数 ηt=ηmin+21(ηmax−ηmin)(1+cos(TiTcurπ))ηt是指learningrate,ηmax是指最大learningrate,ηmin是指最小learningrate,Tcur是指重新启动后的迭代次数,Tmax是指第i轮的迭代次数
使用基因算法Genetic Algorithms来选择超参数.作法是先随机组合超参数去做训练,然后挑选出最好的10%超参数再去随机组合并训练,最后选择最佳的模型.
SAM源自于论文CBAM(Convolutional Block Attention Module)的论文,提出了两种注意力机制的技巧.
在经典的NMS中,置信度最高的检测框和其他检测框会逐一算出对应的IOU值,并将值超过阈值的检测框过滤掉.但是在实际情况下,当两个不同的物体靠的很近时,由于IOU值比较大,在经过NMS算法后,往往只剩下一个检测框,这样容易导致有漏检的状况发生.
以下是DIOU-NMS的公式:
s i = { s i , I O U − R D I O U ( M , B i ) < ε 0 , I O U − R D I O U ( M , B i ) ≥ ε , s i 为 分 类 置 信 度 , ε 为 N M S t h r e s h o l d , M 为 最 高 置 信 度 的 检 测 框 s_i=\begin{cases} s_i, IOU-R_{DIOU}(M, B_i)<\varepsilon \\0, IOU-R_{DIOU}(M, B_i)\geq\varepsilon,\end{cases}\\s_i为分类置信度,\\\varepsilon 为 NMSthreshold, \\M为最高置信度的检测框 si={si,IOU−RDIOU(M,Bi)<ε0,IOU−RDIOU(M,Bi)≥ε,si为分类置信度,ε为NMSthreshold,M为最高置信度的检测框
解释: