创见博客
语义分割入门
七崽爱吃小饼干2025/09/08阅读 1

语义分割是什么

目标检测(Object Detection)

核心目标:定位图像中所有感兴趣的目标,并识别其类别。 具体任务:输出每个目标的边界框(Bounding Box)(通常用坐标 (x1,y1,x2,y2) 表示)和对应的类别标签(如 “人”“车”)。 不关注目标内部的细节(如人的手臂、汽车的车窗),仅需框出目标整体。

语义分割(Semantic Segmentation)

核心目标:对图像中的每个像素进行分类,标注其所属的语义类别(如 “人”“树”“道路”“背景”)。 关键特点:不区分同一类别的不同个体。例如,图像中有 3 个人,语义分割会将他们的所有像素都标注为 “人”,但不会区分 “人 1”“人 2”“人 3”。

实例分割(Instance Segmentation,属于分割任务的典型代表)

核心目标:同时实现 “目标检测” 和 “像素级分割”,既需要区分不同个体,又需要标注每个个体的像素范围。 具体任务:对图像中每个目标(实例),输出其像素级的分割掩码(Mask) 和类别标签,且同一类别的不同实例会被区分(如 “人 1”“人 2” 用不同掩码区分)。

语义分割任务的核心是对图像中每个像素进行分类,因此损失函数的设计需围绕像素级别的分类误差展开。同时,由于语义分割常面临类别不平衡(如背景像素远多于前景)、边界模糊等问题,研究者提出了多种针对性的损失函数。以下是常用的语义分割损失函数及其特点:

语义分割的损失函数

一、基础损失函数(适用于简单场景)

  1. 交叉熵损失(Cross-Entropy Loss)
    • 原理:最经典的分类损失,适用于单标签像素分类(每个像素属于唯一类别)。
      对每个像素,损失计算为:
      LCE=−∑c=1Cyclog⁡(pc)L_{CE} = -\sum_{c=1}^{C} y_{c} \log(p_{c})LCE​=−∑c=1C​yc​log(pc​)
      其中,ycy_cyc​ 是像素的真实类别(独热编码,1表示属于该类,0表示不属于),pcp_cpc​ 是模型预测该像素属于类别 ccc 的概率。
    • 特点:简单直观,适用于类别分布较均衡的场景;但对类别不平衡敏感(如小目标像素占比低时,损失被主导类别掩盖)。

二、针对类别不平衡的损失函数

  1. 加权交叉熵损失(Weighted Cross-Entropy Loss)

    • 原理:为每个类别分配权重 wcw_cwc​(类别样本越少,权重越大),缓解不平衡问题。
      损失公式:
      LWCE=−∑c=1Cwc⋅yclog⁡(pc)L_{WCE} = -\sum_{c=1}^{C} w_{c} \cdot y_{c} \log(p_{c})LWCE​=−∑c=1C​wc​⋅yc​log(pc​)
    • 特点:通过手动或自适应调整权重(如根据训练集中类别频率设置 wc=1/log⁡(fc)w_c = 1/\log(f_c)wc​=1/log(fc​),fcf_cfc​ 为类别频率),提升小类别的损失占比。
  2. 焦点损失(Focal Loss)

    • 原理:通过降低易分类样本的权重,聚焦于难分类样本(如模糊边界、小目标像素)。
      损失公式:
      LFL=−∑c=1Cyc⋅(1−pc)γlog⁡(pc)L_{FL} = -\sum_{c=1}^{C} y_{c} \cdot (1 - p_{c})^\gamma \log(p_{c})LFL​=−∑c=1C​yc​⋅(1−pc​)γlog(pc​)
      其中,γ≥0\gamma \geq 0γ≥0 是聚焦参数(通常取2),(1−pc)γ(1-p_c)^\gamma(1−pc​)γ 对易分类样本(pcp_cpc​ 接近1)的损失进行衰减。
    • 特点:最初为目标检测设计,后被广泛用于语义分割,尤其适合类别不平衡且存在大量简单样本的场景(如遥感图像分割)。
  3. Dice损失(Dice Loss)

    • 原理:基于Dice系数(衡量两个集合的相似度)设计,适用于小目标或前景像素极少的场景(如医学影像分割中的肿瘤分割)。
      Dice系数公式:
      D=2∑yc⋅pc∑yc+∑pcD = \frac{2 \sum y_c \cdot p_c}{\sum y_c + \sum p_c}D=∑yc​+∑pc​2∑yc​⋅pc​​
      损失公式:
      LDice=1−DL_{Dice} = 1 - DLDice​=1−D
    • 特点:对小目标敏感,能有效提升小区域的分割精度;但训练过程不稳定(梯度易波动),常与交叉熵损失结合使用(如 L=LCE+αLDiceL = L_{CE} + \alpha L_{Dice}L=LCE​+αLDice​,α\alphaα 为权重)。

