Skip to content

图像分割

图像分割(Segmentation)是深度学习 CNN 分支下与图像分类、目标检测(见 目标检测与 YOLO)并列的计算机视觉任务,目标是为每个像素赋予类别或实例标签。本页介绍两个标志性架构:U-Net(语义分割)与 Mask R-CNN(实例分割),并延伸到最新的分割大模型(SAM 2)。

如果目标检测是”画方框框住物体”,那图像分割就是**“用画笔精确涂出物体的轮廓”**——细到每一个像素。

两种分割任务的直觉:

  • 语义分割(Semantic Segmentation)= 给每个像素贴标签:图里有 3 只猫 2 只狗,语义分割把所有猫的像素标成”猫”、所有狗的像素标成”狗”——不区分”这是哪只猫”,只关心”这块像素属于什么类别”。
  • 实例分割(Instance Segmentation)= 既贴标签又数个数:不仅知道每个像素属于”猫”还是”狗”,还能区分”这是第 1 只猫”和”这是第 2 只猫”——每个物体实例都有自己的独立掩码。

此外还有更精细的:

  • 全景分割(Panoptic Segmentation)= 语义 + 实例的统一:将背景类(天空、道路等”stuff”)做语义分割,将前景物体(人、车等”things”)做实例分割,合二为一形成一张完整的分割图——每个像素既有类别标签又有实例编号。

在深度学习分割模型(U-Net、Mask R-CNN)出现之前,图像分割已经积累了数十年的经典算法。这些传统方法至今仍在医学图像和工业场景中被广泛使用——它们无需训练数据、可解释性强、计算量小,在某些场景下依然是首选。详见传统计算机视觉。

方法核心思路典型场景
阈值分割按灰度阈值将像素分为前景/背景——最简单快速的分割方式工业质检(缺陷 vs 正常区域)
Otsu(大津法)自动计算最佳阈值(最大化类间方差),无需手动选阈值医学图像二值化、文档扫描
分水岭(Watershed)把灰度图视为地形,“洪水”从局部最低点上涨,汇聚处形成边界细胞分割、重叠物体分离
区域生长(Region Growing)从种子点出发,将相似灰度/纹理的相邻像素逐步并入同一区域医学 CT/MRI 中器官轮廓提取
GraphCut将像素建模为图的节点,用最大流/最小割优化全局能量函数交互式抠图(Photoshop 魔术橡皮擦的前身)

为什么传统方法仍在使用? 深度学习分割需要大量标注数据(每个像素都要标注),而医学和工业场景中标注极其昂贵(需专业医生或工程师)。传统方法无需训练、即开即用,在简单的二值分割(如工业零件缺陷检测、细胞前景提取)中效率极高。OpenCV 的 cv2.threshold()、cv2.watershed() 等函数至今仍是高频调用。

U-Net:编码器-解码器 + 跳跃连接

Section titled “U-Net:编码器-解码器 + 跳跃连接”

U-Net 形状像字母”U”:左半边(编码器)逐步下采样提取特征、缩小分辨率;右半边(解码器)逐步上采样恢复分辨率。关键是跳跃连接——把编码器中对应层的精细特征直接拼接到解码器,避免上采样后细节丢失。

直觉:编码器像”压缩总结”(丢了细节但抓住要点),解码器像”按总结还原图像”。跳跃连接相当于”编码时留的便签”,帮解码器把丢掉的细节找回来。

以原始 U-Net(用于 512x512 生物医学图像)为例,数据流如下:

编码器路径(下采样):
572x572x1 → [Conv3x3×2 + Conv3x3×2] → 568x568x64
→ MaxPool 2x2 → 284x284x64
→ [Conv3x3×2] → 280x280x128
→ MaxPool 2x2 → 140x140x128
→ [Conv3x3×2] → 136x136x256
→ MaxPool 2x2 → 68x68x256
→ [Conv3x3×2] → 64x64x512
→ MaxPool 2x2 → 32x32x512
→ [Conv3x3×2] → 28x28x1024 ← 瓶颈层(最低分辨率,最高语义)
解码器路径(上采样):
28x28x1024 → UpConv 2x2 → 56x56x512
→ 跳跃连接拼接(裁剪后) → 56x56x1024
→ [Conv3x3×2] → 52x52x512
→ UpConv 2x2 → 104x104x256
→ 跳跃连接拼接 → 104x104x512
→ ...(对称结构)...
→ 最终 Conv1x1 → 388x388x2(输出掩码)

