一、概述
语义分割是计算机视觉领域的一个重要任务(图像分类、目标识别、语义分割),旨在依据图像所含语义信息对每个像素进行分类标注,并使用不同的像素值表示该像素所属的类别,将图像分割为语义含义(类别)相同的若干区域。
输入:H*W*3
输出:H*W*num_class(每个通道上的值代表对应像素属于该类别的概率或置信度)通常情况下,经过激活函数处理后,这些值会被归一化到 [ 0 , 1] 范围内,表示像素属于每个类别的概率。最后,预测的结果可以通过对每个像素在深度维度上求argmax的方式整合到一张单通道的分割图上。
二、语义分割中常见数据集格式
1. MSCOCO
2. PNG模式
from PIL import Image
im = Image.open('../train/png/T000000.png')
print(type(im))
print(im.mode)
print(im.getpalette())
print(len(im.getpalette())/3)
P模式指的是palette模式,也就是调色板模式,也可以说是index模式。在该模式下,图像中每个像素上存放的是index索引值,通常情况下对应的就是数据集分类的index。而该索引又与RGB值一一对应。以PASCAL VOC数据集为例,其类别、索引与像素对应信息,如下所示。
VOC_COLORMAP = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],
[0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],
[64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],
[64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],
[0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],
[0, 64, 128]]
VOC_CLASSES = ['background', 'aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair', 'cow',
'diningtable', 'dog', 'horse', 'motorbike', 'person',
'potted plant', 'sheep', 'sofa', 'train', 'tv/monitor']
以下代码是将标签图片中每个像素的RGB值一对一映射到对应的类别索引
colormap2label = torch.zeros(256 ** 3, dtype=torch.uint8)
for i, colormap in enumerate(VOC_COLORMAP):
colormap2label[(colormap[0] * 256 + colormap[1]) * 256 + colormap[2]] = i
// 将一个RGB颜色值(每个通道的取值范围为0-255)转换为一个唯一的十进制数值
// 该公式通常用于将彩色标签图像中的每个像素的颜色值映射到类别索引
// 在该公式中,红色通道的值被乘以65536,是因为一个24位的RGB颜色值可以被表示为一个整数
// 其中,前8位表示红色通道的值,中间8位表示绿色通道的值,后8位表示蓝色通道的值。
// 因此,将十进制的红色通道的值乘以65536,即代表将二进制的红色通道的值左移16位
def voc_label_indices(colormap):
"""
convert colormap (PIL image) to colormap2label (uint8 tensor).
"""
colormap = np.array(colormap).astype('int32')
idx = ((colormap[:, :, 0] * 256 + colormap[:, :, 1]) * 256
+ colormap[:, :, 2])
return colormap2label[idx]
注意,在语义分割中对应的标注图像(.png)用PIL的Image.open()函数读取时,默认是P模式,即一个单通道的图像。在背景处的像素值为0,目标边缘处用的像素值为255(训练时一般会忽略像素值为255的区域),目标区域内根据目标的类别索引信息进行填充,例如人对应的目标索引是15,所以目标区域的像素值用15填充。
三、语义分割评价指标
:类别 i 被预测为类别 j 的像素个数
:目标类别个数(包含背景)
:目标类别 i 的总像素个数(真实标签)
1. 像素准确率(Pixel Accuracy)
2. 平均准确率(Mean Accuracy)
3. 平均IoU(Mean IoU)
4.混淆矩阵
在PyTorch中,通过混淆矩阵来计算像素准确率(Pixel Accuracy)、平均准确率(Mean Accuracy)、平均IoU(Mean Intersection over Union)等指标。混淆矩阵是一个二维矩阵,其中行表示真实类别,列表示预测类别,矩阵的元素表示属于真实类别 i 并被预测为类别 j 的样本数量。我们通过如下标签,举例说明指标计算过程。
我们通过预测标签与真实标签,计算类别 i 被预测为类别 j 的像素个数,填充混淆矩阵。
通过混淆矩阵,我们计算得到global_accuracy、cls_accuracy、cls_iou
四、常见语义分割网络
FCN | 使用卷积层代替全连接层,接收任意尺寸的输入图像 |
UNet | 在上采样阶段,使用跳跃连接,有效解决空间信息不足的问题 |
PSPNet | 引入金字塔池化模块,捕获不同尺度的上下文信息 |
DeepLab系列 | 能够有效地处理多尺度信息,提高准确性和鲁棒性 |