YOLOV8 原理和实现全解析
- 0 简介
- 1 YOLOv8 概述
- 2 模型结构设计
- 3 Loss 计算
- 4 训练数据增强
- 5 训练策略
- 6 模型推理过程
- 7 特征图可视化
- 总结
0 简介
图 1:YOLOv8-P5 模型结构
以上结构图由 RangeKing@github 绘制。
YOLOv8 是 Ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。
按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。 不过 Ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 Ultralytics 这个词,原因是 Ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于 YOLO 系列模型,而是能够支持非 YOLO 模型以及分类分割姿态估计等各类任务。 总而言之,Ultralytics 开源库的两个主要优点是:
融合众多当前 SOTA 技术于一体
未来将支持其他 YOLO 系列以及 YOLO 之外的更多算法
图 2:YOLOv8 性能曲线
下表为官方在 COCO Val 2017 数据集上测试的 mAP、参数量和 FLOPs 结果。可以看出 YOLOv8 相比 YOLOv5 精度提升非常多,但是 N/S/M 模型相应的参数量和 FLOPs 都增加了不少,从上图也可以看出相比 YOLOV5 大部分模型推理速度变慢了。
YOLOv8的主要应用领域:
智能安防与视频监控:YOLOv8在智能安防领域被用于实时监控和异常行为检测,例如识别可疑人物、车辆和包裹,并通过边缘计算进行快速目标检测和事件预警,提升安防系统的响应速度和精准度。
自动驾驶:在自动驾驶领域,YOLOv8用于实时识别路况中的行人、车辆和其他障碍物,为自动驾驶系统提供关键数据支持,包括障碍物检测、车道线检测和交通标志识别等。
工业自动化:YOLOv8在工业自动化中用于产品检测、缺陷检测和机器人视觉导航。它能够提高生产效率和产品质量,减少人工成本,并适应复杂的工作环境。
医疗影像分析:YOLOv8在医学影像处理中用于病灶检测、器官分割和医学图像分类等任务,辅助医生进行诊断和治疗,提高医疗水平。
农业:在农业领域,YOLOv8用于监测作物生长、检测作物病害、识别害虫等,帮助农民提高农作物管理效率。
零售业:YOLOv8在零售业中用于商品检测和库存管理自动化,帮助零售商监控库存水平,检测商店扒手,并跟踪客户行为。
机器人技术:YOLOv8在机器人技术中用于目标定位与导航,帮助机器人识别环境中的物体并与之交互。
无人机侦查:YOLOv8用于无人机侦查任务,实时分析空中拍摄的图像,进行物体跟踪和目标识别。
智能交通系统:YOLOv8在智能交通系统中用于车辆检测、行人检测、交通流量统计和交通标志识别,提高交通管理的效率和安全性。
其他领域:YOLOv8还应用于环境保护、娱乐、野生动物保护、智能养老健康监测等多个领域,展示了其广泛的适用性和高效性。
1 YOLOv8 概述
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
训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作,可以有效地提升精度
从上面可以看出,YOLOv8 主要参考了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关设计,本身的创新点不多,偏向工程实践,主推的还是 ultralytics 这个框架本身。
性能表现 速度与准确性平衡:
YOLOv8通过改进的网络架构和训练策略,实现了在实时性要求较高的自动驾驶应用场景中的高效应用。它在速度和准确性之间取得了出色的平衡,适合需要快速检测的应用场景。小目标检测能力:
针对自动驾驶中常见的小目标检测问题,研究者们提出了基于YOLOv8的改进算法,通过引入注意力机制和多尺度特征融合技术,显著提高了对远距离小目标的检测能力。多任务处理能力:
YOLOv8不仅在目标检测方面表现出色,还能够处理其他任务,如车道线分割和可驾驶区域分割。例如,在OpenLane挑战赛中,YOLOv8与其他模型结合使用,取得了优异的拓扑任务性能。多种模型大小选择:
YOLOv8提供了多种模型大小,用户可以根据需求选择最适合的模型。较小的模型优先考虑速度,而较大的模型则提供更高的准确性。高级技术应用: YOLOv8采用了路径聚合网络(PAN)和聚焦空间注意力(FSA)等高级技术,提高了物体定位和识别的准确性。
下面将按照模型结构设计、Loss 计算、训练数据增强、训练策略和模型推理过程共 5 个部分详细介绍 YOLOv8 目标检测的各种改进,实例分割部分暂时不进行描述。
2 模型结构设计
模型完整图示可以看图 1。
在暂时不考虑 Head 情况下,对比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以发现改动较小。
骨干网络和 Neck 的具体变化为:
第一个卷积层的 kernel 从 6x6 变成了 3x3
所有的 C3 模块换成 C2f,结构如下所示,可以发现多了更多的跳层连接和额外的 Split 操作
module 图 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。其结构如下所示:
head 图 5:YOLOv8 Head 结构
可以看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss 中提出的积分形式表示法。
3 Loss 计算
YOLOv8的损失函数(Loss Function)是其训练过程中用于评估模型预测与真实值之间差异的关键组件。理解YOLOv8的损失函数对于优化模型性能和调试训练过程至关重要。以下是对YOLOv8损失函数的详细解析:
- 损失函数的组成部分
YOLOv8的损失函数主要由以下几个部分组成:
分类损失(Classification Loss) :用于衡量模型预测的类别概率与真实类别之间的差异。
定位损失(Localization Loss) :用于衡量模型预测的边界框位置与真实边界框位置之间的差异。
对象性损失(Objectness Loss) :用于衡量模型预测的对象性得分与真实对象存在的标注之间的差异。
-
分类损失
分类损失通常使用交叉熵损失(Cross-Entropy Loss)来计算。对于每个预测框,模型会输出一个类别概率分布,而真实值是一个one-hot编码的向量,表示目标所属的类别。 -
定位损失
定位损失用于衡量预测的边界框与真实边界框之间的差异。YOLOv8使用通用的目标框损失(Generalized Objective Box Loss,GOL)来计算定位损失。
GOL损失结合了GIoU损失(Generalized Intersection over Union Loss)和DIoU损失(Distance Intersection over Union Loss)的优点,提供了更稳定的训练过程和更好的收敛性。
GIoU损失通过引入归一化项,使得损失不仅考虑交并比(IoU),还考虑了边界框的重叠程度和位置偏差。 -
对象性损失
对象性损失用于衡量模型预测的对象性得分与真实对象存在的标注之间的差异。对象性得分表示某个预测框是否包含目标对象。 -
总损失
总损失是分类损失、定位损失和对象性损失的加权和。权重系数可以根据具体任务的需求进行调整。 -
其他考虑因素
正负样本平衡:在训练过程中,正样本(包含目标的预测框)和负样本(不包含目标的预测框)的数量往往不平衡。为了处理这个问题,YOLOv8可能采用 focal loss 或其他方法来平衡正负样本的损失贡献。
标签分配:确定哪些预测框负责预测哪些真实目标是一个关键步骤。YOLOv8可能使用如动态标签分配(Dynamic Label Assignment)等策略来优化标签分配过程。
总结
YOLOv8的损失函数是一个综合考虑分类准确性、边界框定位精度和对象性得分的多任务损失函数。通过合理设计和调整各个损失组件的权重,可以有效地训练模型以实现高性能的目标检测。
4 训练数据增强
数据增强方面和 YOLOv5 差距不大,只不过引入了 YOLOX 中提出的最后 10 个 epoch 关闭 Mosaic 的操作。假设训练 epoch 是 500,其示意图如下所示:
图 6:pipeline
考虑到不同模型应该采用的数据增强强度不一样,因此对于不同大小模型,有部分超参会进行修改,典型的如大模型会开启 MixUp 和 CopyPaste。
如果想了解每个 pipeline 的细节,可以查看 MMYOLO 中 YOLOv5 的算法解析文档 。
5 训练策略
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
6 模型推理过程
YOLOv8 的推理过程和 YOLOv5 几乎一样,唯一差别在于前面需要对 Distribution Focal Loss 中的积分表示 bbox 形式进行解码,变成常规的 4 维度 bbox,后续计算过程就和 YOLOv5 一样了。
以 COCO 80 类为例,假设输入图片大小为 640x640,MMYOLO 中实现的推理过程示意图如下所示:
head 图 8:results
其推理和后处理过程为:
(1) bbox 积分形式转换为 4d bbox 格式
对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式
(2) 维度变换
YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。 将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。
(3) 解码还原到原图尺度
分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。
(4) 阈值过滤
遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。
(5) 还原到原图尺度和 nms
基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。
有一个特别注意的点:YOLOv5 中采用的 Batch shape 推理策略,在 YOLOv8 推理中暂时没有开启,不清楚后面是否会开启,在 MMYOLO 中快速测试了下,如果开启 Batch shape 会涨大概 0.1~0.2。
7 特征图可视化
在MMYOLO中,特征图可视化是一个重要的功能,可以帮助用户更好地理解模型的特征分布情况。以YOLOv8-s模型为例,进行特征图可视化的步骤如下:
下载官方权重:首先需要从官方渠道下载YOLOv8-s模型的预训练权重文件。这些权重文件通常用于确保模型的性能和一致性。
转换权重格式:由于MMYOLO与YOLOv8的实现方式可能有所不同,因此需要使用yolov8_to_mmyolo脚本将YOLOv8的权重转换为MMYOLO可以识别的格式。这一步骤确保了权重文件能够被MMYOLO正确加载和使用。需要注意的是,该脚本必须放置在MMYOLO的官方仓库目录下才能正常运行。
运行可视化脚本:假设转换后的权重文件名为mmyolov8s.pth,接下来可以使用MMYOLO提供的可视化工具来查看特征图。
选择可视化方式:MMYOLO支持多种通道压缩策略,如squeeze_mean、select_max等,用户可以根据需要选择合适的策略来显示特征图。此外,还可以通过配置文件中的test_pipeline设置来调整特征图与图像的对齐方式,以确保可视化效果的准确性。
通过上述步骤,用户可以有效地利用MMYOLO的特征图可视化工具来分析YOLOv8-s模型的特征分布情况,从而更好地理解和优化模型性能。
MMYOLO中yolov8_to_mmyolo脚本的具体使用方法和要求是什么?
MMYOLO中yolov8_to_mmyolo脚本的具体使用方法和要求如下:
下载官方权重:首先需要从YOLOv8的官方仓库下载预训练的权重文件。
转换权重文件:使用yolov8_to_mmyolo脚本将YOLOv8的权重文件转换为MMYOLO兼容的格式。这个脚本必须放置在MMYOLO的官方库中才能正确运行。转换后的权重文件通常命名为mmyolov8s.pth 。
可视化特征图:如果需要可视化YOLOv8模型的特征图,可以使用MMYOLO提供的特征图可视化工具。具体步骤如下:
进入MMYOLO的开发分支目录:cd mmyolo
运行特征图可视化脚本:python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reduction squeeze_mean
注意:为了确保特征图和图片叠加显示能对齐,需要先将原先的test_pipeline替换为特定的配置。
MMYOLO特征图可视化工具支持哪些通道压缩策略,以及各自的优缺点是什么?
MMYOLO特征图可视化工具支持的通道压缩策略主要有以下几种:
select_max:选择每个通道中最大值进行压缩。这种方法的优点是能够保留最重要的特征信息,缺点是可能会忽略一些次要但仍然重要的特征。
select_mean:选择每个通道的平均值进行压缩。这种方法的优点是能够平滑特征图,减少噪声,缺点是可能会丢失一些重要的细节信息。
select_min:选择每个通道中最小值进行压缩。这种方法的优点是能够突出背景或低强度区域的特征,缺点是可能会忽略一些重要的前景特征。
select_sum:选择每个通道的总和进行压缩。这种方法的优点是能够增强特征图的整体强度,缺点是可能会导致过饱和,使得特征图难以区分。
总结
本文详细分析和总结了最新的 YOLOv8 算法,从整体设计到模型结构、Loss 计算、训练数据增强、训练策略和推理过程进行了详细的说明,并提供了大量的示意图供大家方便理解。 简单来说 YOLOv8 是一个包括了图像分类、Anchor-Free 物体检测和实例分割的高效算法,检测部分设计参考了目前大量优异的最新的 YOLO 改进算法,实现了新的 SOTA。不仅如此还推出了一个全新的框架。不过这个框架还处于早期阶段,还需要不断完善。