YOLOV8 原理和实现全解析(合适新人)

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损失函数的详细解析:

  1. 损失函数的组成部分
    YOLOv8的损失函数主要由以下几个部分组成:

分类损失(Classification Loss) :用于衡量模型预测的类别概率与真实类别之间的差异。

定位损失(Localization Loss) :用于衡量模型预测的边界框位置与真实边界框位置之间的差异。

对象性损失(Objectness Loss) :用于衡量模型预测的对象性得分与真实对象存在的标注之间的差异。

  1. 分类损失
    分类损失通常使用交叉熵损失(Cross-Entropy Loss)来计算。对于每个预测框,模型会输出一个类别概率分布,而真实值是一个one-hot编码的向量,表示目标所属的类别。

  2. 定位损失
    定位损失用于衡量预测的边界框与真实边界框之间的差异。YOLOv8使用通用的目标框损失(Generalized Objective Box Loss,GOL)来计算定位损失。
    GOL损失结合了GIoU损失(Generalized Intersection over Union Loss)和DIoU损失(Distance Intersection over Union Loss)的优点,提供了更稳定的训练过程和更好的收敛性。
    GIoU损失通过引入归一化项,使得损失不仅考虑交并比(IoU),还考虑了边界框的重叠程度和位置偏差。

  3. 对象性损失
    对象性损失用于衡量模型预测的对象性得分与真实对象存在的标注之间的差异。对象性得分表示某个预测框是否包含目标对象。

  4. 总损失
    总损失是分类损失、定位损失和对象性损失的加权和。权重系数可以根据具体任务的需求进行调整。

  5. 其他考虑因素
    正负样本平衡:在训练过程中,正样本(包含目标的预测框)和负样本(不包含目标的预测框)的数量往往不平衡。为了处理这个问题,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(10003 * 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。不仅如此还推出了一个全新的框架。不过这个框架还处于早期阶段,还需要不断完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WRF教程第四期】WRF 初始化概述:以4.5版本为例

WRF 初始化(WRF Initialization) Building Initialization Programs编译方式 理想案例初始化(Initialization for Idealized Cases)理想化案例的输入可用的理想化案例 现实案例初始化(Initialization for Real Data Ca…

vmcore-dmesg交叉编译(arm64平台)

kexec工具:能够将第二内核(捕获内核)装载到指定内存运行。 vmcore-dmesg工具:用于提取vmcore的dmesg信息。 1、源码下载地址: Index of /pub/linux/utils/kernel/kexec/ 2、交叉编译: 采用aarch64-lin…

计算机网络-L2TP VPN基础概念与原理

一、概述 前面学习了GRE和IPSec VPN,今天继续学习另外一个也很常见的VPN类型-L2TP VPN。 L2TP(Layer 2 Tunneling Protocol) 协议结合了L2F协议和PPTP协议的优点,是IETF有关二层隧道协议的工业标准。L2TP是虚拟私有拨号网VPDN&…

OpenCV学习——图像融合

import cv2 as cv import cv2 as cvbg cv.imread("test_images/background.jpg", cv.IMREAD_COLOR) fg cv.imread("test_images/forground.png", cv.IMREAD_COLOR)# 打印图片尺寸 print(bg.shape) print(fg.shape)resize_size (1200, 800)bg cv.resize…

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息,据报道,OpenAI开启了第八天技术分享直播,对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中,实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化,使得用户提出问题后&…

30. Three.js案例-绘制并渲染圆弧

30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&#xff…

YOLO8 改进 009:引入 ASFF 对 YOLOv8 检测头进行优化(适用于小目标检测任务)

论文题目:Learning Spatial Fusion for Single-Shot Object Detection 论文地址:Paper - ASFF 官方源码:GitHub - GOATmessi8/ASFF 简 介 多尺度特征融合是解决多尺度目标检测问题的关键技术,其中 FPN(特征金字塔网络…

【数据集】生菜病害检测数据集530张6类YOLO+VOC格式

数据集格式:VOC格式YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:530 Annotations文件夹中xml文件总计:530 labels文件夹中txt文件总计:530 标签种类数&#…

设计模式2

23中设计模式分类 创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。(对象的创建和对象的使用分离) 5种:单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 结构型模式:把类或对…

CSS边框的样式

边框阴影 让元素更有立体感 img {box-shadow: 2px 10px 5px 20px #ff0000;border-radius: 44px;}语法:box-shadow:值1 值2 值3 值4 值5 值1:水平阴影的位置值2:垂直阴影的位置值3:模糊距离值4:阴影的尺寸…

Spring篇--xml方式整合第三方框架

Spring xml方式整合第三方框架 xml整合第三方框架有两种整合方案: ​ 不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如:MyBatis; ​ 需要引入第三方框架命名空间,需要使用…

Javascript-web API-day02

文章目录 01-事件监听02-点击关闭广告03-随机点名案例04-鼠标经过或离开事件05-可点击的轮播图06-小米搜索框07-键盘类型事件08-键盘事件-发布评论案例09-focus选择器10-评论回车发布11-事件对象12-trim方法13-环境对象14-回调函数15-tab栏切换 01-事件监听 <!DOCTYPE html…

powershell(1)

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…

GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法

GraphReader: 将长文本结构化为图&#xff0c;并让 agent 自主探索&#xff0c;结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够&#xff1f;还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…

如何一站式计算抗体和蛋白信息

在生物医药研究领域&#xff0c;蛋白质&#xff08;抗体、多肽等&#xff09;的性质计算是理解生命机制、分离/纯化/鉴定/生产蛋白、以及开发蛋白新药的重要研究手段。然而&#xff0c;很多相关功能分散在不同的软件中&#xff0c;十分不方便。鹰谷电子实验记录本InELN一站式内…

物理信息神经网络(PINN)八课时教案

物理信息神经网络&#xff08;PINN&#xff09;八课时教案 第一课&#xff1a;物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff0c;简称PINN&#xff09;是一种将物理定律融入神经网络训练过程中的先进方…

gitlab初始化+API批量操作

几年没接触gitlab了&#xff0c;新版本装完以后代码提交到默认的main分支&#xff0c;master不再是主分支 项目有几十个仓库&#xff0c;研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

STM32CUBEMX+STM32H743ZIT6+MPU+DMA+UART下发指令对MPU配置管理

实现stm32H7的IAP过程&#xff0c;没有想象中的顺利。 需要解决串口DMA和MPU配置管理。 查看正点原子的MPU管理例程&#xff0c;想自己用串口下发指令&#xff0c;实现MPU打开&#xff0c;读取和写入指令。 中间遇到很多坑&#xff0c;比如串口DMA方式下发指令&#xff0c;没反…

8. 数组拼接

题目描述 现在有多组整数数组&#xff0c;需要将它们合并成一个新的数组。合并规则&#xff0c;从每个数组里按顺序取出固定长度的内容合并到新的数组中&#xff0c;取完的内容会删除掉&#xff0c;如果该行不足固定长度或者已经为空&#xff0c;则直接取出剩余部分的内容放到新…