YOLOv8网络理解

目录

1. YOLO算法

2. YOLOV8的理解

3. YOLOV8的概述

3.1 Backbone

3.2 Neck

3.3 head

3.4 yaml文件对比解析

4. Loss计算

4.1 正负样本分配策略

4.1.1 静态分配策略与动态分配策略区别

4.1.2 simOTA 策略

4.1.3 Task-Aligned Assigner 策略

4.2 Loss计算

5.各任务表现及指标

6.训练策略与推理测试

6.1 训练的三种方式

6.2 模型验证/测试

6.3 模型推理

6.4 模型输出

7. 总结


1. YOLO算法

  YOLO(You Only Look Once)是一种实时目标检测算法,它能够在图像中快速准确地识别出多个物体的位置和类别。相比于传统的目标检测算法,YOLO具有更快的处理速度和更高的准确性,使其在实时应用中具有很大的优势。

  YOLO的核心思想是将目标检测任务转化为一个回归问题,通过将图像分成网格并预测每个网格中是否包含物体以及物体的位置和类别,从而实现目标检测。YOLO算法的一个重要特点是端到端的训练,即整个网络可以直接从原始图像到最终的目标检测结果进行训练,而无需复杂的预处理或后处理步骤。

  总的来说,YOLO算法以其快速、准确和端到端训练的特点,在目标检测领域取得了很大的成功,并被广泛应用于各种实时场景中。

  现在新的yolov9、YOLOV10也已经发布,期待进一步的学习。

2. YOLOV8的理解

  YOLOv8是YOLO(You Only Look Once)目标检测算法系列的较新之一,YOLOv8 是 Ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,它在物体检测、图像分类和实例分割任务上提供了先进的性能。YOLOv8引入了多项改进和新特性,旨在提升模型的精度、速度和灵活性,使之成为一个尖端的实时物体检测器。

  按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。 不过 Ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 Ultralytics 这个词,原因是 Ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO 系列模型,而是能够支持非 YOLO 模型以及分类分割姿态估计等各类任务。 总而言之,Ultralytics 开源库的两个主要优点是:

  • 融合众多当前 SOTA 技术于一体

  • 未来将支持其他 YOLO 系列以及 YOLO 之外的更多算法

  下表为官方在 COCO Val 2017 数据集上测试的 mAP、参数量和 FLOPs 结果。可以看出 YOLOv8 相比 YOLOv5 精度提升非常多,但是 N/S/M 模型相应的参数量和 FLOPs 都增加了不少,从上图也可以看出相比 YOLOV5 大部分模型推理速度变慢了。

模型YOLOv5params(M)FLOPs@640(B)YOLOv8params(M)FLOPs@640 (B)
n28.0(300e)1.94.537.3 (500e)3.28.7
s37.4 (300e)7.216.544.9 (500e)11.228.6
m45.4 (300e)21.249.050.2 (500e)25.978.9
l49.0 (300e)46.5109.152.9 (500e)43.7165.2
x50.7 (300e)86.7205.753.9 (500e)68.2257.8

  另外,现在各个 YOLO 系列改进算法都在 COCO 上面有明显性能提升,但是在自定义数据集上面的泛化性还没有得到广泛验证,至今依然听到不少关于 YOLOv5 泛化性能较优异的说法。

3. YOLOV8的概述

YOLOV8网络结构

