文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Yolov8原理详细解析!一文看懂

2023-08-30 15:55

关注

引言

Yolo(You Only Look Once)是一种one-stage目标检测算法,即仅需要 “看” 一次就可以识别出图片中物体的class类别和边界框。Yolov8是Ultralytics公司最新推出的Yolo系列目标检测算法,可以用于图像分类、物体检测和实例分割等任务。
在这里插入图片描述
根据官方描述,Yolov8是一个SOTA模型,它建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性,使其成为实现目标检测、图像分割、姿态估计等任务的最佳选择。其具体创新点包括一个新的骨干网络、一个新的Ancher-Free检测头和一个新的损失函数,可在CPU到GPU的多种硬件平台上运行。

此外,Yolov8还有一个特点就是可扩展性,ultralytics没有直接将开源库命名为Yolov8,而是直接使用"ultralytics",将其定位为算法框架,而非某一个特定算法。这也使得Yolov8开源库不仅仅能够用于Yolo系列模型,而且能够支持非Yolo模型以及分类分割姿态估计等各类任务。

总而言之,Yolov8是Yolo系列模型的最新王者,各种指标全面超越现有对象检测与实例分割模型,借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,在全面提升改进Yolov5模型结构的基础上实现,同时保持了Yolov5工程化简洁易用的优势。
在这里插入图片描述
如下表所示是基于COCO Val 2017数据集测试并对比Yolov8和Yolov5的mAP、参数量和FLOPs结果。由此可以看出,Yolov8相比Yolov5精度提升比较多,但是n/s/m模型参数量和flops增加不少,但是相比Yolov5大部分模型推理速度变慢了。

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

模型Yolov5(300epoch)params(M)FLOPS@640(B)Yolov8(500epoch)params(M)FLOPS@640(B)
n28.01.94.537.33.28.7
s37.47.216.544.911.228.6
m45.421.249.050.225.978.9
l49.046.5109.152.943.7165.2
x50.786.7205.753.968.2257.8

这里需要注意的是,目前各个Yolo系列算法都只是在COCO数据集上性能提升明显,然而在自定义数据集上的泛化性尚未得到充分验证。

Yolov8创新点

Yolov8主要借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,其本身创新点不多,偏重在工程实践上,具体创新如下:

Yolov8网络结构

Yolov8模型网络结构图如下图所示。
在这里插入图片描述

Backbone

Yolov8的Backbone同样借鉴了CSPDarkNet结构网络结构,与Yolov5最大区别是,Yolov8使用C2f模块代替C3模块。具体改进如下:

C2f与C3对比

在这里插入图片描述

由上图可以看出,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)。

Neck

YOLOv8的Neck采用了PANet结构,如下图所示。

在这里插入图片描述
Backbone最后SPPF模块(Layer9)之后H、W经过32倍下采样,对应地Layer4经过8倍下采样,Layer6经过16倍下采样。输入图片分辨率为640*640,得到Layer4、Layer6、Layer9的分辨率分别为80*80、40*40和20*20。

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

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

Head

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

yaml配置文件解析

参数部分

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

Backbone

在这里插入图片描述

# [from, repeats, module, args] from:本层的来源,即就是输入。-1表示将上层的输出作为本层的输入。repeats:本层重复次数。module:本层名称。args:本层参数。

Head

在这里插入图片描述

Loss计算

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

正负样本分配策略

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

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

静态分配策略

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

动态分配策略

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

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

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

具体执行步骤如下:

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

代码示例

# 1. 计算对齐分数alignment_metricsalignment_metrics = bbox_scores.pow(self.alpha)*overlaps.pow(self.beta)# 2. 保证中心点在GT内部的maskis_in_gts = select_candidates_in_gts(priors,gt_bboxes)# 3. 选取TopK大的对齐分数的样本topk_metric = self.select_topk_candidates(            alignment_metrics * is_in_gts,            topk_mask=pad_bbox_flag.repeat([1, 1, self.topk]).bool())

Loss计算

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

分类损失

使用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。

回归损失

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

DFL Loss

常规的坐标点回归方式是一种狄拉克分布,即认为某一点概率无穷大,而其它点概率为0(概率密度是一条尖锐的竖线,如下图),这种方式认为标签是绝对正确的。

在这里插入图片描述

但是在实际应用中,对于遮挡、模糊场景下目标框的边界存在一定的不确定性,如下图中滑板左侧边界和大象右侧边界,常规的回归方式是不能解决这种不确定问题的,此时学习一个边界分布更为合理。

在这里插入图片描述
但是如果分布过于随意,网络学习的效率可能不会高,因为一个积分目标可能对应无穷多种分布模式。
在这里插入图片描述
考虑到真实的分布通常不会距离标注的位置太远,因此Distribution Focal Loss选择优化标签y附近左右两个位置(yi与yi+1)的概率,使得网络分布聚焦到标签值附近。
在这里插入图片描述

来源地址:https://blog.csdn.net/xu1129005165/article/details/132582070

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