YOLO实例分割详细解析

YOLO 的实例分割(Instance Segmentation)其实是在 YOLO 检测(Object Detection) 的基础上增加了一条 Mask 分支

很多人学习 YOLO Seg 的时候容易陷入代码(Segment Head、Proto、Coeff),但是如果没有理解整个思想,看源码会很痛苦。

建议按照下面这个顺序理解:

图像分割是什么 → 为什么YOLO能够做分割 → YOLO Seg整体结构 → Mask如何生成 → Loss如何训练 → 推理过程 → 与Mask R-CNN区别 → YOLOv8/YOLO11源码分析


一、先理解什么叫实例分割

我们先看看几个任务:

复制代码
输入图片

        ↓

Classification(分类)

        ↓

      猫


------------------------------------

Detection(检测)

        ↓

  ┌─────────┐
  │   猫    │
  └─────────┘


------------------------------------

Semantic Segmentation(语义分割)

        ↓

██████████
██████████

所有猫都是同一种颜色


------------------------------------

Instance Segmentation(实例分割)

        ↓

██      ████
██      ████

每只猫都是一个独立mask

YOLO Seg做的是:

Instance Segmentation(实例分割)

输出:

复制代码
类别

bbox

score

mask

例如

复制代码
person
bbox
confidence
mask

dog
bbox
confidence
mask

所以:

一个目标 =

复制代码
bbox

+

mask

二、为什么YOLO能够做分割?

YOLO本来就是:

复制代码
Backbone

↓

Neck

↓

Detection Head

输出:

复制代码
类别

位置

置信度

那如果要做分割怎么办?

答案非常简单:

再预测一个Mask。

所以YOLO Seg变成:

复制代码
                Backbone

                    │

                Neck(PAFPN)

          ┌──────────────┐
          │              │

 Detection Head     Mask Head

检测Head负责:

复制代码
bbox

cls

score

Mask Head负责:

复制代码
mask

但是问题来了。

如果每个目标直接预测:

复制代码
640×640

=

409600个像素

假设:

100个目标

就是

复制代码
409600 ×100

≈4000万个数

太大了。

所以YOLO采用了一种非常聪明的方法。


三、YOLO Seg最大的创新------Prototype Mask

YOLO Seg并不是:

每个目标预测一个完整Mask。

而是:

所有目标共享一套Mask模板(Prototype),每个目标只预测组合系数(Coefficient)。

这就是论文最大的思想。

可以理解成:

复制代码
先生成

32张基础Mask

然后每个目标告诉你:

这些Mask怎么组合。

举个例子。

网络输出:

复制代码
Prototype

32

×

160

×

160

可以理解成:

复制代码
Proto1

Proto2

Proto3

...

Proto32

例如:

Proto1

复制代码
████
████

Proto2

复制代码
■■■■

Proto3

复制代码
▒▒▒▒

...

这些Mask没有任何意义。

它们不是:

复制代码
人

车

狗

而是:

一些基础纹理。

有点像:

PCA里的基。

或者:

神经网络自动学习出来的Basis。


四、每个目标只预测32个系数

例如:

检测Head输出:

复制代码
bbox

cls

score

coeff

coeff就是:

复制代码
32维

例如

[

0.2

-1.1

0.5

...

]

那么最终Mask就是:

复制代码
Mask

=

Coeff

×

Prototype

数学表达:

复制代码
M

=

Σ

ci

×

Proto_i

例如:

复制代码
Mask

=

0.2×Proto1

+

1.5×Proto2

-

0.8×Proto3

...

于是:

32张模板

组合出来

这一只狗。

另一只狗:

复制代码
coeff

不同

所以:

生成另一张Mask。


五、整个网络结构

YOLO Seg可以画成:

复制代码
              输入640×640

                     │

                 Backbone

                     │

                 Neck(FPN)

        ┌──────────────┐
        │              │

 Detection Head     Proto Head

