语义分割入门

简介

最近在跟踪论文《Tell Me Where to Look: Guided Attention Inference Network》,主要工作是attention map,最终用语义分割验证其有效性。因为之前没接触过语义分割,在知乎和机器之心上看了几篇综述,整理一下。

转载:

什么是语义分割

图像语义分割可以说是图像理解的基石性技术,在自动驾驶系统(具体为街景识别与理解)、无人机应用(着陆点判断)以及穿戴式设备应用中举足轻重。

图像是由许多像素(Pixel)组成,而「语义分割」顾名思义就是将像素按照图像中表达语义含义的不同进行分组(Grouping)/分割(Segmentation)。下图取自图像分割领域的标准数据集之一PASCAL VOC。其中,左图为原始图像,右图为分割任务的真实标记(Ground truth):红色区域表示语义为“person”的图像像素区域,蓝绿色代表“motorbike”语义区域,黑色表示“background”,白色(边)则表示未标记区域。注意语义分割不同于实例分割,举例来说,如果一张照片中有多个人,对于语义分割来说,只要将所由人的像素都归为一类,但是实例分割还要将不同人的像素归为不同的类。也就是说实例分割比语义分割更进一步。因此,图像语义分割也称为“图像语义标注”(Image semantic labeling)、“像素语义标注”(Semantic pixel labeling)或“像素语义分组”(Semantic pixel grouping)。

显然,在图像语义分割任务中,其输入为一张$H×W×3$的三通道彩色图像。而输出有两种形式:

  1. 一个$H×W$的矩阵,矩阵的每一个元素表明了原图中对应位置像素所表示的语义类别(Semantic label);
  2. 一个$H×W×(class+1)$的矩阵,可以看为图片上每个点的one-hot表示,每一个channel对应一个class,对每一个pixel位置,都有$(class+1)$个channel,每个channel的值对应那个像素属于该class的预测概率。$class+1$是因为还要加上背景。

在真实图像中,表达某一语义的同一物体常由不同部件组成(如,building,motorbike,person等),同时这些部分往往有着不同的颜色、纹理甚至亮度(如building),这给图像语义的精确分割带来了困难和挑战。

训练集

常用于训练语义分割模型的数据集:

  • Pascal VOC 2012:有 20 类目标,这些目标包括人类、机动车类以及其他类,可用于目标类别或背景的分割

  • MSCOCO:微软团队获取的一个可以用来图像recognition+segmentation+captioning 数据集,从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。

  • Cityscapes:50 个城市的城市场景语义理解数据集

  • Pascal Context:有 400 多类的室内和室外场景

  • Stanford Background Dataset:至少有一个前景物体的一组户外场景。


来自 Stanford Background Dataset 的示例图像,该数据集的图像大致为 320\240 像素,还包括指向每块像素所属类别的整数矩阵。*

评价指标

先说明一些符号表示的意义。

$k$ :类别总数,如果包括背景的话就是 $k+1$

$p_{ij}$ :真实像素类别为 $i$ 的像素被预测为类别 $j$ 的总数量,换句话说,就是对于类别为 $i$ 的像素来说,被错分成类别 $j$ 的数量有多少。

$P_{ii}$ :真实像素类别为 $i$ 的像素被预测为类别 $i$ 的总数量,换句话说,就是对于真实类别为 $i$ 的像素来说,分对的像素总数有多少。

  1. 像素精度(pixel accuracy, PA):每一类像素正确分类的个数/ 每一类像素的实际个数
  2. 均像素精度(mean pixel accuracy, MPA):每一类像素的精度的平均值
  3. 平均交并比(Mean Intersection over Union, MIoU):求出每一类的IoU取平均值

IoU指的是两块区域相交的部分/两个部分的并集,如图中绿色部分/总面积。

这样的评价指标可以判断目标的捕获程度(使预测标签与标注尽可能重合),也可以判断模型的精确程度(使并集尽可能重合)。

  1. 权频交并比(Frequency Weight Intersection over Union):将每一类出现的频率作为权重计算IoU

