图像分割模型演进史:从FCN到SAM
图像分割模型输出发展史
FCN │ ▼ U-Net │ ▼ DeepLab │ ▼ Mask R-CNN │ ▼ YOLACT │ ▼ YOLOv8/YOLO11 Seg │ ▼ SAM可以看到:
前三个属于
直接输出像素分类(Dense Prediction)
后面几个属于
先预测目标,再生成Mask
这是两种完全不同的思路。
第一种:FCN
网络输出
假设:
输入
640×640×3假设数据集有
3类例如:
背景 猫 狗那么FCN最后输出:
640 × 640 × 3为什么?
因为:
每个Pixel都要预测:
属于背景? 属于猫? 属于狗?所以:
每一个Pixel输出:
3个数例如:
第100行200列:
输出:
[0.01,0.98,0.01]表示:
背景:1% 猫:98% 狗:1%最后:
argmax()得到:
猫于是:
Mask:
111111 111111所以:
FCN真正输出的是:
每个Pixel的类别概率(Logits)
不是Mask。
Mask只是:
argmax(logits)得到的。
输出Tensor
(B,C,H,W)例如:
(1,3,640,640)这里:
B=batch C=类别数第二种:U-Net
很多人认为:
U-Net输出Mask。
其实:
不是。
U-Net输出:
也是:
(B,C,H,W)例如:
二分类:
(1,1,512,512)为什么只有1?
因为:
只有:
前景 背景不需要输出两个通道。
例如:
某Pixel:
0.92表示:
前景概率92%最后:
prob>0.5得到:
Mask如果:
四分类:
背景 肝脏 脾脏 肾脏输出:
(1,4,512,512)每个Pixel:
[0.1,0.7,0.1,0.1]最后:
argmax()得到:
肝脏所以:
U-Net输出:
不是Mask。
而是:
Pixel Classification Logits
第三种:DeepLabV3+
DeepLab和U-Net几乎一样。
输出:
(B,C,H,W)例如:
VOC:
21类输出:
(1,21,513,513)每一个Pixel:
输出:
21个类别分数然后:
Softmax ↓ Argmax ↓ Mask所以:
DeepLab也是:
Dense Prediction。
第四种:Mask R-CNN
这里开始完全变了。
因为:
它不是:
预测整张Mask。
而是:
每一个目标预测一个Mask。
Mask R-CNN输出:
实际上有:
四个Head:
Class Head Box Head Mask Head Score Head其中:
Mask Head输出:
例如:
检测到了:
3个目标那么:
Mask输出:
(3,80,28,28)为什么?
80:
COCO类别。
28×28:
Mask大小。
例如:
第一只狗:
输出:
Dog:28×28不是:
640×640。
最后:
再:
ROI Align
Upsample
得到:
原图大小Mask。
所以:
Mask R-CNN真正输出:
不是整张Mask。
而是:
每个ROI的小Mask
第五种:YOLACT
YOLACT更有意思。
它:
根本不预测Mask。
它输出:
两个东西。
第一个:
Prototype
例如:
(138,138,32)什么意思?
就是:
预测:
32张基础Mask。
例如:
Mask1 Mask2 Mask3 ... Mask32第二个:
Coefficient
每一个目标:
输出:
32例如:
[0.3,0.2,...]最后:
Prototype × Coefficient得到:
Mask。
所以:
YOLACT输出:
不是Mask。
而是:
Prototype + Coefficient
第六种:YOLOv8 Seg / YOLO11 Seg
YOLO也是:
继承YOLACT。
输出:
两部分。
第一部分:
Detection:
Boxes Classes Scores第二部分:
Prototype:
(32,160,160)第三部分:
每个目标:
Mask Coefficient:
32最终:
Mask=Proto @ Coeff例如:
Proto:32×160×160目标:
Coeff:32最后:
得到:
160×160再:
Upsample:
640×640所以:
YOLO:
真正输出:
Boxes Classes Scores Proto Coeff不是Mask。
第七种:SAM
SAM更加不同。
SAM输出:
三个东西。
第一:
Mask
例如:
(3,256,256)为什么:
3?
SAM默认:
输出:
三个候选Mask。
第二:
IoU Prediction
例如:
[0.98,0.85,0.61]表示:
三个Mask:
谁最好。
第三:
Low Resolution Logits
例如:
256×256方便:
下一轮Prompt。
所以:
SAM输出:
Masks IoU Scores Low-res Logits不是:
只有Mask。
所有模型输出对比
| 模型 | 网络直接输出 | Tensor Shape(示例) | 后处理得到 |
|---|---|---|---|
| FCN | Pixel Logits | (B,C,H,W) | argmax → Mask |
| U-Net | Pixel Logits(或前景概率) | (B,C,H,W)或(B,1,H,W) | sigmoid/softmax → Mask |
| DeepLabV3+ | Pixel Logits | (B,C,H,W) | argmax → Mask |
| Mask R-CNN | ROI Mask Logits | (N,C,28,28)(训练)或每实例(N,1,28,28)(推理) | 上采样 + 粘贴回原图 |
| YOLACT | Prototype + Coefficient | (H,W,K)+(N,K) | 线性组合 → Mask |
| YOLO11 | Detection + Prototype + Coefficient | Proto(K,h,w),Coeff(N,K) | Proto × Coeff → 上采样 → Mask |
| Segment Anything Model | 多个 Mask Logits + IoU 评分 | Masks + Scores + Logits | 选择最佳 Mask |
你会发现两个时代
把所有模型归纳一下,其实只有两大类:
第一类:Dense Prediction(逐像素预测)
代表模型:
- FCN
- U-Net
- DeepLabV3+
共同特点:
输出: (B, C, H, W) ↓ Softmax / Sigmoid ↓ Mask网络直接对每一个像素进行分类。
第二类:Mask Generation(生成 Mask)
代表模型:
- Mask R-CNN
- YOLACT
- YOLO11
- Segment Anything Model
共同特点:
检测目标 / 接收 Prompt ↓ 生成实例级 Mask ↓ 得到最终 Mask网络不直接输出整张图的像素类别图,而是围绕目标实例或提示生成对应的 Mask。