vcjmhg 的个人博客

自律者自由

  menu

语义分割之deeplab v1

概述

首先我们简单考虑一下什么是语义分割

语义分割是从粗推理到精推理的自然步骤。原点可以定位在分类,分类包括对整个输入进行预测。下一步是本地化/检测,它不仅提供类,还提供关于这些类的空间位置的附加信息。最后,语义分割通过对每个像素进行密集的预测、推断标签来实现细粒度的推理,从而使每个像素都被标记为其封闭对象区域的类别。

image-20200728222339597

其实简单来说,**语义分割就是像素级别的图像分类。**我们以下边一幅图为例:左侧是原图,右侧是经过图像分割之后的图片,结果图中我们可以看到,经过图片分割后,不同类别的物体,例如行人飞机、房子等被分别标记成不同的颜色。

Deeplabv1 是谷歌 14 年提出的语义分割算法,它解决语义分割分割问题的基本思想就将卷积神经网络(DCNNs)和概率图模型(DenseCRFs)进行结合。简单来说,DeepLab 是结合了深度卷积神经网络(DCNNs)和概率图模型(DenseCRFs)的方法。具体结合方式是这样的:将每个像素视为 CRF 节点,利用远程依赖关系,并使用 CRF 推理直接优化 DCNN 的损失函数。

算法

image-20200728222746963

整个算法处理过程是这样的:首先对输入的图片经过 DCNN 网络处理,得到其初步的得分图,然后通过双线性插值,扩大图片尺寸,进而经过全连接 CRF 处理之后,最后输出结果图。

在语义分割任务中,DCNN 存在两个问题:

  1. 最大池化和下采样操作压缩了图像分辨率。一般语义分割来说通过将网络的全连接层改为卷积层,获取得分图(或称为概率图、热图),然后对其上采样、反卷积等操作还原与输入图像同样大小。如果压缩太厉害,还原后分辨率就会比较低,因此我们希望获得更为稠密(dense)的得分图;
  2. 对空间变换的不变性限制了模型的精度,网络丢失了很多细节,获得的概率图会比较模糊,我们希望获得更多的细节。

天若 OCR_202007282203500SS

**在该文章中,提出使用空洞算法和全连接 CRF 分别解决这两个问题。**下边我们具体展开来说。首先是 DCNN 的设计,DCNN 是由 VGG16 网络变换过来的,具体变换过程是这样的:

  1. 首先我们知道在 VGG16 中,卷积层的卷积核大小统一为 3*3,步长为 1,最大池化层的池化窗口为 2 * 2 ,步长为 2 。在变换的时候,首先现将先将 VGG16 的 FC 层转为卷积层,这样就变成了的全卷积神经网络。
  2. 第二步将 pool4 和 pool5 的步长由 2 改为 1, 这样在原本 FC7 的位置,VGG 网络总的步长由原来的 32 变为 8。 (展开来说:一般来说,池化层的步长为 2,池化后输出大小变为输入大小的一半。原 VGG16 模型有 5 次池化,缩小 2^5=32 倍,修改后的 VGG16 有 3 次补步长为 2 的池化,缩小 2^3=8 倍,两次步长为 1 的池化,输出大小基本不变,所以说 VGG 网络总的步长由原来的 32 变为 8。)
  3. 在经过前两步之后,由于采样率的减少,使得得分图(score map)会变得稀疏,为了得到更加稠密(步幅 8)的得分图,我们在最后的两个最大池化层不进行下采样(padding 到原大小),而是通过 2 或 4 的采样率的空洞卷积对特征图做采样,扩大感受野,缩小步幅。

空洞卷积具体过程是怎样的那?

image-20200728224132221

首先我们看上边这个图,这个是作者论文中给定图,是在一维条件下,空洞卷积的作用过程,其中卷积核大小是 3,输入步长是 2,输出步长是 1。可能在一维条件下,不太直观。因此我找到了一个二维图的空洞卷积过程如下图所示:

image-20200728224251399

其中蓝色部分是输入:7×7 的图像;青色部分是输出:3×3 的图像;空洞卷积核:3×3 采样率(扩展率)为 2 。我们非常直观的看到上边,每 9 个输入对应一个输出。从而实现得分图的稠密化。

