语义分割任务
前言
在计算机视觉领域,如果说图像分类是“看懂图中有什么”,目标检测是“找到物体在哪里”,那么图像分割就是“精确描绘物体的轮廓”。它是计算机视觉中粒度最细、理解程度最深的任务之一。它的核心任务是让计算机能够像人脑一样“看懂”图像,把图片里的每一个像素点都分配给一个特定的类别(比如天空、草地、汽车、行人等)。
| 任务类型 | 核心能力 | 形象比喻 | 输出形式 |
|---|---|---|---|
| 图像分类 | 识别图中有什么 | “这是一张有猫的图” | 类别标签 (如:Cat) |
| 目标检测 | 识别物体并定位 | “猫在这个方框里” | 边界框 + 类别 |
| 图像分割 | 精确勾勒形状 | “把这些像素涂成猫的颜色” | 像素级掩码 |
但是,图像分割只关心像素属于哪一类(是车还是人),不关心这是哪一辆车。如果有三辆车,它会把它们全部标记为“汽车”,不区分个体。
根据对图像中物体类别和个体实例的处理方式,图像分割主要分为以下三种核心任务:
1. 语义分割 (Semantic Segmentation)
这是最基础的分割任务。它的核心是“只认类别,不认个体”。模型会为图像中的每一个像素分配一个语义类别标签,但不会区分同类物体中的不同个体。例如,在一张城市街景图中,它能把所有的汽车像素都标记为“汽车”,所有的行人像素都标记为“行人”,但无法区分出哪辆车是“汽车A”,哪辆车是“汽车B”。代表算法有FCN。
2. 实例分割 (Instance Segmentation)
这项任务可以看作是目标检测的进化版。它不仅要求识别出物体的类别,还要求精确勾勒出每一个独立物体的形状边界。与语义分割不同,实例分割只关注具有明确形状的实体(如人、车),并且能够区分出同一类别下的不同个体(例如分别框出并标记出图中的汽车A、汽车B和汽车C)。代表算法有Mask R-CNN。
3. 全景分割 (Panoptic Segmentation)
这是语义分割和实例分割的结合体,旨在实现最全面的场景理解。全景分割模型不仅能确定所有像素的语义分类,还能区分图像中的每个对象实例。它既能处理可数的实体(如汽车、行人),也能处理无定形的背景区域(如天空、草地、道路),从而为整张图像提供全局统一的解析。代表算法有Panoptic FPN。
在语义分割任务中,混淆矩阵是评估指标的基础工具。这个 N×N 的矩阵(N 为类别总数)结构如下:
- 行对应真实标签(Ground Truth)
- 列对应模型预测结果(Prediction)
- 矩阵元素 CM[i][j] 表示实际为i类但被预测为 j 类的像素数量
从混淆矩阵中,我们可以为每个类别 i 提取四个核心评估指标:
- TP(True Positive):正确预测为 i 类的数量(对角线元素 CM[i][i])
- FP(False Positive):将非 i 类误判为 i 类的数量(第 i 列总和减去TP)
- FN(False Negative):将 i 类误判为其他类的数量(第 i 行总和减去TP)
- TN(True Negative):正确识别为非 i 类的数量
Pixel Accuracy 是在所有像素中,模型一共猜对了多少个?
Mean Accuracy 是为了弥补 Pixel Accuracy 的缺陷,我们分别计算每一个类别的准确率,然后求平均。相当于问:“对于每一个类别单独拿出来考,平均分是多少?”。
Mean IoU (平均交并比) 是语义分割中最重要、最常用的指标!想象真实物体的形状是一个圈,模型预测的形状是另一个圈。这两个圈重叠的部分叫“交集(Intersection)”,它们合在一起的总面积叫“并集(Union)”。IoU 就是重叠面积除以总面积。
转置卷积
该计算方法数学由来得先从正常卷积操作看起,从下图所示为例。
具体卷积计算可以先讲卷积核等效成四个矩阵,分别对应卷积核移动计算的四个过程。
等效矩阵可以视为和原始输入矩阵对应位置点积求和,之后再将等效矩阵展平后拼接起来就变成了矩阵。
相应地,输入矩阵展平后也变成矩阵,最终整个过程就可以等效成线性代数中的矩阵乘积运算。
这个过程也可以叫下采样,将原始输入矩阵信息聚合,转置矩阵类似这一过程逆运算,根据线性代数知识如果要求逆过程需要矩阵可逆,明显,我们这个不符合要求,但是,我们可以退而求其次,可以将输出矩阵维度和输入矩阵设置一致,只需要两边右乘同一矩阵即可,如下图所示。
Fully Convolutional Networks
FCN(全卷积网络)是深度学习在语义分割领域的开山之作。在它之前,传统的图像分类网络(如AlexNet、VGG)只能输出“这张图里有一只猫”,而FCN首次实现了“这只猫在图片的哪个具体位置”,也就是像素级的分类。
传统的分类网络在最后都有“全连接层(FC)”,它会把前面的特征图强行压扁成一个固定长度的向量(比如1000维),用来代表整张图的类别。这就导致空间位置信息彻底丢失,而且输入图片的尺寸必须是固定的。
FCN有三个网络版本,分别如下图所示。
膨胀卷积(Dilated convolution)
在语义分割任务中,网络设计一直面临一个无法调和的矛盾:
- 想要“全局视野”(大感受野):为了准确识别物体,网络必须“看”到足够大的范围。传统做法是不断下采样(池化),但这会导致特征图尺寸急剧缩小,丢失空间位置信息。
- 想要“边缘细节”(高分辨率):为了精准分割出物体的轮廓,特征图必须保持足够大的尺寸。
传统卷积的痛点:
如果想扩大感受野,传统卷积只有两个办法:
- 方法A:增大卷积核尺寸(比如从3x3变成7x7甚至11x11)。缺点是参数量呈平方级暴增,极易过拟合且计算极慢。
- 方法B:增加网络层数,不断进行池化下采样。缺点是特征图越来越小,最后分割出来的物体边缘全是马赛克。
膨胀卷积完美地打破了这个僵局——既不需要增加参数量,也不需要下采样,就能成倍地扩大感受野。
普通卷积和膨胀卷积在数学运算上其实是一脉相承的,核心区别在于引入了一个超参数:膨胀率(Dilation Rate,通常用 r 表示)。当r=1时,与普通卷积一样计算。当r>1时,卷积核的“物理尺寸”没变(依然是9个参数),但它在输入特征图上“跳着”采样。相邻的采样点之间会空出 r−1 个像素(这里空出1个)。
虽然膨胀卷积极其强大,但在实际应用中有一个著名的坑:网格效应(Gridding Effect)。
- 现象:当 rr 设置得过大(比如 r=3)时,卷积核在采样时跳跃的步长太大,导致中间有很多像素点被完全忽略,没有参与到计算中。
- 后果:网络丢失了连续的局部信息,提取出的特征是不连贯的,这会导致分割出来的物体内部出现空洞或粗糙的网格状瑕疵。
在堆叠多层膨胀卷积时,膨胀率(Dilation Rate)的设置顺序是极其讲究的。如果设置不当,就会引发我之前提到的“网格效应(Gridding Effect)”。
连续使用相同的膨胀率(灾难现场)
假设我们堆叠两层 3×33×3 的膨胀卷积,且都设置膨胀率 r=2r=2 。
- 第一层:每隔1个像素采样一次,覆盖了 5×55×5 的范围,但丢失了棋盘格状的像素点。
- 第二层:在已经丢失了部分像素的特征图上,再次以 r=2r=2 的方式跳跃采样。
- 后果:第二层不仅没有填补第一层留下的空洞,反而让那些没被看到的像素永远无法被网络感知到。这在数学上被称为“不连续性(Discontinuity)”,会导致提取的特征出现严重的断层。
递减的膨胀率(连续覆盖)
为了避免上述问题,研究者们提出了一个黄金法则:在堆叠多层膨胀卷积时,膨胀率必须逐层递减。
假设我们连续堆叠两层 3×3 的膨胀卷积:
- 第一层:设置 r=2 。它跳跃采样,覆盖 5×5范围,留下了一些空洞。
- 第二层:设置 r=1 (也就是普通卷积)。它紧密地在第一层的输出上滑动。
- 后果:第二层的普通卷积就像一个“补漏网”,把第一层因为跳跃采样而遗漏的像素全部看了个遍。这样,两层叠加下来,网络不仅拥有了 7×7 的超大感受野,而且没有遗漏任何一个像素(实现了连续的密集覆盖)。
U-Net
它由德国研究者于2015年提出,最初是为了解决医学图像(如细胞核、肿瘤)标注数据极少、且对边缘精度要求极高的问题。
U-Net 的名字来源于它极其对称的网络结构,它由两大部分组成:
- 收缩路径(编码器 / Encoder):负责“下采样”。通过连续的卷积和最大池化操作,逐步缩小特征图的尺寸,同时增加通道数。这一步的目的是提取图像的全局上下文信息(高级语义),比如“这是一个细胞”。
- 扩展路径(解码器 / Decoder):负责“上采样”。通过反卷积(转置卷积)逐步放大特征图,恢复原始尺寸。这一步的目的是结合上下文信息,实现精确的像素级定位。