DeepLearning-500-questions/ch09_图像分割/第九章_图像分割.md

63 KiB
Raw Blame History

[TOC]

第九章 图像分割

9.1 图像分割算法分类?

图像分割是预测图像中每一个像素所属的类别或者物体。基于深度学习的图像分割算法主要分为两类:

1.语义分割

为图像中的每个像素分配一个类别,如把画面中的所有物体都指出它们各自的类别。

2.实例分割

与语义分割不同实例分割只对特定物体进行类别分配这一点与目标检测有点相似但目标检测输出的是边界框和类别而实例分割输出的是掩膜mask和类别。

9.2 传统的基于CNN的分割方法缺点

传统的基于CNN的分割方法为了对一个像素分类使用该像素周围的一个图像块作为CNN的输入用于训练与预测这种方法主要有几个缺点
1存储开销大例如对每个像素使用15 * 15的图像块然后不断滑动窗口将图像块输入到CNN中进行类别判断因此需要的存储空间随滑动窗口的次数和大小急剧上升
2效率低下相邻像素块基本上是重复的针对每个像素块逐个计算卷积这种计算有很大程度上的重复
3像素块的大小限制了感受区域的大小通常像素块的大小比整幅图像的大小小很多只能提取一些局部特征从而导致分类性能受到限制。
而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。

9.3 FCN

9.3.1 FCN改变了什么?

对于一般的分类CNN网络如VGG和Resnet都会在网络的最后加入一些全连接层经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的即只能标识整个图片的类别不能标识每个像素点的类别所以这种全连接方法不适用于图像分割。 而FCN提出可以把后面几个全连接都换成卷积这样就可以获得一张2维的feature map后接softmax层获得每个像素点的分类信息从而解决了分割问题如图4。

图 4 ### 9.3.2 FCN网络结构

FCN对图像进行像素级的分类从而解决了语义级别的图像分割semantic segmentation问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类全联接层softmax输出不同FCN可以接受任意尺寸的输入图像采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。 下图是语义分割所采用的全卷积网络(FCN)的结构示意图:

9.3.3 全卷积网络举例?

通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务因为它们最后都得到整个输入图像的一个概率向量。

如上图所示:
1在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
2FCN与CNN的区别在于把CNN最后的全连接层转换成卷积层输出的是一张已经带有标签的图片, 而这个图片就可以做语义分割。
3CNN的强大之处在于它的多层结构能自动学习特征并且可以学习到多个层次的特征: 较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高, 所以我们常常可以将卷积层看作是特征提取器。

9.2.4 全连接层和卷积层如何相互转化?

两者相互转换的可能性:
全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将此两者相互转化是可能的:
1对于任一个卷积层都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵除了某些特定块其余部分都是零。而在其中大部分块中元素都是相等的。
2任何全连接层都可以被转化为卷积层。比如VGG16中第一个全连接层是25088 * 4096的数据尺寸将它转化为512 * 7 * 7 * 4096的数据尺寸即一个K=4096的全连接层输入数据体的尺寸是7 * 7 * 512这个全连接层可以被等效地看做一个F=7, P=0, S=1, K=4096 的卷积层。换句话说就是将滤波器的尺寸设置为和输入数据体的尺寸一致7 * 7, 这样输出就变为1 * 1 * 4096, 本质上和全连接层的输出是一样的。
输出激活数据体深度是由卷积核的数目决定的(K=4096)。
在两种变换中将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是227x227x3的图像一系列的卷积层和下采样层将图像数据变为尺寸为7x7x512的激活数据体, AlexNet的处理方式为使用了两个尺寸为4096的全连接层最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层
1第一个连接区域是[7x7x512]的全连接层令其滤波器尺寸为F=7,K=4096这样输出数据体就为[1x1x4096]。
2第二个全连接层令其滤波器尺寸为F=1,K=4096这样输出数据体为[1x1x4096]。
3最后一个全连接层也做类似的令其F=1,K=1000最终输出为[1x1x1000]。

9.2.5 为什么传统CNN的输入图片是固定大小

对于CNN一幅输入图片在经过卷积和pooling层时这些层是不关心图片大小的。比如对于一个卷积层outputsize = (inputsize - kernelsize) / stride + 1它并不关心inputsize多大对于一个inputsize大小的输入feature map滑窗卷积输出outputsize大小的feature map即可。pooling层同理。但是在进入全连接层时feature map假设大小为n×n要拉成一条向量而向量中每个元素共n×n个作为一个结点都要与下一个层的所有结点假设4096个全连接这里的权值个数是4096×n×n而我们知道神经网络结构一旦确定它的权值个数都是固定的所以这个n不能变化n是conv5的outputsize所以层层向回看每个outputsize都要固定那每个inputsize都要固定因此输入图片大小要固定。

9.2.6 把全连接层的权重W重塑成卷积层的滤波器有什么好处

这样的转化可以在单个向前传播的过程中, 使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。
比如: 我们想让224×224尺寸的浮窗以步长为32在384×384的图片上滑动把每个经停的位置都带入卷积网络最后得到6×6个位置的类别得分, 那么通过将全连接层转化为卷积层之后的运算过程为:
如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组那么384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组, 然后再经过上面由3个全连接层转化得到的3个卷积层最终得到[6x6x1000]的输出((12 7)/1 + 1 = 6), 这个结果正是浮窗在原图经停的6×6个位置的得分。
一个确定的CNN网络结构之所以要固定输入图片大小是因为全连接层权值数固定而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层经过这一层还是得到二维的feature map同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制。
如下图所示FCN将传统CNN中的全连接层转化成卷积层对应CNN网络FCN把最后三层全连接层转换成为三层卷积层:

一个分类网络 ![](img/ch9/figure_9.1.7_2.png) 变为全卷积网络 ![](img/ch9/figure_9.1.7_3.png) End-to-end, pixels-to pixels网络 ![](img/ch9/figure_9.1.7_4.jpg)

