赞
踩
以下内容如有错误,恳请指出。
而且查阅参考的资料也有点多,参考链接若有遗落,也恳请指出,会立刻补上
以下先回顾一下之前的笔记总结:
YOLOv1:目标检测算法——YOLOv1
YOLOv2:目标检测算法——YOLOv2
YOLOv3:目标检测算法——YOLOv3
在前面的目标检测算法笔记中,已经介绍了YOLOv1,v2,v3的版本,其中本来还想记录一下YOLOv3的一些改进版本的,比如:YOLOv3-SPP,SlimYOLOv3-SPP, YOLOv3-SPP-Ultralytics。通过学习了一些b站的相关讲解视频与一些相关的博客,也知道了这些版本的一点区别。
以下对YOLOv3的几个版本进行简要概括:
下图是一些版本之间的对比:
YOLOv3-SPP与YOLOv3-SPP-Ultralytics的对比
YOLOv3-SPP与SlimYOLOv3-SPP的对比
后来在寻找资料的过程中,发现了YOLOv4中对深度学习中一些常用Tricks进行了大量的测试,然后这些tricks本身就包含了刚刚提及版本所使用的tricks。然后我就觉得没有必要记录yolov3的其他版本了,然后本人就打算直接通过yolov4来学习这些常用的tricks,以下内容开始正题。
在深度学习中,有很多技巧可以提高卷积神经网络的检测精度。有些技巧只能针对特定的模型,而有些技巧适用于大多数模型、任务和数据集,比如batch-normalization、residual-connections等。
所有的这些技巧只有通过实际的实验,才能证明其有效性。YOLOv4就对其中的一些常用技巧进行了大量的测试,最终选择了一些有用的tricks。
关于Bag of Freebies与Bag of Specials的概念下面会进行概括
CutMix and Mosaic data augmentation, DropBlock regularization,Class label smoothing
Mish activation, Cross-stage partial connections (CSP), Multiinput weighted residual connections (MiWRC)
CIoU-loss, CmBN, DropBlock regularization, Mosaic data augmentation, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyperparameters, Random training shapes
Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS
YOLOv4在传统的YOLO基础上,加入了这些实用的技巧,实现了检测速度和精度的最佳权衡。实验表明,在Tesla V100上,对MS COCO数据集的实时检测速度达到65 FPS,精度达到43.5%AP。
YOLOv4的主要贡献:
yolov4概括性地提出了一个目标检测的模型一般包含哪几种方面:一个是特征提取的backbone,还有一个是用于分类与预测边界框的head。而在backbone与head之间,为了更好的从不同层次的特征图中采集特征,会添加一些形如FPN的额外结构,yolov4中将其称之为neck。(很形象的就是头与躯干之间的内容就是靠颈来连接)
一般来说,如果是GPU跑的backbone主要是:VGG,ResNet,ResNeXt,DenseNet;而如果是CPU跑的backbone,需要的是轻量级网络,所以主要是:SqueezeNet,MobileNet,ShuffleNet
其中:对于VGG,ResNet,ResNeXt,MobileNet,ShuffleNet在我之前的博客有介绍过。
对与head部分,一般也分两个部分,一个用于one-step的目标检测,另外的two-step的目标检测。比较有代表性的two-step的网络有:RCNN系列(RCNN,Fast RCNN,Faster RCNN),还有R-FCN,Libra R-CNN。同时two-step网络中还有anchor-free 结构的网络。而one-stage的目标检测网络有:SSD,YOLO,RetinaNet。同样的,one-step网络也有anchor-free 结构的网络。
其中:对于RCNN,Fast RCNN,Faster RCNN,SSD,YOLO在我之前的博客也有介绍过。
近年来发展起来的目标探测器通常在主干和头部之间插入一些层,这些层通常用于收集不同阶段的特征图。我们可以称它为目标检测的颈部。通常,一个颈是由几个自底向上的路径和几个自顶向下的路径组成。比如有FPN,BiFPN等等。
综上所述,一个普通的目标探测器由以下几个部分组成:
下面内容会介绍yolov4的两个重要概念:Bag of freebies与Bag of specials,它将一些tricks都总归类成了这两类
我们把这些只会改变培训策略或只会增加培训成本的方法称为“bag of freebies”。
详细的“bag of freebies”概念总结,见链接:YOLOv4中的tricks概念总结——Bag of freebies
对于那些只增加少量推理成本,却能显著提高目标检测准确率的插件模块和后处理方法,我们称之为“Bag of specials”。
详细的“bag of specials”概念总结,见链接:YOLOv4中的tricks概念总结——Bag of specials
YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
完整的网络结构图如下:
YOLOv4的网络结构是由 CSPDarknet53、 SPP、 PANet、YOLOv3头部等组成,下面对各部分逐一讲解:
CSP结构就是将输出的特征图按channels均分两半,感觉理解了这个其他就没什么好说的了。下面贴两张图,对比去看就知道怎么回事了。
一共有5个CSP结构,所以每次输出的特征图在这里都会进行均分两份。
参考链接:https://www.cnblogs.com/yymn/articles/13672236.html
参考链接:https://blog.csdn.net/nan355655600/article/details/106246422
这张图片比较长,就不放在这里了。
在YOLOv4中的tricks概念总结——Bag of specials中有介绍
SPP在YOLOv4中的结构为:
双塔结构
在YOLOv4中,作者使用PANet代替YOLOv3中的FPN作为参数聚合的方法,针对不同的检测器级别从不同的主干层进行参数聚合。并且对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)。
详细见:目标检测算法——YOLOv3
在YOLOv4中,继承了YOLOv3的Head进行多尺度预测,提高了对不同size目标的检测性能。
YOLOv4学习了YOLOv3的方式,采用三个不同层级的特征图进行融合,并且继承了YOLOv3的Head。从上图可以看出,在COCO数据集上训练时,YOLOv4的3个输出张量的shape分别是:(19,19,225)、(38,38,255)、(76,76,225)。这是因为COCO有80个类别,并且每一个网格对应3个Anchor boxes,而每个要预测的bounding box对应的5个值
(
t
x
、
t
y
、
t
w
、
t
h
、
t
o
)
(t_{x}、t_{y}、t_{w}、t_{h}、t_{o})
(tx、ty、tw、th、to),所以有:3 x (80+5)=255 。
其他的一些数据增强的方法:见YOLOv4中的tricks概念总结——Bag of freebies
借鉴了CutMix数据增强方式的思想。CutMix数据增强方式利用两张图片进行拼接,但是Mosaic使利用四张图片进行拼接
Mosaic数据增强方法有一个优点:拥有丰富检测目标的背景,并且在BN计算的时候一次性会处理四张图片
SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。
也就是利用了对抗攻击模型来实现数据增强,关于这方面我后面会出一个关于李宏毅课上的一个笔记。
CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据。BN、CBN和CmBN之间的区别具体如下图所示:
CBN Cross-Iteration Bach Normalization 通过泰勒多项式去估计几个连续batch的统计参数:为了适配单GPU,低batch也可以有好结果
参考:https://www.cnblogs.com/yymn/articles/13672236.html
Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,Yolov4则借鉴D/CIOU loss的论文
将其中计算IOU的部分替换成DIOU的方式:再来看下实际的案例
在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。
问题:这里为什么不用CIOU_nms,而用DIOU_nms?
因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。
到最后,yolov4使用了如下的技巧与结构:
以上大多数已有概括,现在简要讲述一些没有提及的tricks
[0,0,1]–>[0.01,0.01,0.98]
[…] (1-a)+a/n[1,1…](这里a=0.03 n=3)
在BiFPN中,提出了多输入加权剩余连接来进行尺度级重加权,然后添加不同尺度的特征映射。
为了在网格线上的相对值同样可以被检测到
原本:
由
b
x
=
s
i
g
m
o
i
d
(
t
x
)
+
C
x
b_{x} = sigmoid(t_{x}) + C_{x}
bx=sigmoid(tx)+Cx改变为
b
x
=
α
∗
s
i
g
m
o
i
d
(
t
x
)
+
C
x
b_{x} = α*sigmoid(t_{x}) + C_{x}
bx=α∗sigmoid(tx)+Cx
简单的就是通过sigmoid乘上一个>1.0的因子,这样就不用处于无限大的时候值才等于1.现在乘上一个因子,相当于可以用一个小数也可以使得sigmoid值为1.
为单ground truth做多个锚点
一种改变学习率的方式
通过遗传算法找到最优参数
总结:
参考资料:
https://blog.csdn.net/weixin_44751294/article/details/117844557
https://blog.csdn.net/weixin_44751294/article/details/117851548
https://blog.csdn.net/weixin_44751294/article/details/117882906
https://www.bilibili.com/video/BV1yi4y1g7ro?p=4
https://blog.csdn.net/wjinjie/article/details/107509243
https://blog.csdn.net/wjinjie/article/details/107445791
https://blog.csdn.net/yzf0011/article/details/75212513
https://github.com/ultralytics/yolov3
https://www.cnblogs.com/yymn/articles/13672236.html
https://www.bilibili.com/video/BV1aK4y1k73n
https://www.bilibili.com/video/BV1pv411V7kR
https://blog.csdn.net/nan355655600/article/details/106246422
https://www.cnblogs.com/sddai/p/14760055.html
附录:
最后参考了一幅图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。