YOLOV8网络结构

  Yolov8是一个SOTA模型,它建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,主要借鉴了Yolov5、Yolov6、YoloX等模型的设计优点,其本身创新点不多,偏重在工程实践上。   YOLOv8的提出主要包括以下几个方面的改进:

  • 提供了一个全新的SOTA模型(包括P5 640和P6 1280分辨率的目标检测网络和基于YOLACT的实例分割模型)。并且,基于缩放系数提供了N/S/M/L/X不同尺度的模型,以满足不同部署平台和应用场景的需求。

  • Backbone:同样借鉴了CSP模块思想,CSPDarknet53作为backbone网络,不过将Yolov5中的C3模块替换成了C2f模块,实现了进一步轻量化,同时沿用Yolov5中的SPPF模块,并对不同尺度的模型进行精心微调,不再是无脑式一套参数用于所有模型,大幅提升了模型性能。

  • Neck:继续使用PAN的思想,但是通过对比YOLOv5与YOLOv8的结构图可以看到,YOLOv8移除了1*1降采样层。

  • Head部分相比YOLOv5改动较大,Yolov8换成了目前主流的解耦头结构(Decoupled-Head),将分类和检测头分离,同时也从Anchor-Based换成了Anchor-Free。

  • Loss计算:使用VFL Loss作为分类损失(实际训练中使用BCE Loss);使用DFL Loss+CIOU Loss作为回归损失。

  • 标签分配:Yolov8抛弃了以往的IoU分配或者单边比例的分配方式,而是采用Task-Aligned Assigner正负样本分配策略。

  • 自适应训练数据增强:采用了自适应的数据增强策略,能够根据目标检测的难易程度自动调整数据增强的强度。

  • 多尺度训练策略:采用了多尺度训练策略,能够更好地适应不同尺度的目标。

  总的来说,YOLOv8通过改进网络结构、优化训练策略和引入新的技术,提高了目标检测的性能和精度,使得在实际应用中能够更好地应对各种复杂场景下的目标检测任务。

  下面将按照模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分详细介绍 YOLOv8 目标检测的各种改进,实例分割部分暂时不进行描述。

3.1 Backbone

在暂时不考虑 Head 情况下,对比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以发现改动较小。

YOLOV5S与YOLOV8syaml差异对比

  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。

  • 去掉了 Neck 模块中的 2 个卷积连接层

  • Backbone 中 C2f 的 block 数从 3-6-9-3 改成了 3-6-6-3

  • 查看 N/S/M/L/X 等不同大小模型,可以发现 N/S 和 L/X 两组模型只是改了缩放系数,但是 S/M/L 等骨干网络的通道数设置不一样,没有遵循同一套缩放系数。如此设计的原因应该是同一套缩放系数下的通道设置不是最优设计,YOLOv7 网络设计时也没有遵循一套缩放系数作用于所有模型

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

3.2 Neck

  YOLOv8的NeckYOLOv8的Neck部分是该模型中的一个关键组件,它在特征提取和融合方面起着重要作用。Neck的详细描述如下:Neck部分主要起到一个特征融合的操作, YOLOv8的Neck部分依然采用PAN-FPN的思想,下图的a,b,c为一个Neck部分的流程示意图。采用了PANet结构,如下图所示。

Neck结构

Neck结构

  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是一个双向通路网络,引入了自下向上的路径,使得底层信息更容易传递到顶层。

  整体功能:

(1) Neck的作用:

  Neck部分在YOLOv8模型中负责对来自Backbone的特征进行进一步处理和融合,以提高目标检测的准确性和鲁棒性。它通过引入不同的结构和技术,将多尺度的特征图进行融合,以便更好地捕捉不同尺度目标的信息。

(2) 特征金字塔网络(Feature Pyramid Network, FPN):

  YOLOv8的Neck部分通常采用特征金字塔网络结构,用于处理来自Backbone的多尺度特征图。FPN通过在不同层级上建立特征金字塔,使得模型能够在不同尺度上进行目标检测。它通过上采样和下采样操作,将低层级的细节特征与高层级的语义特征进行融合,以获取更全面和丰富的特征表示。

(3)特征融合(Feature Fusion):

  Neck部分还包括特征融合的操作,用于将来自不同层级的特征进行融合。这种特征融合有助于提高模型对目标的检测准确性,尤其是对于不同尺度的目标。

(4)上采样和下采样:

  Neck部分通常会使用上采样和下采样操作,以调整特征图的尺度和分辨率。上采样操作可以将低分辨率的特征图放大到与高分辨率特征图相同的尺寸,以保留更多的细节信息。而下采样操作则可以将高分辨率的特征图降低尺寸,以减少计算量和内存消耗。

  YOLOv8的Neck部分通过特征金字塔网络和特征融合等操作,有效地提取和融合多尺度的特征,从而提高了目标检测的性能和鲁棒性。这使得模型能够更好地适应不同尺度和大小的目标,并在复杂场景下取得更准确的检测结果。

3.3 head

  Head部分是输出结果的部分,经过前面的准备工作我们得到了Neck部分的输出T1、T2、T3分别代表不同层级的特征图,Head部分就是对这三个特征图进行处理以产生模型的的输出结果的一个过程。

  YOLOv8的Head部分我们先来看一下它的网络结构。

