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