通道数的变化规律:编码器中每下采样一次,通道翻倍(64 → 128 → 256 → 512 → 1024);解码器中每上采样一次,通道减半。这种”分辨率降、通道升”的设计与 ResNet 等 CNN 架构一脉相承。

跳跃连接(Skip Connection,也叫 Shortcut Connection)将编码器中相同分辨率层的特征拼接到解码器。为什么需要它?

  • 下采样的代价:每次 MaxPool 都会丢失空间细节(如精确的边缘位置),只保留语义信息(“这里是细胞核”)。
  • 上采样的局限:转置卷积(Transposed Convolution)虽然能放大分辨率,但只能从低分辨率特征”猜”细节,恢复的边缘通常模糊。
  • 跳跃连接补全细节:编码器对应层的高分辨率特征包含精确的边缘和纹理信息,拼接到解码器后,解码器可以在”语义指导”下精确还原边界。

这和 ResNet 的残差连接虽然都叫 Skip Connection,但操作不同:ResNet 是相加(F(x) + x),U-Net 是拼接(concat[F(x), x])——因为编码器和解码器在同一分辨率层提取的是不同类型的特征,相加会混淆,拼接则保留了两路信息。

DeepLab 是语义分割的另一条重要技术路线(与 U-Net 并列),由 Google 团队从 2014 年持续发展至 2018 年。核心创新:

  • 空洞卷积(Atrous/Dilated Convolution):在卷积核的元素之间插入”空洞”(零),在不增加参数量和计算量的前提下扩大感受野(Receptive Field,即一个输出像素能看到多大范围的输入)。例如 3x3 卷积加 dilation=2 后,等效感受野变成 5x5,但参数量仍为 9 个。
  • ASPP(Atrous Spatial Pyramid Pooling):用不同 dilation rate(如 6, 12, 18)的空洞卷积并行处理特征,再拼接结果——让网络在多个尺度上同时捕获上下文信息。

DeepLabV3+(2018)在 ASPP 之后加了decoder模块,结合了 U-Net 式的跳跃连接,融合了两条路线的优点。

Mask R-CNN 在 Faster R-CNN 基础上增加一个并行的掩码预测分支——在检测到物体(框 + 类别)的同时,额外为每个物体预测一个像素级掩码:

Faster R-CNN 使用 RoIPool 将不同大小的候选区域映射为固定大小(如 7x7),但 RoIPool 会做量化取整(将浮点坐标截断为整数),导致特征图与原始图像之间存在 像素级错位——这对检测(框级精度)影响不大,但对掩码(像素级精度)是致命的。

Mask R-CNN 提出 RoIAlign:用双线性插值在浮点坐标处精确采样特征值,完全消除量化误差。这一改进看似微小,但对掩码精度的提升非常显著。

掩码分支是一个小型 FCN(全卷积网络):对每个 RoIAlign 后的 14x14x256 特征图,经过 4 个连续的 3x3 卷积(256 通道)、1 个反卷积(上采样到 28x28)、最后 1x1 卷积输出。每个类别有独立的掩码通道——C 个类别就有 C 个输出掩码,取对应类别的掩码作为最终结果。

分割任务的损失函数设计至关重要,尤其是处理类别不均衡(前景小、背景大)的场景。

1. 像素级交叉熵(Pixel-wise Cross-Entropy)

最基础的损失函数,对每个像素独立计算交叉熵:

LCE=−1N∑i=1N∑c=1Cyi,c⋅log⁡(pi,c)L_{\text{CE}} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \cdot \log(p_{i,c})
  • NN 是像素总数,CC 是类别数
  • yi,cy_{i,c} 是第 ii 个像素属于类别 cc 的真实标签(0 或 1)
  • pi,cp_{i,c} 是模型预测的第 ii 个像素属于类别 cc 的概率

问题:当前景占 1%、背景占 99% 时,模型全预测背景也能得到 99% 准确率,损失很低但完全没有学到分割。

2. Dice Loss

Dice Loss 基于 Dice 系数(衡量两个集合重叠度的指标),直接优化预测掩码与真实掩码的相似度:

Dice 系数=2⋅∣A∩B∣∣A∣+∣B∣=2⋅∑i(pi⋅gi)∑ipi+∑igi\text{Dice 系数} = \frac{2 \cdot |A \cap B|}{|A| + |B|} = \frac{2 \cdot \sum_{i} (p_i \cdot g_i)}{\sum_{i} p_i + \sum_{i} g_i} Dice Loss=1−Dice 系数\text{Dice Loss} = 1 - \text{Dice 系数}
  • pip_i 是第 ii 个像素的预测概率
  • gig_i 是第 ii 个像素的真实标签
  • Dice 系数对前景大小不敏感——即使前景只有 10 个像素,只要预测对了就能得到高分数

Dice Loss 天然缓解类别不均衡问题,是医学图像分割的标配。

3. Focal Loss

Focal Loss(Lin et al., 2017)通过降低”容易分类”样本的权重,让模型聚焦于”难”样本:

LFocal=−α⋅(1−pt)γ⋅log⁡(pt)L_{\text{Focal}} = -\alpha \cdot (1 - p_t)^{\gamma} \cdot \log(p_t)
  • ptp_t 是模型对正确类别的预测概率
  • γ\gamma(focusing parameter,通常设为 2):当 ptp_t 接近 1(容易样本)时,(1−pt)γ(1 - p_t)^{\gamma} 接近 0,该样本的损失被大幅降低
  • α\alpha(平衡因子):进一步平衡正负样本权重

Focal Loss 最初是为目标检测提出的(RetinaNet),但在分割任务中同样有效——大量背景像素是”容易样本”,Focal Loss 让模型不被它们淹没。

4. 混合损失(Dice + CE)

实践中常用 Dice Loss 和交叉熵的加权和:

L=λDice⋅LDice+λCE⋅LCEL = \lambda_{\text{Dice}} \cdot L_{\text{Dice}} + \lambda_{\text{CE}} \cdot L_{\text{CE}}

CE 提供逐像素的稳定梯度,Dice 缓解类别不均衡——二者互补效果通常最好。

指标定义适用场景
IoU (Intersection over Union)∣A∩B∣/∣A∪B∣\lvert A \cap B\rvert / \lvert A \cup B\rvert,交集除以并集,也叫 Jaccard Index分割的标准评估指标,mIoU 是各类 IoU 的平均
Dice 系数2∣A∩B∣/(∣A∣+∣B∣)2\lvert A \cap B\rvert / (\lvert A\rvert + \lvert B\rvert),与 IoU 单调相关医学图像分割常用
Pixel Accuracy正确像素 / 总像素简单直观,但受类别不均衡影响大
mIoU (mean IoU)各类别 IoU 的平均值语义分割的核心指标(PASCAL VOC、Cityscapes 等)

IoU 与 Dice 的换算关系:Dice=2⋅IoU1+IoU\text{Dice} = \frac{2 \cdot \text{IoU}}{1 + \text{IoU}},二者单调正相关。

下面对比 FCN、U-Net、DeepLabV3+ 三种经典分割模型在 Cityscapes、PASCAL VOC 和医学数据集上的 mIoU 表现(数据为示意性近似值):

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
# --- Data ---
models = ["FCN", "U-Net", "DeepLabV3+"]
datasets = ["Cityscapes", "PASCAL VOC", "Medical"]
# mIoU scores (mock but realistic)
scores = {
"FCN": [65, 67, 70],
"U-Net": [72, 71, 82],
"DeepLabV3+": [78, 82, 76],
}
x = np.arange(len(datasets))
width = 0.22
# --- Plot ---
fig, ax = plt.subplots(figsize=(9, 5.5))
colors = ["#4C72B0", "#55A868", "#C44E52"]
for i, (model, vals) in enumerate(scores.items()):
offset = (i - 1) * width
bars = ax.bar(
x + offset, vals, width,
label=model, color=colors[i],
edgecolor="white", linewidth=0.8, zorder=3,
)
# value labels on top of bars
for bar in bars:
h = bar.get_height()
ax.text(
bar.get_x() + bar.get_width() / 2, h + 0.6,
f"{h}", ha="center", va="bottom",
fontsize=9, fontweight="bold",
)
ax.set_xticks(x)
ax.set_xticklabels(datasets, fontsize=11)
ax.set_ylabel("mIoU (%)", fontsize=11)
ax.set_ylim(55, 90)
ax.set_yticks(np.arange(55, 91, 5))
ax.set_title(
"Segmentation Model IoU Comparison Across Datasets",
fontsize=12, fontweight="bold", pad=14,
)
ax.legend(
title="Model", title_fontsize=10,
fontsize=10, loc="upper left",
frameon=True, fancybox=True, shadow=False,
)
ax.yaxis.grid(True, linestyle="--", alpha=0.4, zorder=0)
ax.set_axisbelow(True)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
fig.tight_layout()
fig.savefig(
"segmentation-iou-comparison.png",
dpi=180, bbox_inches="tight", facecolor="white",
)
plt.close(fig)

