yolov8 和 yolov11 在输出上是一模一样的,所以如下对 v8 的描述均可以替换为 v11

image.png

YOLOv8-Seg 模型在进行实例分割时,会产生两个主要的输出张量,这两个输出协同工作以同时完成目标检测和像素级的分割任务。

YOLOv8-Seg 模型输出概览

YOLOv8-Seg 模型巧妙地将目标检测和语义分割结合在了一起。简单来说,它首先像标准的目标检测模型一样,预测出图像中所有可能物体的边界框(bounding box)以及它们对应的类别和置信度。但与纯检测模型不同的是,它额外为每个检测到的物体预测了一组==“掩码系数”(mask coefficients)。同时,模型还会生成一组固定数量的“原型掩码”==(prototype masks)。最后,通过将每个物体的掩码系数与这些原型掩码进行线性组合,就能为该物体生成一个精确到像素的分割掩码。

下面我们来详细解析这两个输出的维度和具体含义。


输出一:检测框与掩码系数

第一个输出主要负责目标检测任务,并包含了生成最终分割掩码所需的权重。其维度通常为:

[batch_size, 4 + num_classes + num_mask_coefficients, num_proposals]

让我们来逐一解析这个维度的每个部分:

  • batch_size: 表示一次前向传播中处理的图像数量。在典型的推理场景下,这个值通常是 1。
  • 4 + num_classes + num_mask_coefficients: 这是每个检测提议(proposal)所包含的信息维度,上图中为 4 + 80 + 32 = 116。
    • 4: 代表检测框的四个坐标值,通常是 (x_center, y_center, width, height),即边界框的中心点坐标、宽度和高度。
    • num_classes: 代表模型能够识别的物体类别数量。每个类别都有一个对应的置信度分数,表示该检测框属于这个类别的概率。
    • num_mask_coefficients: 这是用于生成实例分割掩码的一组系数或权重。在 YOLOv8 的默认设置中,这个值通常是 32。这 32 个系数将与第二个输出中的 32 个原型掩码相对应。
  • num_proposals: 表示模型在三个不同尺度的特征图上生成的总检测框提议数量。例如,对于一个 640x640 的输入图像,这个值可能是 8400。

总结: 这个输出本质上是一个包含了大量潜在物体信息的列表。每个潜在物体都由其边界框、所有类别的置信度分数以及一组用于生成分割图的掩码系数来描述。


输出二:原型掩码

第二个输出是一组低分辨率的“原型”分割掩码。其维度通常为:

[batch_size, num_mask_coefficients, mask_height, mask_width]

  • batch_size: 同样是批处理大小。
  • num_mask_coefficients: 原型掩码的数量,这个值与第一个输出中的掩码系数数量相匹配,通常是 32
  • mask_height,** mask_width: 原型掩码的分辨率。这个分辨率通常是输入图像尺寸的 1/4。例如,对于 640x640 的输入,mask_height 和 mask_width 通常会是 160x160。

总结: 这个输出可以被看作是一系列基础的、与任何特定物体无关的分割模板。

如何生成最终的实例分割掩码?

最终的实例分割掩码是通过将这两个输出结合起来生成的,具体步骤如下:

  1. 筛选检测框: 首先,对第一个输出应用非极大值抑制(NMS)等后处理技术,以过滤掉置信度低的和重叠的检测框,保留最可靠的物体检测结果。
  2. 线性组合: 对于每一个保留下来的检测框,取出其对应的 32 个掩码系数。
  3. 矩阵乘法: ==将这 32 个掩码系数与第二个输出中的 32 个 160x160 的原型掩码进行加权求和==(本质上是一个矩阵乘法和加法操作)。
  4. Sigmoid 激活: 对加权求和后的结果应用 Sigmoid 函数,将其值归一化到 [0, 1] 之间,从而生成一个与该物体对应的低分辨率(160x160)分割掩码。
  5. 上采样和二值化: 最后,将这个低分辨率的掩码上采样到原始输入图像的尺寸,并根据一个阈值(例如 0.5)进行二值化处理,得到最终的、高分辨率的实例分割掩码。

通过这种方式,YOLOv8-Seg 能够高效地为图像中的每一个被检测到的物体生成精确的分割图。