Detection Head输出:

每个Anchor Point:

复制代码
bbox

cls

score

32 coeff

Proto Head输出:

复制代码
32

×

160

×

160

注意:

Proto只有一份。

所有目标共享。


六、为什么Proto只有160×160?

640输入:

YOLO一般:

Stride=4

所以:

复制代码
640

↓

160

Proto大小:

复制代码
160×160

为什么不用:

复制代码
640×640?

原因就是:

计算太大。

160×160:

复制代码
25600

640×640:

复制代码
409600

差了:

16倍。

所以:

YOLO最后:

Mask生成以后:

再Upsample回:

原图大小。


七、Mask是怎么生成的?

假设:

Proto:

复制代码
32

×

160

×

160

Coeff:

复制代码
32

首先:

把Proto展开:

复制代码
32

×

25600

Coeff:

复制代码
1

×

32

矩阵乘法:

复制代码
1×32

×

32×25600

↓

1×25600

恢复:

复制代码
160×160

就是:

Mask。

最后:

复制代码
Sigmoid

得到:

复制代码
0~1

每个像素:

都是:

概率。


八、为什么还要Crop?

生成出来Mask以后:

其实:

是整个图片的Mask。

例如:

复制代码
████████████
████████████
████████████

但是:

检测框只有:

复制代码
□□□□

于是:

YOLO:

只保留BBox内部。

外面全部:

复制代码
0

就是:

Crop Mask。

这一步:

非常重要。

否则:

不同目标:

Mask会互相污染。


九、推理全过程

整个推理:

复制代码
图片

↓

Backbone

↓

Neck

↓

Detection Head

↓

bbox

cls

score

coeff

↓

Proto Head

↓

Prototype

↓

Coeff×Prototype

↓

Mask

↓

Crop

↓

Upsample

↓

最终Mask

整个过程就是:

复制代码
BBox

+

Coeff

+

Prototype

十、Loss如何计算?

YOLO Seg总Loss:

复制代码
Loss

=

Box Loss

+

Cls Loss

+

DFL Loss

+

Mask Loss

其中前三项与检测模型完全一致。

新增的是:

Mask Loss。

Mask Loss通常使用:

复制代码
BCE Loss

即:

复制代码
预测Mask

VS

GT Mask

逐像素计算:

Binary Cross Entropy。

有些版本也可以结合:

  • Dice Loss
  • Focal Loss

不过在 Ultralytics 的 YOLOv8/YOLO11 实现中,默认实例分割训练主要采用 BCE 风格的 Mask Loss,检测部分仍然使用 Box、Classification 和 DFL 等损失。


十一、为什么Prototype方案这么优秀?

假设:

每个目标直接预测Mask:

复制代码
100个目标

×

160×160

=

256万个像素

如果采用Prototype:

复制代码
Proto:

32×160×160

=

819200

Coeff:

100×32

=

3200

总量约:

复制代码
82万

相比直接预测:

减少了约 3 倍以上 的输出,而且目标越多优势越明显。

Prototype 只计算一次,后续每个目标只需要预测少量系数,因此:

  • 内存占用更低
  • 推理速度更快
  • 更适合实时检测

这也是 YOLO Seg 能够保持实时性的关键原因之一。


十二、与 Mask R-CNN 的区别

对比项 YOLO Seg Mask R-CNN
是否一阶段
是否使用 ROI
Mask 生成 Prototype + Coefficient 每个 ROI 单独预测
推理速度 很快 较慢
精度 较高 通常更高
实时性 很好 一般

Mask R-CNN 的思路是:每个检测框都裁剪出一个 ROI,再单独预测一个小尺寸 Mask,因此计算量会随着目标数量增加而增加。

YOLO Seg 则只生成一套共享 Prototype,每个目标预测一组系数进行线性组合,因此更高效。


十三、YOLOv8/YOLO11 分割 Head 的输出

以 640×640 输入为例,YOLOv8/YOLO11 的分割模型通常包含三个检测尺度(P3、P4、P5)以及一个 Prototype 分支。

大致输出如下(具体通道数会随类别数变化):

复制代码
Detection Head

P3
bbox
cls
32 coeff

P4
bbox
cls
32 coeff

P5
bbox
cls
32 coeff

Proto Head

32×160×160

因此,每个候选目标最终都会拥有:

  • 边界框(bbox)
  • 类别(class)
  • 置信度(score)
  • 32 维 Mask 系数(coeff)

这些系数与共享的 Prototype 相乘后即可恢复该目标的实例 Mask。


十四、学习源码时建议重点关注的几个模块

如果你准备深入阅读 Ultralytics YOLOv8/YOLO11 的源码,建议重点理解下面几个模块,它们构成了整个实例分割流程:

  1. Segment Head:在检测 Head 基础上增加 Mask Coefficient 的预测。
  2. Proto Module(Proto Head):生成共享的 Prototype Masks。
  3. Mask 组合过程 :将 coeff × proto 得到目标 Mask。
  4. Crop Mask:依据预测框裁剪 Mask,仅保留目标区域。
  5. Mask Loss:训练阶段计算预测 Mask 与真实 Mask 的误差。
  6. 推理后处理:Mask 上采样到原图尺寸,并与检测结果一起输出。

十五、一张图总结整个 YOLO Seg 流程

text 复制代码
                 输入图片
                     │
              Backbone + Neck
                     │
        ┌────────────┴────────────┐
        │                         │
 Detection Head              Proto Head
(bbox/cls/score/coeff)      (32×160×160)
        │                         │
        └──────────┬──────────────┘
                   │
        coeff × Prototype(矩阵乘法)
                   │
             得到目标 Mask
                   │
            Crop 到预测框区域
                   │
         Upsample 到原图尺寸
                   │
          输出 bbox + class + mask

核心总结

理解 YOLO 分割最重要的是把握三个核心思想:

  1. 实例分割 = 检测 + Mask:YOLO 保留检测框预测,同时为每个目标增加一个实例 Mask。
  2. 共享 Prototype + 每目标 Coefficient:网络只生成一套共享的 Prototype,每个目标只预测一组系数,通过线性组合得到自己的 Mask。这是 YOLO 实时实例分割的核心设计。
  3. 推理流程Backbone → Detection Head + Proto Head → coeff × proto → Crop → Upsample → 最终 Mask

只要真正理解了 Prototype、Coefficient 和线性组合 这三个概念,再去阅读 Ultralytics 的 ProtoSegment Head 以及 ops.process_mask() 等源码,就会发现代码基本就是上述流程的工程化实现。

相关推荐
DogDaoDao2 小时前
LLM:用一条命令统一所有大语言模型的 CLI 工具
人工智能·语言模型·自然语言处理·llm·github
ZRS的AI笔记2 小时前
AI Agent 工具链演进:从框架混战到协议标准化
人工智能
K姐研究社2 小时前
OiiOii 2.0 实测 – 智能画布实现 AI 视频创作自动化
运维·人工智能·自动化
掘金一周2 小时前
裁员了,公司很爽快,赔偿一分没少 | 沸点周刊 7.8
前端·人工智能·后端
yaoyouzhong2 小时前
GPT-Image-2 文生图:产品场景提示词撰写指南
人工智能
+wacyltd大模型备案算法备案2 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
DonngZH2 小时前
【大模型、工程实践】LLM Wiki 实战:用 6 份行业报告 PDF 构建一个能跨文档问答的知识库
人工智能
Token观测者2 小时前
AGENT实例-智能体量化交易真相:告别算命,拥抱信息差
人工智能·agent skills·agent自进化·agnet实例
2501_931819703 小时前
虚拟文化体验翻译:虚拟体验场景名称的文化适配与多语呈现
人工智能