方法

前DL时代

从最简单的像素级别“阈值法”(Thresholding methods)、基于像素聚类的分割方法(Clustering-based segmentation methods)到“图划分”的分割方法(Graph partitioning segmentation methods),在深度学习(Deep learning, DL)“一统江湖”之前,图像语义分割方面的工作可谓“百花齐放”。在此,我们仅以“Normalized cut” 和“Grab cut” 这两个基于图划分的经典分割方法为例,介绍一下前DL时代语义分割方面的研究。

(N-cut)方法是基于图划分(Graph partitioning)的语义分割方法中最著名的方法之一,于2000年Jianbo Shi和Jitendra Malik发表于相关领域顶级期刊TPAMI。通常,传统基于图划分的语义分割方法都是将图像抽象为图(Graph)的形式$G=(V,E)$($V$为图节点,$E$为图的边),然后借助图理论(Graph theory)中的理论和算法进行图像的语义分割。常用的方法为经典的最小割算法(Min-cut algorithm)。不过,在边的权重计算时,经典min-cut算法只考虑了局部信息。如下图所示,以二分图为例(将$G$分为不相交的$A,B$两部分),若只考虑局部信息,那么分离出一个点显然是一个min-cut,因此图划分的结果便是类似$n_1$或$n_2$这样离群点,而从全局来看,实际想分成的组却是左右两大部分。


针对这一情形,N-cut则提出了一种考虑全局信息的方法来进行图划分(Graph partitioning),即,将两个分割部分$A$,$B$与全图节点的连接权重(${\rm assoc(A,V)}$和$\rm assoc(B,V$))考虑进去:

如此一来,在离群点划分中,$N_{cut}(\bf{A},\bf{B})$中的某一项会接近1,而这样的图划分显然不能使得$N_{cut}(\bf{A},\bf{B})$是一个较小的值,故达到考虑全局信息而摒弃划分离群点的目的。这样的操作类似于机器学习中特征的规范化(Normalization)操作,故称为Normalized cut。N-cut不仅可以处理二类语义分割,而且将二分图扩展为$K$路($K$-way)图划分即可完成多语义的图像语义分割,如下图例。

Grab cut是微软剑桥研究院于2004年提出的著名交互式图像语义分割方法。与N-cut一样,grab cut同样也是基于图划分,不过grab cut是其改进版本,可以看作迭代式的语义分割算法。Grab cut利用了图像中的纹理(颜色)信息和边界(反差)信息,只要少量的用户交互操作即可得到比较好的前后背景分割结果。

在Grab cut中,RGB图像的前景和背景分别用一个高斯混合模型(Gaussian mixture model, GMM)来建模。两个GMM分别用以刻画某像素属于前景或背景的概率,每个GMM高斯部件(Gaussian component)个数一般设为$k=5$。接下来,利用吉布斯能量方程(Gibbs energy function)对整张图像进行全局刻画,而后迭代求取使得能量方程达到最优值的参数作为两个GMM的最优参数。GMM确定后,某像素属于前景或背景的概率就随之确定下来。

在与用户交互的过程中,Grab cut提供两种交互方式:一种以包围框(Bounding box)为辅助信息;另一种以涂写的线条(Scribbled line)作为辅助信息。以下图为例,用户在开始时提供一个包围框,grab cut默认的认为框中像素中包含主要物体/前景,此后经过迭代图划分求解,即可返回扣出的前景结果,可以发现即使是对于背景稍微复杂一些的图像,grab cut仍有不俗表现。

不过,在处理下图时,grab cut的分割效果则不能令人满意。此时,需要额外人为的提供更强的辅助信息:用红色线条/点标明背景区域,同时用白色线条标明前景区域。在此基础上,再次运行grab cut算法求取最优解即可得到较为满意的语义分割结果。Grab cut虽效果优良,但缺点也非常明显,一是仅能处理二类语义分割问题,二是需要人为干预而不能做到完全自动化。

DL时代