1全连接层转化为全卷积层 : 在传统的CNN结构中前5层是卷积层第6层和第7层分别是一个长度为4096的一维向量第8层是长度为1000的一维向量分别对应1000个不同类别的概率。FCN将这3层表示为卷积层卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别但是卷积跟全连接是不一样的概念和计算过程使用的是之前CNN已经训练好的权值和偏置但是不一样的在于权值和偏置是有自己的范围属于自己的一个卷积核。
2CNN中输入的图像大小是统一固定成227x227大小的图像第一层pooling后为55x55第二层pooling后图像大小为27x27第五层pooling后的图像大小为13x13, 而FCN输入的图像是H * W大小第一层pooling后变为原图大小的1/2第二层变为原图大小的1/4第五层变为原图大小的1/8第八层变为原图大小的1/16。
3经过多次卷积和pooling以后得到的图像越来越小分辨率越来越低。其中图像到H/32 * W/32的时候图片是最小的一层时所产生图叫做heatmap热图热图就是我们最重要的高维特征图得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling把图像进行放大几次到原图像的大小。
相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算优化模型然后再对36个位置做预测使用转化后的卷积神经网络进行一次前向传播计算要高效得多因为36次计算都在共享计算资源。这一技巧在实践中经常使用通常将一张图像尺寸变得更大然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分然后在求这些分值的平均值。

9.2.7 反卷积层理解

Upsampling的操作可以看成是反卷积(deconvolutional)卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层不关心input大小滑窗卷积后输出output。deconv并不是真正的deconvolution卷积的逆变换最近比较公认的叫法应该是transposed convolutiondeconv的前向传播就是conv的反向传播。
反卷积参数: 利用卷积过程filter的转置实际上就是水平和竖直方向上翻转filter作为计算卷积前的特征图。
反卷积的运算如下所示:
蓝色是反卷积层的input绿色是反卷积层的outputFull padding, transposed Full padding, transposed。

上图中的反卷积input是2×2, output是4×4。 Zero padding, non-unit strides, transposed。 ![](img/ch9/figure_9.1.8_2.png) 上图中的反卷积input feature map是3×3, 转化后是5×5, output是5×5 ### 9.2.8 跳级(skip)结构

对CNN的结果做处理得到了dense prediction而作者在试验中发现得到的分割结果比较粗糙所以考虑加入更多前层的细节信息也就是把倒数第几层的输出和最后的输出做一个fusion实际上也就是加和


实验表明这样的分割结果更细致更准确。在逐层fusion的过程中做到第三行再往下结果又会变差所以作者做到这里就停了。

9.2.9 模型训练

1用AlexNetVGG16或者GoogleNet训练好的模型做初始化在这个基础上做fine-tuning全部都fine-tuning只需在末尾加上upsampling参数的学习还是利用CNN本身的反向传播原理。
2采用whole image做训练不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。
3对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。
举例:
FCN例子: 输入可为任意尺寸图像彩色图像输出与输入尺寸相同深度为20类目标+背景=21模型基于AlexNet。
蓝色:卷积层。
绿色Max Pooling层。
黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。
灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。
对于不同尺寸的输入图像各层数据的尺寸heightwidth相应变化深度channel不变。


1全卷积层部分进行特征提取, 提取卷积层3个蓝色层的输出来作为预测21个类别的特征。

2图中虚线内是反卷积层的运算, 反卷积层3个橙色层可以把输入数据尺寸放大。和卷积层一样升采样的具体参数经过训练确定。

  1. 以经典的AlexNet分类网络为初始化。最后两级是全连接红色参数弃去不用。

2) 从特征小图()预测分割小图(),之后直接升采样为大图。

反卷积橙色的步长为32这个网络称为FCN-32s 3) 升采样分为两次完成橙色×2, 在第二次升采样前把第4个pooling层绿色的预测结果蓝色融合进来。使用跳级结构提升精确性。

第二次反卷积步长为16这个网络称为FCN-16s 4) 升采样分为三次完成橙色×3, 进一步融合了第3个pooling层的预测结果。

第三次反卷积步长为8记为FCN-8s 其他参数: minibatch20张图片。 learning rate0.001。 初始化分类网络之外的卷积层参数初始化为0。 反卷积参数初始化为bilinear插值。 最后一层反卷积固定位bilinear插值不做学习。

9.2.10 FCN缺点

1得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多但是上采样的结果还是比较模糊和平滑对图像中的细节不敏感。
2对各个像素进行分类没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整spatial regularization步骤缺乏空间一致性。

9.3 U-Net