head结构

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

  可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。

  将网络得到的特征图T1,T2,T3分别输入解耦头头进行预测,检测头的结构如下图所示其中包含4个3×3卷积与2个1×1卷积,同时在检测头的回归分支中添加WIOU损失函数,回归头部需要计算预测框与真实框之间的位置偏移量,然后将偏移量送入回归头部进行损失计算,然后输出一个四维向量,分别表示目标框的左上角坐标x、y和右下角坐标x、y。分类头部针对于每个Anchor Free提取的候选框对其进行RoI Pooling和卷积操作得到一个分类器输出张量每个位置上的值表示该候选框属于每个类别的概率,在最后通过极大值抑制方式筛选出最终的检测结果

3.4 yaml文件对比解析

  参数部分

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

  Backbone

- 第0层:[-1,1,Conv,[64, 3, 2]] #0-P1/2
  - -1表示将上层的输出作为本层的输入,第0层的输入是640*640*3的图像。
  - Conv表示卷积层。
  - [64, 3, 2]:输出通道数64,卷积核大小k为3,stride步长为2。由此计算padding为1。
  - 输出特征图大小(向下取整1):f_out=((f_in - k + 2*p ) / s )=((640 - 3 + 2*1 ) / 2 )=320。
  - 所以本层输出特征图尺寸为320*320*64,长宽为原输入图片的1/2。
- 第1层:[-1,1,Conv,[128, 3, 2]] # 1-P2/4
  - [128, 3, 2]:输出通道数128,卷积核大小k为3,stride步长为2。
  - 输出特征图大小(向下取整1):f_out=((f_in - k + 2*p ) / s )=((320 - 3 + 2*1 ) / 2 )=160。
  - 所以本层输出特征图尺寸为160*160*128,长宽为原输入图片的1/4。
- 第2层:[-1,3,C2f,[128, True]]
  - [128, True]:128表示输出通道数,True表示Bottleneck有shortcut。
  - 本层输出特征图尺寸仍为160*160*128。
- 第3层:[-1,1,Conv,[256,3,2]] # 3-P3/8
  - [256,3,2]:输出通道数256,卷积核大小k为3,stride步长为2。
  - 输出特征图大小(向下取整1):f_out=((f_in - k + 2*p ) / s )=((160-3+ 2*1 )/2)=80。
  -  所以本层输出特征图尺寸为80*80*256,长宽为原输入图片的1/8。
- …
- 第9层:[-1,1,SPPF,[1024, 5]]
  - [1024, 5]:1024表示输出通道数,5表示池化核大小k。
  - 输出特征图尺寸为20*20*1024。

  Head

- 第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表示使用的上采样算法为最近邻插值算法。经过这层之后,特征图的长和宽变为原来的二倍,通道数不变,所以输出特征图尺寸为40*40*1024。

- 第11层:[[-1,6],1,Concat,[1]] #cat backbone P4

    本层为cancat层,[-1,6]表示将上层和第6层的输出作为本层的输入,[1]表示concat拼接的维度为1。上层的输出尺寸为40*40*1024,第6层的输出尺寸为40*40*512,最终本层的输出尺寸为40*40*1536。

- …
- 第21层:[-1,3,C2f,[1024]] # 21(P5/32-large)

    本层是C2f模块,3表示本层重复3次。1024表示输出通道数。经过这层之后,特征图尺寸变为20*20*1024,特征图的长宽已经变成原输入图片的1/32。

第22层:[[15, 18, 21], 1, Detect, [nc]]

    本层是Detect层,[15, 18, 21]表示将第15、18、21层的输出(分别是80*80*256、40*40*512、20*20*1024)作为本层的输入。nc是数据集的类别数。


4. Loss计算

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

4.1 正负样本分配策略
4.1.1 静态分配策略与动态分配策略区别

  在目标检测中,正负样本分配策略通常用于在训练期间为每个样本分配一个权重,以便模型更加关注困难的样本和重要的样本。动态分配策略和静态分配策略是两种常见的正负样本分配策略。

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

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

  总的来说,动态分配策略通常比静态分配策略更加灵活和高效,可以帮助模型更好地利用样本信息,提高训练效果。虽然动态分配策略可以在训练过程中根据模型的学习情况来适当调整正负样本的比例,但也存在一些缺点。

  (1)动态分配策略需要不断地监控模型在训练集上的表现,并根据表现调整正负样本的比例,因此会增加训练的计算量和时间成本。   (2)动态分配策略可能会导致过拟合。因为动态分配策略会在训练过程中频繁地改变正负样本的比例,可能会导致模型过于关注某些样本,而忽略了其他样本,从而导致过拟合。   (3)动态分配策略的结果难以复现。由于动态分配策略的调整是基于模型当前的学习情况,因此同样的训练过程可能会得到不同的正负样本比例,使得实验的结果难以复现和比较。

