Yolov8目标识别与实例分割——算法原理详细解析-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

YOLO是一种基于图像全局信息进行预测并且它是一种端到端的目标检测系统最初的YOLO模型由Joseph Redmon和Ali Farhadi于2015年提出并随后进行了多次改进和迭代产生了一系列不同版本的YOLO模型如YOLOv2、YOLOv3、YOLOv4YOLOv5等。这些更新和迭代旨在提高模型的性能、精度和速度使其在实际应用中更具竞争力。

YOLO的核心思想是将图像划分为网格并在每个网格单元中预测物体的边界框和类别。这种设计使得YOLO非常适合实时目标检测应用因为它可以在较短的时间内完成目标检测任务。

一、算法比较

1、简介

Yolov8作为一种SOTAState-of-the-Art模型构建在Yolo系列的基础之上融合了先前版本的经验同时引入了创新性的特性和改进以进一步提高其性能和灵活性使其成为目标检测、图像分割、姿态估计等多项任务的首选。

Yolov8的创新点包括以下方面

  1. 新的骨干网络Yolov8采用了一种新的骨干网络架构有望提高特征提取和处理能力从而有助于更准确的目标检测和分割。

  2. 新的Anchor-Free检测头引入了Anchor-Free检测头不再依赖锚框提供更大的灵活性可以更好地适应各种目标形状和大小。

  3. 新的损失函数Yolov8采用了一种全新的损失函数有望进一步提升模型的收敛速度和性能表现。

Yolov8还具备多平台支持的能力可以在不同硬件平台上运行包括CPU和GPU。此外Yolov8的开源库不仅限于Yolo系列模型还具有卓越的可扩展性支持其他类型的模型以及各种任务如分类、分割、姿态估计等。

Yolov8在各项指标上实现了显著的提升超越了现有的目标检测和实例分割模型。它汲取了Yolov5、Yolov6、YoloX等模型的设计优点通过全面改进Yolov5的结构同时保留了Yolov5工程化简洁易用的特点。
在这里插入图片描述

2.对比

从下面的表格可以看到Yolov5与Yolov8在COCO Val 2017数据集的测试结果比较了Yolov8和Yolov5在mAP、参数数量和FLOPs方面的性能。结果显示Yolov8相较于Yolov5在精度上有显著提升然而模型的参数数量和FLOPs也相应增加这导致模型的推理速度相对较慢。

这个比较表格是有关性能和复杂性的重要信息对于选择合适的模型在不同应用中非常有帮助。 Yolov8的精度提高表明其在更精细的目标检测任务中可能更具竞争力但同时需要更多的计算资源。在使用的过程中可以具体对比应用需求权衡精度和速度选择最适合的模型。

FlOPs(floating point operations)浮点运算次数用于衡量算法/模型的复杂度。FLOPS全部大写(floating point operations per second)每秒运算的浮点数可以理解为计算速度用于衡量硬件性能。这里是衡量模型的复杂度因此选择FlOPs。

Yolov5与yolov8在COCO Val 2017数据集的测试结果
在这里插入图片描述

二、算法解析

1、算法创新

Yolov8主要汲取了Yolov5、Yolov6、YoloX等模型的设计优点并将其工程实践进行了深入改进。具体创新点如下

  1. Yolov8引入了一个全新的SOTA模型包括P5 640和P6 1280分辨率的目标检测网络以及基于YOLACT的实例分割模型。此外通过提供不同尺度的模型N/S/M/L/X以满足不同部署平台和应用场景的需求。

s这是 YOLO 系列中最小的模型。“s” 代表 “small”小。该模型在计算资源有限的设备上表现最佳如移动设备或边缘设备。YOLOv5s 的检测速度最快但准确度相对较低。
m这是 YOLO 系列中一个中等大小的模型。“m” 代表 “medium”中。m 在速度和准确度之间提供了较好的平衡适用于具有一定计算能力的设备。
l这是 YOLO 系列中一个较大的模型。“l” 代表 “large”大。l 的准确度相对较高但检测速度较慢。适用于需要较高准确度且具有较强计算能力的设备。
x这是 YOLO系列中最大的模型。“x” 代表 “extra large”超大。x 在准确度方面表现最好但检测速度最慢。适用于需要极高准确度的任务且具有强大计算能力如 GPU的设备。
n这是 YOLO 系列中的一个变体专为 Nano 设备如 NVIDIA Jetson Nano进行优化。n 在保持较快速度的同时提供适用于边缘设备的准确度。

  1. 在骨干网络Backbone方面Yolov8继续采用CSP模块的思想但将Yolov5中的C3模块替换为C2f模块从而实现了进一步的轻量化。此外它延续了Yolov5中的SPPF模块并对不同尺度的模型进行了精心微调不再采用单一的参数设置从而显著提升了模型性能。