三、针对边界和细节的损失函数

  1. IoU损失(Intersection over Union Loss)

    • 原理:基于交并比(IoU)设计,衡量预测掩码与真实掩码的重叠度,对类别不平衡和尺度变化更稳健。
      IoU公式:
      IoU=∑yc⋅pc∑yc+∑pc−∑yc⋅pcIoU = \frac{\sum y_c \cdot p_c}{\sum y_c + \sum p_c - \sum y_c \cdot p_c}IoU=∑yc​+∑pc​−∑yc​⋅pc​∑yc​⋅pc​​
      损失公式:
      LIoU=1−IoUL_{IoU} = 1 - IoULIoU​=1−IoU
    • 扩展:广义IoU(GIoU)、边界IoU(BIoU)等变体,进一步优化边界区域的损失计算。
  2. 边界损失(Boundary Loss)

    • 原理:专门针对分割边界的精度优化,通过惩罚预测边界与真实边界的距离(如hausdorff距离)提升细节分割效果。
    • 特点:常用于需要精确分割边缘的场景(如医学影像中器官边缘、工业检测中零件轮廓)。

四、其他进阶损失函数

  1. Lovász-Softmax损失

    • 原理:基于亚模函数(submodular function)的凸包近似,直接优化IoU的上界,理论上比IoU损失更高效。
    • 特点:在类别不平衡和小目标场景中表现优异,尤其适合语义分割的评价指标(如mIoU)直接关联的任务。
  2. 混合损失(Hybrid Loss)

    • 原理:结合多种损失函数的优势(如交叉熵+Dice、焦点损失+边界损失),平衡不同场景的需求。
    • 示例:在医学影像分割中,常用 L=LCE+LDiceL = L_{CE} + L_{Dice}L=LCE​+LDice​ 兼顾全局分类和小目标精度。

总结

  • 基础场景:优先使用交叉熵损失或加权交叉熵损失。
  • 类别不平衡/小目标:选择焦点损失、Dice损失或Lovász-Softmax损失。
  • 边界细节敏感:结合边界损失或IoU损失变体。
  • 复杂任务:通常采用混合损失(如交叉熵+Dice)平衡性能。

实际应用中,损失函数的选择需结合具体数据集特点(如类别分布、目标尺度)和任务需求(如是否关注小目标或边界)进行调整。

语义分割的核心是对图像中每个像素进行类别标注,因此评估标准需围绕像素级别的分类准确性、类别间的均衡性以及空间结构的一致性展开。以下是常用的评估指标及其适用场景:

语义分割的评估标准

