语义分割是什么
目标检测(Object Detection)
核心目标:定位图像中所有感兴趣的目标,并识别其类别。 具体任务:输出每个目标的边界框(Bounding Box)(通常用坐标 (x1,y1,x2,y2) 表示)和对应的类别标签(如 “人”“车”)。 不关注目标内部的细节(如人的手臂、汽车的车窗),仅需框出目标整体。
语义分割(Semantic Segmentation)
核心目标:对图像中的每个像素进行分类,标注其所属的语义类别(如 “人”“树”“道路”“背景”)。 关键特点:不区分同一类别的不同个体。例如,图像中有 3 个人,语义分割会将他们的所有像素都标注为 “人”,但不会区分 “人 1”“人 2”“人 3”。
实例分割(Instance Segmentation,属于分割任务的典型代表)
核心目标:同时实现 “目标检测” 和 “像素级分割”,既需要区分不同个体,又需要标注每个个体的像素范围。 具体任务:对图像中每个目标(实例),输出其像素级的分割掩码(Mask) 和类别标签,且同一类别的不同实例会被区分(如 “人 1”“人 2” 用不同掩码区分)。
语义分割任务的核心是对图像中每个像素进行分类,因此损失函数的设计需围绕像素级别的分类误差展开。同时,由于语义分割常面临类别不平衡(如背景像素远多于前景)、边界模糊等问题,研究者提出了多种针对性的损失函数。以下是常用的语义分割损失函数及其特点:
语义分割的损失函数
一、基础损失函数(适用于简单场景)
- 交叉熵损失(Cross-Entropy Loss)
- 原理:最经典的分类损失,适用于单标签像素分类(每个像素属于唯一类别)。
对每个像素,损失计算为:
其中, 是像素的真实类别(独热编码,1表示属于该类,0表示不属于), 是模型预测该像素属于类别 的概率。 - 特点:简单直观,适用于类别分布较均衡的场景;但对类别不平衡敏感(如小目标像素占比低时,损失被主导类别掩盖)。
- 原理:最经典的分类损失,适用于单标签像素分类(每个像素属于唯一类别)。
二、针对类别不平衡的损失函数
-
加权交叉熵损失(Weighted Cross-Entropy Loss)
- 原理:为每个类别分配权重 (类别样本越少,权重越大),缓解不平衡问题。
损失公式:
- 特点:通过手动或自适应调整权重(如根据训练集中类别频率设置 , 为类别频率),提升小类别的损失占比。
- 原理:为每个类别分配权重 (类别样本越少,权重越大),缓解不平衡问题。
-
焦点损失(Focal Loss)
- 原理:通过降低易分类样本的权重,聚焦于难分类样本(如模糊边界、小目标像素)。
损失公式:
其中, 是聚焦参数(通常取2), 对易分类样本( 接近1)的损失进行衰减。 - 特点:最初为目标检测设计,后被广泛用于语义分割,尤其适合类别不平衡且存在大量简单样本的场景(如遥感图像分割)。
- 原理:通过降低易分类样本的权重,聚焦于难分类样本(如模糊边界、小目标像素)。
-
Dice损失(Dice Loss)
- 原理:基于Dice系数(衡量两个集合的相似度)设计,适用于小目标或前景像素极少的场景(如医学影像分割中的肿瘤分割)。
Dice系数公式:
损失公式:
- 特点:对小目标敏感,能有效提升小区域的分割精度;但训练过程不稳定(梯度易波动),常与交叉熵损失结合使用(如 , 为权重)。
- 原理:基于Dice系数(衡量两个集合的相似度)设计,适用于小目标或前景像素极少的场景(如医学影像分割中的肿瘤分割)。
三、针对边界和细节的损失函数
-
IoU损失(Intersection over Union Loss)
- 原理:基于交并比(IoU)设计,衡量预测掩码与真实掩码的重叠度,对类别不平衡和尺度变化更稳健。
IoU公式:
损失公式:
- 扩展:广义IoU(GIoU)、边界IoU(BIoU)等变体,进一步优化边界区域的损失计算。
- 原理:基于交并比(IoU)设计,衡量预测掩码与真实掩码的重叠度,对类别不平衡和尺度变化更稳健。
-
边界损失(Boundary Loss)
- 原理:专门针对分割边界的精度优化,通过惩罚预测边界与真实边界的距离(如hausdorff距离)提升细节分割效果。
- 特点:常用于需要精确分割边缘的场景(如医学影像中器官边缘、工业检测中零件轮廓)。
四、其他进阶损失函数
-
Lovász-Softmax损失
- 原理:基于亚模函数(submodular function)的凸包近似,直接优化IoU的上界,理论上比IoU损失更高效。
- 特点:在类别不平衡和小目标场景中表现优异,尤其适合语义分割的评价指标(如mIoU)直接关联的任务。
-
混合损失(Hybrid Loss)
- 原理:结合多种损失函数的优势(如交叉熵+Dice、焦点损失+边界损失),平衡不同场景的需求。
- 示例:在医学影像分割中,常用 兼顾全局分类和小目标精度。
总结
- 基础场景:优先使用交叉熵损失或加权交叉熵损失。
- 类别不平衡/小目标:选择焦点损失、Dice损失或Lovász-Softmax损失。
- 边界细节敏感:结合边界损失或IoU损失变体。
- 复杂任务:通常采用混合损失(如交叉熵+Dice)平衡性能。
实际应用中,损失函数的选择需结合具体数据集特点(如类别分布、目标尺度)和任务需求(如是否关注小目标或边界)进行调整。
语义分割的核心是对图像中每个像素进行类别标注,因此评估标准需围绕像素级别的分类准确性、类别间的均衡性以及空间结构的一致性展开。以下是常用的评估指标及其适用场景:
语义分割的评估标准
一、像素级基础指标
-
像素准确率(Pixel Accuracy, PA)
- 定义:所有被正确分类的像素占总像素的比例。 其中, 为类别的真阳性(正确预测为),为假阳性(其他类预测为),为假阴性(预测为其他类),为类别总数。
- 特点:计算简单,但受类别不平衡影响大(如背景像素占比高时,PA易被高估)。
-
类别像素准确率(Class Pixel Accuracy, CPA)
- 定义:每个类别中被正确分类的像素占该类别总像素的比例(即召回率),再取平均值。
- 特点:反映每个类别的召回能力,对小类别更敏感,但忽略假阳性问题。
二、基于交并比(IoU)的核心指标
交并比(Intersection over Union, IoU)是语义分割中最常用的指标,衡量预测区域与真实区域的重叠程度,对类别不平衡更稳健。
-
类别交并比(Class IoU, CIoU)
- 定义:单个类别的交并比,即预测掩码与真实掩码的交集除以并集。
- 意义:直接反映某一类别的分割精度(如“行人”类的IoU),是后续高阶指标的基础。
-
平均交并比(Mean IoU, mIoU)
- 定义:所有类别的IoU的平均值(包括背景类)。
- 特点:语义分割的核心评估指标,被广泛用于各类数据集(如PASCAL VOC、Cityscapes)。它平衡了不同类别的表现,对小类别误差更敏感,能有效反映模型的整体分割能力。
-
加权交并比(Frequency Weighted IoU, FWIoU)
- 定义:以每个类别的像素占比为权重,对IoU进行加权平均。
- 特点:更侧重样本量大的类别(如背景),适合关注主导类别的场景(如遥感图像中大面积地物的分割)。
三、基于区域一致性的指标
-
Dice系数(Dice Coefficient, DC)
- 定义:与IoU类似,衡量两个区域的重叠度,计算公式为:
- 特点:对小目标(如医学影像中的肿瘤)更敏感,因为分子中“2·TP”放大了重叠区域的贡献。常与IoU结合使用,尤其适合样本极度不平衡的场景。
-
边界F1分数(Boundary F1-Score)
- 定义:先通过边缘检测算法(如Canny)提取预测掩码和真实掩码的边界,再计算边界像素的F1分数(精确率与召回率的调和平均)。
- 特点:专门评估分割边界的准确性,适用于对细节敏感的任务(如工业零件缺陷分割、医学器官边缘分割)。
四、综合评估指标
-
平均精度(Mean Precision, mPrecision)与平均召回率(Mean Recall, mRecall)
- 分别计算每个类别的精确率()和召回率(),再取平均值。
- 意义:mPrecision反映“预测为某类的像素中真正属于该类的比例”,mRecall反映“该类真实像素中被正确预测的比例”。
-
F1分数(F1-Score)
- 精确率与召回率的调和平均,综合两者的表现:
- 平均F1(mF1)为所有类别的F1分数的平均值,适合平衡精确率和召回率的场景。
总结与适用场景
| 指标 | 核心优势 | 适用场景 |
|---|---|---|
| PA | 简单直观 | 快速评估,类别分布均衡的场景 |
| mIoU | 平衡类别差异,反映整体精度 | 通用场景(如PASCAL VOC、Cityscapes) |
| Dice系数 | 对小目标敏感 | 医学影像、小样本分割(如肿瘤、缺陷) |
| 边界F1分数 | 聚焦边界精度 | 边缘敏感任务(如器官边缘、零件轮廓) |
| FWIoU | 侧重主导类别 | 遥感图像、大面积地物分割 |
在实际研究中,mIoU是最核心的评估指标,常结合Dice系数(小目标)或边界指标(细节任务)进行补充分析,以全面反映模型性能。
U-Net
U-Net是一种卷积神经网络架构,由Olaf Ronneberger等人于2015年提出,最初用于生物医学图像分割任务,凭借其高效性和出色性能,已成为图像分割领域的主流架构之一。以下是具体介绍:
- 网络结构:
- 编码路径:也称为收缩路径,位于网络左侧。通过多层卷积和最大池化操作,对输入图像进行逐步下采样,每次下采样特征通道数量加倍,图像尺寸减小,从而提取图像的上下文信息,将图像“压缩”,捕捉图像中“是什么”的信息。
- 解码路径:又称扩张路径,在网络右侧。通过上采样与卷积操作,将编码过程中的特征图还原为与原图大小一致的分割图,即“扩展”图像。上采样过程中,图片的通道数减半,与编码路径中特征通道数的变化相反,主要用于实现精确的像素定位,确定目标“在哪里”。
- 跳跃连接:这是U-Net的核心部分。它连接编码器和解码器中相同层级的特征图,将编码路径中保留的空间细节信息传递给解码路径,有效弥补了下采样过程中信息的损失,使模型在保持语义理解的同时也能精准还原图像细节,从而得到更准确的分割结果。


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

