YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版别,现在支撑图画分类、物体检测和实例切割任务,在还没有开源时就收到了用户的广泛关注。

YOLOv8 深度详解!一文看懂,快速上手

考虑到 YOLOv8 的优异性能,MMYOLO 也在第一时刻组织了复现,因为时刻匆促,现在 MMYOLO 的 Dev 分支已经支撑了 YOLOv8 的模型推理以及经过 projects/easydepoly 支撑部署,咱们将赶快发布可练习版别,敬请期待!

官方开源地址 github.com/ultralytics…

MMYOLO 开源地址: github.com/open-mmlab/…

按照官方描绘,YOLOv8 是一个 SOTA 模型,它建立在曾经 YOLO 版别的成功基础上,并引入了新的功能和改善,以进一步提高性能和灵活性。具体立异包含一个新的主干网络、一个新的 Ancher-Free 检测头和一个新的丢失函数,能够在从 CPU 到 GPU 的各种硬件平台上运转。

不过 ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 ultralytics 这个词,原因是 ultralytics 将这个库定位为算法结构,而非某一个特定算法,一个首要特点是可扩展性。其期望这个库不仅仅能够用于 YOLO 系列模型,而是能够支撑非 YOLO 模型以及分类切割姿势估量等各类任务。

总而言之,ultralytics 开源库的两个首要长处是:

  • 交融众多当时 SOTA 技术于一体
  • 未来将支撑其他 YOLO 系列以及 YOLO 之外的更多算法

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 泛化性能较优异的说法。对各系列 YOLO 泛化性验证也是 MMYOLO 中一个特别关怀和重点发力的方向。

阅览本文前,假如你对 YOLOv5、YOLOv6 和 RTMDet 不熟悉,能够先看下如下文档:

  1. YOLOv5 原理和完成全解析 mmyolo.readthedocs.io/zh_CN/lates…
  2. YOLOv6 原理和完成全解析 mmyolo.readthedocs.io/zh_CN/lates…
  3. RTMDet 原理和完成全解析 mmyolo.readthedocs.io/zh_CN/lates…

1 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
  5. 练习的数据增强部分引入了 YOLOX 中的最终 10 epoch 关闭 Mosiac 增强的操作,能够有效 提高精度

从上面能够看出,YOLOv8 首要参阅了最近提出的诸如 YOLOX、YOLOv6、YOLOv7 和 PPYOLOE 等算法的相关规划,自身的立异点不多,偏向工程实践,主推的还是 ultralytics 这个结构自身

下面将按照模型结构规划、Loss 核算、练习数据增强、练习战略和模型推理进程共 5 个部分具体介绍 YOLOv8 方针检测的各种改善,实例切割部分暂时不进行描绘。

2 模型结构规划

YOLOv8 深度详解!一文看懂,快速上手

以上为根据 YOLOv8 官方代码所制作的模型结构图。假如你喜爱这种模型结构图风格,能够检查 MMYOLO 里面对应算法 README 中的模型结构图,现在已经支撑了 YOLOv5、YOLOv6、YOLOX、RTMDet 和 YOLOv8。MMYOLO 中重构的 YOLOv8 模型对应结构图如下所示:

具体地址为: github.com/open-mmlab/…

YOLOv8 深度详解!一文看懂,快速上手

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

YOLOv8 深度详解!一文看懂,快速上手

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

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

  • 第一个卷积层的 kernel 从 6×6 变成了 3×3
  • 一切的 C3 模块换成 C2f,结构如下所示,能够发现多了更多的跳层衔接和额定的 Split 操作

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 深度详解!一文看懂,快速上手

能够看出,不再有之前的 objectness 分支,只有解耦的分类和回归分支,而且其回归分支使用了 Distribution Focal Loss 中提出的积分方式表示法, DFL 的描绘见知乎推文:zhuanlan.zhihu.com/p/147691786…

3 Loss 核算

Loss 核算进程包含 2 个部分: 正负样本分配战略和 Loss 核算。

现代方针检测器大部分都会在正负样本分配战略上面做文章,典型的如 YOLOX 的 simOTA、TOOD 的 TaskAlignedAssigner 和 RTMDet 的 DynamicSoftLabelAssigner,这类 Assigner 大都是动态分配战略,而 YOLOv5 选用的仍然是静态分配战略。考虑到动态分配战略的优异性,YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。

