本文作者分别来自波兰华沙大学和美国普渡大学。首发于arXiv.org,后于2017年发表于2017ICLR.
论文地址:ENet:A Deep Neural Network Architecture for Real-Time Semantic Segmentation
背景
近年深度神经网络在计算机视觉领域发展迅猛,特别是图像分类等领域。但是大多数神经网络仍受限于计算量、存储空间、运算速度等因素的限制。在分类任务中往往容易忽略空间信息。处于对图像进行空间分类以及精细分割的目的,尚有SegNet、CRFasRNN
等模型,但是这些模型的都是基于VGG-16
,在推理过程中包含大量的参数以及更长的推理时间。导致很难应用于移动手机以及需要电池供电的应用。而对于手机应用而言,要求处理图像的速度达到10fps
,而当下的SOTA模型SegNet
只能达到1fps
。最近的条件随机场CRF
被用于模型的后处理中,提高了对目标细节的有效表征。但是出于对图像处理速度的要求,作者在文中没有使用任何后处理过程。
模型构造
处initialblock
外,模型包含五个阶段,其中第二,三阶段结构一致.模型的输入为size = 512x512
,输出也是size = 512x512
设计思想
这里我不按照作者原文的顺序,按照整个模型中的出现顺序列出。
-
提前下采样
进行图像处理时,特别是对实时图像图像进行操作时,如果图像尺寸较大,其昂贵的计算开销是不可取的。视觉信息中包含大量的空间信息,完全可以使用更加有效的表征*但是当下流行的模型都没有注意到这一点。完全可以在输入网络进行特征提取前,利用这个预处理过程将原始视觉信息的信息浓缩,同时缩小图像的空间尺寸。作者通过实验证实使用的特征图个数为16和32的效果近乎一致。 -
保持信息维度变化
尽管提前下采样十分有效,但是维度的急剧下降会隐藏某些信息流.卷积之后的池化操作增加特征图的深度也会增加开销.,作者这里采用的方式是一边利用size=3x3,stride=2
的filter做卷积,另一方面同时利用size=2x2的max-pooling
进行池化操作,然后将得到的特征图合并.这个方式使得initial block
的速度提升了10倍. -
特征图分辨率
语义分割任务中的个下采样过程包含两个drawbacks。
1)减少特征图的分辨率容易丢失如精确边界之类的空间信息。2)全像素的分割要求输入与输出的分辨率相同。
这要求下采样之后须有上采样,使得模型大小增加,以及相应的计算开销增加。FCN
中的解码器中,使用最大池化层中的索引值产生稀疏的上采样特征图。SegNet
能够减少存储开销。但是下采样的的确确会降低精度。其好处也很明显,filter可以获取更大的感受野以获取更充分的上下文信息。这对于区分目标类别十分重要.例如在道路识别中区分行人和骑车者. -
解码器尺寸
不同于SegNet
中完全对称的编解码器结构,ENet
中的编码器部分规模比解码器部分大.因为编码器的作用类似于图像分类任务中的卷积,目的是提取特征,而解码器部分的作用是对编码器的输出进行上采样然后微调细节. -
非线性操作
当时的文章表明在卷积操作前使用ReLU
和Batch Normalization
的效果会好一些.但是对于ENet
模型却没有此效果.作者将其模型initial
部分的ReLu
全部移除了.而采用了PReLU
-
分解卷积
卷积核权重有相当一部分的冗余,并且一个size = nxn
大小的卷积操作可以分解为size = nx1
和size = 1xn
的卷积,以此可以减少计算量.此外,由于层与层之间的非线性操作,使得计算函数愈加丰富. -
空洞卷积
空洞卷积的作用是可以在不增加计算复杂度的前提下获得更大的感受野,感知更丰富的上下文信息.
主要结构
initial block(左)
下图左侧即为模型的起始模块.通过并行的卷积和池化操作最后将得到的特征图整合.以此达到减少图像分辨率,除去视觉信息中的冗余信息的目的.
bottleneck block(右)
文章的主体结构近乎是这样搭建的.
实验
作者在三个benchmarks
上进行了实验.包含Cam Vid
,Cityscapes
以及SUN RGB-D
,所有训练测试均用Pytouch
完成.评判指标为平均精度mAP
和交并比IoU
.
作者首先比较的是SegNet
和ENet
的运行速度,如下:
可以看到的是,在处理速度上ENet
是SegNet
的十多倍.此外作者分析了两种模型对硬件的要求,如下:
以下是在三个数据集上的表现对比.
Cityscapes
CamVid
SUN RGB-D
总结
ENet
的设计目的是将其应用于手机或电池供电设备的应用软件上,但尽管实验验证了它的处理速度能够在手机应用上运行,但不可否认的是其分割精度尚有待提升.(这里我也给不出当时SOTA
具体的数值,就很难受.)
PS:最后贴几张文中的分割实例.