转载自https://blog.csdn.net/Python_zzm/article/details/140745340?spm=1001.2014.3001.5502
目标检测YOLO系列算法——YOLOv3-YOLOv9介绍
YOLO系列
在YOLO提出之前,R-CNN系列算法在目标检测领域中独占鳌头。尽管R-CNN系列检测精度高,但由于其双阶段(two-stage)网络结构,检测速度无法满足实时性的需求,饱受诟病。为了打破这一僵局,开发速度更快的目标检测器成为了大势所趋。
2016年,Joseph Redmon、Santosh Divvala、Ross Girshick等人提出了一种单阶段(one-stage)的目标检测网络。该网络的检测速度非常快,每秒可以处理45帧图片,能够轻松地实时运行。由于其速度之快和其使用的特殊方法,作者将其命名为:You Only Look Once(YOLO),并将该成果发表在了CVPR 2016上,从而引起了广泛地关注。
YOLO的核心思想是将目标检测转变成一个回归问题。利用整张图作为网络的输入,仅经过一个神经网络,就能得到bounding box(边界框)的位置及其所属的类别。这种方法显著提高了检测速度,同时保持了较高的检测精度,开创了目标检测领域的新纪元。
算法流程
YOLO系列算法通过一个单一的神经网络实现端到端的目标检测。YOLO系列算法的主要步骤和流程如下:
-
输入图像的预处理
将输入图像缩放到固定大小(例如,YOLOv1和YOLOv2常用448x448,YOLOv3和之后的版本通常用416x416或608x608),以适应网络的输入要求。 -
图像分网格
将输入图像划分为SxS的网格。每个网格负责检测包含其中心的目标。网格大小根据输入图像的大小和算法的具体实现有所不同。 -
预测边界框和类别概率
每个网格预测B个边界框和每个边界框的置信度。置信度表示预测的边界框内包含物体的概率以及边界框的准确度。
边界框参数: 每个边界框包含以下信息:中心坐标 (x, y),宽度 w,高度 h,以及置信度分数。
类别概率: 每个网格还预测C个类别概率,表示该网格包含不同类别目标的概率。 -
计算损失函数
YOLO的损失函数包括以下几个部分:
位置损失: 用于衡量预测边界框的中心坐标、宽度和高度与真实边界框的差异。
置信度损失: 衡量预测的置信度分数与实际情况的差异。
类别损失: 衡量预测的类别概率与实际类别的差异。
总损失是以上三部分的加权和,模型通过反向传播来最小化总损失。 -
非极大值抑制(Non-Maximum Suppression, NMS)
为了消除多余的边界框,YOLO采用非极大值抑制技术。保留置信度最高的边界框并移除与该边界框有较高重叠的其他边界框(通常使用IOU阈值)。 -
输出结果
最终输出包括检测到的边界框位置、置信度分数以及类别标签。只保留置信度超过一定阈值的边界框。
网络结构
在现代目标检测器中,网络结构通常分为三个主要部分:Backbone、Neck 和 Head。每个部分在整个检测过程中扮演不同的角色,分别负责特征提取、特征融合和最终检测。以下是这三部分在YOLO系列算法中的具体描述:
- Backbone
Backbone是卷积神经网络的基础部分,负责从输入图像中提取高级特征。它通常由多个卷积层和池化层组成,能够提取图像的边缘、纹理、形状等特征。
YOLOv1: 使用了GoogleNet的一部分作为Backbone。
YOLOv2: 使用了改进的Darknet-19网络,包含19个卷积层和5个池化层。
YOLOv3: 使用了更深的Darknet-53网络,包含53个卷积层。
YOLOv4: 引入了CSPDarknet53网络,结合了CSPNet(Cross Stage Partial Network)来进一步提高特征提取能力和网络效率。 - Neck
Neck部分负责特征融合和多尺度特征提取。通过结合来自不同层次的特征,可以增强模型对不同尺度目标的检测能力。Neck部分通常使用特征金字塔网络(FPN)、路径聚合网络(PANet)等技术。
YOLOv3: 引入了FPN(Feature Pyramid Network),在不同尺度上进行检测,提高了对小目标的检测效果。
YOLOv4: 使用了PANet(Path Aggregation Network)来进一步优化特征融合,提升了检测精度和速度。
YOLOv5: 继续改进Neck部分,采用了更加优化的特征融合策略。 - Head
Head部分是检测器的输出层,负责生成最终的边界框和类别预测。Head部分根据从Neck传来的特征图,进行回归和分类任务。
YOLOv1: 直接在最后的特征图上进行回归,生成每个网格的边界框和类别预测。
YOLOv2: 引入Anchor Boxes,通过回归每个Anchor Box的偏移量来预测边界框。
YOLOv3: 使用了多尺度预测,在不同特征图上同时进行预测,以提高不同尺度目标的检测能力。
YOLOv4及以后: 继续优化Head部分,结合最新的损失函数(如CIOU Loss)和激活函数(如Mish),提高预测的准确性和鲁棒性。
YOLOv3
YOLOv3(You Only Look Once version 3)是YOLO系列算法的第三个版本,由Joseph Redmon和Ali Farhadi在2018年提出。YOLOv3具有以下特点
-
深度网络结构
Darknet-53 Backbone: YOLOv3采用了更深的Darknet-53作为骨干网络(Backbone)。Darknet-53包含53个卷积层,并且引入了残差连接(ResNet的设计思想),使得网络能够更有效地训练和更深层次地提取特征。 -
多尺度检测
特征金字塔(Feature Pyramid Network, FPN): YOLOv3在三个不同尺度上进行预测,每个尺度对应不同层级的特征图。这样可以更好地检测不同大小的目标,提升了对小目标的检测能力。
三尺度检测: 在13x13、26x26和52x52(有的版本是19、38、76,与输入图像尺寸有关)三个尺度上进行预测,分别用于检测大、中、小目标。 -
改进的边界框预测
Anchor Boxes: YOLOv3使用预定义的Anchor Boxes,通过回归Anchor Box的偏移量来预测边界框的位置和尺寸。每个预测尺度使用不同大小的Anchor Boxes。
Logistic回归: 用于预测对象置信度,从而更好地处理边界框的置信度预测问题。 -
多标签分类损失
Binary Cross-Entropy Loss: YOLOv3在类别预测上使用了多标签分类损失(binary cross-entropy loss),而不是softmax。这使得YOLOv3能够处理多标签分类问题,对于一个目标同时属于多个类别的情况更加灵活。
主干网络
YOLOv3的主干网络Darknet-53包含卷积层(Convolutional Layer)、残差层(Residual Layer)、特征融合层(Feature Fusion Layer),网络层数的加深提高了检测精度,大量残差网络模块的引入减少了由网络层数加深引起的梯度下降问题,金字塔池化模块的引入可以实现多尺寸的输入和统一尺寸的输出。
Darknet-53主要由1x1和3x3的卷积层组成,每个卷积层之后包含一个批量归一化层和一个Leaky ReLU,加入这两部分的目的是为了防止过拟合。卷积层、BN层以及LeakyReLU共同组成Darknet-53的基本CBL。因为在Darknet-53中共包含53个这样的CBL,所以称其为Darkent-53。
Darknet-53的具体结构如下:
- 输入图像(例如,416x416x3)
- 卷积层 + 批归一化 + Leaky ReLU(数次)
- 残差块(多个卷积层 + 残差连接)(数次)
- 步长为2的卷积层进行下采样
- 重复步骤2-4若干次,构建深层网络
- 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的
- 最终输出特征图,用于后续的检测任务
颈部网络
YOLOv3的颈部网络是FPN(多尺度检测,特征融合),FPN(Feature Pyramid Network)是一种用于目标检测和语义分割任务的特征金字塔网络结构。它的设计目的是解决单尺度特征提取网络在处理不同尺度目标时的困难。
FPN的主要步骤是,从最高层的特征图开始,逐层进行上采样(通常使用2倍上采样),得到与下一层特征图相同分辨率的上采样特征图。将上采样后的特征图与相应的横向特征图进行融合。融合方法通常是逐元素相加(element-wise addition)。横向特征图来自自底向上的特征提取过程,是较高分辨率但语义信息较少的特征图。最终得到的每一层融合后的特征图作为金字塔的一个尺度。整个过程形成了一个从高分辨率到低分辨率的特征金字塔,每个尺度上的特征图都包含丰富的语义信息。
Bounding Box
YOLOv3输出了3个不同尺度的特征图,采用多尺度来对不同尺寸的目标进行检测,越精细的网格单元就可以检测出越精细的物体。
对于COCO类别而言,有80个类别,所以每个box应该对每个类别都输出一个概率。
每个box需要有x, y, w, h, confidence(中心坐标,框的宽度和高度,置信度)5个基本参数,还要有80个类别的概率。yolov3设定的是每个网格单元预测3个box,所以得到特征图的深度为 ### Bounding Box
yolov3输出了3个不同尺度的特征图,采用多尺度来对不同尺寸的目标进行检测,越精细的网格单元就可以检测出越精细的物体。
对于COCO类别而言,有80个类别,所以每个box应该对每个类别都输出一个概率。
每个box需要有x, y, w, h, confidence(中心坐标,框的宽度和高度)五个基本参数,还要有80个类别的概率。yolov3设定的是每个网格单元预测3个box,所以得到特征图的深度为 3*(5 + 80) = 255。3个不同尺度的特征图的输出分别是 13 ∗ 13 ∗ 255 , 26 ∗ 26 ∗ 255 , 52 ∗ 52 ∗ 255 13*13*255,26*26*255,52*52*255 13∗13∗255,26∗26∗255,52∗52∗255。
VOC2012数据集有20个类别,特征图的深度为 3*(5 + 20) = 75。
随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO v2 已经开始采用 K-means 聚类得到先验框的尺寸,YOLO v3 延续了这种方法,为每种下采样尺度设定 3 种先验框,总共聚类出 9 种尺寸的先验框。在 COCO 数据集这 9 个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的 13*13 特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的 26 * 26 特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的 52 * 52 特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
这里注意bounding box 与anchor box的区别:
Bounding box它输出的是框的位置(中心坐标与宽高),confidence以及N个类别。
anchor box只是一个尺度即只有宽高。
下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
损失函数
神经网络的输出分为四类:(x,y),(w,h), confident, class。损失函数应该由各自特点确定。加到一起组成最终的loss_function。
YOLOv3使用logistic回归对每个anchor包围的内容进行目标性评分(objectness score)。根据目标性评分来选择评分最高的预选框进行预测,而不是对所有预选框进行输出。YOLOv3只会对评分最高的那个anchor进行操作,即最佳anchor。logistic回归用于从9个anchors中找到目标性评分(objectness score)最高的那一个。
YOLOv3需要先构建目标。对于某个ground truth,首先确定其中心点落在哪个cell上,然后计算该cell的每个anchor与ground truth的IOU值。计算IOU值时不考虑坐标,只考虑形状,因为anchor没有坐标(x, y)信息。具体步骤是将anchor与ground truth的中心点都移动到同一位置(原点),然后计算IOU值。IOU值最大的那个anchor与ground truth匹配,作为正样本参与训练。这个匹配的anchor对应的预测框将用来预测该ground truth。
损失计算
- 位置损失 (x, y, w, h):
- x和y的预测值经过sigmoid激活函数,与label的x, y(grid cell中心点坐标,值在0-1之间)求差,使用均方差(MSE)计算损失。
- w和h的损失也使用均方差(MSE)计算。
- 类别损失 (class):
使用多类别交叉熵(multi-class cross-entropy)计算损失。 - 置信度损失 (confidence):
使用二分类交叉熵(binary cross-entropy)计算损失。
负样本不参与class,xywh的loss计算只参与confident的loss计算。
YOLOv4
YOLOv4(You Only Look Once version 4)是YOLO系列的改进版本,由Alexey Bochkovskiy、Chien-Yao Wang和Hong-Yuan Mark Liao于2020年提出。YOLOv4进一步提升了YOLO系列在目标检测中的性能,通过结合先进的模型架构设计和优化技巧,实现了高精度和高效率的平衡。
YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
主干网络
CSPNet全称是Cross Stage Paritial Network,主要从网络结构设计的角度解决推理中从计算量很大的问题。
CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。
因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
颈部网络
PANet特征融合:YOLOv4引入了PANet(Path Aggregation Network)模块,用于在不同尺度的特征图之间进行信息传递和融合,以获取更好的多尺度特征表示。
SPP:具体是在CSPDarknet-53网络的后面,通过在不同大小的池化层上进行特征提取,从而捕捉到不同尺度上的上下文信息。
激活函数
Yolov4在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky relu激活函数。
M i s h = x ∗ t a n h ( l n ( 1 + e x ) ) Mish = x*tanh(ln(1+e^x)) Mish=x∗tanh(ln(1+ex))
Mish在负值的时候并不是完全截断,而是允许比较小的负梯度流入,从而保证信息流动。并且激活函数无边界这个特点,避免了饱和这一问题。比如sigmoid,tanh激活函数通常存在梯度饱和问题,在两边极限情况下,梯度趋近于1,而Mish激活函数则巧妙的避开了这一点。
另外Mish函数也保证了每一点的平滑,从而使得梯度下降效果比Relu要好。
Yolov4作者实验测试时,使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些。
因此在设计Yolov4目标检测任务时,主干网络Backbone使用Mish激活函数。
PaFPN
和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。
PAN通过自顶向下传达强语义特征,特征金字塔(两个PAN)则自底向上传达强定位特征。两相结合,缩短了低层与顶层特征之间的信息路径,促进了特征融合,进一步提高特征提取的能力。
两个PAN层特征的融合依旧是concat。
损失函数
在YOLOv4中,确实引入了一种新的距离度量指标,称为CIOU。
CIOU是一种改进的目标检测损失函数,用于衡量预测框和真实框之间的距离。CIOU是DIoU的进一步扩展,除了考虑框的位置和形状之间的距离外,还引入了一个附加的参数用于衡量框的长宽比例的一致性。
CIOU的计算公式如下:
其中,IoU表示传统的交并比(Intersection over Union),d表示预测框和真实框中心点之间的欧氏距离,c表示预测框和真实框的对角线距离。在CIOU中,α是一个参数,用于平衡框长宽比例的一致性和框位置之间的距离。v是一个辅助项,用于惩罚预测框和真实框之间的长宽比例差异。
CIOU损失是通过最小化CIOU来优化目标检测模型。它可以作为定位损失函数的一部分,用于衡量预测框的定位准确性。通过CIOU损失的引入,YOLOv4可以更好地优化边界框的位置、形状和长宽比例,从而提高目标检测的准确性和鲁棒性。
YOLOv5
非常经典实用的YOLO版本。
与YOLOv4相比,改动不大,主要是细节方面的改进、网络结构的调整以及代码框架的完善。
网络结构图:
主干网络
和YOLOv4 的主干网络相同,都采用了基于CSP结构的CSPDarkNet网络,不同的是,在YOLOv4中,CSPDarkNet遵循“12884”的设计来得到CSPDarkNet-53,而YOLOv5则进一步将其修改为“3993”的结构,以便后续在模型深度的层面上做缩放。相较于YOLOv4 的“12884”,YOLOv5则在模型的第一阶段中不加入CSP模块,仅仅使用一个kernel较大的卷积来做第一次的降采样,随后才使用CSP模块,因此,YOLOv5的结构参数“3993”,而不是“13993”。
相较于早期的YOLOv4,YOLOv5在PaFPN中添加了CSP模块,取代了早期的包含5层卷积的简单模块。
数据增强
马赛克增强(Mosaic Augmentation)是YOLOv4中引入的一种数据增强技术,用于提升模型的泛化能力。通过将多张不同的图像拼接成一张新的图像,马赛克增强可以显著丰富训练数据的多样性,同时提高模型对不同尺度目标的检测能力。
在马赛克增强的基础上,YOLOv5还进一步使用了混合增强,即将两张马赛克图像拼在一起。在训练阶段,YOLOv5仅以很小的概率来使用这个增强,对于YOLOv5-N和YOLOv5-S这两个小模型,不适用混合增强,而对于YOLOv5-M到YOLOv5-X,则以很低的0.1或0.15的概率来使用。
YOLOv6
YOLOv6于2022年9月由美团视觉人工智能部发布在ArXiv。与YOLOv4和YOLOv5类似,它为工业应用提供了各种不同尺寸的模型。
从整体上看,YOLOv6的网络结构与YOLOv4、YOLOv5是很相似的,尤其是backbone和neck部分,但是其中的实现模块是有变化的;但最大的不同在于Head部分,采用的是YOLOX的hHead方式,将分类和回归分为两个支路,进行了解耦操作。
主干网络
YOLOv6的Backbone的实现的基本模块为RVB1_X结构,其全程为RepVGGBlock_X,表示由多个RepVGGBlock组成。
RepVGGBlock是RepVGG网络的重复模块,由多个RepVGGConv模块组成。每个RepVGGBlock由两个RepVGGConv模块组成,第一个RepVGGConv是一个3x3卷积操作,而第二个RepVGGConv是一个1x1卷积操作。
这两个卷积模块之间使用了批归一BatchNorm 和ReLU激活函数。RepVGGConv模块是RepVGG网络中的基本卷积模块,由一个卷积层、批归一化和ReLU激活函数组成。这样的设计使得RepVGGBlock具有较强的表达能力,并且可以适应不同的特征提取需求。
RepVGGBlock在RepVGG网络中被重复堆叠多次,形成了深层的网络结构。通过堆叠多个RepVGGBlock,可以提高网络的表示能力和复杂度,从而实现更准确的特征提取和目标识别。
颈部网络
PANet结构类似更换为RepVGGBlock结构。
输出端
YOLOv6对检测头进行了解耦,分开了边框与类别的分类过程。
YOLOv7
YOLOv7由YOLOv4和YOLOR的同一作者于2022年7月发表在ArXiv。
主干网络
Backbone为骨干网络由CBS、ELAN、MP-1组成。
CBS结构:特征提取和通道转换。
ELAN:通过不同的分支将特征图拼接起来,进而促进更深层网络的有效学习和收敛。
MP-1:将经过不同下采样方式所得到的特征图进行融合,在不增加计算量的同时保留更多的特征信息。
颈部网络
该网络主要包括SPPCSPC、ELANW、UPSample三个子模块和Cat结构,其中,SPPCSPC模块用于提高特征提取的效率和准确率;ELANW模块相比于ELAN模块增加了两个拼接操作;UPSample模块用于实现不同层次特征的高效融合;Cat结构旨在进一步优化卷积层的效果。
输出端
与YOLOv6类似。检测头负责网络最终的预测输出,针对Neck处理后的特征信息进行解耦,采用重参数化模块对Neck输出的三种不同尺寸的特征进行通道数调整,再经过1x1的卷积操作,得出目标物体的位置、置信度和类别的预测。
YOLOv8
YOLOv8 与YOLOv5出自同一个团队,是一款前沿、最先进(SOTA)的模型,基于先前 YOLOv5版本的成功,引入了新功能和改进,进一步提升性能和灵活性。
主干网络
Backbone部分采用的结构为Darknet53,其中包括基本卷积单元Conv、实现局部特征和全局特征的Feature Map级别的融合的空间金字塔池化模块SPPF、增加网络的深度和感受野,提高特征提取能力的C2F模块。
输出端
在损失函数计算方面,采用了Task AlignedAssigner正样本分配策略。由分类损失VFL(Varifocal Loss)和回归损失CIOU(Complete-IOU)+DFL(Deep Feature Loss)两部分的三个损失函数加权组合而成。
YOLOv9
YOLOv9是原YOLOv7团队打造,提出了 可编程梯度信息(PGI) 的概念来应对深度网络实现多个目标所需的各种变化。 PGI可以为目标任务计算目标函数提供完整的输入信息,从而获得可靠的梯度信息来更新网络权值。此外,还设计了一种新的轻量级网络架构——基于梯度路径规划的通用高效层聚合网络(GELAN)。 GELAN的架构证实了PGI在轻量级模型上取得了优异的结果。
可编程梯度信息
在深度网络中,输入数据在前馈过程中丢失信息的现象俗称信息瓶颈。
为了解决上述问题,论文提出了一个新的概念,即可编程梯度信息。其概念是通过辅助可逆分支生成可靠的梯度,使得深层特征仍然能够保持执行目标任务的关键特征。PGI主要包括三个组成部分:主分支、辅助可逆分支、多级辅助信息。
从图3(d)中我们可以看出,PGI的推理过程仅使用主分支,因此不需要任何额外的推理成本。至于其他两个组件,它们仅用于训练阶段而不在推理阶段,用于解决或减缓深度学习方法中的几个重要问题:
辅助可逆分支:是为了处理神经网络加深带来的问题而设计的。网络加深会造成信息瓶颈,导致损失函数无法生成可靠的梯度。
对于多级辅助信息:旨在处理深度监督带来的误差累积问题,特别是针对多个预测分支的架构和轻量级模型。
通用高效层聚合网络
ELAN(Efficient layer aggregation network)高效层聚合网络,具体的说是一种网络结构设计策略,最早在论文Designing Network Design Strategies Through Gradient Path Analysis(https://arxiv.org/abs/2211.04800)被提出。在YOLOv7中作为主干使用。
神经网络结构设计主要分为两种,分别是依据数据路径设计和依据梯度路径设计。ELAN是依据梯度路径设计策略进行相关的设计和优化,更具体的讲,ELAN侧重于最大化梯度源,丰富梯度路径。
重参化是一种从网络推理效率和性能方面出发,优化得到的网络结构。其基本思想是在训练时使用多分支(如多个Conv层),增加梯度反馈路径。在推理时进行融合,减小计算量,提高推理效率。
YOLOv9网络模型的主要模块可以理解为是一个Rep + CSP + ELAN的组合网络。Rep优化计算,CSP丰富梯度,ELAN做高效的特征聚合。