一、像素级基础指标

  1. 像素准确率(Pixel Accuracy, PA)

    • 定义:所有被正确分类的像素占总像素的比例。 PA=∑c=0C−1TPc∑c=0C−1(TPc+FPc+TNc+FNc)PA = \frac{\sum_{c=0}^{C-1} TP_c}{\sum_{c=0}^{C-1} (TP_c + FP_c + TN_c + FN_c)}PA=∑c=0C−1​(TPc​+FPc​+TNc​+FNc​)∑c=0C−1​TPc​​ 其中,TPcTP_cTPc​ 为类别ccc的真阳性(正确预测为ccc),FPcFP_cFPc​为假阳性(其他类预测为ccc),FNcFN_cFNc​为假阴性(ccc预测为其他类),CCC为类别总数。
    • 特点:计算简单,但受类别不平衡影响大(如背景像素占比高时,PA易被高估)。
  2. 类别像素准确率(Class Pixel Accuracy, CPA)

    • 定义:每个类别中被正确分类的像素占该类别总像素的比例(即召回率),再取平均值。 CPA=1C∑c=0C−1TPcTPc+FNcCPA = \frac{1}{C} \sum_{c=0}^{C-1} \frac{TP_c}{TP_c + FN_c}CPA=C1​c=0∑C−1​TPc​+FNc​TPc​​
    • 特点:反映每个类别的召回能力,对小类别更敏感,但忽略假阳性问题。

二、基于交并比(IoU)的核心指标

交并比(Intersection over Union, IoU)是语义分割中最常用的指标,衡量预测区域与真实区域的重叠程度,对类别不平衡更稳健。

  1. 类别交并比(Class IoU, CIoU)

    • 定义:单个类别的交并比,即预测掩码与真实掩码的交集除以并集。 CIoUc=TPcTPc+FPc+FNcCIoU_c = \frac{TP_c}{TP_c + FP_c + FN_c}CIoUc​=TPc​+FPc​+FNc​TPc​​
    • 意义:直接反映某一类别的分割精度(如“行人”类的IoU),是后续高阶指标的基础。
  2. 平均交并比(Mean IoU, mIoU)

    • 定义:所有类别的IoU的平均值(包括背景类)。 mIoU=1C∑c=0C−1CIoUcmIoU = \frac{1}{C} \sum_{c=0}^{C-1} CIoU_cmIoU=C1​c=0∑C−1​CIoUc​
    • 特点:语义分割的核心评估指标,被广泛用于各类数据集(如PASCAL VOC、Cityscapes)。它平衡了不同类别的表现,对小类别误差更敏感,能有效反映模型的整体分割能力。
  3. 加权交并比(Frequency Weighted IoU, FWIoU)

    • 定义:以每个类别的像素占比为权重,对IoU进行加权平均。 FWIoU=1∑c=0C−1(TPc+FNc)∑c=0C−1(TPc+FNc)⋅CIoUcFWIoU = \frac{1}{\sum_{c=0}^{C-1} (TP_c + FN_c)} \sum_{c=0}^{C-1} (TP_c + FN_c) \cdot CIoU_cFWIoU=∑c=0C−1​(TPc​+FNc​)1​c=0∑C−1​(TPc​+FNc​)⋅CIoUc​
    • 特点:更侧重样本量大的类别(如背景),适合关注主导类别的场景(如遥感图像中大面积地物的分割)。

三、基于区域一致性的指标

  1. Dice系数(Dice Coefficient, DC)

    • 定义:与IoU类似,衡量两个区域的重叠度,计算公式为: DCc=2⋅TPc2⋅TPc+FPc+FNcDC_c = \frac{2 \cdot TP_c}{2 \cdot TP_c + FP_c + FN_c}DCc​=2⋅TPc​+FPc​+FNc​2⋅TPc​​
    • 特点:对小目标(如医学影像中的肿瘤)更敏感,因为分子中“2·TP”放大了重叠区域的贡献。常与IoU结合使用,尤其适合样本极度不平衡的场景。
  2. 边界F1分数(Boundary F1-Score)

    • 定义:先通过边缘检测算法(如Canny)提取预测掩码和真实掩码的边界,再计算边界像素的F1分数(精确率与召回率的调和平均)。
    • 特点:专门评估分割边界的准确性,适用于对细节敏感的任务(如工业零件缺陷分割、医学器官边缘分割)。