卷积网络被大规模应用在分类任务中输出的结果是整个图像的类标签。然而在许多视觉任务尤其是生物医学图像处理领域目标输出应该包括目标类别的位置并且每个像素都应该有类标签。另外在生物医学图像往往缺少训练图片。所以Ciresan等人训练了一个卷积神经网络用滑动窗口提供像素的周围区域patch作为输入来预测每个像素的类标签。这个网络有两个优点 第一,输出结果可以定位出目标类别的位置; 第二由于输入的训练数据是patches这样就相当于进行了数据增广解决了生物医学图像数量少的问题。
但是,这个方法也有两个很明显缺点。
第一它很慢因为这个网络必须训练每个patch并且因为patch间的重叠有很多的冗余(冗余会造成什么影响呢卷积核里面的W就是提取特征的权重两个块如果重叠的部分太多这个权重会被同一些特征训练两次造成资源的浪费减慢训练时间和效率虽然说会有一些冗余训练集大了准确率不就高了吗可是你这个是相同的图片啊重叠的东西都是相同的举个例子我用一张相同的图片训练20次按照这个意思也是增大了训练集啊可是会出现什么结果呢很显然会导致过拟合也就是对你这个图片识别很准别的图片就不一定了)。
第二定位准确性和获取上下文信息不可兼得。大的patches需要更多的max-pooling层这样减小了定位准确性(为什么因为你是对以这个像素为中心的点进行分类如果patch太大最后经过全连接层的前一层大小肯定是不变的如果你patch大就需要更多的pooling达到这个大小而pooling层越多丢失信息的信息也越多小的patches只能看到很小的局部信息包含的背景信息不够。
这篇论文建立了一个更好全卷积方法。我们定义和扩展了这个方法它使用更少的训练图片但产生更精确的分割。

(1) 使用全卷积神经网络。(全卷积神经网络就是卷积取代了全连接层,全连接层必须固定图像大小而卷积不用,所以这个策略使得,你可以输入任意尺寸的图片,而且输出也是图片,所以这是一个端到端的网络。)
(2) 左边的网络是收缩路径使用卷积和maxpooling。
(3) 右边的网络是扩张路径:使用上采样产生的特征图与左侧收缩路径对应层产生的特征图进行concatenate操作。pooling层会丢失图像信息和降低图像分辨率且是不可逆的操作对图像分割任务有一些影响对图像分类任务的影响不大为什么要做上采样因为上采样可以补足一些图片的信息但是信息补充的肯定不完全所以还需要与左边的分辨率比较高的图片相连接起来直接复制过来再裁剪到与上采样图片一样大小这就相当于在高分辨率和更抽象特征当中做一个折衷因为随着卷积次数增多提取的特征也更加有效更加抽象上采样的图片是经历多次卷积后的图片肯定是比较高效和抽象的图片然后把它与左边不怎么抽象但更高分辨率的特征图片进行连接
(4) 最后再经过两次反卷积操作生成特征图再用两个1X1的卷积做分类得到最后的两张heatmap,例如第一张表示的是第一类的得分第二张表示第二类的得分heatmap,然后作为softmax函数的输入算出概率比较大的softmax类选择它作为输入给交叉熵进行反向传播训练。

下面是U-Net模型的代码实现贡献者黄钦建华南理工大学

def get_unet():
    inputs = Input((img_rows, img_cols, 1))
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
    # pool1 = Dropout(0.25)(pool1)
    # pool1 = BatchNormalization()(pool1)

    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
    # pool2 = Dropout(0.5)(pool2)
    # pool2 = BatchNormalization()(pool2)

    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2)
    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)
    # pool3 = Dropout(0.5)(pool3)
    # pool3 = BatchNormalization()(pool3)

    conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3)
    conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)
    # pool4 = Dropout(0.5)(pool4)
    # pool4 = BatchNormalization()(pool4)

    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4)
    conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5)

    up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=(
        2, 2), padding='same')(conv5), conv4], axis=3)
    # up6 = Dropout(0.5)(up6)
    # up6 = BatchNormalization()(up6)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6)
    conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6)

    up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=(
        2, 2), padding='same')(conv6), conv3], axis=3)
    # up7 = Dropout(0.5)(up7)
    # up7 = BatchNormalization()(up7)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7)
    conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7)

    up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=(
        2, 2), padding='same')(conv7), conv2], axis=3)
    # up8 = Dropout(0.5)(up8)
    # up8 = BatchNormalization()(up8)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8)
    conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8)

    up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=(
        2, 2), padding='same')(conv8), conv1], axis=3)
    # up9 = Dropout(0.5)(up9)
    # up9 = BatchNormalization()(up9)
    conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9)
    conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9)

    # conv9 = Dropout(0.5)(conv9)

    conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9)

    model = Model(inputs=[inputs], outputs=[conv10])

    model.compile(optimizer=Adam(lr=1e-5),
                  loss=dice_coef_loss, metrics=[dice_coef])

    return model

9.4 SegNet

可训练的图像分割引擎包含一个encoder网络一个对应的decoder网络衔接像素级分类层解码网络与VGG16的13层卷积层相同。解码网络是将低分辨率的编码特征图映射到全分辨率的特征图。解码网络使用最大池化层的池化索引进行非线性上采样上采样过程就不需要学习。上采样得到的稀疏图与可训练的滤波器卷积得到致密的特征图。
使用池化层索引进行上采样的优势:
1提升边缘刻画度
2减少训练的参数
3这种上采样模式可以包含到任何编码-解码网络中。
SegNet网络的结构如下图所示

SegNet网络结构如图1所示Input为输入图片Output为输出分割的图像不同颜色代表不同的分类。语义分割的重要性就在于不仅告诉你图片中某个东西是什么而且告知你他在图片的位置。我们可以看到是一个对称网络由中间绿色pooling层与红色upsampling层作为分割左边是卷积提取高维特征并通过pooling使图片变小SegNet作者称为Encoder右边是反卷积在这里反卷积与卷积没有区别与upsampling通过反卷积使得图像分类后特征得以重现upsampling使图像变大SegNet作者称为Decoder最后通过Softmax输出不同分类的最大值。这就是大致的SegNet过程下面对这个过程里面使用到的方法进行介绍。
编码网络与滤波器族卷积得到特征图进行BNReLU最大池化。最大池化是为了获得空间小位移的平移不变。最大池化和下采样损失了边缘细节因此在编码过程中保存边缘信息很重要。考虑到内存原因只保存最大池化索引如最大特征值的位置。
SegNet解码技术如下图所示

解码网络使用保存的最大池化索引上采样得到稀疏的特征图将特征图与可训练的解码滤波器族卷积得到致密的特征图。之后进行BN。高维的特征图输入soft-max层对每个像素进行分类得到每个像素属于K类的概率。 图3中右边是FCN的解码技术FCN对编码的特征图进行降维降维后输入到解码网络解码网络中上采样使用反卷积实现上采样的特征图与降维的编码图进行element-wise add得到最终的解码特征图。FCN解码模型需要存储编码特征图在嵌入式设备中内存紧张。
SegNet的Encoder过程中卷积的作用是提取特征SegNet使用的卷积为same卷积详见卷积神经网络CNN1)即卷积后不改变图片大小在Decoder过程中同样使用same卷积不过卷积的作用是为upsampling变大的图像丰富信息使得在Pooling过程丢失的信息可以通过学习在Decoder得到。SegNet中的卷积与传统CNN的卷积并没有区别。

9.5 空洞卷积(Dilated Convolutions)

在图像分割领域图像输入到CNN典型的网络比如FCN[3]FCN先像传统的CNN那样对图像做卷积再pooling降低图像尺寸的同时增大感受野但是由于图像分割预测是pixel-wise的输出所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测upsampling一般采用deconv反卷积操作deconv可参见知乎答案如何理解深度学习中的deconvolution networks之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键一个是pooling减小图像尺寸增大感受野另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中肯定有一些信息损失掉了那么能不能设计一种新的操作不通过pooling也能有较大的感受野看到更多的信息呢答案就是dilated conv。
以前的CNN主要问题总结
1Up-sampling / pooling layer
2内部数据结构丢失空间层级化信息丢失。
3小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
举例如下:

Dilated Convolution with a 3 x 3 kernel and dilation rate 2 下面看一下dilated conv原始论文[4]中的示意图

(a) 图对应3x3的1-dilated conv和普通的卷积操作一样(b)图对应3x3的2-dilated conv实际的卷积kernel size还是3x3但是空洞为1也就是对于一个7x7的图像patch只有9个红色的点和3x3的kernel发生卷积操作其余的点略过。也可以理解为kernel的size为7x7但是只有图中的9个点的权重不为0其余都为0。 可以看到虽然kernel size只有3x3但是这个卷积的感受野已经增大到了7x7如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话那么每个红点就是1-dilated的卷积输出所以感受野为3x3所以1-dilated和2-dilated合起来就能达到7x7的conv,(c)图是4-dilated conv操作同理跟在两个1-dilated和2-dilated conv的后面能达到15x15的感受野。对比传统的conv操作3层3x3的卷积加起来stride为1的话只能达到(kernel-1) * layer+1=7的感受野也就是和层数layer成线性关系而dilated conv的感受野是指数级的增长。
dilated的好处是不做pooling损失信息的情况下加大了感受野让每个卷积输出都包含较大范围的信息。在图像需要全局信息或者语音文本需要较长的sequence信息依赖的问题中都能很好的应用dilated conv比如图像分割、语音合成WaveNet、机器翻译ByteNet中。

9.6 RefineNet

网络结构:
RefineNet block的作用就是把不同resolution level的feature map进行融合。网络结构如下


最左边一栏就是FCN的encoder部分(文中是用的ResNet)先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine最后得到一个refined feature map(接softmax再双线性插值输出)。 注意除了RefineNet-4所有的RefineNet block都是二输入的用于融合不同level做refine而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。

RefineNet Block
接下来仔细看一下RefineNet block可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map但具体的实现应该是和输入个数、shape无关的。

Residual convolution unit就是普通的去除了BN的residual unit

Multi-resolution fusion是先对多输入的feature map都用一个卷积层进行adaptation(都化到最小的feature map的shape)再上采样再做element-wise的相加。注意如果是像RefineNet-4那样的单输入block这一部分就直接pass了

Chained residual pooling中的ReLU对接下来池化的有效性很重要还可以使模型对学习率的变化没这么敏感。这个链式结构能从很大范围区域上获取背景context。另外这个结构中大量使用了identity mapping这样的连接无论长距离或者短距离的这样的结构允许梯度从一个block直接向其他任一block传播。

Output convolutions就是输出前再加一个RCU。

9.7 PSPNet

场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的.本文使用文中的pyramid pooling module实现基于不同区域的上下文集成提出了PSPNet实现利用上下文信息的能力进行场景解析。
作者认为FCN存在的主要问题是没有采取合适的策略来用全局的信息本文的做法就是借鉴SPPNet来设计了PSPNet解决这个问题。
很多State-of-the-art的场景解析框架都是基于FCN的.基于CNN的方法能够增强动态物体的理解但是在无限制词汇和不同场景中仍然面临挑战.举个例子,如下图.


FCN认为右侧框中是汽车但是实际上是船如果参考上下文的先验知识就会发现左边是一个船屋进而推断是框中是船.FCN存在的主要问题就是不能利用好全局的场景线索。

对于尤其复杂的场景理解之前都是采用空间金字塔池化来做的和之前方法不同为什么不同需要参考一下经典的金字塔算法本文提出了pyramid scene parsing network(PSPNet)。
本文的主要贡献如下:
(1) 提出了PSPNet在基于FCN的框架中集成困难的上下文特征
(2) 通过基于深度监督误差开发了针对ResNet的高效优化策略
(3) 构建了一个用于state-of-the-art的场景解析和语义分割的实践系统具体是什么
通过观察FCN的结果发现了如下问题
(1) 关系不匹配Mismatched Relationship
(2) 易混淆的类别Confusion Categories
(3) 不显眼的类别Inconspicuous Classes
总结以上结果发现以上问题部分或者全部与上下文关系和全局信息有关系因此本文提出了PSPNet.框架如下:


并且加入额外的深度监督 Loss

9.8 DeepLab系列

9.8.1 DeepLabv1

DeepLab 是结合了深度卷积神经网络DCNNs和概率图模型DenseCRFs的方法。
在实验中发现 DCNNs 做语义分割时精准度不够的问题,根本原因是 DCNNs 的高级特征的平移不变性,即高层次特征映射,根源于重复的池化和下采样。
针对信号下采样或池化降低分辨率DeepLab 是采用的 atrous带孔算法扩展感受野获取更多的上下文信息。
分类器获取以对象中心的决策是需要空间变换的不变性,这天然地限制了 DCNN 的定位精度DeepLab 采用完全连接的条件随机场CRF提高模型捕获细节的能力。
除空洞卷积和 CRFs 之外,论文使用的 tricks 还有 Multi-Scale features。其实就是 U-Net 和 FPN 的思想,在输入图像和前四个最大池化层的输出上附加了两层的 MLP第一层是 128 个 3×3 卷积,第二层是 128 个 1×1 卷积。最终输出的特征与主干网的最后一层特征图融合,特征图增加 5×128=640 个通道。
实验表示多尺度有助于提升预测结果,但是效果不如 CRF 明显。
论文模型基于 VGG16在 Titan GPU 上运行速度达到了 8FPS全连接 CRF 平均推断需要 0.5s ,在 PASCAL VOC-2012 达到 71.6% IOU accuracy。

9.8.2 DeepLabv2

DeepLabv2 是相对于 DeepLabv1 基础上的优化。DeepLabv1 在三个方向努力解决但是问题依然存在特征分辨率的降低、物体存在多尺度DCNN 的平移不变性。
因 DCNN 连续池化和下采样造成分辨率降低DeepLabv2 在最后几个最大池化层中去除下采样,取而代之的是使用空洞卷积,以更高的采样密度计算特征映射。
物体存在多尺度的问题DeepLabv1 中是用多个 MLP 结合多尺度特征解决,虽然可以提供系统的性能,但是增加特征计算量和存储空间。
论文受到 Spatial Pyramid Pooling (SPP) 的启发,提出了一个类似的结构,在给定的输入上以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文,称为 ASPP (atrous spatial pyramid pooling) 模块。
DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF 在增强模型捕捉细节的能力。
论文模型基于 ResNet在 NVidia Titan X GPU 上运行速度达到了 8FPS全连接 CRF 平均推断需要 0.5s ,在耗时方面和 DeepLabv1 无差异,但在 PASCAL VOC-2012 达到 79.7 mIOU。

9.8.3 DeepLabv3

好的论文不止说明怎么做还告诉为什么。DeepLab 延续到 DeepLabv3 系列,依然是在空洞卷积做文章,但是探讨不同结构的方向。
DeepLabv3 论文比较了多种捕获多尺度信息的方式:

1.Image Pyramid将输入图片放缩成不同比例分别应用在 DCNN 上,将预测结果融合得到最终输出。
2.Encoder-Decoder利用 Encoder 阶段的多尺度特征,运用到 Decoder 阶段上恢复空间分辨率,代表工作有 FCN、SegNet、PSPNet 等工。
3.Deeper w. Atrous Convolution在原始模型的顶端增加额外的模块例如 DenseCRF捕捉像素间长距离信息。
4.Spatial Pyramid Pooling空间金字塔池化具有不同采样率和多种视野的卷积核能够以多尺度捕捉对象。
DeepLabv1-v2 都是使用带孔卷积提取密集特征来进行语义分割。但是为了解决分割对象的多尺度问题DeepLabv3 设计采用多比例的带孔卷积级联或并行来捕获多尺度背景。
此外DeepLabv3 将修改之前提出的带孔空间金字塔池化模块,该模块用于探索多尺度卷积特征,将全局背景基于图像层次进行编码获得特征,取得 state-of-art 性能,在 PASCAL VOC-2012 达到 86.9 mIOU。

9.8.4 DeepLabv3+

语义分割关注的问题:
1、 实例对象多尺度问题。
2、 因为深度网络存在stride=2的层会导致feature分辨率下降从而导致预测精度降低而造成的边界信息丢失问题。
deeplab V3新设计的aspp结构解决了问题1deeplab v3+主要目的在于解决问题2。
问题2 可以使用空洞卷积替代更多的pooling层来获取分辨率更高的feature。但是feature分辨率更高会极大增加运算量。以deeplab v3使用的resnet101为例stride=16将造成后面9层feature变大后面9层的计算量变为原来的2*2=4倍大。stride=8则更为恐怖后面78层的计算量都会变大很多。
解决方案1、编解码器结构2 Modified Aligned Xception

在deeplabv3基础上加入解码器。A是aspp结构其中8x的上采样可以看做是一个解码器。B是编解码结构它集合了高层和底层的特征。C就是本文采取的结构。 方法:
1Encoder-Decoder with Atrous Convolution

编码器采用deeplabv3。
解码器部分先从低层级选一个feature将低层级的feature用1 * 1的卷积进行通道压缩原本为256通道或者512通道目的在于减少低层级的比重。作者认为编码器得到的feature具有更丰富的信息所以编码器的feature应该有更高的比重。 这样做有利于训练。
再将编码器的输出上采样使其分辨率与低层级feature一致。举个例子如果采用resnet conv2 输出的feature则这里要* 4上采样。将两种feature连接后再进行一次3 * 3的卷积细化作用然后再次上采样就得到了像素级的预测。后面的实验结果表明这种结构在 stride=16 时既有很高的精度速度又很快。stride=8相对来说只获得了一点点精度的提升但增加了很多的计算量。
2Modified Aligned Xception
Xception主要采用了deepwish seperable convolution来替换原来的卷积层。简单的说就是这种结构能在更少参数更少计算量的情况下学到同样的信息。这边则是考虑将原来的resnet-101骨架网换成xception。

红色部分为修改
更多层重复8次改为16次基于MSRA目标检测的工作
将原来简单的pool层改成了stride为2的deepwish seperable convolution。
额外的RELU层和归一化操作添加在每个 3 × 3 depthwise convolution之后原来只在1 * 1卷积之后

9.9 Mask-R-CNN

9.9.1 Mask-RCNN 的网络结构示意图

其中黑色部分为原来的Faster-RCNN红色部分为在Faster网络上的修改
1将ROI Pooling层替换成了ROIAlign
2添加并列的FCN层Mask层
先来概述一下Mask-RCNN的几个特点来自于PaperMask R-CNN的Abstract
1在边框识别的基础上添加分支网络用于语义Mask识别
2训练简单相对于Faster仅增加一个小的Overhead可以跑到5FPS
3可以方便的扩展到其他任务比如人的姿态估计等
4不借助Trick在每个任务上效果优于目前所有的 single-model entries包括 COCO 2016 的Winners。

9.9.2 RCNN行人检测框架

来看下后面两种RCNN方法与Mask结合的示意图:


图中灰色部分是原来的RCNN结合ResNet or FPN的网络下面黑色部分为新添加的并联Mask层这个图本身与上面的图也没有什么区别旨在说明作者所提出的Mask RCNN方法的泛化适应能力可以和多种RCNN框架结合表现都不错。

9.9.3 Mask-RCNN 技术要点

1.技术要点1 - 强化的基础网络
通过ResNeXt-101+FPN用作特征提取网络达到state-of-the-art的效果。
2.技术要点2 - ROIAlign
采用ROIAlign替代RoiPooling改进池化操作。引入了一个插值过程先通过双线性插值到1414再pooling到77很大程度上解决了仅通过Pooling直接采样带来的Misalignment对齐问题。
PS 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
后面我们把结果对比贴出来Table2 c & d能够看到 ROIAlign 带来较大的改进可以看到Stride 越大改进越明显。
3.技术要点3 - Loss Function
每个ROIAlign对应K * m^2维度的输出。K对应类别个数即输出K个maskm对应池化分辨率7 * 7。Loss函数定义