TaskAlignedAssigner 的匹配战略简略总结为: 根据分类与回归的分数加权的分数挑选正样本

YOLOv8 深度详解!一文看懂,快速上手

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 选用必定权重比例加权即可。

4 练习数据增强

数据增强方面和 YOLOv5 差距不大,只不过引入了 YOLOX 中提出的最终 10 个 epoch 关闭 Mosaic 的操作。假定练习 epoch 是 500,其示意图如下所示:

YOLOv8 深度详解!一文看懂,快速上手

考虑到不同模型应该选用的数据增强强度不相同,因而关于不同巨细模型,有部分超参会进行修改,典型的如大模型会敞开 MixUp 和 CopyPaste。数据增强后典型作用如下所示:

YOLOv8 深度详解!一文看懂,快速上手

上述作用能够运转 github.com/open-mmlab/… 脚本得到

因为每个 pipeline 都是比较惯例的操作,本文不再赘述。假如想了解每个 pipeline 的细节,能够检查 MMYOLO 中 YOLOv5 的算法解析文档 mmyolo.readthedocs.io/zh_CN/lates…

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 640×640
EMA decay 0.9999

6 模型推理进程

YOLOv8 的推理进程和 YOLOv5 简直相同,唯一差别在于前面需求对 Distribution Focal Loss 中的积分表示 bbox 方式进行解码,变成惯例的 4 维度 bbox,后续核算进程就和 YOLOv5 相同了。

以 COCO 80 类为例,假定输入图片巨细为 640×640,MMYOLO 中完成的推理进程示意图如下所示:

暂时无法在飞书文档外展现此内容

其推理和后处理进程为:

(1) bbox 积分方式转换为 4d bbox 格局

对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 核算将积分方式转换为 4 维 bbox 格局

(2) 维度改换

YOLOv8 输出特征图标准为 80×80、40×40 和 20×20 的三个特征图。Head 部分输出分类和回归共 6 个标准的特征图。

将 3 个不同标准的类别猜测分支、bbox 猜测分支进行拼接,并进行维度改换。为了后续便利处理,会将原先的通道维度置换到最终,类别猜测分支 和 bbox 猜测分支 shape 分别为 (b, 80×80+40×40+20×20, 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 模型为例,第一步需求下载官方权重,然后将该权重经过 github.com/open-mmlab/… 脚本将去转换到 MMYOLO 中,留意必须要将脚本置于官方库房下才干正确运转,假定得到的权重名字为 mmyolov8s.pth。

假定想可视化 backbone 输出的 3 个特征图作用,则只需求

cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean

需求特别留意,为了确保特征图和图片叠加显现能对齐作用,需求先将原先的 test_pipeline 替换为如下:

test_pipeline = [
    dict(
        type='LoadImageFromFile',
        file_client_args=_base_.file_client_args),
    dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这儿将 LetterResize 修改成 mmdet.Resize
    dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
    dict(
        type='mmdet.PackDetInputs',
        meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
                   'scale_factor'))
]

YOLOv8 深度详解!一文看懂,快速上手

从上图能够看出不同输出特征图层首要负责猜测不同标准的物体

咱们也能够可视化 Neck 层的 3 个输出层特征图:

cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck

YOLOv8 深度详解!一文看懂,快速上手

从上图能够发现物体处的特征更加聚集。

总结

本文具体分析和总结了最新的 YOLOv8 算法,从整体规划到模型结构、Loss 核算、练习数据增强、练习战略和推理进程进行了具体的阐明,并供给了很多的示意图供我们便利理解。

简略来说 YOLOv8 是一个包含了图画分类、Anchor-Free 物体检测和实例切割的高效算法,检测部分规划参阅了现在很多优异的最新的 YOLO 改善算法,完成了新的 SOTA。不仅如此还推出了一个全新的结构。不过这个结构还处于早期阶段,还需求不断完善。

因为时刻匆促且官方代码在不断完善中,假如有不对的当地,欢迎批评和指正。MMYOLO 会赶快地跟进并复现该算法,敬请期待!

MMYOLO 开源地址: github.com/open-mmlab/…

MMYOLO 算法解析教程:mmyolo.readthedocs.io/zh_CN/lates…