本文记录了博主阅读论文《ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation》的笔记,代码。更新于2019.04.17。
文章目录
Abstract
在移动应用中,像素级语义分割的实时性是最重要的。本文中提出了一个名为ENet(Efficient neural network)的深度神经网络结构,专为低延时(low latency)任务设计。ENet比现存方法最高快18倍,少用了75倍的浮点运算(FLOPs,Floating point operations),少了79倍的参数,精度又与现存方法相差无几。ENet在CamVid、Cityscapes和SUN数据库上都测试过。文中还给出了在嵌入式系统(embedded systems)中的结构表现,并提供了让ENet更快的软件提升。
Introduction
可穿戴增强现实、家用自动化设备、自动驾驶这些应用都对能够在移动设备上实时运作的低功耗语义分割(或视觉场景理解)产生了大量的需求。
像SegNet和FCN(详见博主笔记SegNet和FCN)这些网络虽然能够实现端到端的稠密像素分割,但是它们都是基于庞大的网络结构VGG16设计的,无法在大多数电池供电的移动设备上运作(要求达到10fps以上)。
本文中提出了一个专为快速、高准确率推理设计的神经网络结构。下图给出了ENet在图像分割上的示例。
本文工作中,选择不应用任何后处理步骤。尽管可以融合后处理,但是对于端到端网络来说,这样做会破坏最后的结果。
Related work
语义分割对于理解图像内容和查找目标物体非常重要,这项技术在诸如辅助驾驶、现实增强等应用领域中是最重要的。
目前主流的神经网络结构都由两部分组成:编码器和解码器。但是这些方法由于网络结构复杂、参数众多,推理过程比较慢。
尽管SegNet与FCN不同,丢弃了VGG16,从而使其成为这些网络中最小的结构,但这仍然无法满足实时的要求。
其他现存结构使用更简单的分类器,然后用CRF作为后处理。如SegNet论文中提到的,这些方法需要繁重的后处理,且经常对那些在一帧中占据更少像素点个数的类别分类失败。尽管这可以通过结合CNN来实现精度的提升(比如CRFasRNN,博主笔记看这里),但是这样做会导致速度的下降。另外,值得注意的是,RNN是可以作为后处理结合进任何一种方法的,包括本文提出的方法。
Network architecture
下表是网络结构。网络结构可以分成几个阶段,如表中强调的。输出尺寸是以输入图像分辨率为512x512给出的。
这里采用了ResNets的概念,从一个主干里面分出了一支卷积滤波器,再以元素相加(element-wise addition)的形式融合回主干,如下图(b)所示。每个模块包括三层卷积层:一个1x1映射用于降维,一个主卷积层(图中的conv),和一个1x1的扩张。在所有卷积后面都应用了Batch Normalization和PReLU。与原文一致,这里也称这些为bottleneck模块。如果bottleneck是下采样,那么主干上会加一个max pooling层。同时,第一个1x1的映射用各维度步长均为2的2x2卷积替代。应用了zero pad。conv可以是普通卷积、空洞卷积或全卷积(也称为反卷积)中的任何一种,滤波器尺寸为3x3。有时候也会用对称卷积替代,即连续的5x1和1x5卷积。归一化(regularizer)用Spatial Dropout,在bottleneck2.0以前
p
=
0.01
p=0.01
p=0.01,以后
p
=
0.1
p=0.1
p=0.1。
初始化阶段包括一个单独的block,如上图(a)所示。第一阶段包括5个bottleneck block,第2、3阶段结构相同,只是第3阶段在最开始不做下采样(即忽略第0个bottleneck)。这三个阶段是编码器。第4、5阶段属于解码器。
由于cuDNN对卷积和偏置用不同的核,因此为了减少核调用的次数从而节省运算总内存,这里所有映射(projections)过程都没有使用偏置(bias)。这个操作没有对最终的精度造成什么影响。在卷积层和后续的非线性激活函数之间用Batch Normalization。
在解码器中,用max unpooling替代了max pooling,padding替换成了没有bias的空间卷积。最后一个上采样没用pooling indices,因为对应的是3通道的输入模块,而输出需要C个特征图。为了提升表现,这里最后一层只应用了全卷积层(占了相当一部分处理时间)。
Design choices
Feature map resolution
在语义分割过程中对图像下采样主要有两个缺点:第一,特征图分辨率下降会损失空间信息(比如具体的边界形状);第二,稠密像素分割需要输出分辨率与输入分辨率相同。第一个问题FCN和SegNet都通过不同的方式解决了,但论文作者发现,过度下采样会影响精度,因此他们尽量限制下采样。
然而,下采样有一个明显的优势:在下采样后的图片上应用的卷及操作有更大的感受野,从而使得他们能够收集更多的上下文信息。这对于区分不同类别非常重要。比如马路上的行人和骑自行车的人,网络只知道人的长相还不够,他们出现的上下文也同等重要。最后,他们发现用空洞卷积达到这个目的的效果更好。
Early downsampling
尽管“处理大图片的代价是非常昂贵的”听起来很明显,但是很少有工作关注这个早期阶段。但这个阶段却常常是目前代价最高的。
ENet的前两个block极大地缩减了输入图像的尺寸,并且只用了一小部分特征图。这个做法背后的想法是,视觉信息在空间上的冗余是很大的,因此可以用更高效的描述压缩。同时,作者的想法是,原始网络层不应该被直接用于分类,而应该作为特征提取工具,服务于后续的网络。这个想法在实验中得到了印证:将特征图个数从16提升到32并没有提升在CityScapes下的精度。
Decoder size
这篇论文中提出了除SegNet以外的另一种编解码结构。SegNet是一个对称性很强的结构:解码器是编码器的镜像。不同的是,这篇论文中用了一个大编码器和一个小解码器。这么做的动机是,编码器应该与传统的分类网络结构工作机制类似,即在小分辨率数据上操作并提供处理和滤波信息。但是,解码器的工作是上采样编码器,只是用来完善细节。
Nonlinear operations
有论文说在卷积之前用ReLU和Batch Normalization更好,但是论文作者尝试在ENet上应用这个理论,发现对精度有负面影响。同时,他们发现移除原始层中的大多数ReLU提升了效果。这个发现非常有趣,所以他们决定进一步研究原因。
他们用PReLU替换掉了ReLU,每个特征层会多出一个参数,其目的是学习负半轴的非线性。他们期望在每个层中,identity is a preferable transfer function,而PReLU的权重接近1,相反,ReLU的是0。下图是这个实验的结果。
初始权重的方差很大,且轻微倾向于正值;而在编码器的后面部分,它们则稳定到了一个循环形式下。在主干上的所有层与普通ReLUs几乎完全相同,只是bottleneck模块中的权重是负的,即函数颠倒并按比例缩小了负值。论文作者假设,identity效果不好可能是受限于ENet的结构深度。为什么习得了一个有损耗的函数可能是因为,原始的ResNets网络结构可以达到几百层深,但是ENet只用了几层,所以需要快速过滤掉信息。值得注意的是,解码器权重明显更多倾向于正值,习得的函数更倾向于identity。这也证实了他们的猜想,即解码器只是用来精调上采样的输出。(因为更多值被保留了吗?)
Information-preserving dimensionality changes
如前文所述,早点对输入进行下采样是必要的,但是过于激进的维度下降也会妨碍信息流。DeepLab v3(详见博主笔记)中提出了一个对这个问题不错的解决方法。借鉴其中的思想,用步长为2的卷积同时实现卷积和池化,最后将得到的特征图级联。这个做法能够加速推理过程大概10倍。
另外,论文作者发现了在原始ResNet结构中的一个问题。在下采样时,第一个卷积分支的1x1映射的步长为2(各个维度),从而有效抛弃了75%的输入。将滤波器尺寸提升到2x2能够将全部的信息都考虑到,从而提升了信息流和精度。当然,这样做使得计算量变成了原来的4倍,但是ENet中这些模块比较少,所以这种计算量的增加也不成问题。
Factorizing filters
已经被证明了,卷积权重有相当一部分的冗余,而一个
n
×
n
n\times n
n×n的卷积可以拆分成两个串联的小卷积:
n
×
1
n\times 1
n×1和
1
×
n
1\times n
1×n(论文)。这种做法成为对称卷积(asymmetric convolution),在DeepLab v3中也提到过。这里用了
n
=
5
n=5
n=5的对称卷积,这样的计算量与单个
3
×
3
3\times 3
3×3的卷积相同。这样做有助于增加模块习得函数的多样性,同时增加感受野。
另外,bottleneck module中的一系列操作(映射、卷积、映射),可以看做是将一个大卷积层分解成一系列更小、更简单的操作,也就是其低秩近似(low-rank approximation)。这样做不仅能加速和减少参数个数,同时由于之间的激活函数,也会使函数更多样化。
Dilated convolutions
如前文所述,增大感受野是必要的。为了防止过度下采样,这里采用了空洞卷积提升效果。它们替代了几个处理最小分辨率下的神经网络。这样做在Cityscapes下大概提升了4%的IoU。论文作者通过将空洞卷积和传统卷积以及对称卷积交错使用(而非像这里这样串联空洞卷积),实现了最好的效果。
Regularization
为了防止过拟合,这里在卷积分支的最后面,也就是相加之前,应用了Spatial Dropout。
Results
以SegNet为基准,用Torch7框架和cuDNN,测量标准为class average accuracy和IoU。
Performance Analysis
ENet的设计目标是在NVIDIA TX1上处理640x360的图达到10fps以上,从而足够满足道路场景处理需求。因此,在网络中融入了batch normalization和dropout。
Inference time
下表比较了单针不同分辨率输入下的推理时间。
Hardware requirements
下表比较了不同模型的浮点运算数和参数。
Software limitations
实现这些表现的一个重要原因是卷积层分解,但是论文作者发现了一个缺点。虽然这个方法极大地降低了浮点数运算和参数个数,但是其也增加了每个核函数的调用数使其更小。但是由于这些计算太容易了,导致GPU核启动的代价甚至高于实际运算的代价。
Benchmarks
优化函数用ADAM。
训练过程分两步:首先训练编码器用于分类下采样后的输入图片,随后加上解码器训练网络实现像素级分类。
学习率5e-4,L2权重下降2e-4,batch size 10。
应用类别权重,
w
c
l
a
s
s
=
1
ln
(
c
+
p
c
l
a
s
s
)
w_{class}=\frac{1}{\text{ln}(c+p_{class})}
wclass=ln(c+pclass)1,其中
c
=
1.02
c=1.02
c=1.02,也就是将类别权重限制在区间[1,50]。
Cityscapes
其中,iIoU代表instance-level intersection over union。
CamVid
数据库图像分辨率为960x720,但是在训练前将其下采样成480x360。
SUN RGB-D
只用了RGB,没有用深度信息。
Conclusion
更多内容,欢迎加入星球讨论。