图像分割模型演进史:从FCN到SAM

📅 2026/7/3 17:01:09 👁️ 阅读次数 📝 编程学习
图像分割模型演进史:从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(示例)后处理得到
FCNPixel Logits(B,C,H,W)argmax → Mask
U-NetPixel Logits(或前景概率)(B,C,H,W)(B,1,H,W)sigmoid/softmax → Mask
DeepLabV3+Pixel Logits(B,C,H,W)argmax → Mask
Mask R-CNNROI Mask Logits(N,C,28,28)(训练)或每实例(N,1,28,28)(推理)上采样 + 粘贴回原图
YOLACTPrototype + Coefficient(H,W,K)+(N,K)线性组合 → Mask
YOLO11Detection + Prototype + CoefficientProto(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。