Yolov5中的C3模块
在这里插入图片描述
Yolov8 C2f模块:
在这里插入图片描述

  1. 在特征融合Neck方面Yolov8继续使用PAN的思想但通过对比Yolov5和Yolov8的结构图可以看到Yolov8去除了1*1降采样层。

  2. 头部Head部分相较于Yolov5有较大的改动。Yolov8采用了目前主流的解耦头结构Decoupled-Head将分类和检测头分离。此外Yolov8从Anchor-Based方法切换到了Anchor-Free方法。

  3. 在损失函数计算方面Yolov8使用VFL Loss作为分类损失在实际训练中使用BCE Loss同时使用DFL Loss和CIOU Loss作为回归损失。

  4. Yolov8改进了标签分配策略弃用了以往的IoU分配或单边比例的分配方式取而代之的是采用Task-Aligned Assigner策略用于正负样本的分配。

这些创新和改进使Yolov8成为一个在性能和工程实践方面都有重要进展的目标检测模型。

2.网络结构

网络结构如下图
在这里插入图片描述

2.1 Backbone

Yolov8的Backbone同样借鉴了CSPDarkNet结构网络结构
在这里插入图片描述
与Yolov5最大区别是Yolov8使用C2f模块代替C3模块。具体改进如下
第一个卷积层的Kernel size从6×6改为3x3。所有的C3模块改为C2f模块如下图所示多了更多的跳层连接和额外Split操作。
Block数由C3模块3-6-9-3改为C2f模块的3-6-6-3。
在这里插入图片描述
由上图可以看出C2f中每个BottleNeck的输入Tensor的通道数channel都只是上一级的0.5倍因此计算量明显降低。从另一方面讲梯度流的增加也能够明显提升收敛速度和收敛效果。

C2f模块首先以输入tensor(n,c,h,w)经过Conv1层进行split拆分分成两部分(n,0.5c,h,w)一部分直接经过n个Bottlenck另一部分经过每一操作层后都会以(n,0.5c,h,w)的尺寸进行Shortcut最后通过Conv2层卷积输出。也就是对应n+2的Shortcut第一层Conv1的分支tensor和split后的tensor为2+n个bottenlenneck。

2.2 Neck

Neck采用了PANet结构
在这里插入图片描述
Backbone最后SPPF模块(Layer9)之后H、W经过32倍下采样对应地Layer4经过8倍下采样Layer6经过16倍下采样。输入图片分辨率为640640得到Layer4、Layer6、Layer9的分辨率分别为8080、4040和2020。

Layer4、Layer6、Layer9作为PANnet结构的输入经过上采样通道融合最终将PANet的三个输出分支送入到Detect head中进行Loss的计算或结果解算。

与FPN(单向自上而下)不同的是PANet是一个双向通路网络引入了自下向上的路径使得底层信息更容易传递到顶层。

2.3 Head

Head部分相比Yolov5改动较大直接将耦合头改为类似Yolox的解耦头结构(Decoupled-Head)将回归分支和预测分支分离并针对回归分支使用了Distribution Focal Loss策略中提出的积分形式表示法。之前的目标检测网络将回归坐标作为一个确定性单值进行预测DFL将坐标转变成一个分布。
在这里插入图片描述

3. yaml配置文件

3.1 参数设置

在这里插入图片描述
Yolov8采用Anchor-Free方式因而在yaml文件中移除了anchors参数并且将多个不同版本的模型参数写在一个yaml同时在深度因子和宽度因子后面增加了 最大通道数 这一参数。

3.2 Backbone

