概述
deeplab v3+ 是 deeplab 系列中最新内容,也是当前最流行的语义分割算法,本篇文章主要记录的是个人在学习 deeplab v3+ 过程中的一些收获以及个人对该算法的理解。
首先我们先简单回顾下 deeplap v3 相关的创新点以及不足。在上一讲的时候我们讲到 v3 相比 v2 创新点主要有四个方面,首先它提出了更加通用的框架,其次重新设计了空洞卷积,将空洞卷积和级联模块结合起来使用,而不再单独使用。第三点它改进了 ASPP,在 ASPP 的最后一层使用了 BN 层。最后一点是去掉了 CRF。并且我们在最后,也说了 deeplab v3 的不足点—就是 v3 获取处理结果的时候直接按照 8 或者 16 进行上采样来获取最终结果,这样处理很粗糙。因为,直接按照 8 或 16 的采样率进行上采样的操作并不能充分恢复降采样的过程中损失的细节信息,会导致分割不精确的情况发生。因此 v3+ 的创新点之一就是在在 v3 的基础上加入编码器和解码器结构来恢复原始分辨率的分割结果,使得边缘细节信息能够较好的保留。同时另一个创新点是将 v3 的基础网络 ResNet101 换成了 Xception 网络,使用深度分割卷积进一步提高分割算法的速度和精度。
算法
首先我们看到左边这张图是是我们之前常见的空间金字塔池化结构,也就是我们之前 v2 和 v3 中用的结构,它通过在不同分辨率上的池化操作来捕获丰富的上下文信息。而中间这张图片是 FCN 算法中用的网络结构,我们称为编码器-解码器结构。在这个结构中编码器一般采用图像分类预训练得到的网络,采用不断的池化和跨步卷积(strided convolution)能够获得长范围的语境信息,从而得到更好的分类结果。然而在此过程中特征分辨率不断降低,图像细节信息丢失,这对于分割任务而言影响很大。因此在编码器之后需要利用解码器进行图像分辨率的恢复。值得注意的一点:一般解码器常常具有类似 skip 的结构将编码器得到的细节信息加入后续解码器的信息恢复中。而右边这幅图,展示的就是 deeplab v3+ 中所使用的新的结构,它是将前面两者结合起来,在空间池化的基础上使用了编码器和解码器架构,从而能够有效的解决 v3 中使用上仅仅通过采样恢复特征图时导致细节信息丢失的问题。
我们详细讲下这个 deeplab v3+ 提出的新结构。整个网络的编码器应该就不用再讲了,其实就是和 deeplab v3 一样的,依然采用了 ASPP 的设计思想。因此我们主要看下,解码器部分的内容,这里和 Deepv3+ 最大的不同点就是 v3+ 采用的是级联解码器,不是一步到位的。而 v3 只是在则是在双线性插值之后直接按照原采样率进行上采样一步得出了结果。首先我们看解码器最左边,这里采用 11 的卷积核主要是为了对编码过程中提取到 low-level(低层次)的特征信息进行压缩(一般压缩到 48)。这里压缩目的是什么那?论文没有说,但应该是为了将那些低层次的特征信息压缩到和编码器输出的特征图 4 倍上采样之后的空间分辨率保持一致,这样才能进行融合。然后将融合后的结果通过一个 33 的卷积来细化特征,最后经过一个四倍上采样之后来输出最终结果。
接下来我们讲下 v3+ 对网络架构的优化—将原来的 ResNet101 换成了 Xception。在正式讲 xception 内容之前我们先讲下深度可分离卷积。
深度可分离卷积首先对输入特征图的每一个通道分别单独做卷积操作,然后再用点卷积(1x1 卷积)将所有结果混合得到输出。这种方式相比普通卷积可以大幅减少需要的计算量,最后,再用空洞卷积代替对每一个通道做的卷积操作,整个过程我们称为深度可分离卷积。
接下来我们看下对 xception 模型的修改,因为作者不是在 v3+ 上直接就是用 xception 网络,而是在原来的 xception 网络上进行修改,他修改的地方主要有三个方面,首先作者是用了更深的 xception 网络,但和原网络的不同点在于,它不修改入口流网络结构从而实现计算效率和内存使用效率的提升。第二点,所有最大值池化操作被深度可分离卷积替换,这使我们能够应用深度可分离卷积以任意分辨率提取。最后一点是在每个 3×3 的深度卷积后增加 BN 层和 ReLU。
实验
作者为了验证 deeplab v3+ 的效果针对算法结构中的三个关键点,设计了一系列的实验进行验证。上边这张图是不同通道下的 mIOU 图,我们可以看到当通道数是 48 的时候,效果是最好的。为了获得更好的 33 卷积,作者设计了下边的实验,我们从实验结果中可以看到当使用两个 33 卷积进行串联,并连接 cov2 特征模块的时候,模型效果最好。
上边这张是使用 ResNet101 来作为主干网络的结果图,从图中我们可以看到:
- 左表的第二组采用的 encoder,平均多增加了 20B 的计算消耗
- 测试了使用 output_stride=32 ,这样计算速度更快。但是相对于 output_stride=16 准确率下降了 1-2% 左右。
上边这张图是以 xception 为主干网络后的实验结果图,注意看跨红框的内容,我们和使用 ResNet101 位主干网络的结果图进行对比,我们发现使用 xception 之后运算量变得更小,结果也更加准确。
最后两张图是 deeplab v3+ 在 PASCAl VOC 2012 数据集合和 cityspaces 数据集上与其他算法的效果对比图,我们可以看到 deeplab v3+ 算法取得了最好的结果。
结论
最后作者得出结论:实验结果表明,deeplab v3 所提出的模型在 PASCAL VOC 2012 和 Cityscapes 数据集上取得了最好的性能表现。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于