其实大家不难看出,前DL时代的语义分割工作多是根据图像像素自身的低阶视觉信息(Low-level visual cues)来进行图像分割。由于这样的方法没有算法训练阶段,因此往往计算复杂度不高,但是在较困难的分割任务上(如果不提供人为的辅助信息),其分割效果并不能令人满意。

在计算机视觉步入深度学习时代之后,语义分割同样也进入了全新的发展阶段。语义分割任务最初流行的深度学习方法是图像块分类(patch classification),即图像是切成块喂给深度模型的,然后利用像素周围的图像块对每一个像素进行独立的分类。使用图像块分类的主要原因是分类网络通常是全连接层(full connected layer),且要求固定尺寸的图像。

在此之后,以全卷积神经网络(Fully convolutional networks,FCN)为代表的一系列基于卷积神经网络“训练”的语义分割方法相继提出,屡屡刷新图像语义分割精度。而该系列的方法有一个通用的框架:

  • FCN-全卷积网络
  • CRF-条件随机场
  • MRF-马尔科夫随机场

前端使用FCN进行特征粗提取,后端使用CRF/MRF优化前端的输出,最后得到分割图。

FCN

论文地址:Fully Convolutional Networks for Semantic Segmentation
发表日期:14 Nov 2014

三个创新点:

  • 卷积化(Convolutional)

卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。

  • 上采样(Upsample)

此处的上采样即是反卷积(Deconvolution,叫Transposed Convolution也合适)。普通的池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了使得网络可以接受任意大小的图片且得到和原图等大的分割图,我们需要上采样/反卷积。

反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。图解如下:

虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。

  • 跨层连接结构(Skip Architecture)

这个结构的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将低层的目标位置信息强但语义信息弱的特征图和高层目标位置信息弱但语义信息强的特征图进行融合,来优化输出。具体结构如下:

下图是不同层作为输出的语义分割结果,可以明显看出,由于池化层的下采样倍数的不同导致不同的语义分割精细程度。如FCN-32s,由于是FCN的最后一层卷积和池化的输出,该模型的下采样倍数最高,其对应的语义分割结果最为粗略;而FCN-8s则因下采样倍数较小可以取得较为精细的分割结果。

DeconvNet

论文地址:Learning Deconvolution Network for Semantic Segmentation
发表日期:17 May 2015
FCN引领了之后一系列语义分割的研究都是以其为基础,采用编码器-解码器结构的热潮。

DeconvNet的创新点是使用了上池化。上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0即OK。

U-Net

论文地址:U-Net: Convolutional Networks for Biomedical Image Segmentation
发表日期:18 May 2015

U-Net用于解决小样本的简单问题分割,比如医疗影片的分割。通过产生原始训练数据的扭曲版而增加训练数据。这一步使 CNN 编码器-解码器变得更加鲁棒以抵抗这些形变,并能从更少的训练图像中进行学习。当它在少于40张图的生物医学数据集上训练时,IoU值仍能达到 92%。

它与FCN相比有更丰富的信息融合:如灰色剪头,更多的前后层之间的信息融合。这里是把前面层的输出和后面层concat(串联)到一起,区别于FCN的逐元素加和。不同Feature map串联到一起后,后面接卷积层,可以让卷积核在channel上自己做出选择。注意的是,在串联之前,需要把前层的feature map crop到和后层一样的大小。

SegNet

论文地址:Learning Deconvolution Network for Semantic Segmentation
发表日期:2 Nov 2015

创新点:将最大池化索引(Maxpooling indices)转移到解码器,从而改善分割分辨率。

在 FCN 网络中,尽管使用了解卷积层和一些跨层连接,但输出的分割图仍然比较粗糙。因此,更多的跨层连接被引入 FCN 网络。但是,SegNet 没有复制 FCN 中的编码器特征,而是复制了最大池化索引。这使得 SegNet 比 FCN 更节省内存。

maxpooling 的indices复制原理如下:

空洞卷积 - Dilated Convolution

论文地址:Multi-Scale Context Aggregation by Dilated Convolutions
发表日期:23 Nov 2015

创新点:

  1. 使用空洞卷积,一种可进行稠密预测的卷积层。
  2. 提出「背景模块」(context module),该模块可使用空洞卷积进行多尺度背景聚合。

池化使感受野增大,因此对分类网络有所帮助。但池化会造成分辨率下降,不是语义分割的最佳方法。因此,论文作者使用空洞卷积层(dilated convolution layer)。空洞卷积层(DeepLab 将其称为带孔卷积)可使感受野呈指数级增长,而空间维度不至于下降。

从预训练好的分类网络(此处指 VGG)中移除最后两个池化层,之后的卷积层都使用空洞卷积。尤其是,pool-3 和 pool-4 之间的卷积是空洞卷积 2,pool-4 后面的卷积是空洞卷积 4。使用这个模块(论文中称为前端模块 frontend module)之后,无需增加参数即可实现稠密预测。另一个模块(论文中称为背景模块 context module)将使用前端模块的输出作为输入进行单独训练。该模块是多个不同扩张程度的空洞卷积级联而成,因此该模块可聚合多尺度背景,并改善前端模块获取的预测结果。

DeepLab

v1

论文地址:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
发表日期:22 Dec 2014

创新点:

  1. 提出带孔卷积(Atrous Convolution),同空洞卷积(Dilated Convolution)。
  2. 后端采用CRF(条件随机场)优化,利用像素之间的关连信息:相邻的像素,或者颜色相近的像素有更大的可能属于同一个类别。

在许多语义分割架构中,CNN 旨在最小化的损失函数是交叉熵损失。该目标函数度量的是预测像素概率分布(在所有类上)和实际的概率分布的差异。

然而,对语义分割来说,交叉熵损失并不理想。因为对一张图来说,交叉熵损失是每一个像素损失的和,它并不鼓励邻近像素保持一致。因为交叉熵损失无法在像素间采用更高级的结构,所以交叉熵最小化的标签预测一般都是不完整或者是模糊的,它们都需要进行后续处理。

来自 CNN 的原始标签一般都是「缺失(patchy)」图像,在图像中有一些小区域的标签可能不正确,因此无法匹配其周围的像素标签。为了解决这种不连续性,我们可以用一种平滑的形式。我们需要确保目标占据图片中的连续区域,这样给定的像素和其周围像素的标签就是一样的。

对于每个像素$i$具有类别标签$x_i$还有对应的观测值$y_i$,这样每个像素点作为节点,像素与像素间的关系作为边,即构成了一个条件随机场。而且我们通过观测变量$y_i$来推测像素$i$对应的类别标签$x_i$,条件随机场如上。

条件随机场符合吉布斯分布:(此处的$x$即上面说的观测值)

其中的$E(\mathbf{x|I})$是能量函数,为了简便,以下省略全局观测$\mathbf{I}$:

其中的一元势函数$\sum_i{\Psi_u(x_i)}$即来自于前端FCN的输出。而二元势函数如下:

二元势函数就是描述像素点与像素点之间的关系,将像素之间的语义联系/关系考虑进去,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个“距离”的定义与颜色值和实际相对距离有关,例如,“天空”和“鸟”这样的像素在物理空间是相邻的概率,应该要比“天空”和“鱼”这样像素的相邻概率大。所以这样CRF能够使图片尽量在边界处分割。最后通过对CRF能量函数的优化求解,得到对FCN的图像语义预测结果进行优化,得到最终的语义分割结果。

而全连接条件随机场的不同就在于,二元势函数描述的是每一个像素与其他所有像素的关系,所以叫“全连接”。

v2

论文地址:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
发表日期:2 Jun 2016

创新点:引入了带洞空间金字塔池化(Atrous Spatial Pyramid Pooling,ASPP)的结构

v1使用带孔卷积扩大感受野之后,没有融合不同层之间的信息。ASPP层就是为了融合不同级别的语义信息:选择不同扩张率的带孔卷积去处理Feature Map,由于感受野不同,得到的信息的Level也就不同,ASPP层把这些不同层级的feature map concat到一起,进行信息融合。

v3

论文地址:Rethinking Atrous Convolution for Semantic Image Segmentation
发表日期:17 Jun 2017

改动处:

  1. 改进了ASPP模块
  2. 引入Resnet Block
  3. 丢弃CRF

新的ASPP模块:

  1. 加入了Batch Normalization;
  2. 加入特征的全局平均池化(在扩张率很大的情况下,有效权重会变小)。全局平均池化是对全局特征的强调、加强。

在旧的ASPP模块中:我们以为在扩张率足够大的时候,感受野足够大,所以获得的特征倾向于全局特征。但实际上,扩张率过大的情况下,空洞卷积出现了“权值退化”的问题,感受野过大,都已近扩展到了图像外面,大多数的权重都和图像外围的零填充进行了点乘,这样并没有获取图像中的信息。有效的权值个数很少,往往就是1。于是我们加了全局平均池化,强行利用全局信息。

v3+

论文地址:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
发表日期:7 Feb 2018

可以看成是把Deeplab v3作为编码器(上半部分)。后面再进行解码,并且在解码的过程中在此运用了不同层级特征的融合。此外,在encoder部分加入了Xception的结构减少了参数量,提高运行速递。

RefineNet

论文地址:RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation
发表日期:20 Nov 2016

创新点:所有组件遵循残差连接设计

使用空洞/带孔卷积的方法也有弊端。由于空洞卷积需要大量高分辨率特征图,因此其计算成本高昂,且占用大量内存。这妨碍了高分辨率预测的计算。例如,DeepLab 的预测结果大小是原始输入图像的 1/8。

因此,这篇论文提出使用编码器-解码器结构。编码器是 ResNet-101 模块,解码器是 RefineNet 模块,该模块融合了编码器中的高分辨率特征和先前 RefineNet 模块中的低分辨率特征。

RefineNet包括以下几种小模块:

  1. Residual convolution unit :对ResNet block进行2层的卷积操作。注意这里有多个ResNet block作为输入。
  2. Multi-resolution fusion:将1中得到的feature map进行加和融合。
  3. Chained residual pooling :该模块用于从一个大图像区域中捕捉背景上下文。注意:pooling的stride为1。
  4. Output convolutions:由三个RCUs构成。

PSPNet

论文地址:Pyramid Scene Parsing Network
发表日期:4 Dec 2016

创新点:

  1. 全局/空间金字塔池化(Global Pyramid Pooling)
  2. 使用辅助损失(auxiliary loss)

语义分割中常见问题:

  • 关系不匹配(Mismatched Relationship)
    场景中存在着可视模式的共现。比如,飞机更可能在天上或者在跑道上,而不是公路上。

  • 易混淆的类别(Confusion Categories)
    许多类别具有高度相似的外表。

  • 不显眼的类别(Inconspicuous Classes)
    场景中包括任意尺寸的物体,小尺寸的物体难以被识别但是有时候对于场景理解很重要。

这些大多数错误都部分或者完全和上下文关系以及全局信息有关系,而 PSPNet 就是为了整合不同区域的 context 来获取全局的 context 信息。它的骨架网络使用ResNet,之后使用了空间金字塔池化,得到一组感受野大小不同的feature map,将这些感受野不同的map concat到一起,完成多层次的语义特征融合。

在 ResNet 的第四阶段之后(即输入到金字塔池化模块),在主分支损失之外又增加了附加损失。这个想法在其他研究中也被称为中间监督(intermediate supervision)。

Large Kernel Matters

论文地址:Large Kernel Matters — Improve Semantic Segmentation by Global Convolutional Network
发表日期:8 Mar 2017

创新点:提出使用带有大型卷积核的编码器-解码器结构

语义分割不仅需要分割,同时还需要对分割目标进行分类。由于分割结构中无法使用全连接层,因此带有大核函数的卷积可以替代全连接层得到应用。

使用大型核的另一个原因是,尽管 ResNet 等更深层的网络拥有较大的感受野,但相关研究显示这样的网络更易收集较小范围(即有效感受野)内的信息。大型核的计算成本高昂,且拥有大量参数。因此,$k×k$ 卷积可近似成 $1 × k + k × 1$、$k × 1$ 和 $1 × k$。这篇论文中将该模块称为全局卷积网络(GCN)。

再来看结构,ResNet(没有空洞卷积)构成该结构的编码器部分,而 GCN 和反卷积构成了解码器部分。该结构还采用了一个叫做边界细化(BR)的简单残差块。

后端:用CRF/MRF优化

作为语义分割的后端优化部分,除了DeepLab引入的CRF外,还有MRF和G-CRF。

马尔科夫随机场(MRF)

论文地址:Semantic Image Segmentation via Deep Parsing Network
发表日期:9 Sep 2015

在Deep Parsing Network中使用的是MRF,它的公式具体的定义和CRF类似,只不过作者对二元势函数进行了修改:

其中,作者加入的$\lambda_k$为label context,因为$u_k$只是定义了两个像素同时出现的频率,而$\lambda_k$可以对一些情况进行惩罚,比如,人可能在桌子旁边,但是在桌子下面的可能性就更小一些。所以这个量可以学习不同情况出现的概率。而原来的距离$d(i,j)$只定义了两个像素间的关系,作者在这儿加入了个triple penalty,即还引入了$j$附近的$z$,这样描述三方关系便于得到更充足的局部上下文。具体结构如下:

这个结构的优点在于:

  • 将平均场构造成了CNN
  • 联合训练并且可以one-pass inference,而不用迭代

高斯条件随机场(G-CRF)

这个结构使用CNN分别来学习一元势函数和二元势函数。这样的结构是我们更喜欢的:

而此中的能量函数又不同于之前:

而当$(\mathbf{A+\lambda I)}$是对称正定时,求$E(\mathbf{x})$的最小值等于求解:

而G-CRF的优点在于:

  • 二次能量有明确全局
  • 解线性简便很多

端到端方法:CRFasRNN

论文地址:Conditional Random Fields as Recurrent Neural Networks
发表时间:11 Feb 2015

最开始使用DenseCRF是直接加在FCN的输出后面,可想这样是比较粗糙的。而且在深度学习中,我们都追求end-to-end的系统,所以CRFasRNN这篇文章将DenseCRF真正结合进了FCN中。

这篇文章也使用了平均场近似的方法,因为分解的每一步都是一些相乘相加的计算,和普通的加减(具体公式还是看论文吧),所以可以方便的把每一步描述成一层类似卷积的计算。这样即可结合进神经网络中,并且前后向传播也不存在问题。

当然,这里作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取10以内的迭代次数),所以文章才说是as RNN。

对抗训练

论文地址:Semantic Segmentation using Adversarial Networks
发表时间:25 Nov 2016

近期的另一个工作重点是使用对抗性训练获得更高阶的一致性。受生成对抗网络(GAN)的启发,Luc 等人训练了用于语义分割的标准 CNN 以及试着学习区分真实图分割和预测图分割的对抗网络。分割网络旨在产生对抗网络无法从真实分割中区别出来的预测分割。

这个方法的直观想法是希望我们的分割看起来尽可能真是。如果其它网络可以从真实分割中简单地将我们的预测结果区别出来,那么就说明我们的预测结果不够好。

Future Work

可以看到目前的工作主要从两个方向发展:

  1. 特征整合(Feature Ensembling)

    1. 多尺度(multi-scale) 特征整合
      例如:PSPNet

    2. 多级(multi-level)特征整合
      例如:RefineNet

  2. 结构预测(Structure Prediction)
    例如:条件随机场等。

感觉谷歌在深度学习方面的领域都是按系列搞的……Inception和DeepLab,看到别人好的方法就弄成一个组件和原本的组合起来,然后更新一下版本号……

一分一毛,也是心意。