我们对图像分类比较熟悉,图像分类是指对一张图片进行分类,而图像分割是对每一个像素进行分类。如下所示:
右边是原图片,左边是进行图像分割的结果。 图像分割是一个很大的领域,大概可以分为以下 4 种。
语义分割(Semantic Segmentation):对图像中的每个像素进行分类。从下图可以看到,不同的类别由不同的颜色,比如下图就把图像分为了草地(浅绿)、人(红色)、树木(深绿)、天空(蓝色)等标签,用不同的颜色来表示。但是在红色的人类别中,无法区分个体。一个像素虽然是属于人,但是无法区分是哪一个人的。
实例分割(Instance Segmentation):对个体目标进行分割,像素级目标检测。实例分割方式有点类似于物体检测,不过物体检测一般输出的是 bounding box,实例分割输出的是一个mask。实例分割和上面的语义分割也不同,它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行,比如下图中的人就是感兴趣的物体。该图的分割方法采用了一种称为Mask R-CNN的方法。我们可以看到每个人都是不同的颜色的轮廓,因此我们可以区分出单个个体。
全景分割(Panoptic Segmentation):这是语义分割和实例分割的结合。如下图所示,每个像素都被分为一类,如果一种类别里有多个实例,会用不同的颜色进行区分,我们可以知道哪个像素属于哪个类中的哪个实例。比如下图中黄色和红色都属于人这一个类别里,但是分别属于不同的实例(人),因此我们可以通过mask的颜色很容易分辨出不同的实例。
下面是一个具体的例子,使用torch.hub调用预训练好的deeplab-V3模型进行图像分割。然后把分割结果进行可视化,就可以得到我们在博客一开始的分割示意图。
# 由于 Pascal VOC 数据集有 21 个类别,因此这里需要生成 21 个类别的不同颜色。
# 这是RGB颜色映射矩阵,至于为什么是这些数就不清楚了,这里就是自动的生成21个颜色,并且颜色要有一定区分,
# 在 plt.show() 后实际上已经创建了一个新的空白的图片(坐标轴),这时候你再 plt.savefig() 就会保存这个新生成的空白图片。


最后一个图像是由两个图片拼接而成,上半身是狗,下半身是猫,但是网络将这两个部分都认为是狗这一个类别。也就是说我们改变了对象的一部分,但是模型对其他没有变化的部分的分类也发生了变化,整个对象的分类都发生了改变。每一个像素的分类不仅会考虑每个像素自身的信息,还会综合考虑图像上整体区域的信息。
PyTorch-Hub 是PyTorch 模型库,有大量模型供开发者调用。下面是常用的 3 个方法介绍。
主要贡献是利用全卷积完成 pixelwise prediction(逐像素预测)。因为之前的网络最后几层是 Linear 层,这些全连接层有一个局限性,那就是输入的特征数量必须是一致的,这就意味着输入模型的图片大小也是固定的。但是在图像分割的,输 inference 阶段,输入的图片宽高可能不是固定的,最后的 Linear 层无法处理不一样的特征数量。因此 FCN 利用全卷积替换了所有的 Linear 层,使得模型可以处理不同宽高的输入图片。
最初是用于医学图像分割。医学图像分割有一个特点是数据量非常少,而 Unet 可以在非常小的数据集上获得非常好的结果。 下图是 Unet 的网络结构示意图,整个网络呈 U 的形状,因此被才成为 Unet。Unet 的左边称为 Encoder(编码器),右边称为 Decoder(解码器)。每一个 Encoder 输出的 feature map 除了给下一层的 Encoder,还会直接传到后面对应的 Decoder,奠定 Unet 系列图像分割模型的基本结构-编码器和解码器的特征融合。现在 Unet 系列已经有几十篇论文。Unet 的系列论文和代码可以查看
仔细查看上图中模型的输入的宽高和输出的宽高是不一样的,输入的宽高是 572572,输出的宽高是 388388。这是因为输入的图像是由原始图像向四各方向镜像而来。而模型的输入是 1 通道的,因为医学图像是灰度图像;而输入是 2 通道的,因为这里是对每个像素做 2 分类。如下图所示:
可以看到输入和输出的宽高可以是不匹配的,这样就可以综合考虑 572572 区域上的信息,来完成 388388 区域上 的图像分割。
孔洞卷积:借助孔洞卷积,增大感受野,解决了下采样如 max pooling 导致的细节信息丢失问题。
CRF:对于图像分类等 High Level Vision Task,对同一张图片进行空间变换(如平移、旋转),其图片分类结果是不变的。但是但对于图像分割等 Low-Level Vision Task,对于一张图片进行空间变换后,其结果是改变的。这篇论文提出采用 CRF 进行 mask 后处理,得到精细的 mask 输出,解决空间不变形问题。
使用 Atrous Convolution 代替原来上采样的方法,比之前得到更高像素的 score map,并且增加了感受野的大小。
使用 ASPP(Atrous spatial pyramid pooling) 空间金字塔池化代替原来对图像做预处理 resize 的方法,解决多尺度的池化问题,使得输入图片可以具有任意尺度,而不影响神经网络中全连接层的输入大小。这个贡献最大。
- ASPP 的并行:其中一层同时使用不同的卷积 rate,得到不同大小的特侦图,最后对这些特征图进行 concat 和 1*1 的卷积。