Segmentation Model IoU Comparison Across Datasets

下图以分组柱状图对比 FCN、U-Net、DeepLabV3+ 在三个典型数据集上的 IoU/mIoU 得分,直观展示不同架构的分割精度差异。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
models = ["FCN", "U-Net", "DeepLabV3+"]
datasets = ["Cityscapes", "PASCAL VOC", "Medical"]
scores = {
"FCN": [65, 67, 70],
"U-Net": [72, 71, 82],
"DeepLabV3+": [78, 82, 76],
}
colors = ["#2196F3", "#4CAF50", "#FF5722"]
x = np.arange(len(datasets))
width = 0.22
fig, ax = plt.subplots(figsize=(9, 5.5))
for i, model in enumerate(models):
offset = (i - 1) * width
bars = ax.bar(x + offset, scores[model], width, label=model,
color=colors[i], edgecolor="white", alpha=0.88)
for bar, val in zip(bars, scores[model]):
ax.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 0.5,
f"{val}", ha="center", fontsize=10, fontweight="bold")
ax.set_xlabel("Dataset")
ax.set_ylabel("IoU / mIoU Score (%)")
ax.set_title("Segmentation Model IoU Comparison Across Datasets",
fontsize=12, fontweight="bold")
ax.set_xticks(x)
ax.set_xticklabels(datasets)
ax.set_ylim(0, 95)
ax.legend(fontsize=9)
ax.grid(axis="y", alpha=0.25)
plt.tight_layout()
plt.savefig("segmentation-iou-comparison.png", dpi=180,
bbox_inches="tight", facecolor="white")

分割模型 IoU 对比

