论文学习笔记(六) CGNet: A Light-weight Context Guided Network for Semantic Segmentation

『写在前面』

语义分割轻量级网络。

作者机构:Tianyi Wu等,中科院计算所

原文链接:https://arxiv.org/pdf/1811.08201

相关repo:https://github.com/wutianyiRosun/CGNet


目录

摘要

1 介绍

2 相关工作

3 干货

3.1 Context Guided Block

扫描二维码关注公众号,回复: 5075490 查看本文章

3.2 Context Guided Network 

4 实验


摘要

提出一种轻量化语义分割模型Context Grided Network(CGNet),以满足移动设备的运行需要。

CGNet主要由CG块构建而成,CG块可以学习局部特征周围环境上下文的联合特征,最后通过引入全局上下文特征进一步改善联合特征的学习。

 

1 介绍

下图给出了在Cityscapes数据集上对现有的一些语义分割模型的测试效果,横轴表示参数量,纵轴表示准确率(mIoU)。可以看出,在参数量较少的情况下,CGNet可以达到一个比较好的准确率。虽与高精度模型相去甚远,但在一些对精度要求不高、对实时性要求比较苛刻的情况下,很有价值。

高精度模型,如DeepLab、DFN、DenseASPP等,动不动就是几十M的参数,很难应用在移动设备上。而上图中红色的模型,相对内存占用较小,但它们的分割精度却不是很高。作者认为主要原因是,这些小网络大多遵循着分类网络的设计思路,并没有考虑语义分割任务更深层次的特点。

空间依赖性和上下文信息对提高分割精度有很大的作用。作者从该角度出发,提出了CG block,并进一步搭建了轻量级语义分割网络CGNet。CG块具有以下特点: 

  • 学习局部特征和上下文特征的联合特征;
  • 通过全局上下文特征改进上述联合特征;
  • 可以贯穿应用在整个网络中,从low level(空间级别)到high level(语义级别)。不像PSPNet、DFN、DenseASPP等,只在编码阶段以后捕捉上下文特征。;
  • 只有3个下采样,相比一般5个下采样的网络,能够更好地保留边缘信息。

CGNet遵循“深而薄”的原则设计,整个网络又51层构成。其中,为了降低计算,大量使用了channel-wise conv.

2 相关工作

小型语义分割模型:

  • 需要平衡准确率和系统开销
  • 进化路线:ENet -> ICNet -> ESPNet
  • 这些模型基本都基于分类网络设计,在分割准确率上效果并不是很好

上下文信息模型:

  • 大多数现有模型只考虑解码阶段的上下文信息并且没有利用周围的上下文信息

注意力机制:

  • CG block使用全局上下文信息计算权重向量,并使用其细化局部特征和周围上下文特征的联合特征

3 干货

3.1 Context Guided Block

CG block由4部分组成:

  1. 局部特征提取器f_{loc}(*) :以常规卷积实现;
  2. 周围上下文特征提取器f_{sur}(*):以膨胀卷积实现;
  3. 联合特征提取器f_{joi}(*):一个简单的拼接层,后面加上BN层和PReLU激活;
  4. 全局特征提取器f_{glo}(*):全局池化层后面跟两个全连接层抽取特征,得到一个权重向量,以此向量指导联合特征融合

此外,CG block还采用了残差学习。文中提出了局部残差学习(LRL)和全局残差学习(GRL)两种方式。 LRL添加了从输入到联合特征提取器的连接,GRL添加了从输入到全局特征提取器的连接。从直观上来说,GRL比LRL更能促进网络中的信息传递(更像ResNet~~),后面实验部分也进行了测试,的确GRL更能提升分割精度。

3.2 Context Guided Network 

CGNet的通用网络结构如下图所示,分为3stage,第一个stage使用3个卷积层抽取特征,第二和第三个stage堆叠一定数量的CG block,具体个数可以根据情况调整。最后,通过1x1 conv得到分割结果。

下图是用于Cityscapes数据集的CGNet网络细节说明:输入尺寸为3*680*680;stage1连续使用了3个Conv-BN-PReLU组合,首个组合使用了stride=2的卷积,所以得到了1/2分辨率的feature map;stage2和stage3分别使用了多个CG block,且其中使用了不同大小的膨胀卷积核,最终分别得到了1/4和1/8的feature map。

需注意:

stage2&3的输入特征分别由其上一个stage的首个和最后一个block组合给出(参考上图的绿色箭头);

输入注入机制,图中未体现,实际使用中,作者还将输入图像下采样1/4或1/8,分别给到stage2和stage3的输入中 ,以进一步加强特征传递。

channel-wise conv。为了缩减参数数量,在局部特征提取器和周围上下文特征提取器中使用了channel-wise卷积,可以消除跨通道的计算成本,同时节省内存占用。但是,没有像MobileNet等模型一样,在depth-wise卷积后面接point-wise卷积(1*1 conv),作者解释是,因为CG block需要保持局部特征和周围上下文特征的独立性,而1*1 conv会破坏这种独立性,所以效果欠佳,实验部分也进行了验证。

个人感觉此处应该指的是depth-wise卷积?

官方Git中对该部分的实现如下:

class ChannelWiseDilatedConv(nn.Module):
    def __init__(self, nIn, nOut, kSize, stride=1, d=1):
        """
        args:
           nIn: number of input channels
           nOut: number of output channels, default (nIn == nOut)
           kSize: kernel size
           stride: optional stride rate for down-sampling
           d: dilation rate
        """
        super().__init__()
        padding = int((kSize - 1)/2) * d
        self.conv = nn.Conv2d(nIn, nOut, (kSize, kSize), stride=stride, padding=(padding, padding), groups= nIn, bias=False, dilation=d)

    def forward(self, input):
        """
        args:
           input: input feature map
           return: transformed feature map
        """
        output = self.conv(input)
        return output

可以看到,groups=nIn,所以我认为可能更像是depth-wise卷积?

在网上试着搜了下channel-wise,出来的都是depth-wise。可是在《ChannelNets: Compact and Efficient ConvolutionalNeural Networks via Channel-Wise Convolutions》中,提出了Channel-wise卷积的定义:

这里还没有很明白,感觉上像是:1*1conv可以看做是在feature map每个位置上,对于各个channel的一个共享权值的FC层。相比普通的全连接层(不共享权值),这样虽然大大减少了参数量, 但仍是一种稠密连接。channel-wise卷积(ChannelNets中提出的),将1*1卷积进一步改进,变为一种稀疏连接,即只跟上一层部分channel有联系。

在GitHub上提了个Issue,静候佳音:https://github.com/wutianyiRosun/CGNet/issues/11

4 实验

作者进行了很细致的分解实验,以证明CG block中各部分的有效性。

这里,因为本人最关心的还是效率、精度和模型大小~所以贴一下实验结果表格,效果很赞!

猜你喜欢

转载自blog.csdn.net/sinat_37532065/article/details/86483645