电脑基础 · 2023年4月18日

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度


文章目录

    • 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.前言

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度
YOLO(You Only Look Once) 是由 Joseph RedmonAli Farhadi 在华盛顿大学开发的流行的目标检测和图像分割模型。第一个版本的 YOLO2015 年发布,并因其高速度和准确性而迅速赢得了广泛的关注。

YOLOv22016 年发布,通过引入批归一化、锚框和尺寸聚类等方法改进了原始模型。

YOLOv32018 年发布,通过使用更高效的骨干网络、添加特征金字塔并利用焦点损失进一步提高了模型的性能。

2020 年,YOLOv4 发布,引入了许多创新,例如使用 Mosaic 数据增强、新的无锚检测头和新的损失函数。

2021年,Ultralytics 发布了 YOLOv5,进一步提高了模型的性能,并添加了新功能,例如支持全景分割和物体跟踪。

2022年,美团发布了 YOLOv6 ,这是一款面向工业部署的目标检测模型。

2022年,YOLOv7发布,这是 AlexeyAB(YOLOv4作者)WongKinYiu(YOLOR作者) 发布的一款实时目标检测器。

2023年,Ultralytics 发布了 YOLOv8,进一步提高了模型的性能,可以同时实现分类、检测和分割等任务。


1.YOLOv5

1.1 YOLOv5网络回顾

首先回顾一下 YOLOv5 的结构

  • BackboneNew CSP-Darknet53,网络第一层 v5.0 版本前是 FOCUS 结构,v5.0 版本以后是 6×6 卷积。
  • NeckPAN 结构,v5.0 版本以前是SPP结构,v5.0版本以后是 SPPF 结构。
  • Head:常见的耦合头,和经典的YOLOv3一样。
  • Loss

    • 分类损失,采用的是BCE loss;只计算正样本的分类损失。
    • obj损失,采用的是BCE loss;这里的obj指的是网络预测的目标边界框与GT BoxCIoU,计算的是所有样本的obj损失。
    • 定位损失,采用的是CIoU loss;只计算正样本的定位损失。

1.2 YOLOv5网络结构图

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度


2.YOLOv8

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

YOLOv8 项目地址:https://github.com/ultralytics/ultralytics

Ultralytics YOLOv8 是由 Ultralytics 开发的 YOLO 目标检测和图像分割模型的最新版本。YOLOv8 是一款先进的、最新的模型,基于之前 YOLO 版本的成功,并引入了新的特性和改进,进一步提高了性能和灵活性。

YOLOv8 的一个关键特性是其可扩展性。它被设计为一个框架,支持所有之前的 YOLO 版本,使得在不同版本之间切换并比较它们的性能变得非常容易。这使得 YOLOv8 成为那些想要利用最新的 YOLO 技术同时仍能够使用现有 YOLO 模型的用户的理想选择。

除了可扩展性之外,YOLOv8 还包括许多其他创新,使其成为一种适用于广泛目标检测和图像分割任务的吸引人选择。这些包括一个新的骨干网络、一个新的无锚点检测头和一个新的损失函数。此外,YOLOv8 高效并且可以在多种硬件平台上运行,从 CPUGPU

总的来说,YOLOv8 是一款强大、灵活的目标检测和图像分割工具,它提供了最新的 SOTA 技术以及使用和比较所有之前 YOLO 版本的能力,是一个兼具优点的选择。

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 ultralytics 这个词,原因是 ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO 系列模型,而是能够支持非 YOLO 模型以及分类分割姿态估计等各类任务。

YOLOv8主要有如下的优点:

  • 用户友好的API
  • 可以同时实现分类、检测、分割和姿态估计任务
  • 速度更快、准确率更高
  • 全新的结构
  • 新的损失函数
  • Anchor free

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

模型 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概述

  1. Backbone: 第一层卷积由原本的 6×6 卷积改为 3×3 卷积;参考 YOLOv7 ELAN 设计思想将 C3 模块换成了 C2f 模块,并配合调整了模块的深度。
  2. Neck:移除了 1×1 卷积的降采样层;同时也将原本的 C3 模块换成了 C2f 模块。
  3. Head:这部分改动较大,换成了解耦头结构,将分类任务和回归任务解耦;同时也将 Anchor-Based 换成了 Anchor-Free
  4. Loss:使用 BCE Loss 作为分类损失;使用 VFL Loss + CIOU Loss 作为回归损失。
  5. 样本匹配策略: 采用了 Task-Aligned Assigner 样本分配策略。
  6. 训练策略:新增加了最后 10 轮关闭 Mosaic 数据增强操作,该操作可以有效的提升精度。

2.2 YOLOv8整体结构图

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

图片来源https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8(博主修正后)


2.3 YOLOv8yaml 文件与 YOLOv5yaml 文件对比

2.3.1 参数部分

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

左侧 yolov5s.yaml ,右侧 yolov8.yaml


因为YOLOv8采用Anchor free的范式,所以在 yaml 文件中移除了 anchor 的参数部分,并且YOLOv8将多个不同版本的模型写到了一起,除此之外在深度因子宽度因子后又新增了一个最大通道数的参数,我觉得这可能和YOLOv7的模型理念有些相似,单凭宽度因子调整的通道数应该不是最优的,所以s\m\l没有遵循同一套的缩放系数。


2.3.2 主干部分

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

左侧 yolov5s.yaml ,右侧 yolov8.yaml


主干部分改进主要有以下三点:

  • 第一层卷积由原本的 6×6 卷积改为 3×3 卷积 。
  • 所有的 C3 模块改为 C2f 模块 。
  • 深度由 C3 模块 3、6、9、3 改为C2f3、6、6、3

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度


2.3.3 Neck部分

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

左侧 yolov5s.yaml ,右侧 yolov8.yaml


依然采用 PAN 结构,但是删除了降维用的 1×1 卷积。


2.3.4 Head部分

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度

头部的改动是最大的,直接将原本的耦合头改成了解耦头,值得注意力的是,这个解耦头不再有之前的 objectness 分支,而是直接解耦成了两路,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。


2.4 正负样本分配策略

2.4.1 静态分配策略和动态分配策略有什么区别

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

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

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

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

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

2.4.2 simOTA 策略

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

在传统的目标检测算法中,通常使用IoU来度量anchorground 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采用了一种基于动态阈值的分配方法。具体而言,它在计算AnchorGround Truth Box之间的IoU时,采用了一个基于任务自适应的动态阈值来判断正负样本的分配。通过这种方式,Task-Aligned Assigner能够根据具体的任务和数据分布,自适应地调整正负样本的分配比例,从而获得更好的检测性能。

Task-Aligned Assigner的公式如下:

t
=
s
α
×
u
β
t=s^α\times u^β
t=sα×uβ

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

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

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度


2.4.5 损失计算

Loss 计算包括 2个分支:分类和回归分支,没有了之前的 objectness 分支。

  • 分类分支依然采用 BCE Loss
  • 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss, 同时还使用了 CIoU Loss

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

【2】YOLOv8原理解析:重新定义实时目标检测的速度和精度


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——算法详解