4.1.2 simOTA 策略

  simOTA是YOLOX目标检测算法中的一种正负样本分配策略,全称为Similarity Overlap Threshold Assigner。它的主要思想是通过计算anchor和ground truth之间的相似度,来动态地分配正负样本。

  在传统的目标检测算法中,通常使用IoU来度量anchor和ground truth之间的重叠程度,然后根据设定的阈值来判断是否将anchor分配为正样本或负样本。但这种方法存在一个问题,就是对于一些尺寸较小的目标,由于它们的IoU值通常比较低,因此很容易被分配为负样本,从而影响了检测性能。

  simOTA的核心思想是:根据目标的相似度来确定正负样本的阈值,进而实现样本的自适应分配。在训练时,首先将所有的目标两两配对,并计算它们的相似度得分。然后,通过对相似度分数进行统计,得到一个阈值范围,用于确定正负样本的分配阈值。具体而言,相似度得分越高,对应的IoU阈值就越高,样本就越容易被视为正样本;相反,相似度得分越低,对应的IoU阈值就越低,样本就更容易被视为负样本。

  通过引入相似度信息,simOTA可以更加灵活地处理目标间的差异性,从而提高模型的泛化能力和检测性能。实验结果表明,simOTA可以显著提高YOLOX模型在各种基准数据集上的表现,同时具有更好的鲁棒性和泛化性能。

  相比传统的IoU分配方法,simOTA能够更好地处理尺寸较小的目标,从而提高了目标检测的性能。

4.1.3 Task-Aligned Assigner 策略

  Task-Aligned Assigner是一种TOOD中正负样本分配策略的方法,其基本原理是在训练过程中动态地调整正负样本的分配比例,以更好地适应不同的任务和数据分布,YOLOv8就是采用了这种策略。

  具体而言,Task-Aligned Assigner基于一个关键的假设,即在不同的任务和数据集中,正负样本的分布情况可能会有所不同,因此需要针对具体的任务和数据分布,调整正负样本的分配比例,从而达到更好的检测效果。

  为了实现这一目的,Task-Aligned Assigner提出了一个基于“任务自适应”的正负样本分配方法。具体而言,它使用一个任务感知的分配模块来估计不同任务下正负样本的分布情况,并基于这个分布情况动态调整正负样本的分配比例。

  分配模块首先计算每个Anchor和每个Ground Truth Box之间的相似度,然后通过一个多任务学习框架,将相似度与正负样本标签的分布情况进行建模。最终,通过这个分布情况来动态地调整正负样本的分配比例,以更好地适应不同的任务和数据分布。

  在具体实现中,Task-Aligned Assigner采用了一种基于动态阈值的分配方法。具体而言,它在计算Anchor与Ground Truth Box之间的IoU时,采用了一个基于任务自适应的动态阈值来判断正负样本的分配。通过这种方式,Task-Aligned Assigner能够根据具体的任务和数据分布,自适应地调整正负样本的分配比例,从而获得更好的检测性能。

Task-Aligned Assigner的公式如下:

  使用上面公式来对每个实例计算 Anchor-level 的对齐程度:s 和 u 分别为分类得分和 IoU 值,α 和 β 为权重超参。t 可以同时控制分类得分和 IoU 的优化来实现 Task-Alignment,可以引导网络动态的关注于高质量的Anchor。采用一种简单的分配规则选择训练样本:对每个实例,选择 m 个具有最大 t 值的 Anchor 作为正样本,选择其余的 Anchor 作为负样本。然后,通过损失函数(针对分类与定位的对齐而设计的损失函数)进行训练。

YOLOv8源码中各个参数取值如下:

具体执行步骤如下:

  • 1.基于分类得分和预测框与GT的IoU,加权得到一个关联分类以及回归的对齐分数alignment_metrics。

  • 2.计算anchor的中心点是否在当前GT框内,只有在当前GT内的anchor才能作为正样本。

  • 3.满足2的前提下,基于alignment_metrics选取topK大的作为正样本,其余作为负样本进行训练。

# 1. 计算对齐分数alignment_metrics
alignment_metrics = bbox_scores.pow(self.alpha)*overlaps.pow(self.beta)
# 2. 保证中心点在GT内部的mask
is_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())


4.2 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。

CIoU讲述的最清楚的一篇文章

目标检测中的损失函数IoU、GIoU、DIoU、CIoU、SIoU_iou损失-CSDN博客

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

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

  但是如果分布过于随意,网络学习的效率可能不会高,因为一个积分目标可能对应无穷多种分布模式。

  考虑到真实的分布通常不会距离标注的位置太远,因此Distribution Focal Loss选择优化标签y附近左右两个位置(yi与yi+1)的概率,使得网络分布聚焦到标签值附近。

  3 个 Loss 采用一定权重比例加权即可,默认的比例是7.5:0.5:1.5。

5.各任务表现及指标

目标检测

模型尺寸(像素)mAP val50-95推理速度 CPU ONNX (ms)推理速度 A100 TensorRT(ms)参数量(M)FLOPs(B)
YOLOv8n64037.380.40.993.28.7
YOLOv8s64044.9128.41.2011.228.6
YOLOv8m64050.2234.71.8325.978.9
YOLOv8l64052.9375.22.3943.7165.2
YOLOv8x64053.9479.13.5368.2257.8

分类

模型尺寸(像素)acc top1acc top5推理速度 CPU ONNX(ms)推理速度A100 TensorRT(ms)参数量(M)FLOPs(B) at 640
YOLOv8n-cls22466.687.012.90.312.74.3
YOLOv8s-cls22472.391.123.40.356.413.5
YOLOv8m-cls22476.493.285.40.6217.042.7
YOLOv8l-cls22478.094.1163.00.8737.599.7
YOLOv8x-cls22478.494.3232.01.0157.4154.8

实例分割

模型尺寸(像素)mAPbox 50-95mAPmask 50-95推理速度CPU ONNX (ms)推理速度 A100 TensorRT (ms)参数量(M)FLOPs(B)
YOLOv8n-seg64036.730.596.11.213.412.6
YOLOv8s-seg64044.636.8155.71.4711.842.6
YOLOv8m-seg64049.940.8317.02.1827.3110.2
YOLOv8l-seg64052.342.6572.42.7946.0220.5
YOLOv8x-seg64053.443.4712.14.0271.8344.1
6.训练策略与推理测试

模型训练

  主要的ultralytics目录结构,

  打开cfg目录下的default.yaml文件可以配置模型的参数,在其中和模型训练有关的参数及其解释如下:

参数名输入类型参数解释
0taskstrYOLO模型的任务选择,选择你是要进行检测、分类等操作
1modestrYOLO模式的选择,选择要进行训练、推理、输出、验证等操作
2modelstr/optional模型的文件,可以是官方的预训练模型,也可以是训练自己模型的yaml文件
3datastr/optional模型的地址,可以是文件的地址,也可以是配置好地址的yaml文件
4epochsint训练的轮次,将你的数据输入到模型里进行训练的次数
5patienceint早停机制,当你的模型精度没有改进了就提前停止训练
6batchint我们输入的数据集会分解为多个子集,一次向模型里输入多少个子集
7imgszint/list输入的图片的大小,可以是整数就代表图片尺寸为int*int,或者list分别代表宽和高[w,h]
8savebool是否保存模型以及预测结果
9save_periodint在训练过程中多少次保存一次模型文件,就是生成的pt文件
10cachebool参数cache用于控制是否启用缓存机制。
11deviceint/str/list/optionalGPU设备的选择:cuda device=0 or device=0,1,2,3 or device=cpu
12workersint工作的线程,Windows系统一定要设置为0否则很可能会引起线程报错
13namestr/optional模型保存的名字,结果会保存到'project/name' 目录下
14exist_okbool如果模型存在的时候是否进行覆盖操作
15prepetrainedbool参数pretrained用于控制是否使用预训练模型。
16optimizerstr优化器的选择choices=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
17verbosebool用于控制在执行过程中是否输出详细的信息和日志。
18seedint随机数种子,模型中涉及到随机的时候,根据随机数种子进行生成
19deterministicbool用于控制是否启用确定性模式,在确定性模式下,算法的执行将变得可重复,即相同的输入将产生相同的输出
20single_clsbool是否是单标签训练
21rectbool当 rect 设置为 True 时,表示启用矩形训练或验证。矩形训练或验证是一种数据处理技术,其中在训练或验证过程中,输入数据会被调整为具有相同宽高比的矩形形状。
22cos_lrbool控制是否使用余弦学习率调度器
23close_mosaicint控制在最后几个 epochs 中是否禁用马赛克数据增强
24resumebool用于从先前的训练检查点(checkpoint)中恢复模型的训练。
25ampbool用于控制是否进行自动混合精度
26fractionfloat用于指定训练数据集的一部分进行训练的比例。默认值为 1.0
27profilebool用于控制是否在训练过程中启用 ONNX 和 TensorRT 的性能分析
28freezeint/list/optinal用于指定在训练过程中冻结前 n 层或指定层索引的列表,以防止它们的权重更新。这对于迁移学习或特定层的微调很有用。
6.1 训练的三种方式

  (1)可以通过命令直接进行训练在其中指定参数,但是这样的方式,我们每个参数都要在其中打出来。命令如下:

yolo task=detect mode=train model=yolov8n.pt data=data.yaml batch=16 epochs=100 imgsz=640 workers=0 device=0
# 需要注意的是如果你是Windows系统的电脑其中的Workers最好设置成0否则容易报线程的错误。

  (2)推荐 通过指定cfg直接进行训练,我们配置好ultralytics/cfg/default.yaml这个文件之后,可以直接执行这个文件进行训练,这样就不用在命令行输入其它的参数了。

yolo cfg=ultralytics/cfg/default.yaml

  (3)我们可以通过创建py文件来进行训练,这样的好处就是不用在终端上打命令,这也能省去一些工作量,我们在根目录下创建一个名字为run.py的文件,在其中输入代码

from ultralytics import YOLO
 
model = YOLO("权重的地址")
 
data = "文件的地址"
 
model.train(data=data, epochs=100, batch=16)

  无论通过上述的哪一种方式在控制台输出如下图片的内容就代表着开始训练成功了!

6.2 模型验证/测试
参数名类型参数讲解
1valbool用于控制是否在训练过程中进行验证/测试。
2splitstr用于指定用于验证/测试的数据集划分。可以选择 'val'、'test' 或 'train' 中的一个作为验证/测试数据集
3save_jsonbool用于控制是否将结果保存为 JSON 文件
4save_hybirdbool用于控制是否保存标签和附加预测结果的混合版本
5conffloat/optional用于设置检测时的目标置信度阈值
6ioufloat用于设置非极大值抑制(NMS)的交并比(IoU)阈值。
7max_detint用于设置每张图像的最大检测数。
8halfbool用于控制是否使用半精度(FP16)进行推断。
9dnnbool,用于控制是否使用 OpenCV DNN 进行 ONNX 推断。
10plotsbool用于控制在训练/验证过程中是否保存绘图结果。

  验证我们划分的验证集/测试集的情况,也就是评估我们训练出来的best.pt模型好与坏

yolo task=detect mode=val model=best.pt data=data.yaml device=0
6.3 模型推理

  训练好自己的模型之后,都会生成一个模型文件,保存在你设置的目录下,当我们再次想要实验该模型的效果之后就可以调用该模型进行推理了,我们也可以用官方的预训练权重来进行推理。

  推理的方式和训练一样我们这里就选一种来进行举例其它的两种方式都是一样的操作只是需要改一下其中的一些参数即可:

参数讲解