在这里插入图片描述

  • [from, repeats, module, args]
  • from本层的来源即就是输入。-1表示将上层的输出作为本层的输入。
  • repeats本层重复次数。
  • module本层名称。
  • args本层参数。
  1. 第0层[-1,1,Conv,[64, 3, 2]] #0-P1/2
  • -1表示将上层的输出作为本层的输入第0层的输入是6406403的图像。
  • Conv表示卷积层。
  • [64, 3, 2]输出通道数64卷积核大小k为3stride步长为2。由此计算padding为1。
  • 输出特征图大小(「向下取整1」)f_out=((f_in - k + 2p ) / s )=((640 - 3 + 21 ) / 2 )=320。
  • 所以本层输出特征图尺寸为32032064长宽为原输入图片的1/2。
  1. 第1层[-1,1,Conv,[128, 3, 2]] # 1-P2/4
  • [128, 3, 2]输出通道数128卷积核大小k为3stride步长为2。
  • 输出特征图大小(「向下取整1」)f_out=((f_in - k + 2p ) / s )=((320 - 3 + 21 ) / 2 )=160。
  • 所以本层输出特征图尺寸为160160128长宽为原输入图片的1/4。
  1. 第2层[-1,3,C2f,[128, True]]
  • [128, True]128表示输出通道数True表示Bottleneck有shortcut。
  • 本层输出特征图尺寸仍为160160128。
  • 第3层[-1,1,Conv,[256,3,2]] # 3-P3/8
  • [256,3,2]输出通道数256卷积核大小k为3stride步长为2。
  • 输出特征图大小(「向下取整1」)f_out=((f_in - k + 2p ) / s )=((160-3+ 21 )/2)=80。
  • 所以本层输出特征图尺寸为8080256长宽为原输入图片的1/8。
  1. 第9层[-1,1,SPPF,[1024, 5]]
  • [1024, 5]1024表示输出通道数5表示池化核大小k。
  • 输出特征图尺寸为20201024。
3.3 Head

在这里插入图片描述

  1. 第10层[-1,1,nn.Upsample,[None,2,‘nearest’]]
  • torch.nn.Upsample(size=None, scale_factor=None, mode=‘nearest’, align_corners=None)
  • 本层为上采样层-1表示将上层的输出作为本层的输入。None表示上采样的输出尺寸size不指定。2表示scale_factor=2即输出尺寸是 输入的2倍nearest表示使用的上采样算法为最近邻插值算法。经过这层之后特征图的长和宽变为原来的二倍通道数不变所以输出特征图尺寸为40401024。
  1. 第11层[[-1,6],1,Concat,[1]] #cat backbone P4
  • 本层为cancat层[-1,6]表示将上层和第6层的输出作为本层的输入[1]表示concat拼接的维度为1。上层的输出尺寸为40401024第6层的输出尺寸为4040512最终本层的输出尺寸为40401536。
  1. 第21层[-1,3,C2f,[1024]] # 21(P5/32-large)
  • 本层是C2f模块3表示本层重复3次。1024表示输出通道数。经过这层之后特征图尺寸变为20201024特征图的长宽已经变成原输入图片的1/32。
  1. 第22层[[15, 18, 21], 1, Detect, [nc]]
  • 本层是Detect层[15, 18, 21]表示将第15、18、21层的输出分别是8080256、4040512、20201024作为本层的输入。nc是数据集的类别数。

4. loss

Loss计算过程包括两部分正负样本分配策略和Loss计算

4.1 正负样本分配策略

在目标检测中正负样本分配策略是指在训练期间为每个样本分配一个权重以便模型更加关注困难的样本和重要的样本。

常见的正负样本分配策略包括动态分配策略和静态分配策略两种。

  1. 静态分配策略静态分配策略是指在训练开始之前固定为一组预先定义的权重这些权重不会在训练过程中改变。这种分配策略通常基于经验得出可以根据数据集的特点进行调整但是不够灵活可能无法充分利用样本的信息导致训练效果不佳。

  2. 动态分配策动态分配策略则可以根据训练的进展和样本的特点动态调整权重。在训练初期模型可能会很难区分正负样本因此应该更加关注那些容易被错分的样本。随着训练的进行模型逐渐变得更加强大可以更好地区分样本因此应该逐渐减小困难样本的权重同时增加易分样本的权重。动态分配策略可以根据训练损失或者其他指标来进行调整可以更好地适应不同的数据集和模型。

