目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA

时间:2023-02-05 18:52:00

YOLOv8算法简介

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA
YOLOv8作者:glenn-jocher
项目链接:https://github.com/ultralytics/ultralytics

YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Ali Farhadi 等人提出初代模型以来,领域内的研究者们已经对 YOLO 进行了多次更新迭代,模型性能越来越强大。现在,YOLOv8 已正式发布。

YOLOv8 是由小型初创公司 Ultralytics 创建并维护的,值得注意的是 YOLOv5 也是由该公司创建的。


注:由于 YOLOv8 和 YOLOv5 属于同一个作者glenn-jocher,均在???? YOLOAir库 中有集成,所以YOLOv5、YOLOv7、YOLOv8等模型 使用 芒果改进YOLO系列完全通用,不需要额外操作。

????在YOLOv7中结合YOLOv8的梯度流信息模块(C2f)
????:改进YOLOv7系列:结合丰富的梯度流信息模块,来自YOLOv8的核心模块

????芒果汁没有芒果改进YOLO全系列目录
????:芒果改进目录一览|原创改进YOLOv5、YOLOv7、YOLOv8等YOLO模型全系列目录(推荐)


YOLOv8 概述

YOLOv8 算法的核心特性和改动可以归结为如下:

  1. 提供了一个全新的 SOTA 模型,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求
  2. 骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了
  3. Head 部分相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free
  4. Loss 计算方面采用了 TaskAlignedAssigner 正样本分配策略,并引入了 Distribution Focal Loss

从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践,主推的还是 ultralytics 这个框架本身。

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

YOLOv8算法特点

YOLOv8 的主要具有以下特点:

  • 对用户友好的 API(命令行 + Python);
  • 模型更快更准确;
  • 模型能完成目标检测、实例分割和图像分类任务;
  • 与先前所有版本的 YOLO 兼容可扩展;
  • 模型采用新的网络主干架构;
  • 无锚(Anchor-Free)检测;
  • 模型采用新的损失函数。

YOLOv8 网络模型结构图

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA 图 1:YOLOv8-P5 模型结构

以上结构图由 RangeKing@github 绘制。

YOLOv8 网络模型结构设计

模型完整图示可以看图 1。

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

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA 图 3:YOLOv5 和 YOLOv8 YAML 文件对比

左侧为 YOLOv5-s,右侧为 YOLOv8-s

骨干网络和 Neck 的具体变化为:

  • 第一个卷积层的 kernel 从 6x6 变成了 3x3
  • 所有的 C3 模块换成 C2f,结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作
目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA 图 4:YOLOv5 和 YOLOv8 模块对比
  • 去掉了 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 网络设计时也没有遵循一套缩放系数作用于所有模型

Head 部分变化最大,从原先的耦合头变成了解耦头,并且从 YOLOv5 的 Anchor-Based 变成了 Anchor-Free。其结构如下所示:

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA 图 5:YOLOv8 Head 结构

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

YOLOv8 效果

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA

YOLOv8 和 YOLOv5 之间的综合比较

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA

YOLOv8 和 YOLOv5 目标检测模型对比

目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA

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

  • 融合众多当前 SOTA 技术于一体
  • 未来将支持其他 YOLO 系列以及 YOLO 之外的更多算法
目标检测算法 YOLOv8 原理解析|包揽目标检测、实例分割 SOTA 图 2:YOLOv8 性能曲线

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

模型 YOLOv5 params(M) FLOPs@640 (B) YOLOv8 params(M) FLOPs@640 (B)
n 28.0(300e) 1.9 4.5 37.3 (500e) 3.2 8.7
s 37.4 (300e) 7.2 16.5 44.9 (500e) 11.2 28.6
m 45.4 (300e) 21.2 49.0 50.2 (500e) 25.9 78.9
l 49.0 (300e) 46.5 109.1 52.9 (500e) 43.7 165.2
x 50.7 (300e) 86.7 205.7 53.9 (500e) 68.2 257.8

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

YOLOv8 Loss 计算

Loss 计算过程包括 2 个部分: 正负样本分配策略和 Loss 计算。
现代目标检测器大部分都会在正负样本分配策略上面做文章,
YOLOv5 采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner
TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。

t = s α + u β t=s^\alpha+u^\beta t=sα+uβ : s 是标注类别对应的预测分值,u 是预测框和 gt 框的 iou,两者相乘就可以衡量对齐程度。

  1. 对于每一个 GT,对所有的预测框基于 GT 类别对应分类分数,预测框与 GT 的 IoU 的加权得到一个关联分类以及回归的对齐分数 alignment_metrics
  2. 对于每一个 GT,直接基于 alignment_metrics 对齐分数选取 topK 大的作为正样本

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

  • 分类分支依然采用 BCE Loss
  • 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss, 同时还使用了 CIoU Loss
  • 3 个 Loss 采用一定权重比例加权即可。

YOLOv8 训练策略

YOLOv8 的训练策略和 YOLOv5 没有啥区别,最大区别就是模型的训练总 epoch 数从 300 提升到了 500,这也导致训练时间急剧增加。以 YOLOv8-S 为例,其训练策略汇总如下:

配置 YOLOv8-s P5 参数
optimizer SGD
base learning rate 0.01
Base weight decay 0.0005
optimizer momentum 0.937
batch size 128
learning rate schedule linear
training epochs 500
warmup iterations max(1000,3 * iters_per_epochs)
input size 640x640
EMA decay 0.9999

YOLOv8 算法总结

本文详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算进行了详细的说明,并提供了大量的示意图供大家方便理解。
简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。

参考来源

机器之心:https://mp.weixin.qq.com/s/QuzjUsq7niNiP8PYGyMpUA
MMYOLO关于YOLOv8算法解析教程:https://github.com/open-mmlab/mmyolo