参数名类型参数讲解
0sourcestr/optinal用于指定图像或视频的目录
1showbool用于控制是否在可能的情况下显示结果
2save_txtbool用于控制是否将结果保存为 .txt 文件
3save_confbool用于控制是否在保存结果时包含置信度分数
4save_cropbool用于控制是否将带有结果的裁剪图像保存下来
5show_labelsbool用于控制在绘图结果中是否显示目标标签
6show_confbool用于控制在绘图结果中是否显示目标置信度分数
7vid_stride int/optional用于设置视频的帧率步长
8stream_bufferbool用于控制是否缓冲所有流式帧(True)或返回最新的帧(False)
9line_widthint/list[int]/optional用于设置边界框的线宽度,如果缺失则自动设置
10visualizebool用于控制是否可视化模型的特征
11augmentbool用于控制是否对预测源应用图像增强
12agnostic_nmsbool用于控制是否使用无关类别的非极大值抑制(NMS)
13classesint/list[int]/optional用于按类别筛选结果
14retina_masksbool用于控制是否使用高分辨率分割掩码
15boxesbool用于控制是否在分割预测中显示边界框。
yolo task=detect mode=predict model=best.pt source=images device=0

  这里需要需要注意的是我们用模型进行推理的时候可以选择照片也可以选择一个视频的格式都可以。支持的视频格式有

  • MP4(.mp4):这是一种常见的视频文件格式,通常具有较高的压缩率和良好的视频质量

  • AVI(.avi):这是一种较旧但仍广泛使用的视频文件格式。它通常具有较大的文件大小

  • MOV(.mov):这是一种常见的视频文件格式,通常与苹果设备和QuickTime播放器相关

  • MKV(.mkv):这是一种开放的多媒体容器格式,可以容纳多个视频、音频和字幕轨道

  • FLV(.flv):这是一种用于在线视频传输的流式视频文件格式

6.4 模型输出

  当我们进行部署的时候可以进行文件导出,然后在进行部署。

YOLOv8支持的输出格式有如下

    1. ONNX(Open Neural Network Exchange):ONNX 是一个开放的深度学习模型表示和转换的标准。它允许在不同的深度学习框架之间共享模型,并支持跨平台部署。导出为 ONNX 格式的模型可以在支持 ONNX 的推理引擎中进行部署和推理。

    2. TensorFlow SavedModel:TensorFlow SavedModel 是 TensorFlow 框架的标准模型保存格式。它包含了模型的网络结构和参数,可以方便地在 TensorFlow 的推理环境中加载和使用。

    3. PyTorch JIT(Just-In-Time):PyTorch JIT 是 PyTorch 的即时编译器,可以将 PyTorch 模型导出为优化的 Torch 脚本或 Torch 脚本模型。这种格式可以在没有 PyTorch 环境的情况下进行推理,并且具有更高的性能。

    4. Caffe Model:Caffe 是一个流行的深度学习框架,它使用自己的模型表示格式。导出为 Caffe 模型的文件可以在 Caffe 框架中进行部署和推理。

    5. TFLite(TensorFlow Lite):TFLite 是 TensorFlow 的移动和嵌入式设备推理框架,支持在资源受限的设备上进行高效推理。模型可以导出为 TFLite 格式,以便在移动设备或嵌入式系统中进行部署。

    6. Core ML(Core Machine Learning):Core ML 是苹果的机器学习框架,用于在 iOS 和 macOS 上进行推理。模型可以导出为 Core ML 格式,以便在苹果设备上进行部署。

    这些格式都提供了不同的优势和适用场景。选择合适的导出格式应该考虑到目标平台和部署环境的要求,以及所使用的深度学习框架的支持情况。

模型输出的参数有如下:

参数名类型参数解释
0formatstr导出模型的格式
1kerasbool表示是否使用Keras
2optimizebool用于在导出TorchScript模型时进行优化,以便在移动设备上获得更好的性能
3int8bool用于在导出CoreML或TensorFlow模型时进行INT8量化
4dynamicbool用于在导出CoreML或TensorFlow模型时进行INT8量化
5simplifybool用于在导出ONNX模型时进行模型简化
6opsetint/optional用于指定导出ONNX模型时的opset版本
7workspaceint用于指定TensorRT模型的工作空间大小,以GB为单位
8nmsbool用于在导出CoreML模型时添加非极大值抑制(NMS)

命令行命令如下:

yolo task=detect mode=export model=best.pt format=onnx  
7. 总结

  本文详细学习分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算、训练数据增强、训练策略和推理过程进行了详细的说明,并提供了大量的示意图供大家方便理解。 简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。不仅如此还推出了一个全新的框架。不过这个框架还处于早期阶段,还需要不断完善。

wx公众号:AI算法爱好者角落

知乎解析:AI探索先锋

yolov8源码位置:

参考文献:

  1. https://download.csdn.net/blog/column/12483754/134097996#Neck%C2%A0

  2. YOLOv8原理深度解读,超级详细【未完待续】-CSDN博客

  3. YOLOv8 原理和实现全解析 — MMYOLO 0.6.0 文档

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值