四、综合评估指标

  1. 平均精度(Mean Precision, mPrecision)与平均召回率(Mean Recall, mRecall)

    • 分别计算每个类别的精确率(TPc/(TPc+FPc)TP_c/(TP_c + FP_c)TPc​/(TPc​+FPc​))和召回率(TPc/(TPc+FNc)TP_c/(TP_c + FN_c)TPc​/(TPc​+FNc​)),再取平均值。
    • 意义:mPrecision反映“预测为某类的像素中真正属于该类的比例”,mRecall反映“该类真实像素中被正确预测的比例”。
  2. F1分数(F1-Score)

    • 精确率与召回率的调和平均,综合两者的表现: F1c=2⋅Precisionc⋅RecallcPrecisionc+RecallcF1_c = \frac{2 \cdot Precision_c \cdot Recall_c}{Precision_c + Recall_c}F1c​=Precisionc​+Recallc​2⋅Precisionc​⋅Recallc​​
    • 平均F1(mF1)为所有类别的F1分数的平均值,适合平衡精确率和召回率的场景。

总结与适用场景

指标核心优势适用场景
PA简单直观快速评估,类别分布均衡的场景
mIoU平衡类别差异,反映整体精度通用场景(如PASCAL VOC、Cityscapes)
Dice系数对小目标敏感医学影像、小样本分割(如肿瘤、缺陷)
边界F1分数聚焦边界精度边缘敏感任务(如器官边缘、零件轮廓)
FWIoU侧重主导类别遥感图像、大面积地物分割

在实际研究中,mIoU是最核心的评估指标,常结合Dice系数(小目标)或边界指标(细节任务)进行补充分析,以全面反映模型性能。

U-Net

U-Net是一种卷积神经网络架构,由Olaf Ronneberger等人于2015年提出,最初用于生物医学图像分割任务,凭借其高效性和出色性能,已成为图像分割领域的主流架构之一。以下是具体介绍:

  • 网络结构:
    • 编码路径:也称为收缩路径,位于网络左侧。通过多层卷积和最大池化操作,对输入图像进行逐步下采样,每次下采样特征通道数量加倍,图像尺寸减小,从而提取图像的上下文信息,将图像“压缩”,捕捉图像中“是什么”的信息。
    • 解码路径:又称扩张路径,在网络右侧。通过上采样与卷积操作,将编码过程中的特征图还原为与原图大小一致的分割图,即“扩展”图像。上采样过程中,图片的通道数减半,与编码路径中特征通道数的变化相反,主要用于实现精确的像素定位,确定目标“在哪里”。
    • 跳跃连接:这是U-Net的核心部分。它连接编码器和解码器中相同层级的特征图,将编码路径中保留的空间细节信息传递给解码路径,有效弥补了下采样过程中信息的损失,使模型在保持语义理解的同时也能精准还原图像细节,从而得到更准确的分割结果。
python
    def forward(self, input):
        '''
        这个是UNet网络,就是先编码再解码,下面的UNet++网络,多了拼接的操作
        '''
        x0_0 = self.conv0_0(input)
        x1_0 = self.conv1_0(self.pool(x0_0))
        x2_0 = self.conv2_0(self.pool(x1_0))
        x3_0 = self.conv3_0(self.pool(x2_0))
        x4_0 = self.conv4_0(self.pool(x3_0))

        x3_1 = self.conv3_1(torch.cat([x3_0, self.up(x4_0)], 1))
        x2_2 = self.conv2_2(torch.cat([x2_0, self.up(x3_1)], 1))
        x1_3 = self.conv1_3(torch.cat([x1_0, self.up(x2_2)], 1))
        x0_4 = self.conv0_4(torch.cat([x0_0, self.up(x1_3)], 1))
        # 输出层,将结果输出为 0/1(因为这个任务当中只有前景或者后景两种分割结果)
        output = self.final(x0_4)
        return output
基于unet++的医学细胞分割结果演示:
评论
0/100