论文笔记——ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation

        论文地址。

        相比 SegNet、FCN 等以 VGG 作为特征识别部分的网络,作者提出了一个更加轻量级、运算量和参数量都较小的网络,来提高语义分割在实际使用中的推断时间和减轻对设备的要求。网络的名字叫做 ENet,即 efficient neural network。

网络结构

         在了解网络结构之前,通常都是看看网络的组成单元 block。ENet 中主要有两种单元组成,即 initial block 和 bottleneck block,具体的结构分别于下面说明。

论文笔记——ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation_第1张图片

initial block    

       上边的是 initial block,根据论文中的设置,只使用到一次,也就是对输入的图像进行处理时用到的。输入图像的尺寸是512*512*3,两条路径中左侧是 3*3 的卷积,步长为 2,计算的结果是256*256,可见使用了 padding。不过对于步长为 1 的卷积填充很好理解,就是各在边界左右添加相应数量的 0 即可;但是步长不为 1 时呢?应该也是填充,但这个填充是在一侧边界上而已呢还是在左右两侧都会做填充?根据之前看过 tensorflow 官方文档中对于池化层 padding 填充的解释,是单侧填充而已,但似乎对于卷积这种运算特点,要是两侧都做填充显得更合理一些,这个之后再看看资料了解一下。言归正传,那么卷积核的规模是 3*3*3*13,加上三个通道各自的 2*2最大池化层,concat 之后一共是 16 层的特征层。

论文笔记——ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation_第2张图片

bottleneck block

     上边是 bottleneck 结构。整个网络都是由这种结构相同具体组成成分有点差异的元素堆叠而成,它使用了类似残差连接的理念,分为 main branch 和 shortcut。在 shortcut 中都是有三个 CNN 构成,第一个卷积核大小为 1*1,作用是 projection 我的理解就是把目前所有的特征进行压缩合并成一个特征,例如输入的结构式 batch-size*16*256*256,卷积核的大小为 output-channels*16*1*1,计算的结果为 batch-size*output-channels*256*256,如果 output-channels < 16,那么就起到了一个压缩维度的作用,可以减轻后续的计算量。第二个卷积可以分成三种,regular 常规卷积、dilate 空洞卷积 和 deconvolution 转置卷积。第三个卷积核也是的 1*1 但作用和第一个相反,它是 expension,把特征的数量恢复到特定的大小。

       在每个 CNN 之间都使用了 BN 批标准化以及选择 PReLU 作为激活函数,PReLU 是带有参数的 relu,公式如下

PReLU(x)=\left\{\begin{matrix} x ,x>0\\ax,x\leqslant 0 \end{matrix}\right.

a是可以学习的参数。

        如果这个 bottleneck 是属于降采样的,那么在 main branch 上就需要加上有减小尺寸的元素,也就是使用 maxpool 最大值池化;如果池化后的结果和需要的不符,就以 0 进行填充,文章中称为 zero padding。同时,shortcut 上面 1*1 的 projection 卷积将会被替换成步长为 2 的 2*2 卷积,也是为了缩小尺寸。

        regular、dilate 和 deconvolution 都是使用 3*3 的卷积核,除了这三者之外,还有少数的将 "conv" 替换成对称卷积或者是空间可分离卷积,也就是 1*5 和 5*1 的卷积核的组合,常用的技巧了。

        至于在最后的 regularizer,就是使用 spatial dropout,bottleneck2.0 之前的一部分使用 p=0.01 的 dropout,之后的设 p=0.1。

 

论文笔记——ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation_第3张图片

       上图是整个 ENet 的结构,state1就是由单个 initial block组成。state2 和 state 3 是一样的,除了后者没有一开始进行降采样这个环节。前三个 state 组成了一个 encoder 编码器,而 state4 和 state5 在组成了一个 decoder 解码器。

       Between each convolutional layer and following non-linearity we use Batch Normalization,在每个卷积层以及非线性化层之后都是用 BN 来对数据分布进行规范化。

       在解码器中的上采样单元,使用 max unpooling 来取代 maxpooling,而 padding 就被取代成没有 bias 的卷积核,按照作者的说法是包括在 projection 等操作中 bias 的作用很不明显,所以可以省略来减少模型的参数量。到了最后一步我们并不使用 pooling indices 来得到 output,因为原始图片是三通道,但是我们期望的结果是多通道,具体的通道数等于分类的类别数。同时基于效率的原因,选择使用一个 full convolution 来完成这个上采样和分类的任务。

总结

        总的来说作者提出了新的语义分割的结构,和传统的完全对称的 FCN 不同,ENet 拥有一个更大的编码器然后一个较小的解码器,作者解释是

This is motivated by the idea that the encoder should be able to work in a similar fashion to original  classifification architectures, i.e. to operate on smaller resolution data and provide for information processing and filtering.Instead, the role of the the decoder, is to upsample the output of the encoder, only fine-tuning the details. 

意思就是编码器是要起到分类和提取特征的作用,而且蛮多情况是直接使用训练好的分类网络的一部分,而编码器只是起到一个 fine-tuning 以及上采样的作用,所以没必要整的一样大。

      并且相比传统的分割网络,确实在速度上更胜一筹。

 

 

 

 

你可能感兴趣的:(深度学习:CV和NLP)