本文的写作来源于以下这篇稿子的学习:
YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)-优快云博客
西部延时,我们开始吧!
一、YOLO v4大神接棒
(1)网络结构
YOLOv4 = CSPDarknet53(主干)+SPP附加模块(颈)+PANet路径聚合颈)+ YOLOv3(头部)
如下图所示:
①CSPDarknet53
在原来的基础上主要进行了两项改变:
将原来的Darknet53与CSPNet进行结合:原来是由53个残差结构组成,现在将残差结构拆分成2部分,一部分继续堆叠残差块,另一部分只经过很少的变化处理直接连接到末尾。
使用MIsh激活函数代替了原来的Leaky ReLU:
②SPP
SPP最初的设计目的是用来使卷积神经网络不受固定输入尺寸的限制。
在YOLOv4中,它显著地增加了感受野,分离出了最重要的上下文特征,并且几乎不会降低的YOLOv4运行速度。
如下图所示:就是用四个不同尺度的最大池化对上层输出的feature map进行处理。
尺寸:(13x13、9x9、5x5、1x1)
③PANet
实际上就是在Mask R-CNN上修改,充分利用了特征融合!
1、FPN主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
2、Bottom-up Path Augmentation的引入利用网络浅特征进行分割,主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
3、Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
4、Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。
同时,yolo v4对原PANet方法进行了修改, 使用张量连接(concat)代替了原来的捷径连接(shortcut connection)
④YOLO v3 Head
这个没有改变,直接使用(说明v3应用效果非常不错):
(2)作者的“工具箱”
在不增加推理成本的前提下获得更好的精度,而只改变训练策略或只增加训练成本的方法,作着称之为 “免费包”(Bag of freebies);
只增加少量推理成本但能显著提高目标检测精度的插件模块和后处理方法,称之为“特价包”(Bag of specials)
①免费包
以数据增强方法为例,虽然增加了训练时间,但不增加推理时间,并且能让模型泛化性能和鲁棒性更好。像这种不增加推理成本,还能提升模型性能的方法,作者称之为"免费包",非常形象。下面总结了一些常用的数据增强方法:
随机缩放
翻转、旋转
图像扰动、加噪声、遮挡
改变亮度、对比对、饱和度、色调
随机裁剪(random crop)
随机擦除(random erase)
Cutout
MixUp
CutMix
常见的正则化方法有:
DropOut
DropConnect
DropBlock
平衡正负样本的方法有:
Focal loss
OHEM(在线难分样本挖掘)
除此之外,还有回归 损失方面的改进:
GIOU
DIOU
CIoU
②特价包
增大感受野技巧:
SPP
ASPP
RFB
注意力机制:
Squeeze-and-Excitation (SE)
Spatial Attention Module (SAM)
特征融合集成:
FPN
SFAM
ASFF
BiFPN (出自于大名鼎鼎的EfficientDet)
更好的激活函数:
ReLU
LReLU
PReLU
ReLU6
SELU
Swish
hard-Swish
后处理非极大值抑制算法:
soft-NMS
DIoU NMS
(3)改进方法
①Mosaic:为了使目标检测器更容易在单GPU上训练,融合4张照片训练。
②SAT:
SAT是一种自对抗训练数据增强方法,这一种新的对抗性训练方式。在第一阶段,神经网络改变原始图像而不改变网络权值。以这种方式,神经网络对自身进行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,用正常的方法训练神经网络去检测目标。
③CmBN:
CmBN的全称是Cross mini-Batch Normalization,定义为跨小批量标准化(CmBN)。CmBN 是 CBN 的改进版本,它用来收集一个batch内多个mini-batch内的统计数据
④修改过的SAM:
SAM(Spatial Attention Module),将SAM从空间注意修改为点注意!
原:
现:
直接将输入到卷积层中,而不经过最大池化和平均池化。
⑤修改过的PAN
PAN(Path Aggregation Network),使用张量连接(concat)代替了原来的快捷连接(shortcut connection)
二、YOLO v5再次进化
这里作者给出的v5 版本有YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLO5x ,我们采用YOLOv5s来进行解说。
(1)这里我们给出整体网络结构:
(1)input
仍然采用Mosaic进行图片随机缩放、随机裁剪、随机排布来进行数据增强。
(2)BackBone
骨干网路部分主要采用的是:Focus结构、CSP结构。
CSP结构通过降维和压缩输入特征图,从而减少计算量和提高感受野,同时提高目标检测的精度和模型的表达能力。
如图,4x4x3的图像切片后变成2x2x12的特征图。
(3)neck,head
①FPN+PAN结构,详见上面YOLO一系列的做法
②耦合的Head与前代相同
(2)改进之处
①自适应锚框计算
前代是通过K-Means方法来获取数据集的最佳anchors,这部分操作需要在网络训练之前单独进行。Yolov5的作者将此功能嵌入到整体代码中,训练时,自适应的计算不同训练集中的最佳锚框值
②自适应灰度填充
看图片应该很形象吧叭叭叭!
③损失函数
分类用交叉熵损失函数(BEC Loss),边界框回归用 CIoU Loss:
多分类交叉熵损失函数公式为:
L=−∑i=1Cyilogy^i
CIOU将目标与anchor之间的中心距离,重叠率、尺度以及惩罚项都考虑进去,使得目标框回归变得更加稳定呀!
三、YOLO v8传奇之作
(1)网络结构
仍然采用了CSPDarknet(主干) + PAN-FPN(颈) + Decoupled-Head(输出头部)结构,但是每个部分都有略微改进,这里我们看看图示吧!
①Backbone
这里仍然采用的是CSP的思想,但是C3模块被替换成了C2f模块,以实现轻量化。
同时,SPPF模块不变(特征融合与提取特征)。
我们来看看模块具体是怎么被替换的:
这里的Bottleneck模块就是残差模块,n由使用者定义,不同模型n不同。
通过并行更多的梯度流分支,设计ELAN模块可以获得更丰富的梯度信息,进而或者更高的精度和更合理的延迟。
②PAN-FPN
这里依旧使用了PAN的思想,YOLOv8将YOLOv5中PAN-FPN上采样阶段中的卷积结构删除了,同时也将C3模块替换为了C2f模块
③Decoupled-Head
这里也是解耦的输出头部,用以进行类别和边界框的回归学习
同时舍弃了Anchor-Base,使用了Anchor-Free
④损失函数
YOLOv8使用VFL Loss作为分类损失,使用DFL Loss+CIOU Loss作为分类损失。
这里作者将框的位置建模成一个 general distribution,让网络快速的聚焦于和目标位置距离近的位置的分布。
⑤样本匹配
这里YOLO v8抛弃了以往的IOU匹配或者边长比例的分配方式,而是使用了Task-Aligned Assigner匹配方式
到这里,咋们就结束了YOLO v1到v8的全过程学习啦!接下来是更加先进的v9 和 v10呢