Yolo的整个网络,吸取了Resnet、Densenet、FPN的精髓,可以说是融合了目标检测当前业界最有效的全部技巧。
yolov3的backbone部分由Yolov2时期的Darknet-19进化至Darknet-53,加深了网络层数,引入了Resnet中的跨层加和操作,达到了resNet-152的精度,却更快了两倍。对比如下:
共计大概53层,个人感觉就是resnet的轻微改版。
darknet-53、顾名思义有53个卷积层:
1)
DarkNet_53= Conv3x3 + Sum_(下采样 Conv3x3_步长为2 + N x DarkNetBlock) —N为下采样次数
2)
DarkNetBlock(含2层卷积)= Conv1x1 + Conv3x3 + Residual
3)
所以我们可以发现DarkNet-53一共有1 + (1 + 1 x 2 ) + (1 + 2 x2) + (1 + 8 x 2) + (1 + 8 x 2) + (1 + 4 x 2) +全连接= 53个卷积层。
DarkNet-53相对DarkNet-19的有如下几点改进:
1、加深网络层,提升精度,虽然速度有所下降,但是精度有极大提升,可达到resnet-152精度。
2、进入了残差网络resNet模块,防止梯度下降
3、用卷积strid==2代替了池化,防止信息丢失
4、使用空间金字塔池化网络算法SPP(sppnet spatial pyramid pooling)实现多尺寸输入,同尺寸输出。
Yolov3采用了类似SSD的mul-scales策略,使用3个scale(13* 13,26* 26,52* 52)的feature map进行预测。yolov2没有,所以对于小目标很差。
有别于yolov2,这里作者将每个grid cell预测的边框数从yolov2的5个减为yolov3的3个。
和yolov2一样,anchor的大小作者还是使用kmeans聚类得出。在coco数据集上的9个anchor大小分别为:(10× 13); (16× 30); (33× 23); (30× 61); (62× 45); (59×119); (116 × 90); (156 × 198); (373 × 326)。
其中在yolov3中,最终有3个分支输出做预测,输出的特征图大小分别为13x13,26x26,52x52,每个特征图使用3个anchor,
13*13的特征图使用(116 × 90); (156 × 198); (373 × 326);这3个anchor
26*26的特征图使用(30× 61); (62× 45); (59×119);这3个anchor
52*52的特征图使用(10× 13); (16× 30); (33× 23);这3个anchor
N × N × [3 ∗ (4 + 1 + 80)] 。其中N为feature map的长宽,3表示3个anchor的边框,4表示边框的tx,ty,tw,th,1表示预测的边框的置信度,80表示分类的类别数。
考虑到检测物体的重叠情况,用多标签的方式sigmoid函数替代了之前softmax单标签方式;https://zhuanlan.zhihu.com/p/42865896
总结一下YOLOv4框架:
Backbone: CSPDarknet53
Neck: SPP,FPN+PAN
Head: YOLOv3
YOLOv4 = CSPDarknet53 + SPP + (FPN+PAN) + YOLOv3
Yolov4对训练时的输入端进行改进,使得训练在单张GPU上也能有不错的成绩。比如数据增强Mosaic、cmBN、SAT自对抗训练。
但感觉cmBN和SAT影响并不是很大,所以这里主要讲解Mosaic数据增强。
Yolov4中使用的Mosaic是参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放、随机裁剪、随机排布的方式进行拼接。
使用原因:
在平时项目训练时,小目标的AP一般比中目标和大目标低很多。而Coco数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。所以为了平衡小、中、大目标的占比数量。
优点:
1.扩充了数据集,均衡大中小目标数量:随机使用4张图片随机拼接,且通过随机缩放可以获得很多小目标,让网络的鲁棒性更好。
2.减少GPU:因为使用Mosaic增强进行训练时,4张图片被整合成一张图片,这样一来可以使mini-batch大小并不用很大,这样一个GPU就能达到比较好的效果。
主要变化为在DarkNet53网络结构中,融入了CSP这一网络架构。
https://blog.csdn.net/qq_48984174/article/details/111680645
Mish:x * tanh(ln(1+e^x))
ReLU和Mish的对比,Mish的梯度更平滑。相比之下,Mish能更好地保持准确性,这可能是因为它能更好地传播信息。平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。(具体的可以看mish论文)。
作者只在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数。
Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式。
Neck: SPP,FPN+PAN
相对于yolov3没有什么改变。
输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
训练用到的小技巧:
训练用到的小技巧:Mosaic数据增强、Label Smoothing平滑、CIOU、学习率余弦退火衰减。
1、C_IOU
Yolov3&Yolov4网络结构与源码分析 - 吴建明wujianming - 博客园 https://www.cnblogs.com/wujianming-110117/p/13845974.html