文章目录
- 0.前言
- 1.YOLOv5
- 1.1 YOLOv5网络回顾
- 1.2 YOLOv5网络结构图
- 2.YOLOv8
- 2.1 YOLOv8概述
- 2.2 YOLOv8整体结构图
- 2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比
- 2.3.1 参数部分
- 2.3.2 主干部分
- 2.3.3 Neck部分
- 2.3.4 Head部分
- 2.4 正负样本分配策略
- 2.4.1 静态分配策略和动态分配策略有什么区别
- 2.4.2 simOTA 策略
- 2.4.4 Task-Aligned Assigner 策略
- 2.4.5 损失计算
- 2.5 各任务表现及指标
- 参考文献
0.前言
YOLO(You Only Look Once)
是由 Joseph Redmon
和 Ali Farhadi
在华盛顿大学开发的流行的目标检测和图像分割模型。第一个版本的 YOLO
于 2015
年发布,并因其高速度和准确性而迅速赢得了广泛的关注。
YOLOv2
于 2016
年发布,通过引入批归一化、锚框和尺寸聚类等方法改进了原始模型。
YOLOv3
于 2018
年发布,通过使用更高效的骨干网络、添加特征金字塔并利用焦点损失进一步提高了模型的性能。
2020
年,YOLOv4
发布,引入了许多创新,例如使用 Mosaic
数据增强、新的无锚检测头和新的损失函数。
2021
年,Ultralytics
发布了 YOLOv5
,进一步提高了模型的性能,并添加了新功能,例如支持全景分割和物体跟踪。
2022
年,美团发布了 YOLOv6
,这是一款面向工业部署的目标检测模型。
2022
年,YOLOv7
发布,这是 AlexeyAB(YOLOv4作者)
和 WongKinYiu(YOLOR作者)
发布的一款实时目标检测器。
2023
年,Ultralytics
发布了 YOLOv8
,进一步提高了模型的性能,可以同时实现分类、检测和分割等任务。
1.YOLOv5
1.1 YOLOv5网络回顾
首先回顾一下 YOLOv5
的结构
- Backbone:
New CSP-Darknet53
,网络第一层v5.0
版本前是FOCUS
结构,v5.0
版本以后是6×6
卷积。 - Neck:
PAN
结构,v5.0
版本以前是SPP
结构,v5.0
版本以后是SPPF
结构。 - Head:常见的耦合头,和经典的
YOLOv3
一样。 - Loss:
- 分类损失,采用的是
BCE loss
;只计算正样本的分类损失。 obj
损失,采用的是BCE loss
;这里的obj
指的是网络预测的目标边界框与GT Box
的CIoU
,计算的是所有样本的obj
损失。- 定位损失,采用的是
CIoU loss
;只计算正样本的定位损失。
- 分类损失,采用的是
1.2 YOLOv5网络结构图
2.YOLOv8
YOLOv8
项目地址:https://github.com/ultralytics/ultralytics
Ultralytics YOLOv8
是由 Ultralytics
开发的 YOLO
目标检测和图像分割模型的最新版本。YOLOv8
是一款先进的、最新的模型,基于之前 YOLO
版本的成功,并引入了新的特性和改进,进一步提高了性能和灵活性。
YOLOv8
的一个关键特性是其可扩展性。它被设计为一个框架,支持所有之前的 YOLO
版本,使得在不同版本之间切换并比较它们的性能变得非常容易。这使得 YOLOv8
成为那些想要利用最新的 YOLO
技术同时仍能够使用现有 YOLO
模型的用户的理想选择。
除了可扩展性之外,YOLOv8
还包括许多其他创新,使其成为一种适用于广泛目标检测和图像分割任务的吸引人选择。这些包括一个新的骨干网络、一个新的无锚点检测头和一个新的损失函数。此外,YOLOv8
高效并且可以在多种硬件平台上运行,从 CPU
到 GPU
。
总的来说,YOLOv8
是一款强大、灵活的目标检测和图像分割工具,它提供了最新的 SOTA
技术以及使用和比较所有之前 YOLO
版本的能力,是一个兼具优点的选择。
ultralytics
并没有直接将开源库命名为 YOLOv8
,而是直接使用 ultralytics
这个词,原因是 ultralytics
将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO
系列模型,而是能够支持非 YOLO
模型以及分类分割姿态估计等各类任务。
YOLOv8
主要有如下的优点:
- 用户友好的
API
- 可以同时实现分类、检测、分割和姿态估计任务
- 速度更快、准确率更高
- 全新的结构
- 新的损失函数
Anchor free
模型 | YOLOv5 (300epoch) | Params(M) | FLOPs@640(B) | YOLOv8 (500epoch) | Params(M) | FLOPs@640(B) |
---|---|---|---|---|---|---|
n | 28.0 | 1.9 | 4.5 | 37.3 | 3.2 | 8.7 |
s | 37.4 | 7.2 | 16.5 | 44.9 | 11.2 | 28.6 |
m | 45.4 | 21.2 | 49 | 50.2 | 25.9 | 78.9 |
l | 49.0 | 46.5 | 109.1 | 52.9 | 43.7 | 165.2 |
x | 50.7 | 86.7 | 205.7 | 53.9 | 68.2 | 257.8 |
表格中的数据来源于COCO数据集,但是在其它数据集上并不一定是v8优于v5。
2.1 YOLOv8概述
- Backbone: 第一层卷积由原本的
6×6
卷积改为3×3
卷积;参考YOLOv7 ELAN
设计思想将C3
模块换成了C2f
模块,并配合调整了模块的深度。 - Neck:移除了
1×1
卷积的降采样层;同时也将原本的C3
模块换成了C2f
模块。 - Head:这部分改动较大,换成了解耦头结构,将分类任务和回归任务解耦;同时也将
Anchor-Based
换成了Anchor-Free
。 - Loss:使用
BCE Loss
作为分类损失;使用VFL Loss + CIOU Loss
作为回归损失。 - 样本匹配策略: 采用了
Task-Aligned Assigner
样本分配策略。 - 训练策略:新增加了最后
10
轮关闭Mosaic
数据增强操作,该操作可以有效的提升精度。
2.2 YOLOv8整体结构图
2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比
2.3.1 参数部分
因为YOLOv8
采用Anchor free
的范式,所以在 yaml
文件中移除了 anchor
的参数部分,并且YOLOv8
将多个不同版本的模型写到了一起,除此之外在深度因子和宽度因子后又新增了一个最大通道数的参数,我觉得这可能和YOLOv7
的模型理念有些相似,单凭宽度因子调整的通道数应该不是最优的,所以s\m\l
没有遵循同一套的缩放系数。
2.3.2 主干部分
主干部分改进主要有以下三点:
- 第一层卷积由原本的
6×6
卷积改为3×3
卷积 。 - 所有的
C3
模块改为C2f
模块 。 - 深度由
C3
模块3、6、9、3
改为C2f
的3、6、6、3
。
2.3.3 Neck部分
依然采用 PAN
结构,但是删除了降维用的 1×1
卷积。
2.3.4 Head部分
头部的改动是最大的,直接将原本的耦合头改成了解耦头,值得注意力的是,这个解耦头不再有之前的 objectness
分支,而是直接解耦成了两路,并且其回归分支使用了 Distribution Focal Loss
中提出的积分形式表示法。
2.4 正负样本分配策略
2.4.1 静态分配策略和动态分配策略有什么区别
在目标检测中,正负样本分配策略通常用于在训练期间为每个样本分配一个权重,以便模型更加关注困难的样本和重要的样本。动态分配策略和静态分配策略是两种常见的正负样本分配策略。
静态分配策略通常是在训练开始之前确定的,固定为一组预先定义的权重,这些权重不会在训练过程中改变。这种分配策略通常基于经验得出,可以根据数据集的特点进行调整,但是不够灵活,可能无法充分利用样本的信息,导致训练效果不佳。
相比之下,动态分配策略可以根据训练的进展和样本的特点动态地调整权重。在训练初期,模型可能会很难区分正负样本,因此应该更加关注那些容易被错分的样本。随着训练的进行,模型逐渐变得更加强大,可以更好地区分样本,因此应该逐渐减小困难样本的权重,同时增加易分样本的权重。动态分配策略可以根据训练损失或者其他指标来进行调整,可以更好地适应不同的数据集和模型。
总的来说,动态分配策略通常比静态分配策略更加灵活和高效,可以帮助模型更好地利用样本信息,提高训练效果。虽然动态分配策略可以在训练过程中根据模型的学习情况来适当调整正负样本的比例,但也存在一些缺点。
- 动态分配策略需要不断地监控模型在训练集上的表现,并根据表现调整正负样本的比例,因此会增加训练的计算量和时间成本。
- 动态分配策略可能会导致过拟合。因为动态分配策略会在训练过程中频繁地改变正负样本的比例,可能会导致模型过于关注某些样本,而忽略了其他样本,从而导致过拟合。
- 动态分配策略的结果难以复现。由于动态分配策略的调整是基于模型当前的学习情况,因此同样的训练过程可能会得到不同的正负样本比例,使得实验的结果难以复现和比较。
2.4.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
能够更好地处理尺寸较小的目标,从而提高了目标检测的性能。
2.4.4 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
的公式如下:
t
=
s
α
×
u
β
t=s^α\times u^β
t=sα×uβ
使用上面公式来对每个实例计算 Anchor-level
的对齐程度:s
和 u
分别为分类得分和 IoU
值,α
和 β
为权重超参。t
可以同时控制分类得分和 IoU
的优化来实现 Task-Alignment
,可以引导网络动态的关注于高质量的Anchor
。采用一种简单的分配规则选择训练样本:对每个实例,选择 m
个具有最大 t
值的 Anchor
作为正样本,选择其余的 Anchor
作为负样本。然后,通过损失函数(针对分类与定位的对齐而设计的损失函数)进行训练。
YOLOv8
源码中各个参数取值如下:
2.4.5 损失计算
Loss
计算包括 2
个分支:分类和回归分支,没有了之前的 objectness
分支。
- 分类分支依然采用
BCE Loss
。 - 回归分支需要和
Distribution Focal Loss
中提出的积分形式表示法绑定,因此使用了Distribution Focal Loss
, 同时还使用了CIoU Loss
。
3
个 Loss
采用一定权重比例加权即可,默认的比例是7.5:0.5:1.5
。
2.5 各任务表现及指标
目标检测
模型 | 尺寸 (像素) | mAPval 50-95 | 推理速度 CPU ONNX (ms) | 推理速度 A100 TensorRT (ms) | 参数量 (M) | FLOPs (B) |
---|---|---|---|---|---|---|
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv8s | 640 | 44.9 | 128.4 | 1.20 | 11.2 | 28.6 |
YOLOv8m | 640 | 50.2 | 234.7 | 1.83 | 25.9 | 78.9 |
YOLOv8l | 640 | 52.9 | 375.2 | 2.39 | 43.7 | 165.2 |
YOLOv8x | 640 | 53.9 | 479.1 | 3.53 | 68.2 | 257.8 |
分类
模型 | 尺寸 (像素) | acc top1 | acc top5 | 推理速度 CPU ONNX (ms) | 推理速度 A100 TensorRT (ms) | 参数量 (M) | FLOPs (B) at 640 |
---|---|---|---|---|---|---|---|
YOLOv8n-cls | 224 | 66.6 | 87.0 | 12.9 | 0.31 | 2.7 | 4.3 |
YOLOv8s-cls | 224 | 72.3 | 91.1 | 23.4 | 0.35 | 6.4 | 13.5 |
YOLOv8m-cls | 224 | 76.4 | 93.2 | 85.4 | 0.62 | 17.0 | 42.7 |
YOLOv8l-cls | 224 | 78.0 | 94.1 | 163.0 | 0.87 | 37.5 | 99.7 |
YOLOv8x-cls | 224 | 78.4 | 94.3 | 232.0 | 1.01 | 57.4 | 154.8 |
实例分割
模型 | 尺寸 (像素) | mAPbox 50-95 | mAPmask 50-95 | 推理速度 CPU ONNX (ms) | 推理速度 A100 TensorRT (ms) | 参数量 (M) | FLOPs (B) |
---|---|---|---|---|---|---|---|
YOLOv8n-seg | 640 | 36.7 | 30.5 | 96.1 | 1.21 | 3.4 | 12.6 |
YOLOv8s-seg | 640 | 44.6 | 36.8 | 155.7 | 1.47 | 11.8 | 42.6 |
YOLOv8m-seg | 640 | 49.9 | 40.8 | 317.0 | 2.18 | 27.3 | 110.2 |
YOLOv8l-seg | 640 | 52.3 | 42.6 | 572.4 | 2.79 | 46.0 | 220.5 |
YOLOv8x-seg | 640 | 53.4 | 43.4 | 712.1 | 4.02 | 71.8 | 344.1 |
参考文献
https://mp.weixin.qq.com/s/b8gpIb8UMivFm2iH7fRJ_A
目标检测算法——YOLOV8——算法详解