Lmask(Cls_k)=Sigmoid(Cls_k)

Lmask(Cls_k) = Sigmoid (Cls_k),平均二值交叉熵 average binary cross-entropyLoss通过逐像素的 Sigmoid 计算得到。
Why K个mask通过对每个 Class 对应一个Mask可以有效避免类间竞争其他Class不贡献Loss


通过结果对比来看Table2 b也就是作者所说的 Decouple 解耦要比多分类的Softmax效果好很多。
另外作者给出了很多实验分割效果就不都列了只贴一张和FCIS的对比图FCIS出现了Overlap的问题

9.10 CNN在基于弱监督学习的图像分割中的应用

答案来源:CNN在基于弱监督学习的图像分割中的应用

最近基于深度学习的图像分割技术一般依赖于卷积神经网络CNN的训练训练过程中需要非常大量的标记图像即一般要求训练图像中都要有精确的分割结果。
对于图像分割而言要得到大量的完整标记过的图像非常困难比如在ImageNet数据集上有1400万张图有类别标记有50万张图给出了bounding box,但是只有4460张图像有像素级别的分割结果。对训练图像中的每个像素做标记非常耗时特别是对医学图像而言完成对一个三维的CT或者MRI图像中各组织的标记过程需要数小时。
如果学习算法能通过对一些初略标记过的数据集的学习就能完成好的分割结果,那么对训练数据的标记过程就很简单,这可以大大降低花在训练数据标记上的时间。这些初略标记可以是:
1、只给出一张图像里面包含哪些物体
2、给出某个物体的边界框
3、对图像中的物体区域做部分像素的标记例如画一些线条、涂鸦等scribbles)。

9.10.1 Scribble标记

论文地址:ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation (CVPR 2016)
香港中文大学的Di Lin提出了一个基于Scribble标记的弱监督学习方法。Scribble是一个很方便使用的标记方法因此被用得比较广泛。如下图只需要画五条线就能完成对一副图像的标记工作。


ScribbleSup分为两步第一步将像素的类别信息从scribbles传播到其他未标记的像素自动完成所有的训练图像的标记工作 第二步使用这些标记图像训练CNN。在第一步中该方法先生成super-pxels, 然后基于graph cut的方法对所有的super-pixel进行标记。

Graph Cut的能量函数为


\sum_{i}\psi _i\left(y_i|X,S\right)+\sum_{i,j}\psi_{ij}\left(y_i,y_j,X\right)

在这个graph中每个super-pixel是graph中的一个节点相接壤的super-pixel之间有一条连接的边。这个能量函数中的一元项包括两种情况一个是来自于scribble的一个是来自CNN对该super-pixel预测的概率。整个最优化过程实际上是求graph cut能量函数和CNN参数联合最优值的过程


\sum_{i}\psi _i^{scr}\left(y_i|X,S\right)+\sum _i-logP\left(y_i| X,\theta\right)+\sum_{i,j}\psi _{ij}\left(y_i,y_j|X\right)

上式的最优化是通过交替求 Y\theta 的最优值来实现的。文章中发现通过三次迭代就能得到比较好的结果。

9.10.2 图像级别标记

论文地址:Constrained Convolutional Neural Networks for Weakly Supervised Segmentation ICCV 2015
UC Berkeley的Deepak Pathak使用了一个具有图像级别标记的训练数据来做弱监督学习。训练数据中只给出图像中包含某种物体但是没有其位置信息和所包含的像素信息。该文章的方法将image tags转化为对CNN输出的label分布的限制条件因此称为 Constrained convolutional neural network (CCNN).


该方法把训练过程看作是有线性限制条件的最优化过程:


\underset{\theta ,P}{minimize}\qquad D(P(X)||Q(X|\theta ))\\
subject\to\qquad A\overrightarrow{P} \geqslant \overrightarrow{b},\sum_{X}^{ }P(X)=1

其中的线性限制条件来自于训练数据上的标记例如一幅图像中前景类别像素个数期望值的上界或者下界物体大小、某个类别的像素个数在某图像中为0或者至少为1等。该目标函数可以转化为为一个loss function然后通过SGD进行训练。


实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%加上物体大小的限制条件后能达到45.1%如果再使用bounding box做限制可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。

9.10.3 DeepLab+bounding box+image-level labels**

论文地址:Weakly-and Semi-Supervised Learning of a DCNN for Semantic Image Segmentation
Google的George Papandreou 和UCLA的Liang-Chieh Chen等在DeepLab的基础上进一步研究了使用bounding box和image-level labels作为标记的训练数据。使用了期望值最大化算法EM来估计未标记的像素的类别和CNN的参数。


对于image-level标记的数据我们可以观测到图像的像素值和图像级别的标记 ,但是不知道每个像素的标号,因此把y当做隐变量。使用如下的概率图模式:


P\left ( x,y,z;\theta \right ) = P\left ( x \right )\left (\prod_{m=1}^{M} P\left ( y_m|x;\theta \right )\right )P\left ( z|y \right )

这篇论文是通过EM算法来学习模型的参数\theta,具体推导过程可参考原论文。


对于给出bounding box标记的训练图像该方法先使用CRF对该训练图像做自动分割然后在分割的基础上做全监督学习。通过实验发现单纯使用图像级别的标记得到的分割效果较差但是使用bounding box的训练数据可以得到较好的结果在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。

9.10.4 统一的框架

论文地址:Learning to Segment Under Various Forms of Weak Supervision (CVPR 2015)

Wisconsin-Madison大学的Jia Xu提出了一个统一的框架来处理各种不同类型的弱标记图像级别的标记、bounding box和部分像素标记如scribbles。该方法把所有的训练图像分成共计n个super-pixel对每个super-pixel提取一个d维特征向量。因为不知道每个super-pixel所属的类别相当于无监督学习因此该方法对所有的super-pixel做聚类使用的是最大间隔聚类方法(max-margin clustering, MMC),该过程的最优化目标函数是:


\underset{W,H}{min} \qquad  \frac{1}{2}tr\left ( W^TW \right ) + \lambda\sum_{p=1}^{n}\sum_{c=1}^{C}\xi \left ( w_c;x_p;h_p^c \right)

在这个目标函数的基础上,根据不同的弱标记方式,可以给出不同的限制条件,因此该方法就是在相应的限制条件下求最大间隔聚类。

该方法在Siftflow数据集上得到了比较好的结果比state-of-the-art的结果提高了10%以上。

小结在弱标记的数据集上训练图像分割算法可以减少对大量全标记数据的依赖在大多数应用中会更加贴合实际情况。弱标记可以是图像级别的标记、边框和部分像素的标记等。训练的方法一般看做是限制条件下的最优化方法。另外EM算法可以用于CNN参数和像素类别的联合求优。

9.10.5 弱监督分割最新进展(贡献者:明奇-北京理工大学)

  • bbox监督
  1. Learning to Segment via Cut-and-PasteECCV 2018

    利用GAN对抗学习的思想在cut-paste思想指导下利用bbox弱监督进行实例分割。
    采用对抗学习的思想网络主体分为两大部分mask生成器和合成图像判别器。具体过程为1在图像上截取gt经过特征提取后预测一个bbox内gt的mask2在原图上随机cut一个背景图像将bbox内按照生成的mask提取出物体分割结果然后paste到原图裁剪的背景上去3合成的图像经过判别器进行真假判断。 通过生成器生成更好mask来使得判别器更难判别在对抗学习中提升两者的性能逐渐获得更好的结果 .

  2. Simple Does It: Weakly Supervised Instance and Semantic SegmentationCVPR2017 本文做的是bbox弱监督语义/实例分割任务,能达到全监督分割效果(DeepLabv1)的95%。主要工作为讨论了使用弱监督语义标签进行迭代训练的方法以及其限制和不足之处证明了通过类似GrabCut的算法能通过bbox生成分割训练标签方法的可行性可以避免像上面的迭代方法重新调整网络训练策略在VOC数据集上逼近监督学习的分割任务效果。 作者的启发是将bbox level的mask送入网络训练后得到分割mask的比输入的bbox mask要好这是很好的insight。因此启发的操作是将bbox level标注作为初始mask输入优化每次得到的标注作为gt进行下一轮的迭代从而不断获得更好的效果。效果图如下 在此基础上再加上优化的GrabCut+算法以及部分区域的筛选以及BSDS500的边界预测信息整合到一起能够达到很好的弱监督迭代分割效果。

  • 分类监督
  1. Weakly Supervised Learning of Instance Segmentation with Inter-pixel Relations(CVPR2019) 使用分类标注作为弱监督信息在CAM提取到特征的基础上进一步设计IRNet学习额外的特征约束从而到达更好的弱监督实例分割效果。为了解决CAM应用到实例分割的上述局限设计IRNet。其组成为两部分1不分类别的实例响应图 2pairwise semantic affinitie。其中通过不分类别的实例响应图和CAM结合约束后得到instance-wise CAMS另一个分支预先预测物体的边界然后得到pairwise semantic affinitie关于这个的论文参考Related Work的对应部分有相应的方法暂时不深究进行融合和处理得到最终的分割。整体流程如下

  2. Weakly Supervised Instance Segmentation using Class Peak ResponseCVPR2018 本文使用图像级的类别标注监督信息通过探索类别响应峰值使分类网络能够很好地提取实例分割mask。本工作是使用图像级标注进行弱监督实例分割的首个工作。 在分类监督信息之下CNN网络会产生一个类别响应图每个位置是类别置信度分数。其局部极大值往往具有实例很强视觉语义线索。首先将类别峰值响应图的信息进行整合然后反向传播将其映射到物体实例信息量较大的区域如边界。上述从类别极值响应图产生的映射图称为Peak Response Maps (PRMs),该图提供了实例物体的详细表征,可以很好地用作分割监督信息。 具体流程如图: 首先将图片经过正常的分类网络训练其中在类别预测响应图上提取出局部响应极值点进行增强卷积后预测出PRM。然后结合多种信息进行推断生成mask。

  3. Weakly Supervised Semantic Segmentation Using Superpixel Pooling NetworkAAAI 2017 本文介绍通过类别标注的标签实现弱监督语义分割的方法。该方法在语义分割mask生成和使用生成mask学习分割生成网络之间反复交替。要实现这种交替迭代学习关键点就是如何利用类别标注得到较准确的初始分割。为了解决这一问题,提出了Superpixel Pooling Network (SPN),将输入图像的超像素分割结果作为低阶结构的表征,辅助语义分割的推断。 首先是SPN生成初始mask然后用另一个网络DecoupledNet来学习每个像素的mask标注。其中该分割网络将语义分割任务解耦为分类和分割两个子任务并且能够从类别标注中学习形状先验知识用于辅助分割。

9.11 DenseNet贡献者黄钦建华南理工大学

这篇论文是CVPR2017年的最佳论文。

卷积神经网络结构的设计主要朝着两个方向发展一个是更宽的网络代表GoogleNet、VGG一个是更深的网络代表ResNet。但是随着层数的加深会出现一个问题——梯度消失这将会导致网络停止训练。到目前为止解决这个问题的思路基本都是在前后层之间加一个identity connections(short path)。

由上图中可知Resnet是做值的相加也就是add操作通道数是不变的。而DenseNet是做通道的合并也就是Concatenation操作就像Inception那样。从这两个公式就可以看出这两个网络的本质不同。此外DensetNet的前面一层输出也是后面所有层的输入这也不同于ResNet残差网络。

DenseNet的Block结构如上图所示。

1*1卷积核的目的减少输入的特征图数量这样既能降维减少计算量又能融合各个通道的特征。我们将使用BottleNeck Layers的DenseNet表示为DenseNet-B。(在论文的实验里将1×1×n小卷积里的n设置为4kk为每个H产生的特征图数量)

上图是DenseNet网络的整体网络结构示意图。其中1*1卷积核的目的是进一步压缩参数并且在Transition Layer层有个参数Reduction范围是0到1表示将这些输出缩小到原来的多少倍默认是0.5这样传给下一个Dense Block的时候channel数量就会减少一半。当Reduction的值小于1的时候我们就把带有这种层的网络称为DenseNet-C。

DenseNet网络的优点包括

  • 减轻了梯度消失
  • 加强了feature的传递
  • 更有效地利用了feature 
  • 一定程度上较少了参数数量
  • 一定程度上减轻了过拟合

9.12 图像分割的常用数据集

9.12.1 PASCAL VOC

VOC 数据集分为20类包括背景为21类分别如下

  • Person: person
  • Animal: bird, cat, cow, dog, horse, sheep
  • Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
  • Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor

VOC 数据集中用于分割比赛的图片实例如下包含原图以及图像分类分割和图像物体分割两种图PNG格式。图像分类分割是在20种物体中ground-turth图片上每个物体的轮廓填充都有一个特定的颜色一共20种颜色。

9.12.2 MS COCO

MS COCO 是最大图像分割数据集,提供的类别有 80 类,有超过 33 万张图片,其中 20 万张有标注,整个数据集中个体的数目超过 150 万个。MS COCO是目前难度最大挑战最高的图像分割数据集。

9.12.3 Cityscapes

Cityscapes 是驾驶领域进行效果和性能测试的图像分割数据集它包含了5000张精细标注的图像和20000张粗略标注的图像这些图像包含50个城市的不同场景、不同背景、不同街景以及30类涵盖地面、建筑、交通标志、自然、天空、人和车辆等的物体标注。Cityscapes评测集有两项任务像素级Pixel-level图像场景分割以下简称语义分割与实例级Instance-level图像场景分割以下简称实例分割

9.13 全景分割(贡献者:北京理工大学--明奇)

全景分割的开山之作:何恺明的Panoptic Segmentation

  1. Introduction

语义分割通过带孔全卷积网络根据不同的stuff进行划分实例分割则是在目标检测的基础上基于检测框进行物体的分割。缺少一种框架可以将两者进行融合实现既能分割背景又能分割实例而这在自动驾驶和AR技术中大有作为。由此提出的全景分割任务能将两者进行结合。

全景分割的思路很直观为图像的每个像素分配语义label和类内实例id前者用于区分语义信息后者用于分割实例因此stuff不具有实例id。提出全景分割时只是启发式地将语意分割和实例分割两种任务的输出进行后处理的融合如NMS并以此建立PS任务的baseline。为了评价全景分割的质量提出panoptic quality (PQ) 标准,将背景和物体的评价纳入一个完整的框架下。示意图如下:

  1. Panoptic Segmentation
  • Task format
    全景分割的标注方法:
    像素级的标注标出类别label和类内实例id。如果某像素的这两个信息都能匹配则可以将该像素匹配到某个类别和实例中去类外的像素可以分配空标签即并不是所有的像素都要有语义类别。

  • Stuff and thing labels
    对于stuff和thing背景填充和物体实例的标签交集是空集并集是所有可能的label空间。这两者是互相独立不相关的很好理解像素属于那个类和它属于哪个物体不具有相关性

  • Relationship
    都是像素级的label需要为每个像素分配对应的标签。但是实例分割基于region的允许重叠的segmentation而全景分割和语义分割一样是像素级的label不允许重叠标签的出现。

  • Confidence scores
    这一点上更像语义分割而不是实例分割对于PS不需要置信分数评价分割质量。提到这个作者认为语义分割和全景分割可以直接利用人工标注的label进行对比从而评价当前mask的质量而实例分割在选择mask时评价的是分类置信度这个并没有人工标注进行参考因此难以把握。

  1. Panoptic Segmentation Metric
    用于衡量全景分割效果的指标应具有完备性可解释性简洁性。由是提出了PQ指标可分为两步分割匹配、在匹配上进行计算PQ。

3.1 Segment Matching
定义match预测的segmentation和gt的iou大于0.5说明两者can match。再结合全景分割的不可重叠性不难得到最多只有一个预测的segmentation可以match gt。

3.2 PQ Computation
PQ的计算类似mAP也是类内求取然后求类间的平均值以便不敏感类别不平衡。对于每一类可以根据gt与预测的segmentation分为三类下图描述

TP: 预测为正实际为正描述match较好的
FP: 预测为正实际为负描述match错的
FN: 预测为负实际为正描述没match出来的gt
通过上述三类可以计算得到PQ值公式

式中出去FP与FN后剩下的式子描述的是match的segmentation的平均IoU加上FP与FN是为了惩罚match失败的分割实例。
有意思的是,对上述式子进行简单的恒等变化:

第一项评价的是match分割的质量第二项类似于F1得分。因此可以PQ分解为

PQ=SQ*RQ
  • Void labels
    gt中可能出现两种像素标注为空的情况超出类别的像素和模糊不清的像素难以分类。在评估结果时这些空的标签不予以评估。具体而言
    1在matching部分预测出为void的像素会被移出prediction并不参与IoU计算
    2matching后unmatched prediction按照一般情况会计算FP FN但是对于空标签情况如果该prediction含有的void像素块超过一定匹配阈值就会被移除并不算作FP计算得分。

  • Group labels
    有时区分相同语义类别的实例个体标注比较困难因此有提出组标签的标注方法。但对于PQ计算而言
    1matching部分不使用组标签而是严格区分实例
    2matching后对于包含一部分相同类别像素点的unmatched predicted segments这一部分将被去除并不视作false positives

3.3 Comparison to Existing Metrics

  • Semantic segmentation metrics
    衡量语义分割的标准有像素级精度平均精度IoU。但是其只专注于像素级的划分不能反映物体实例级别的分割性能。

  • Instance segmentation metrics
    度量为AP主要是引入了置信度分数confidence score对检测目标进行打分。两者不是完全的隔绝实例分割也有用IoU监督的而confidence score是否能够反映mask的真实质量也有存疑过这个标准也不是固定的

  • Panoptic quality
    PQ的度量可以分解成SQ和RQSQ反映了语义分割的像素级IoU性能RQ专注于检测识别的效果因此将两者统一到一个框架下。

分割效果:




TODO
  • 图像分割数据集标注工具
  • 图像分割评价标准
  • 全景分割
  • UNet++