Abstract
-
ENet专为需要低延迟操作的任务设计,相对于现存的SOTA网络(SegNet),ENet运行速度快18倍,FLops少75倍,参数量少79倍,同时可以产生同等甚至更好的效果
Introduction
-
尽管CNNs在分类问题上精度越来越高,但当应用到像素级分类时产生的仍是粗糙的空间结果,因此,这些算法常与其他算法级联以改善结果
-
现存的分割网络都是参数量和计算量很大,不适用与移动设备,因此作者设计了一个为推理速度和高精度优化的新网络。在这个网络结构中没有使用后处理步骤,因为会使end-to-end CNN网络性能变差
Related Works
-
当时的场景分析SOTA方法将两个独立的神经网络结构组合在一起,组成了一个encoder-decoder的结构
-
SegNet-basic受概率性的自动编码器启发,提出了encoder-decoder结构,并在SegNet中进一步改善,encoder用于训练分类输入,decoder用于将encoder的输出进行上采样
-
但是这些方法推理速度很慢,即使在SegNet最新版本中删除了VGG16的全连接层,仍然无法做到实时分割
-
其他现存的网络使用简单的分类器,然后使用CRF(条件随机场)将他们级联作为后处理步骤,这些方法使用了繁琐的后处理步骤,而且在图像中占据较少像素点的类别往往分类不准
-
CNN可以和RNN结合到一起提高精度,但推理速度会下降
-
RNN作为后处理步骤,可以和其他任何技术结合在一起
CRF- 条件随机场(简单了解一下概念)
-
随机场:随机场可以看成是一组随机变量的集合(这组随机变量对应同一个样本空间)。当给每一个位置按照某种分布随机赋予一个值之后, 其全体就叫做 随机场(一般这些变量之间都有依赖关系)
-
马尔科夫随机场(MRF):马尔科夫随机场对应一个无向图,这个无向图上的每一个节点对应一个随机变量,节点之间的边表示节点对应的随机变量之间有概率依赖关系,在马尔科夫随机场中,我们认为随机变量的概率分布只和它的邻近节点有关,而与其他节点无关(即具有马尔科夫性质)
-
条件随机场(CRF):假设输出的随机变量Y是一个马尔科夫随机场,则条件随机场就是给定一组输入随机变量X的条件下输出随机变量Y的条件概率分布模型
Network architecture
-
ENet分为七个模块,initial block 为卷积和池化两个分支(即卷积和池化并行加速计算),最后通过concat操作合并(推理速度上升了);之后一系列bottleneck采用ResNet的观点,整体结构为一个主分支和一个带卷积层和regularizer的扩展分支,最后通过一个add操作合并。
-
bottleneck的扩展分支有三个卷积层,第一个1x1卷积用于降维,第二个主卷积conv在不同的bottleneck中使用了普通卷积,空洞卷积,完全卷积(非对称卷积)三种模式,第三个1x1卷积用于升维,regularizer使用空间丢弃( Spatial Dropout),随机将输入中某一区域清零。
-
bottleneck有downsampling,dilated 2,asymmetric 5, dilated 4,dilated 8, dilated 16,upsampling几种形式。若为downsampling形式,主分支中会添加一个池化层,而后接一个padding操作将特征图的通道数扩大到与扩展分支输出通道数相同;扩展分支中的第一个1x1卷积用2x2 stride 2的卷积来代替(用于下采样);asymmetric 5是指将5x5的卷积核拆分成1x5和5x1的卷积核(可以减少参数量和计算量);dilated x 指使用扩张率为x的空洞卷积;upsampling使用反卷积上采样
-
整个ENet结构如下
-
由于cuDNN(一个针对深度神经网络的加速库)中使用单独的内核来进行卷积和偏置的计算,为了减少内核的调用次数和总体内存操作,每个层都不使用bias。每个卷积层和非线性激活函数(PRReLU)之间使用BN层。在decoder中max-pooling用max-unpooling代替来进行上采样,同时padding用没有bias的空间卷积来代替
-
在最后一个上采样块中只使用了一个反卷积(因为单是这个卷积就已经占用了decoder大量的推理时间),没有使用pooling indices来进行上采样,因为initial block对三通道进行卷积操作,但是最后的模块输出为C(目标个数)通道的特征图
Design choice
-
Feature map resolution:
-
对特征图进行下采样有两个缺点:
-
一个是会导致如精确的边缘信息之类的空间信息丢失
-
另一个是由于分割要求输出与输入的特征图尺寸相同,因此进行了多少次下采样就要进行对应次数的上采样,这会增大模型的大小和计算开销
-
-
因此作者采用SegNet中通过在maxpooling层保留选择的元素的索引,然后在decoder中通过索引进行maxunpooling产生稀疏的上采样特征图的方法
-
同时为了获取更多的上下文信息,使用dilated convolution来增大感受野
-
-
Early downsampling:处理大输入图像的成本很高,因此ENet在开始的两个stages大幅削减图像尺寸,并且只使用一小组特征图,因为视觉信息在空间上是高度冗余的,可以压缩成更有效的表示;网络的初始层不应该直接有助于分类,而应该专注于为了网络后面的部分进行特征提取和输入预处理。
-
Decoder size:不同于SegNet的对称结构,ENet的encoder更大,decoder更小,因为encoder可以在较小的分辨率特征图上操作,进行信息处理,过滤和特征提取,类似于原始分类架构,而decoder只是对encoder输出的特征图进行上采样,对细节进行微调,对最后的结果没有太大的影响。
-
Nonlinear operations:
-
“Identity mappings in deep residual networks”中说在卷积之前使用ReLU和BN能提高精度,但是作者在ENet中使用发现精度下降,分析原因是网络架构深度,ResNet等网络都有上百层,因此ReLU效果很好,但是ENet层数很少,需要快速过滤信息,所以ENet使用PReLU激活函数。
-
-
Information-preserving dimensionality changes:
-
早期对输入进行下采样很有必要,但是大幅度的降维也会阻碍信息的流动
-
先池化后卷积和先卷积后池化都会增加计算成本,因此作者使用池化和stride 2的卷积并行计算的操作,提高了10倍的推理速度
-
在原始ResNet中,1x1 stride为2的卷积可以有效丢弃75%的输入,而将卷积核尺寸变为2x2可以充分考虑所有输入信息,改善信息流动和精度,增加的计算量在ENet中也并不明显。
-
-
Factorizing filters:
-
卷积核权值有相当多的冗余,而一个nxn的卷积核可以分解成一个nx1和一个1xn的卷积核(非对称卷积)
-
在ENet中使用了n=5的非对称卷积核,计算成本相当于一个单独的3x3卷积核,同时增加block学习到的特征的多样性和增大感受野
-
在bottleneck中使用的一系列操作(1x1卷积映射,卷积,1x1卷积映射)也可以看成是一个大卷积层的分解(低秩近似)可以加快训练速度和减少参数量,减少参数量的冗余。
-
-
Dilated convolutions:
-
在处理最小分辨率的几个阶段中使用扩张卷积代替主卷积层来增大感受野,并且没有额外的计算开销
-
将这些使用扩张卷积的层与其他标准卷积层或者非对称卷积层交错使用比顺序堆叠的效果更好。
-
-
Regularization:大多数像素分割的数据集很小,神经网络很容易过拟合这些数据,因此在卷积分支的addition之前加入了Spatial Dropout防止过拟合,效果比stochastic depth和L2 weight decay更好。
Results
-
Performance Analysis:推理速度足够应用在实际道路场景分析中,为了加速,作者还将BN层和Dropout层合并到了卷积核参数里。
-
Inference time:ENet为实时应用提供了高帧率,允许带encoder-decoder结构的深度神经网络的实际使用;
-
Hardware requirements:ENet模型尺寸很小,使得可能在嵌入式处理器中一个极快的存储器中容纳整个网络,同时减轻了模型压缩的需求,使得使用通用的神经网络库成为可能;
-
Software limitation:使用非对称卷积会增加了单个内核调用的次数,使得GPU内核启动的成本超过了计算的成本,而且GPU内核没有访问以前寄存器中保存的值,因此内核必须在启动的时候从全局内存中加载所有数据,意味着增加内核的调用次数会增加内存的负担,但是用如cuDNN之类软件库的内核融合功能可以解决这个问题
-
Benchmarks: ENet使用Adam优化算法训练网络,分两个阶段训练:首先只训练encoder来分类输入图像的下采样区域,然后再加入decoder训练网络执行上采样和像素级分类,同时使用了一个类加权方案,其中c是超参数
然后在几个数据集上和SegNet比较,都取得不错的效果,同时速度比SegNet快了近20倍。
Conclusion
-
ENet主要是为了高效的语义分割而设计,其中比较重要的加速网络的tricks:
-
下采样时并行计算卷积和池化,非对称卷积,不使用bias来减少GPU内核的调用
-
在早期阶段减少输入特征图的分辨率,使用较小的decoder来减小模型大小
-
-
提高精度的tricks:
-
减少池化的使用,用扩张卷积来代替池化增大感受域
-
使用PReLU来代替ReLU
-
downsampling的bottleneck扩展分支的第一个1x1 stride 2的卷积改为2x2 stride 2的卷积
-
用spatial dropout防止过拟合,增强模型泛化能力。
-