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

前言

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

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

一、算法比较

1、简介

Yolov8,作为一种SOTA(State-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为3,stride步长为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为3,stride步长为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为3,stride步长为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)的概率,使得网络分布聚焦到标签值附近。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目上线前发现严重Bug怎么办?

今天分享一个面试问题,现在有一个面试场景: 项目计划明天发布,但是在今天你作为测试人员发现了一个严重的bug,市场相关人员又在催发布的事情,这个时候你应该怎么办? 这是测试工程师不管是在面试&#xff0…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比,每秒打印1次,总共打印2000次 S0:幸存1区当前使用比例 S1:幸存2区当前使用比例 E:伊甸园区使用比例 O:老年代使用比例 M:元…

基于计算机视觉的身份证识别系统 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…

初识jQuery

文章目录 一、jQuery介绍二、Jquery优势三、jQuery版本四、jQuery对象jQuery的引用js代码与jQuery代码对比标签对象与jQuery对象 五、jQuery查找标签1.基本选择器2.组合选择器3.层次选择器4.属性选择器5.基本筛选器6.表单筛选器 六、筛选器方法七、操作标签1.class操作2.文本操…

048基于web+springboot的校园资料分享平台

欢迎大家关注,一起好好学习,天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本校园资料分享平台有管理员和用户两个角色。管理员功能有个人中心,学生管理,资料分享管理,资源分…

FastBond2阶段2——基于ESP32C3开发的简易IO调试设备

1. 项目介绍 之前买了许多国产单片机esp32c3一直在吃灰,没有发挥它的真实价值。非常感谢硬禾组织的Fastbond2活动,刚好两者经过微妙的碰撞。恰可以用于FastBond2活动主题4 - 测量仪器(单片机开发测试领域),或者用于国…

VR全景在医院的应用:缓和医患矛盾、提升医院形象

医患关系一直以来都是较为激烈的,包括制度的不完善、医疗资源紧张等问题也时有存在,为了缓解医患矛盾,不仅要提升患者以及家属对于医院的认知,还需要完善医疗制度,提高医疗资源的配置效率,提高服务质量。 因…

Linux学习笔记之三(vim编辑器)

目录 1、vim的四种工作模式2、正常模式下的操作指令2.1、进入编辑模式2.2、进入命令行模式2.3、进入视觉模式2.4、光标跳转2.5、复制、粘贴、删除2.6、重复、撤回操作 3、命令行模式下的操作指令 1、vim的四种工作模式 vim的四种工作模式分别是编辑模式(insert mode)、命令行模…

多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …

【Linux】僵尸进程、孤儿进程的理解与验证

僵尸进程 概念 僵尸进程(Zombie Process)是指一个已经终止执行的子进程,但其父进程尚未调用 wait() 或 waitpid() 函数来获取子进程的退出状态。 Linux 中,僵尸进程会保留一些资源,如进程 ID、进程表项和一些系统资源…

王道p18 07.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。(c语言代码实现)

视频讲解在这:👇 p18 第7题 c语言代码实现王道数据结构课后代码题_哔哩哔哩_bilibili 本题代码如下 int merge(struct sqlist* A, struct sqlist* B, struct sqlist* C) {if (A->length B->length > C->length)//大于顺序表的最大长度r…

48基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

玻色量子签约移动云“五岳”量子云计算创新加速计划!

2023年4月24-26日,由中国移动通信集团主办的“云擎未来 智信天下”2023移动云大会在苏州圆满落幕。 中国移动在本次大会发布了“五岳”量子云计算创新加速计划。作为中国移动量子计算方向的战略伙伴,玻色量子创始人&CEO文凯博士代表北京玻色量子科技…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义,两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业…

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针,快指针一次走两个,慢指针一次走一个,如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本,而dnmp只支持到php8.0。安装php8.2的步骤如下: 1. 从/services/php80目录复制一份出来,重命名为php82,extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇:3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型,内容较多,会分为多个章节介绍。模型构建还是和之前一样的流程: 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中,std::thread是一个重要的类,它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了,但是网络上找到的例程很多都额外增加了对time库的引用。只能说,这样不会出现错误,但是这样肯定会有一些计算资源上的消耗。 #!/u…