文章目录
YOLOv8_2">YOLOv8算法简介
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__23">YOLOv8 概述
- 提供了一个
全新的 SOTA 模型
,包括 P5 640 和 P6 1280 分辨率的目标检测网络和基于 YOLACT 的实例分割模型。和 YOLOv5 一样,基于缩放系数也提供了 N/S/M/L/X 尺度的不同大小模型,用于满足不同场景需求 骨干网络和 Neck 部分
可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数,属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了Head 部分
相比 YOLOv5 改动较大,换成了目前主流的解耦头结构,将分类和检测头分离,同时也从 Anchor-Based 换成了 Anchor-Free- Loss 计算方面采用了
TaskAlignedAssigner 正样本分配策略
,并引入了 Distribution Focal Loss
从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践
,主推的还是 ultralytics 这个框架本身。
下面将按照模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分详细介绍 YOLOv8 目标检测的各种改进,实例分割部分暂时不进行描述。
YOLOv8_35">YOLOv8算法特点
YOLOv8 的主要具有以下特点:
- 对用户友好的 API(命令行 + Python);
- 模型更快更准确;
- 模型能完成目标检测、实例分割和图像分类任务;
- 与先前所有版本的 YOLO 兼容可扩展;
- 模型采用新的网络主干架构;
- 无锚(Anchor-Free)检测;
- 模型采用新的损失函数。
YOLOv8__46">YOLOv8 网络模型结构图
以上结构图由 RangeKing@github 绘制。
YOLOv8__54">YOLOv8 网络模型结构设计
模型完整图示可以看图 1。
在暂时不考虑 Head 情况下,对比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以发现改动较小。
骨干网络和 Neck 的具体变化为:
- 第一个卷积层的 kernel 从 6x6 变成了 3x3
- 所有的 C3 模块换成 C2f,结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作
- 去掉了 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。其结构如下所示:
![head](https://user-images.githubusercontent.com/17425982/212009547-189e14aa-6f93-4af0-8446-adf604a46b95.png)
可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss
中提出的积分形式表示法。
YOLOv8__90">YOLOv8 效果
YOLOv8__YOLOv5__92">YOLOv8 和 YOLOv5 之间的综合比较
YOLOv8__YOLOv5__95">YOLOv8 和 YOLOv5 目标检测模型对比
YOLOv8
是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。
不过 Ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 Ultralytics 这个词,原因是 Ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。
总而言之,Ultralytics 开源库的两个主要优点是:
下表为官方在 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__122">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,两者相乘就可以衡量对齐程度。
- 对于每一个 GT,对所有的预测框基于 GT 类别对应分类分数,预测框与 GT 的 IoU 的加权得到一个关联分类以及回归的对齐分数
alignment_metrics
- 对于每一个 GT,直接基于
alignment_metrics
对齐分数选取 topK 大的作为正样本
Loss 计算包括 2 个分支: 分类和回归分支,没有了之前的 objectness 分支。
- 分类分支依然采用 BCE Loss
- 回归分支需要和 Distribution Focal Loss 中提出的积分形式表示法绑定,因此使用了 Distribution Focal Loss, 同时还使用了 CIoU Loss
- 3 个 Loss 采用一定权重比例加权即可。
YOLOv8__141">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__158">YOLOv8 算法总结
本文详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算进行了详细的说明,并提供了大量的示意图供大家方便理解。
简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。
参考来源
机器之心:https://mp.weixin.qq.com/s/QuzjUsq7niNiP8PYGyMpUA
MMYOLO关于YOLOv8算法解析教程:https://github.com/open-mmlab/mmyolo