典型的动态分配策略如YOLOX的simOTA、TOOD的Task-Aligned Assigner和RTMDet的DynamicSoftLabelAssigner等。YOLOv5采用的依然是静态分配策略考虑到动态分配策略的优异性「Yolov8算法中直接引用了TOOD中的Task-Aligned Assigner正负样本分配策略」。

Task-Aligned Assigner顾名思义就是对齐分配器即在训练过程中动态调整正负样本的分配比例。怎么个对齐方式呢「根据分类与回归的分数作为加权分数选择正样本」。
在这里插入图片描述

  • s是标注类别对应的预测分值u是预测框和GT Box的IoU两者相乘即可衡量对齐程度(Task-Alignment)。α和β是权重超参数。
  • t可以同时控制分类得分和IoU的优化来实现Task-Alignment从而引导网络动态关注高质量的anchor。当类别分值越高且IoU越高时t的值就越接近于1。

具体执行步骤如下

  • 基于分类得分和预测框与GT的IoU加权得到一个关联分类以及回归的对齐分数alignment_metrics。
  • 计算anchor的中心点是否在当前GT框内只有在当前GT内的anchor才能作为正样本。
  • 满足「2」的前提下基于alignment_metrics选取topK大的作为正样本其余作为负样本进行训练。
4.2 loss计算

Loss计算包括2个分支分类和回归分支没有了之前的objectness(目标前景/背景)分支。

  1. 分类损失
    使用sigmoid函数来计算每个类别地概率并采用VFL Loss或BCE Loss计算全局的类别损失。

VFL Loss
VFL Loss(Varifocal Loss)的灵感来自Focal Loss这里也简要回顾一下Focal Loss。Focal Loss的设计是为了解决密集目标检测器训练中前景类和背景类之间极度不平衡的问题。Focal Loss定义为:
在这里插入图片描述
其中1为ground-truth类表示前景类的预测概率。如公式所示调制因子(γ为前景类和γ为背景类)可以减少简单样例的损失贡献相对增加误分类样例的重要性。
然而不同的Focal Loss处理的正负样本是对称的VFL Loss则是提出了非对称的加权操作定义如下
在这里插入图片描述
其中预测值为目标分数。对于前景点将其ground truth类别分数设定为「生成的边界框和它的ground truth(gt_IoU)之间的IoU」否则为0而对于背景点所有类的分数为0。

如公式所示通过利用γ的因子缩放损失VFL Loss仅减少了负例(q=0)的损失贡献而不以同样的方式降低正例(q>0)的权重。这是因为正样本相对于负样本是非常罕见的应该保留它们的学习信息。

BCE Loss

由源代码可以看出Yolov8实际采用的是BCE Loss如下图所示
在这里插入图片描述
这也说明Yolov8团队应该是对VFL Loss和BCE Loss都尝试过但最终发现使用VFL和使用普通的BCE效果相当优势不明显故采用了简单的BCE Loss。

  1. 回归损失
    Yolov8的回归损失计算分为「CIou_Loss + Distribution Focal Loss」两部分其中CIou_Loss用于计算预测框与目标框之间的IoU。

DFL Loss

常规的坐标点回归方式是一种狄拉克分布即认为某一点概率无穷大而其它点概率为0概率密度是一条尖锐的竖线如下图这种方式认为标签是绝对正确的。
在这里插入图片描述
但是在实际应用中对于遮挡、模糊场景下目标框的边界存在一定的不确定性如下图中滑板左侧边界和大象右侧边界常规的回归方式是不能解决这种不确定问题的此时学习一个边界分布更为合理。
在这里插入图片描述
但是如果分布过于随意网络学习的效率可能不会高因为一个积分目标可能对应无穷多种分布模式。
在这里插入图片描述
考虑到真实的分布通常不会距离标注的位置太远因此Distribution Focal Loss选择优化标签y附近左右两个位置yi与yi+1的概率使得网络分布聚焦到标签值附近。
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6