参考代码:darknet
导读:检测网络发展到现如今已经有很多的改进思路,这些改进思路在狭义或是广义程度上都对检测网络的性能有所提升。在这篇文章中对这些改进的思路进行探究,从理论上分析对检测结果的影响。文章发现一些检测优化的技巧是针对某个数据集,某个问题等较为单一的方面进行设计与优化的,并不具有较高的通用价值,因而这篇文章更加关注于具有通用价值的改进思路。这些思路包括:加权的残差连接(Weighted Residual Connections,WRC),跨stage特征融合(Cross Stage Partial connections,CSP),Cross mini-Batch Normalization(CmBN),自对抗训练(Self-adversarial training),Mish激活。文章在WRC,SCSP,CmBN,DropBlock正则化,CIoU损失基础上进行选择优化得到了一个新的高性能检测检测网络YOLOv4,在COCO数据集上性能达到43.5%,在V100上能跑到65FPS。比较可贵的一点是照顾了硬件的算力,在单GPU上也能完成训练。
文章的算法与之前的一些算法进行比较其结果见下图所示:
文章的主要贡献归纳为:
在这篇文章中作者将检测网络划分为4个不同的阶段,每个不同的阶段下都有对应的优化技巧,见下图2所示:
在检测优化过程中有一类方法是可以通过改进训练策略或是增加训练的成本(数据增广)来实现检测网络性能的提升。
1. 数据增广层面
数据增广常用的形式有图像变换(亮度,对比度,饱和度等)与几何变换(大小缩放,剪裁,翻转,旋转等)。
除此之外,有使用随机涂白的形式进行模拟遮挡情形,代表的方法有CutOut。除了在输入的图像上进行随机涂白,也有在特征图上进行操作的,如DropOut,DropConnect和DropBlock。也有使用图像混叠的形式进行数据增广,比如MixUP。也可以将GAN引入作为风格迁移进行数据增广。
在训练数据中会有较多的偏向性,比如在类别上,一些采样的方法(困难样本挖掘)可以缓解部分问题。在一阶段检测网络里面使用Focal Loss进行样本损失平衡。也有使用知识蒸馏里面的标签软化使得网络训练结果更加鲁棒。
2. 损失函数层面
早先的检测网络损失函数多以范数类型的算是函数为主,后面通过将检测的度量标准直接作为损失函数度量,从而将IoU引入到网络损失函数中去,从而有了CIoU与DIoU之类的损失函数。
对现有的检测算法增加模块或是改进后处理方法都可以在较少开销的情况下实现较大的性能提升。对于增加模块常见的有,增大感受野,引入注意力机制,增强特征融合。
1. 检测网络中的改进模块
一些常见的网络模块提供给模型以增加网络的感受野,比如SPP,ASPP,RFB等模块。
对于attention机制在图像里面主要是channel层和spatial层的,其中Squeeze-and-Excitation(SE)和Spatial Attention Module(SAM)就是其中的代表。
在检测领域图像特征的融合也是很关键的,综合运用多个尺度的信息会极大提升检测性能。因而就有了FPN,SFAM,ASFF和BiFPN之类的特征融合网络。
除此之外,激活函数也是一个不容忽视的点,从2010年提出来的ReLU一直到LReLU,PReLU,ReLU6,SELU(Scaled Exponential Linear Unit),Swish,hard-Swish和Mish等。
2. 检测后处理
对于检测的后处理一般是采用NMS来去掉多余的检测框,有一些对应的改进,如soft NMS,DIoU NMS等。
文章发现咋ImageNet分类任务中CSPResNext50是好于CSPDarknet53的,但是在MS COCO检测数据集下就是相反的结果,这两个网络里面对不同任务的倾向性,分类表现好的并不一定适合于检测任务。
在确定好BackBone之后就需要为增加网络感受野和参数(拟合能力)选择额外的网络结构了,如FPN,PAN,ASFF,BiFPN等。在检测任务中对网络的要求体现为如下三点:
因而结合上面内容对之前提到的一些网络进行分析,得到下表1:
因而从表中得到CSPDarknet53是其中较优的选择。对于网络感受野的影响其影响可以归纳为:
综上分析,文章在网络结构选择方面最后的结论为:BackBone选择CSPDarknet53,在此基础之上选择SPP模块进一步增大感受野,使用PANet中的特征融合模块增加网络的参数,增加网络表达能力,使用YOLOv3中的检测头作为检测头,从而构建了新的检测网络YOLOv4基础结构。
这里对BoF于BoS中的技巧进行了总结:
在经过一些分析比较之后,对其中的一些方法可以进行排除于选择。PReLU和SELU较难训练,ReLU6是为量化网络而设计的,因而这些激活函数被排除。在正则化方法好不犹豫地选择了DropBlock的方式。由于没有多卡GPU进行训练,因而syncBN被排除了。
为适应单GPU训练的改进
这里对于单GPU训练的场景做了如下额外的设计于优化:
文章使用Mosaic的数据增广的方法,将4张图片进行混合,而不是CutMix中的2张图片,这样可以显著减少训练Batch的数量。
除了上面的图像数据增广之外,文章还是用SAT(自对抗网络)进行数据增广。这个过程的第一步是使用对抗网络去修改原始的图像,以消除图像中的目标。第二步就是使用检测网络用正常的方式去训练这个改动之后的图片。
在BN上文章采用了修改的CBN得到CmBN,在一个Batch上进行划分,再在划分结果上进行统计。
文章对SAM模块进行了改进使用spatial上的attention替换了channel上的attention,见下图:
对于PAN使用concat替换了shortcut,见下图所示: