Yolo11Onnx——分割模型

YOLO11 分割模型 ONNX 输出


一、模型输出结构概览

YOLO11 分割模型在导出为 ONNX 格式后,通常会包含 两个输出分支

  1. Output0:检测张量(Detection Tensor)
  2. Output1:掩膜原型张量(Mask Prototype Tensor)

二、Output0 —— 检测张量

image

以本例中模型输出 [1, 38, 21504] 为例:

  • 第一维 (1):批量大小(batch size)。

  • 第二维 (38):每个检测的特征数量。

    • 前 4 个值:表示检测框的参数

      • cx:检测框中心点 x 坐标
      • cy:检测框中心点 y 坐标
      • w:检测框宽度
      • h:检测框高度
    • 接下来的 2 个值:每个类别的置信度(对应两个类别)

    • 剩余的 32 个值:掩膜权重(mask coefficients),用于与 Output1 中的掩膜原型结合生成目标分割掩膜。

  • 第三维 (21504):表示预测到的对象数量(即 21504 个候选检测点)。

总结结构如下:

部分 数量 含义
0–3 4 检测框参数 (cx, cy, w, h)
4–5 2 类别置信度(双类别)
6–37 32 掩膜权重(Mask Coefficients)

三、Output1 —— 掩膜原型张量

Output1 输出的形状通常为 [1, 32, W, H],如 [1, 32, 160, 160]

  • 这里的 32 与 Output0 中的掩膜权重维度相对应。
  • 每一层(channel)都表示一个掩膜原型(mask prototype)。
  • 模型在推理时,会根据每个检测框的 32 个掩膜权重,对这些掩膜原型进行加权求和,从而生成每个目标的掩膜。

四、掩膜生成与还原流程

  1. 掩膜融合
    使用 Output0 中的掩膜权重(32 维)与 Output1 中的掩膜原型 [32, W, H] 做矩阵乘法:

    \[M_i = \text{sigmoid}(W_i \cdot P) \]

    其中:

    • ( \(W_i\) ):第 i 个检测框的掩膜权重(1×32)
    • ( \(P\)):掩膜原型(32×W×H)
    • ( \(M_i\) ):生成的第 i 个掩膜(H×W)
  2. 上采样(Upsample)
    将生成的掩膜上采样至原图尺寸(例如从 160×160 → 640×640)。除以缩放比例。掩膜还原需要经过两次图像方法。从输出掩膜数据到对应输入图像的尺寸,再从输入图像的尺寸到原图的尺寸。

  3. 掩膜裁剪(Crop)
    按检测框边界裁剪掩膜,仅保留目标区域。再通过二值化找到掩膜部分。

  4. 生成掩膜图像(Graphics)
    根据掩膜数据生成掩膜图像(ARGB),并通过Graphics将其与原图像叠加。

掩膜图像生成
private Bitmap MaskGenerationMethod(Mat maskData, Color color)
{
    Bitmap mask = new Bitmap(maskData.Cols, maskData.Rows, PixelFormat.Format32bppArgb);
    BitmapData maskImageData = mask.LockBits(new Rectangle(0, 0, mask.Width, mask.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
    int height = maskData.Rows;
    int width = maskData.Cols;

    Parallel.For(0, height, i =>
    {
        for (int j = 0; j < width; j++)
        {
            float maskValue = maskData.At<float>(i, j);
            if (maskValue == 1)
            {

                IntPtr startPixel = IntPtr.Add(maskImageData.Scan0, i * maskImageData.Stride + j * 4);
                byte[] colorInfo = new byte[4] { color.B, color.G, color.R, color.A };
                Marshal.Copy(colorInfo, 0, startPixel, 4);
            }
        }
    });
    mask.UnlockBits(maskImageData);
    return mask;
}

五、常见输出格式对比

模型类型 Output0(检测张量) Output1(掩膜原型)
YOLO11-Seg 640×640 [1, 38, 300] [1, 32, 160, 160]
YOLO11-Seg 1024×1024 [1, 38, 21504] [1, 32, 256, 256]

六、要点总结

  • Output0: 包含检测框 + 类别置信度 + 掩膜权重。
  • Output1: 提供基础掩膜原型,用于生成目标掩膜。
  • 核心思想: 通过「掩膜权重 × 掩膜原型 → 上采样 → 裁剪」得到目标分割结果。
  • 理解关键:
    掩膜原型是通用的「基础形态」,而掩膜权重定义了每个目标在这些原型上的组合方式。
  • 性能优化:
    使用多线程操作处理返回的数据(Plinq、Parallel)。并注意多线程中的线程安全问题。
  • 细节问题:
    Bitmap中的数据是小端存放的。因此生成掩膜时要注意。

💡 提示:
YOLO 系列的分割模型(包括 YOLOv8、YOLO11)均采用类似的掩膜生成机制。理解这两个输出分支的关系,有助于在 ONNX 或自定义推理框架中正确解析分割结果。

posted @ 2025-10-22 19:09  Ytytyty  阅读(116)  评论(0)    收藏  举报