import torch
import torch.nn as nn
# 最小化 U-Net(仅展示核心结构:下采样→上采样+跳跃连接)
class MiniUNet(nn.Module):
def __init__(self, in_ch=1, out_ch=1):
super().__init__()
# 编码器:逐步下采样
self.enc1 = nn.Sequential(nn.Conv2d(in_ch, 16, 3, padding=1), nn.ReLU())
self.pool = nn.MaxPool2d(2)
self.enc2 = nn.Sequential(nn.Conv2d(16, 32, 3, padding=1), nn.ReLU())
# 解码器:逐步上采样
self.up2 = nn.ConvTranspose2d(32, 16, 2, stride=2)
self.dec1 = nn.Sequential(nn.Conv2d(32, 16, 3, padding=1), nn.ReLU()) # 32=拼接后
self.out = nn.Conv2d(16, out_ch, 1) # 1×1 卷积输出掩码
def forward(self, x):
e1 = self.enc1(x) # 跳跃连接:保存编码器特征
e2 = self.enc2(self.pool(e1))
d2 = self.up2(e2)
d1 = self.dec1(torch.cat([d2, e1], dim=1)) # 拼接跳跃连接特征
return self.out(d1) # 输出:每像素的分割概率
model = MiniUNet()
print(model)
import torch
import torch.nn as nn
import torch.nn.functional as F
class DoubleConv(nn.Module):
"""U-Net 的基本单元:两次 (Conv3x3 → BN → ReLU)"""
def __init__(self, in_ch, out_ch):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(in_ch, out_ch, 3, padding=1, bias=False),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True),
nn.Conv2d(out_ch, out_ch, 3, padding=1, bias=False),
nn.BatchNorm2d(out_ch),
nn.ReLU(inplace=True),
)
def forward(self, x):
return self.conv(x)
class UNet(nn.Module):
def __init__(self, in_ch=3, out_ch=1, features=[64, 128, 256, 512]):
super().__init__()
self.downs = nn.ModuleList()
self.ups = nn.ModuleList()
self.pool = nn.MaxPool2d(2)
# 编码器
for f in features:
self.downs.append(DoubleConv(in_ch, f))
in_ch = f
# 解码器
for f in reversed(features):
self.ups.append(nn.ConvTranspose2d(f * 2, f, 2, stride=2))
self.ups.append(DoubleConv(f * 2, f))
self.bottleneck = DoubleConv(features[-1], features[-1] * 2)
self.out_conv = nn.Conv2d(features[0], out_ch, 1)
def forward(self, x):
skip = []
for down in self.downs:
x = down(x)
skip.append(x)
x = self.pool(x)
x = self.bottleneck(x)
skip = skip[::-1]
for i in range(0, len(self.ups), 2):
x = self.ups[i](x) # 上采样
x = torch.cat([x, skip[i // 2]], dim=1) # 跳跃连接拼接
x = self.ups[i + 1](x) # 双卷积
return self.out_conv(x)
# Dice Loss 实现
def dice_loss(pred, target, smooth=1e-6):
"""pred: (B, 1, H, W) sigmoid 后的概率, target: (B, 1, H, W) 二值标签"""
pred = torch.sigmoid(pred)
intersection = (pred * target).sum(dim=(2, 3))
union = pred.sum(dim=(2, 3)) + target.sum(dim=(2, 3))
dice = (2.0 * intersection + smooth) / (union + smooth)
return 1.0 - dice.mean()
# 混合损失:BCE + Dice
def bce_dice_loss(pred, target):
bce = F.binary_cross_entropy_with_logits(pred, target)
return bce + dice_loss(pred)
model = UNet(in_ch=3, out_ch=1)
x = torch.randn(2, 3, 256, 256)
out = model(x)
print(f"输入: {x.shape} → 输出: {out.shape}") # (2,1,256,256)

分割任务的数据增强需要同时对图像和掩码做相同的几何变换——如果旋转了图像但没旋转掩码,标签就全错了。

常用增强(用 Albumentations 库最方便):

  • 几何变换:水平/垂直翻转、随机旋转(-15°~15°)、随机缩放裁剪(Scale: 0.8-1.2)
  • 弹性形变(Elastic Deformation):模拟生物组织的自然形变,U-Net 原始论文中就使用了这一技巧,对医学分割效果显著
  • 颜色抖动:亮度、对比度、饱和度、色调微调(仅对图像,掩码不变)
  • CutMix / MixUp:也可用于分割,但需要将标签图按相同方式混合
import albumentations as A
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomRotate90(p=0.5),
A.ElasticTransform(p=0.3, alpha=120, sigma=120 * 0.05),
A.RandomBrightnessContrast(p=0.3),
A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 同时变换图像和掩码
augmented = transform(image=img, mask=mask)

U-Net 的编码器部分本质就是普通 CNN 分类器(如 ResNet-34/50)的前半部分。因此可以用 ImageNet 预训练的 ResNet 权重初始化编码器——这在 segmentation_models_pytorch 库中只需一行:

import segmentation_models_pytorch as smp
model = smp.Unet(
encoder_name="resnet34",
encoder_weights="imagenet", # 加载 ImageNet 预训练权重
in_channels=3,
classes=1,
)

预训练编码器通常比从头训练提升 3-5 个 mIoU 百分点,在数据量小时差距更大。

  • 差异化学习率:编码器(预训练)用较小学习率(如 1e-4),从头训练的解码器用较大学习率(如 1e-3)。PyTorch 中通过参数分组实现。
  • Cosine Annealing + Warmup:前 5 个 epoch 线性预热,之后余弦退火。这是分割任务最常用的调度策略。
  • TTA(Test-Time Augmentation):对输入图像做多种增强(翻转、旋转),分别推理后取平均——提升精度但增加推理时间。
  • CRF(条件随机场):对模型输出的概率图做 CRF 后处理,利用图像底层特征(颜色、边缘)精修分割边界。DeepLab 系列大量使用 CRF 后处理。
  • 模型集成:训练多个模型,对输出做平均或投票。

2024 年 4 月,Meta 发布了 Segment Anything Model 2(SAM 2)——首个统一图像和视频分割的基础大模型。SAM 2 的关键特性:

  • 提示式分割(Promptable Segmentation):通过点击、框选、或文本提示指定要分割的目标,模型输出对应掩码——不需要针对新任务重新训练。
  • 视频分割能力:SAM 2 将图像视为单帧视频,在视频上可以跨帧追踪物体掩码——即使物体被遮挡后重新出现也能持续追踪。
  • 零样本泛化:在 SAM 2 上从未见过的场景(医学影像、卫星图、工业缺陷)中,也能通过点击快速生成分割掩码。
  • 架构:图像编码器(基于 视觉 Transformer)+ 提示编码器 + 轻量掩码解码器 + 记忆模块(跨帧记忆库,用于视频)。

SAM 2 的出现正在改变分割领域的工作流程:传统方式是为每个新任务标注大量数据并从头训练模型;SAM 2 方式是直接在预训练模型上通过交互式提示获得分割结果,或只用少量数据微调(fine-tune)。

移动端和实时场景推动了轻量级分割模型的发展:

  • MobileSeg / EfficientSeg(2023-2024):使用轻量 backbone(MobileNetV3、EfficientNet)和高效解码器,在移动 GPU 上达到 30+ FPS。
  • Fast-SCNN(Semantic Segmentation):专门为高分辨率实时语义分割设计(如自动驾驶 1024x2048 输入),在 Cityscapes 上达到 120+ FPS。

2024-2025 年的 SOTA 分割模型已经全面转向 Transformer 架构:

  • Mask2Former(Cheng et al., 2022):基于 Transformer Decoder 的通用分割架构,用 masked attention 替代标准 attention,在语义/实例/全景分割三个任务上同时达到 SOTA。
  • SegFormer(Xie et al., 2022):轻量级 Transformer 分割模型,无需位置编码即支持任意分辨率输入。
  • DINOv2 + 线性头(2023-2024):Meta 的 DINOv2 自监督视觉大模型作为特征提取器,仅接一个简单的线性分类头就能在多个分割基准上达到 SOTA——证明了强大的视觉特征表示比复杂的任务头更重要。

医学图像通常是 3D 体数据(CT、MRI),催生了 3D 分割专用架构:

  • V-Net / 3D U-Net:将 U-Net 的 2D 卷积替换为 3D 卷积,直接在体数据上端到端分割。
  • nnU-Net(Isensee et al.,2018-2024):“无需任何新架构”的自适应框架——根据数据集特性自动配置 U-Net 的超参数(patch 大小、网络深度等),在数十个医学分割数据集上持续取得 SOTA 或接近 SOTA 的成绩。nnU-Net 的哲学是:正确的训练策略和预处理比花哨的架构更重要。
  • 输出是概率图:分割模型的输出是每个像素属于各类别的概率,用 sigmoid(二分类)或 softmax(多分类)激活。
  • 损失函数选择:常用 Dice Loss 或 Focal Loss,因为前景/背景像素极度不均衡(一张医学图像中病灶可能只占 1%)——普通交叉熵会让模型直接全预测背景。实践推荐混合损失(Dice + CE)。
  • U-Net 不止用于分割:它是 Stable Diffusion 等扩散模型的骨干网络(CV 架构向生成模型渗透的典型交叉点,见 扩散模型)。
  • 实例分割要检测能力:Mask R-CNN 需要 RPN 做检测,训练和推理都比纯语义分割复杂,标注成本也更高(每个实例独立掩码)。
  • 编码器预训练至关重要:始终用 ImageNet 预训练权重初始化编码器(通过 segmentation_models_pytorch 或 mmseg),比从头训练提升显著。
  • 输入分辨率:分割对分辨率敏感——分辨率太低会丢失小物体。训练时常用 256x256 或 512x512 的 patch,推理时可以对大图滑窗预测后拼接。
  • 先试 SAM 2:面对新分割任务时,先用 SAM 2 做交互式分割看看效果——如果 SAM 2 已经足够好,可以省去大量标注和训练成本。
  • 医学图像分割:联影智能、推想科技用 U-Net 在 CT 中自动勾画肿瘤轮廓和器官边界,医生据此制定放疗计划,勾画效率提升数倍。nnU-Net 在 BraTS(脑肿瘤分割)、KiTS(肾脏肿瘤分割)等竞赛中持续领先。
  • 自动驾驶可行驶区域:特斯拉、地平线用语义分割实时区分道路、车道线、人行道与障碍物,为路径规划提供像素级环境理解。Cityscapes 是该领域最常用的基准数据集。
  • 图像编辑:Adobe Photoshop 的”选择主体”、手机相机的人像背景虚化,背后都是分割模型在精确区分前景与背景的像素边界。SAM 2 让交互式抠图变得前所未有的流畅。
  • 遥感与地理信息:SpaceNet 竞赛中用语义分割从卫星图提取建筑轮廓、道路网络和植被覆盖,服务于城市规划和灾害快速评估。
  • 视频分割与特效:SAM 2 的视频分割能力让”一键去除视频中的人物”或”给视频中的特定物体上色”变得可行——这在影视后期中具有巨大价值。
  • 农业与植物科学:用语义分割识别作物叶片病害区域、果实计数、杂草检测——精确到每片叶子的像素级别。
  • U-Net(Ronneberger et al., MICCAI 2015,弗莱堡大学):编码器-解码器 U 形结构 + 跳跃连接,生物医学分割事实标准;同时是 Stable Diffusion 等扩散模型的骨干网络。
  • Mask R-CNN(He et al., ICCV 2017 最佳论文):Faster R-CNN + 掩码分支 + RoIAlign,实例分割;横跨检测与分割两个任务。
  • DeepLabV3+(Chen et al., ECCV 2018):空洞卷积 + ASPP + encoder-decoder,语义分割另一重要路线。
  • SAM 2(Meta AI, 2024):统一图像和视频的提示式分割基础大模型,零样本泛化能力开创了分割新范式。
  • Mask2Former(Cheng et al., CVPR 2022):基于 Transformer 的通用分割架构,语义/实例/全景三任务统一。
类库语言说明
SAM 2 (segment-anything-2)PythonMeta 开源的通用分割大模型,支持交互式分割和零样本分割,覆盖图像和视频
MMSegmentationPython商汤开源的分割工具箱,内置 U-Net/DeepLab/Mask2Former 等主流模型
Detectron2PythonMeta 开源库,提供 Mask R-CNN 等实例分割的高质量实现
segmentation_models_pytorchPython简洁的 PyTorch 分割库,一行加载 U-Net/DeepLabV3+/FPN + 预训练编码器
torchvisionPythonPyTorch 官方库,提供 Mask R-CNN/DeepLabV3 预训练模型
MONAIPython医学影像分析专用库,内置 U-Net/3D 变体与医学数据预处理工具
nnU-NetPython自适应医学分割框架,自动配置超参数,持续 SOTA
AlbumentationsPython高效的图像增强库,支持同时变换图像和掩码
术语英文解释
语义分割Semantic Segmentation为每个像素分配类别标签,不区分同类的不同实例
实例分割Instance Segmentation既能逐像素分类又能区分同类不同实例的分割任务
全景分割Panoptic Segmentation统一语义分割(背景)和实例分割(前景)的分割范式
编码器-解码器Encoder-Decoder先逐步下采样提取特征、再逐步上采样恢复分辨率的结构
跳跃连接Skip Connection把编码器层的精细特征直接拼接到解码器,防止细节丢失
全卷积网络FCN (Fully Convolutional Network)用卷积替代全连接层实现端到端像素级预测的首个分割架构
空洞卷积Atrous / Dilated Convolution卷积核元素间插入空洞以扩大感受野,不增加参数量
感受野Receptive Field一个输出像素对应的输入图像区域大小
Dice 系数Dice Coefficient衡量预测掩码与真实掩码重叠度的指标,常用于类别不均衡场景
IoUIntersection over Union交集除以并集,分割任务的核心评估指标(也叫 Jaccard Index)
转置卷积Transposed Convolution可学习的上采样操作,将低分辨率特征图放大到高分辨率
Focal LossFocal Loss降低易分类样本权重的损失函数,处理类别不均衡问题
RoIAlignRoIAlign用双线性插值精确对齐候选区域特征,消除量化误差
  • FCN(Long, Shelhamer & Darrell, CVPR 2015):首个用全卷积网络做端到端语义分割的工作,是 U-Net 的概念前身。
  • U-Net(Ronneberger et al., MICCAI 2015):编码器-解码器 U 形结构 + 跳跃连接,至今仍是医学分割标配。
  • DeepLab 系列(Chen et al., 2014–2018):空洞卷积(atrous convolution)+ ASPP 模块,语义分割另一重要路线。
  • Mask R-CNN(He et al., ICCV 2017):实例分割里程碑,RoIAlign 是关键创新。
  • Focal Loss / RetinaNet(Lin et al., ICCV 2017):提出 Focal Loss 处理类别不均衡,虽为检测设计但广泛用于分割。
  • SAM 2(Meta AI, 2024):统一图像和视频分割的基础大模型,标志着分割进入”提示式 + 零样本”时代。
  • nnU-Net(Isensee et al., Nature Methods 2021):自适应医学分割框架,证明了训练策略和预处理的重要性。
  • Mask2Former(Cheng et al., CVPR 2022):基于 Transformer 的通用分割架构,当前 SOTA 基线之一。