YOLOV4在V3的基础上引进了很多挂机,了解这些挂件们,会有助于真正了解这篇文章。所以我就先从挂件开始介绍吧。
Weighted-Residual-Connections
文章
weighted-residual 可以更好更快的结合不同层传递过来的残差,虽然增加了一些计算量,但是当网络层数从100+增加到1000+时,网络效果更好,收敛得更快。公式是:
Cross-Stage-Partial-Connections
文章
作者认为现在网络计算量大是由于在网络优化的过程中,重复的梯度信息。作者将一个stage的头尾两部分的特征图集成起来,来解决这个问题。减少了至少20%的计算量,网络效果与之前相当甚至超出。
CSP结构可以和其他网络结构结合,以resnext为例
将base layer 按channel 一份为二,这种情况下甚至都不需要bottleneck,在固定FLOPs的情况下,对MAC(Memory Access Cost)的需求更低。
Cross mini-Batch Normalization
首先介绍CNB,文章。
现在很多大的网络,往往batch-size都很小,比如一些检测网络,这样的情况下直接使用BN,batch内部的统计量与全局数据的统计量会有较大的误差会导致BN的效果不好;使用Group Normalization在layer之间做normalization会导致计算量过大;也有使用navie CNB的方式,就是多次迭代之间计算BN所需的统计量,但是不同迭代之间使用的参数
CNB的思想就是通过泰勒展开,使用之前迭代的BN统计量去逼近当前的BN统计量
其中为
反观CmBN就简单很多,mini-batches之间不更新网络参数,只在batch最后同时更新BN的统计量ScaleShift和网络参数,就相当于一个大的batch,分多个mini batches进行计算,在最后一起更新。
Self-Adversarial-Training
先介绍下 Adversarial Training
内层就是给输入加一个扰动最大化loss,外层在当前的扰动下最小化loss。
SAT包含两个向前向后的过程:
1.第一次固定网络的参数去训练图像,通过最大化loss,生成图像没有待检测物体的描述(就是扰动)。
2.第二次就是在加了扰动的图像上正常训练模型。
下面是我在github上找的作者的详细描述。
Mish activation
公式
y = x*tf.math.tanh(F.softplus(x))
可以发现比RELU平滑,经过测试,比RELU略慢,但是效果好。
Mosaic data augmentation
CutOut:图像中切除一块
MixUp:两张图像加权相加
CutMix:一张图像切除一块,另一张取对应位置补上去。
Mosaic:四张图像拼一起。
DropBlock
dropblock是对卷积层正则化的方式,dropout是dropblock的一种,当block的大小为1时就是dropout。在使用dropout时,被drop调的单元的特征还可以通过附近激活的单元去学习;而dropblock只能从其他区域去学习,比如drop调了狗的头,只有去学习狗的其他部分,有更好的泛化效果。
IOU,GIOU,DIOU,CIOU
这边简单介绍一下,具体可以看这里
IOU =
GIOU:即使IOU相同也不能代表两个bbox的接近程度是一致的,因此提出GIOU
DIOU:当一个物体包含另一个物体时,GIOU就退化到IOU了。DIOU考虑到两个bbox的中心点的距离。
CIOU:进一步考虑了bbox长宽比的关系。
PANet
这个着实比较熟,当年还实现过,就是最后全连接太占资源了,单卡跑起来比较费劲。
个人总结起来就是比FPN多了一个自下而上的过程,多做了一次特征融合。
SE & SAM
SE是在通道上加注意力,SAM是在特征图的二维空间上注意力了。
正文开始
作者在V3的基础上尝试加入各种挂件,包括:Weighted-Residual-Connections、Cross-Stage-Partial-connections、Cross mini-Batch Normalization、Self-adversarial-training、Mish-activation、Mosaic data augmentation、DropBlock regularization 和 CIoU loss。组合这些挂件可以达到SOTA:在MS COCO 上达到 43.5%AP(65.7%
Contributions
1.任何人使用一块1080Ti或者2080Ti就可以训练一个又快又准的目标检测模型。
2.我们实验确认了各种SOTA的Bag-of-Freebies和Bag-of-Specials在训练时对模型的影响。
3.我们对一些SOTA的方法做出改进,让它们更适合单卡训练,包括CNB,PAN,SAM等。
Related work
Object detection model
- Backbones for GPU:VGG,ResNet,ResNeXt,DenseNet
- Backbones for CPU:SqueezeNet,MobileNet,ShuffleNet
- two-stage: R-CNN, fast R-CNN, faster R-CNN, R-FCN, Libra R-CNN .RepPoints(anchor free)
- one-stage: 使用anchors的有 YOLO(除了V1), SSD , RetinaNet; 不带anchor的有 CenterNet, CornerNet, FCOS 等。
- neck:backbone和head之间的部分,常常用于提取不同stage的特征,包括FPN,PAN,BiFPN,NAS-FPN。
- new: backbone 有 DetNet, DetNAS;完整的检测模型有:SpineNet, HitDetector
Bag of freebies是指提升model的预测准确度但是不会影响增加预测的开销,常常使用在训练阶段且只会增加训练开销。常见的手段就是数据增广。数据增光包括photometric distortions和geometric distortions,具体有:
photometric distortions:调整亮度,对比度,hue,饱和度,图像噪声。
geometric distortions:随机缩放、裁剪、翻转和旋转。
上述的方法都是像素级别的,原始的像素信息依旧保存着。
有一些尝试模拟目标遮挡的数据增广方式,比如random erase、CutOut、hide-and-seek、grid mask都是随机选取原图像中的矩形区域置0或者随机值。也有作用在特征图上的方法,比如DropOut、DropConnect、DropBlock;MixUp将两张图片融合到一起;CutMix将原图裁剪到一部分并用另一张的对应部分填补上去;style transfer GAN也可以用来做数据增广,可以减少CNN学习到的纹理偏差。
有一些freebies是用来解决数据的语义分布的偏差问题,一种情况就是不同类别之间数据分布不均衡,常用的方法就是hard negative example mining和 OHEM, hard negative example mining需要结束一轮训练才能找到loss高的负样本,而OHEM是复制了一个只做forward的分支,提取loss高的ROIs,然后放入另外一个分支训练,两个分支一起更新权重。因为one-stage的检测方法没有RPN所以不适合使用example mining的方法,于是就有了kaiming老哥的focal loss,
最后就是LOSS方面的设计,常用的L1,L2 loss 来做回归,当物体的大小变化时,loss也会随这变化。于是就有基于IOU的loss,让降低loss与物体大小的相关性,包括IOUG,IOU,DIOU,CIOU。
Bag of specials
specials 就是指提升预测的开销,但是可以提升模型准确率的方法。
常用的模块有SPP,ASPP,RFB;最早的SPP结构是将特征图分解成多个d*d的特征块,然后使用bag-of-word的方式组合成固定大小的特征;后续就使用max-pooling的方式替代bag-of-word。ASPP相较SPP 加了空洞卷积。RFB基于inception的思想加了空洞卷积。
attention机制也是一种常用的提升方式,SE就是基于通道的attention,SAM就是基于特征图的二维attention。
关于特征集成部分,skip-connect和hyper-column都是融合不同尺度特征的方式。SFAM是基于SE的方式,在给concated后的多尺度特征上,给通道设置权重。ASFF用softmax在point-wise的级别上给特征加权,然后相加不同尺度的特征。在BiFPN中使用多输入加权的残差连接给不同尺度的特征加权,然后相加。
关于激活函数,就有ReLU,LReLU,PReLU,ReLU6,SELU,Swish,hard-Swish和Mish。
关于后处理,常用的是NMS;然后基于贪心的思想,提出了soft NMS;DIoU NMS是进一步把bbox的center point的信息加入到NMS的计算中。
Methodology
基于GPU,使用CSPResNeXt50/CSPDarknet53.
基于VPU,使用EfficientNet-lite/MixNet/GhostNet/MobileNetV3.
Selection of architecture
对分类来说最优的网络结构,对检测来说往往不是。对分类任务相反,检测任务需要:
- 更高的输入size,用于检测小目标。
- 更深的网络,更大的感受野去覆盖更大的输入size。
- 更多的参数,更大的模型复杂度去支持检测各种尺度的物体。
Selection of Bof and Bos
Additional improvements
作者做出的一些改进方法
- Mosaic和SAT
- 用遗传算法寻找最优超参数
- 调整现有方法,modified SAM,modified PAN, CmBN
SAM 从 scale-wise 的attention该成point-wise的;PAN从add改成concate。
YOLOV4
Experiments
具体的实验细节就不贴在这里了。