前边我们通过对 VGG16 进行变换形成了 DCNN,但在实际使用过程中仍然有两个问题:

  1. 在使用 VGG-16 网络的情况下,如果网络应用卷积,其感受野是 224×224(零填充)和 404×404。 作者认为这种感受野大小太大,无法保证良好的定位精度。
  2. 将网络转换为完全卷积的网络之后,第一个全连接层具有 4,096 个大小的 7×7 空间大小的滤波器,这十分消耗计算资源。

因此作者想出通过卷积网络控制感受野的大小,具体来说将第一个 FC 层空间抽样到 4×4 空间大小,这样之后能够将网络的感受野减少到 128×128(零填充)或 308×308(卷积模式),并将第一个 FC 层的计算时间缩短了 3 倍。

image-20200728224957253

前边在通过 DCNN 网络处理的过程中,不断向下采样,原来的位置信息会随着深度减少甚至消失。最后导致分类结果变得十分平滑,但最后我们想要的结果它的细节应该是突出的。从这个图中我们可以看到经过 DCNN 处理之后,飞机的边界变得十分模糊。然后经过 CRF 处理之后飞机的分类边界变得越来越清晰。CRF 在传统图像处理上主要做平滑处理。这跟我此处的使用场景刚好相反,我们需要的是锐化,因此作者对传统的 CRF 进行改良,二元势能函数使用的是高斯核,并且任意两个像素点都有此项,因此被称为全连接 CRF。

image-20200728225104963

此外为了获得更好的边界信息,作者还增加了一个多尺度预测。具体来说就是在输入图片与前四个 max pooling 后添加 MLP,得到预测结果。最终输出的特征映射送到模型的最后一层辅助预测,合起来模型最后的 softmax 层输入特征多了 640 个通道。虽然,多尺度预测处理效果不如全连接 CRF,但也有一定效果,并且作者最终两个模型都用上了,即最终模型是结合了全连接 CRF 与多尺度预测。

实验

item set
数据集 PASCAL VOC 2012 segmentation benchmark
DCNN 模型 权重采用预训练的 VGG16
交叉熵
训练器 SGD,batch=20
学习率 初始为 0.001,最后的分类层是 0.01。每 2000 次迭代乘 0.1
权重 0.9 的动量, 0.0005 的衰减

为了验证 deeplab 算法的效果,作者设计了一系列的实验验证,上边是实验参数。值得注意的是模型训练的方式是分段训练就是说 DCNN 的输出是 CRF 的输入。

image-20200728225333841

上面这张图是 CRF 以及多尺度预测在测试集上的表现,从图中可以看到带 CRF 和多尺度的预测的 DeepLab 模型效果明显上升了。

image-20200728225732045

上边这张图是多尺度的视觉效果图。第一行的图片表示的是原始的输出,第二行是经过多尺度预测之后的输出,可以明显看出经过多尺度预测之后输出部分的细节要比原来要好一些。

image-20200728225757376

image-20200728225805670

上面这两张图这两张图是 deeplab 和其他模型相比的效果图。从图中我们可以看出,与其他先进模型相比,DeepLab 捕获到了更具细节的边界(第二行图是预测目标)。

结论

最后作者得出结论 DeepLab 创造性的结合了 DCNN 和 CRF 产生一种新的语义分割模型,模型有准确预测结果同时,计算效率也比较高。在 PASCAL VOC 2012 上展现了先进的水平。虽然说 deeplab 语义分割的效果好像不错,但是问题依然存在,问题主要有三个方面 1.特征分辨率的降低、2.物体存在多尺度、3.DCNN 的平移不变性。关于这些问题的解决方案,我们可能需要在 v2 上边寻找答案。

总结

应导师要求,学习语义分割(已经换了两个方向了,好苦逼呀 😄)。但时间花了,还是要写点东西,做记录的。因此写了两篇文章对 deeplab 的内容进行记录,希望能给别人以帮助。后续也会写一篇关于 v3+ 版本,这个应该是最新的。


标题:语义分割之deeplab v1
作者:vcjmhg
地址:https://vcjmhg.top/deeplabv1