Instance Segmentation
实例分割会用独立的像素掩码勾勒图像中的每个物体,因此同一类别中相互接触的物体也能保持区分。内容涵盖模型、指标和代码。
实例分割是一项计算机视觉任务,用于查找图像中的每个物体、为其分配类别,并用独立的像素级掩码勾勒轮廓。它结合了目标检测对单个物体的推理能力和图像分割的像素级精度:检测器绘制的矩形边界框也会包含背景,而实例分割模型则会精确标出哪些像素属于哪个物体。两个人肩并肩站立时,会得到两个分别带有标签的独立掩码,因此可以对单个物体进行计数、测量和抠图。
实例分割、语义分割和全景分割#
实例分割是三种分割任务之一,它们的区别在于标签的含义:
- 语义分割: 为每个像素标注类别,并将该类别的所有物体合并为一个区域,因此三辆停放的汽车会合并为一个“汽车”区域。语义分割也会标注道路和天空等背景区域。
- 实例分割: 为每个可计数物体(即“thing”)提供独立的掩码和 ID,因此三辆汽车会分别标记为汽车 1、汽车 2 和汽车 3。不属于任何已检测物体的像素会保持未标注状态。
- 全景分割: 为每个像素分配类别,并为可计数物体分配实例 ID,将两种视图整合为一个输出。
Meta 的 Segment Anything Model (SAM) 等可提示模型可以执行交互式分割:无论点击、框选还是文本提示指向什么对象,模型都会返回对应的掩码,而不受固定类别列表的限制。
实例分割模型的工作原理#
两阶段模型先检测,再分割。Mask R-CNN是自 2017 年以来长期采用的参考设计:它会提出候选区域,对每个边界框进行分类和细化,然后通过独立的掩码分支,在每个框内预测一个 28×28 的小型掩码。
单阶段模型只需一次前向传播即可预测边界框和掩码,适合实时推理。YOLACT引入了 YOLO 分割模型也采用的原型设计:网络会为整张图像预测一组共享的原型掩码,并为每个检测到的物体预测一个较短的掩码系数向量。每个物体的掩码是原型掩码按系数加权求和后裁剪至其边界框范围,再经阈值处理得到的二值掩码。
Transformer架构模型(例如 Mask2Former)采用第三种方案:它们会预测一组固定数量的掩码查询,并使用相同的架构执行语义分割、实例分割和全景分割。
掩码、多边形和指标#
训练标签通常是沿每个物体轮廓描绘的多边形,存储在 COCO JSON 或 YOLO 文本文件等格式中;每个物体对应一个类别 ID 和一组归一化顶点。推理时,模型会将每个实例输出为二值掩码,可将其转换回多边形轮廓以便存储或绘制。准确率以掩码均值平均精度 (mAP)报告,其计算方式与边界框 mAP 相同,只是 交并比 (IoU)是根据预测掩码和真实掩码计算的。逐个物体描绘多边形所需的时间远多于绘制边界框,因此 SAM 等可提示模型被广泛用于通过一次点击生成草稿掩码,随后由标注人员进行修正。
Ultralytics YOLO26分割模型的后缀为 -seg,采用原型设计;每次检测使用 32 个原型和 32 个系数,并为每个实例返回其类别、边界框、掩码和多边形轮廓:
from ultralytics import YOLO
# Load a YOLO26 instance segmentation model pretrained on the 80 COCO classes
model = YOLO("yolo26n-seg.pt")
# Segment every object instance in the image
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Each instance has its own class and mask outline, even when classes repeat
for class_id, polygon in zip(result.boxes.cls.int().tolist(), result.masks.xy):
print(f"{result.names[class_id]}: outline with {len(polygon)} points")
result.save(filename="instance_segmentation.jpg")每个检测到的人都会单独打印一行,并显示各自的轮廓;保存的图像会为每个实例的掩码分别着色。
实际应用#
只要决策取决于单个物体的精确形状或数量,实例掩码就十分重要:










