博客首发至Marcovaldo’s blog (http://marcovaldong.github.io/)
这是最近读的另外几篇做语义分割的论文,有写得不对或不清楚的地方,欢迎指正。
这是TuSimple的一篇工作,它的主要贡献是提出了DUC(dense upsampling convolution)和HDC(hybird dilated convolution)。前者其实不是这篇工作提出来的,它来源于Sub-Pixel,是用来实现super-resolution的。一张尺寸为 H×W×3 的图像在经过一系列的卷积池化后尺寸变成了 h×w×c ,其中H/h=W/w=d。在之前的方法中,大家通常使用反卷积或带索引的Unpooling来实现分辨率的放大。DUC则是通过使用超长通道数量的卷积来实现:在模型的最后使用一个卷积层,将feature map的尺寸由 h×w×c 卷积到 h×w×(d2×L) ,然后通过reshape将feature map的尺寸转换成 H×W×L ,其中L是语义分割任务中的目标物体数量。论文中的示意图意思不是很明确,这里给出Sub-Pixel中的示意图(该方法在这篇工作中被称为Sub-pixel convolution layer)。
该工作讨论的另外一个问题是空洞卷积,论文认为空洞卷积在卷积核中填充了很多零导致了每一层卷积都会有信息丢失,而且越往上丢失的信息越多。因此论文中在使用空洞卷积时使用了不同的dilation rate,并给出了一个计算公式来保证没有信息丢失。下面是使用相同rate和不同rate时的一个示意图。另外,论文还指出,在一组空洞卷积中不应该使用2,4,8这样的dilation rate组合。
ENet的设计初衷是因为之前的模型都是基于VGG或ResNet的,整个模型太大,速度太慢。下面第一张图给出了模型的initial block和bottleneck模块。initial block没什么可说的,包含3x3的卷积和max Pooling两个分支,之后concat到一块,feature map变成原来的1/4。bottoleneck类似于ResNet中的bottleneck模块,包含三个卷积层(1x1降维,3x3卷积层,1x1扩张),卷积层之间加入了BN和PReLUd。该模块也可以用来向下采样,此时第一个1x1卷积换成一个2x2,步长为2的卷积,主分支加入一个max Pooling层。另外那个3x3的卷积层也可以换成空洞卷积、序列为5x1、1x5的非对称卷积、反卷积。另外,模型还在bottleneck2.0前后分别加入了p=0.01和p=0.1的Spatial Dropout。ENet包含5个stage,示意图见下面第一张图。stage1包含initial block和5个bottleneck,stage2和stage3的结构相同,不过stage3中去掉了下采样层。前面三个stage属于encoder,stage4和stage5属于decoder。另外,模型中所有的结构都去掉了bias。
在介绍完模型结构之后,论文中还专门在section 4中阐述了这样设计的原因,这里不再展开。ENet比SegNet小了80倍,速度快了近20倍,但精度不怎么样。(SegNet的性能本来就比较差)
这篇论文受ENet启发给出了新的结构,下面第一张图是它的bottleneck和downsampler block,后面两张图是模型结构和示意图。标记了dilated的bottleneck把第二组3x1和1x3的卷积换成空洞卷积。
模型最终的性能要优于SegNet,速度上比ENet要慢上近一倍。
ICNet(image cascade network)是基于PSPNet的语义分割模型,其速度比SegNet要快,其性能接近DeepLabv2。论文中首先分析了影响处理速度的因素,并分别分析了下采样输入图像、下采样feature map和压缩模型对速度和性能的影响。然后提出了下面的模型,其主要思想是首先在低分辨率图像上获取主要的语义分割信息,然后使用中分辨率图像和高分辨率图像对之前的结果进行refinement。不同比例的原始图像在经过自己的卷积层之后feature map缩小为输入尺寸的1/8,之后经过CFF和下一个branch的feature map进行融合。前两个分支的卷积层是共享的。
下面这张图是CFF单元的示意图。F1和F2分别代表低分辨率图像得来的feature map和高分辨率图像得来的feature map,前者的尺寸是后者尺寸的1/2,因此F1要先经过一次upsample,然后跟F2分别经过自己的卷积层,相加得到新的feature map F2’。另外,F1在upsample之后还作为对应比例的预测值,作为一个辅助损失。因此,整个模型的损失函数要包含三部分。
下面一张图是性能和速度的对比图。
这是ICCV2017上的一篇工作,其提出了DIS(dual image segmentation),模型结构见下图。模型包含ResNet101特征提取部分和subnet-1、subnet-2、subnet-3三部分,图中的蓝色部分、绿色部分和粉色部分分别对应三个subnet,三部分的用途分别是语义分割、图像恢复和tag分类。输入一张图像,ResNet101提取到尺寸为2048x45x45的feature map u1 和尺寸为2048x1的feature vector v1 。 v1 在上采样后和 u1 相加,再经过一个卷积层得到语义分割的结果label map u3 ; u1 下采样后和 v1 相加,然后经过一层卷积得到尺寸21x1的tag vector v3 ; u3 在经过三层卷积后得到 z3 表示恢复出的原始图像。在预测时, v3 作为一个卷积核对 u3 再做一次卷积得到最终的label map。
该模型的训练分为两个阶段,第一阶段为fully-supervised阶段,所有的label都是齐全的;第二阶段为semi-supervised阶段,三个label有缺失,这一阶段作为第一阶段的微调。模型在PASCAL VOC 2012上的mIOU达到了86.8。
论文重新思考了空洞卷积的使用,改进了ASPP,去掉了CRF。改进后的ASPP如下图所示,包含一个1x1的卷积层和三个3x3卷积层,后三个卷积层分别为使用了rate为6、12、18的空洞卷积,且所有的卷积后面都跟着BN。模型在PASCAL VOC 2012上的mIOU达到了85.7,经过JFT-300M预训练的模型在该数据集上的mIOU达到了86.9,这应该是目前最高的性能了。
这是中科院的一篇工作,整个模型结构是基于DenseNet的。该模型的主要思想是设计了一个浅层的反卷积单元SDN,然后把多个SDN密集连接,堆叠到一块儿,从而获取更多的信息。SDN单元如下图中a所示,其中包含两个下采样block和两个上采样block,各个block之间加入了卷积层和压缩层。下采样block和上采样block分别如下图中b和c所示,均由max-pooling/deconvolutional层、两个卷积层和压缩层组成,卷积层之间还加入了内部连接。模型使用DenseNet-161作为第一个SDN单元的编码器,然后在最后一个SDN单元中去掉了编码器中的压缩层。模型在单元之间引入了连接,如下图中的inter-unit connection所示。模型中包含两种SDN单元间的连接,一种是相邻两个SDN单元之间的连接,另一种是DenseNet编码阶段和后边每一个SDN单元的连接。
另外为了加快训练,模型在每个SDN单元中加入了层级监督。这里的层级监督包含了三个scape的监督,且是把所有相同scape的都给连接了起来,具体见下面的示意图。最终模型在VOC上的mIOU为83.5,在VOC+COCO上的mIOU为86.6。
[1] Understanding Convolution for Semantic Segmentation
[2] ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation
[3] Efficient ConvNet for Real-time Semantic Segmentation
[4] ICNet for Real-Time Semantic Segmentation on High-Resolution Images
[5] Deep Dual Learning for Semantic Image Segmentation
[6] Rethinking Atrous Convolution for Semantic Image Segmentation
[7] Stacked Deconvolutional Network for Semantic Segmentation