普通 YOLO 检测 与 YOLO-seg(实例分割)差在哪里
普通 YOLO 检测 与 YOLO-seg(实例分割)差在哪里
Ultralytics 里名字差一个 -seg:yolo11n.pt 和 yolo11n-seg.pt 不是换皮,是 多了一条输出支路。下面按「输入一路怎么走、最后多出什么」写,少用比喻,方便你对照代码和 Netron 里的图。
1. 共同点:前面大半条路是一样的
两条线通常都包含:
- Backbone:把输入图像压成多层特征图(空间变小、通道变多),提取边缘、纹理、形状等层次信息。
- Neck(如 FPN / PAN):把不同分辨率的特征再融合,让大目标、小目标都能被照顾到。
到 Neck 为止,检测版和分割版往往共用同一套权重里的这部分(同一权重文件里不会「前半截两套参数」;你换 -seg 权重,是整网一起换,不是只换后半截)。说「共享」指的是 设计上一套骨干+颈,不是指你可以在 n 检测权重上「只接一个分割头」不训练就用。
2. 检测版:多一个「检测头」就够了
从 Neck 出来,接 Detection Head。它干的事可以概括成:在多个尺度的特征图上,对每个 锚点 / 网格位置 预测:
- 有没有目标(objectness)、
- 框相对网格的偏移(得到 BBox)、
- 类别概率。
输出:一组稀疏结果——每个实例几个数(框 + 类 + 分),没有「每个像素属于谁」的稠密图。
所以:框是粗粒度的外接矩形;框和某区域在几何上相交,不等于人体像素真的进了那个区域。
3. 分割版:在检测之上再加「分割头」
-seg 在 同一套 Neck 特征(或与之对齐的特征)上,再挂 Segmentation(实例掩码)分支。它和检测头 并行从融合特征里取信息,不是「Backbone 跑两遍」。
它多出来的东西(概念上):
- 对每个 保留下来的检测实例,再预测一组 与掩码相关的量(常见实现里不是对整图 H×W 每个位置单独跑一层全分类,而是用 相对低分辨率的 mask 原型 / 系数 组合出每实例一张 mask,再 上采样 到和框或原图对齐;具体连接方式以你导出的 ONNX 为准)。
- 推理结果里除了
boxes,还有masks:每张实例一张 0~1 或 logits 再 sigmoid 的稠密图(实现里经常是 小于原图 的尺寸,需要resize或库里的对齐逻辑对齐到原图)。
所以表格里更准确的一句是:检测头负责「实例在哪、哪类」;分割头负责「这个实例占哪些像素(近似)」。
4. 对照表(记这个就够开会)
| 项目 | 普通检测 yolo11n | 实例分割 yolo11n-seg |
|---|---|---|
| 典型权重后缀 | .pt,无 -seg | .pt,带 -seg |
| Neck 之后 | 检测头 | 检测头 + 掩码分支 |
| 必备输出 | 框、类、置信度 | 框、类、置信度 + 每实例 mask |
| 算力、显存 | 相对小 | 通常更大(多一条支路 + 上采样/后处理) |
| 适用 | 只要「有没有、框在哪」 | 要轮廓、抠图、和任意 ROI 做像素与等 |
5. 和 Python 里 results 的对应关系
from ultralytics import YOLO
model = YOLO("yolo11n-seg.pt", task="segment")
results = model(img, verbose=False)
r0 = results[0]
# 检测头侧:框、置信度、类别
if r0.boxes is not None:
xyxy = r0.boxes.xyxy # 像素坐标,形状 [N, 4]
conf = r0.boxes.conf # [N]
cls = r0.boxes.cls # [N]
# 分割头侧:掩码(可能需在原图尺寸上再对齐)
if r0.masks is not None:
m = r0.masks.data # 常见 [N, Hm, Wm],float;N 与保留的实例数一致
# 对齐到原图 (H, W) 用库接口或 cv2.resize,勿与 letterbox 逆变换搞反
检测-only 的权重里 masks 一般为 None;-seg 权重在有人检出且未被过滤掉时才有 mask。
6. 部署和量产时多惦记三件事(和「是不是 seg」强相关)
- 图更大、支路更多:同样
imgsz,-seg往往比纯检测慢、占内存多;板子上用 端到端时间 测,别只盯 NPU 子图。 - 导出图里算子:常见有
Resize、Sigmoid、Mul等,是否全进 NPU 要看 SDK;回退 CPU 时延迟可能陡增。 - INT8:掩码边缘对量化误差敏感,量化后 阈值 τ、形态学 可能要重新扫一遍。
7. 一句话收尾
普通 YOLO:Neck 后面主要是 检测头,输出框+类+分。
YOLO-seg:Neck 后面 检测头还在,另外加 掩码分支,给每个实例一张 像素级(或对齐到像素)的 mask。
结构差异可以记成 「多一条支路、多一类输出」;不必记「第几个车间」,记 数据流和 results 里多出来的字段 更实在。
Ultralytics 各版本张量名、默认 imgsz、是否默认 letterbox 以当前文档为准;要抠实现细节请 export 成 ONNX 用 Netron 打开看一遍。
更多推荐
所有评论(0)