轻量级语义分割网络:ENet

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

   作者:石文华           

作者&编辑:石文华           


章节目录

  • 介绍

  • 网络结构

  • 设计选择

  • 实验

  • 代码

01

介绍

为了减少浮点运算的次数和内存占用以及推理时间,提出了Enet,采用编码器-解码器架构,相比SegNet,速度提升18倍,计算量减少75倍,参数量减少79倍。并且具有相当的精度,它是一个实时的语义分割网络结构。ENet分割图像的示例如下图所示:

33654da0837a14eb2d55656ca88f3576.png

02

网络结构

网络结构如下表所示:

6112d0b653614e7b04d2d538622634ef.png

网络的输入大小是512x512,有两种网络模块,分别是initial和bottleneck,如下图所示:

4d0c42df321b83b4ec16ee49679fbcab.png

图(a)是initial模块,MaxPooling为步长2的2x2的filter,卷积有13个filter,Concat后的特征映射总计为16个,起到特征提取、压缩输入图像”体积”、除去图像中的视觉冗余信息的作用。图(b)是bottleneck 模块,采用残差连接的思想,包含三个卷积层:一个1 x 1的降维卷积,一个主卷积层,一个1 x 1扩张卷积,bn和PReLU放在中间。对于下采样的bottleneck模块,主分支添加最大池层,第一个1×1卷积被替换为步长为2的2×2卷积,中间的主卷积有三种可能的选择:Conv普通卷积,asymmetric分解卷积(如分解成 5 × 1 和 1 × 5 ),Dilated空洞卷积。对于正则化方式,使用了Spatial Dropout,在bottleneck 2.0之前p=0.01,之后p=0.1。由网络结构表格可以看到,初始阶段包含一个块,接着是阶段1由5个bottleneck 组成,而阶段2和阶段3具有相同的结构,阶段3在开始时没有对输入进行降采样。阶段1到3是编码器。阶段4和5属于解码器。

细节:

(1)为了减少内核调用和内存操作,没有在任何投影中使用bias,因为cuDNN会使用单独的内核进行卷积和bias相加。这种方式对准确性没有任何影响。

(2)在每个卷积层和随后的非线性之间,都使用了bn进行处理。

(3)在解码器中,用max unpooling代替max pooling,用无bias的spatial convolution代替padding。

(4)在最后一个上采样模块中,没有使用池化索引,因为初始块在输入帧的3个通道上操作,而最终输出具有C特征映射(对象类的数量)。

(5)出于性能原因,只在网络的最后一个模块设置一个完全卷积,仅这一项就占用了解码器处理时间的很大一部分。

03

设计选择

 1、Feature map resolution:

    语义分割中的图像下采样有两个主要缺点:一是降低特征图的分辨率意味着丢失精确边缘形状等空间信息;二是全像素分割要求输出与输入具有相同的分辨率。这意味着进行了多少次下采样将需要同样次数的上采样,这将增加模型尺寸和计算成本。第一个问题在FCN中通过编码器生成的特征映射之间的add得到了解决,在SegNet中通过保存在max pooling层中选择的元素的索引,并使用它们在解码器中生成稀疏的上采样映射得到了解决。作者遵循SegNet方法,因为它减少了对内存需求。尽管如此,还是发现下采样会损害准确性,需要尽可能的限制下采样。当然,下采样能够扩大感受野,学习到更多的上下文特征用于逐像素的分类。

 2、Early downsampling:

    高分辨率的输入会耗费大量计算资源,ENet的初始化模块会大大减少输入图像的大小,并且只使用了少量的feature maps,初始化模块充当良好的特性提取器,并且只对网络稍后部分的输入进行预处理。

 3、Decoder size:

    ENet的Encoder和Decoder不对称,由一个较大的Encoder和一个较小的Decoder组成,作者认为Encoder和分类模型相似,主要进行特征信息的处理和过滤,而decoder主要是对encoder的输出做上采样,对细节做细微调。

4、Nonlinear operations:

    作者发现ENet上使用ReLU却降低了精度。相反,删除网络初始层中的大多数ReLU可以改善结果。用PReLU替换了网络中的所有ReLU,对每个特征映射PReLU有一个附加参数,目的是学习非线性的负斜率。

 5、Information-preserving dimensionality changes:

    选择在使用步长2的卷积的同时并行执行池化操作,并将得到的特征图拼接(concatenate)起来。这种技术可以将初始块的推理时间提高10倍。此外,在原始ResNet架构中发现了一个问题。下采样时,卷积分支中的第一个1×1卷积在两个维度上以2的步长滑动,直接丢弃了75%的输入。而ENet将卷积核的大小增加到了2×2,这样可以让整个输入都参与下采样,从而提高信息流和精度。虽然这使得这些层的计算成本增加了4倍,但是在ENET中这些层的数量很少,开销并不明显。

6、Factorizing filters:

    卷积权重存在大量冗余,并且每个n x n卷积可以分解成一个n x 1滤波和一个1 x n滤波,称为非对称卷积。本文采用n = 5的非对称卷积,它的操作相当于一个3 x 3的卷积,增加了模块的学习能力并增加了感受野,更重要的是,在瓶颈模块中使用的一系列操作(投影、卷积、投影)可以被视为将一个大卷积层分解为一系列更小和更简单的操作,即其低阶近似。这样的因子分解可以极大地减少参数的数量,从而减少冗余。此外,由于在层之间插入的非线性操作,特征也变得更丰富了。

7、Dilated convolutions:

大的感受野对分割任务也是非常重要的,可以参考更多的上下文特征对像素进行分类,为了避免对特征图进行过度的下采样,使用空洞卷积,在最小分辨率下运行的阶段中,几个瓶颈模块内的主要卷积层都使用了空洞卷积。在没有增加额外计算开销的情况下,便提高了准确度。当作者将空洞卷积与其他bottleneck(常规和非对称卷积)交织时,即不是按顺序排列它们,获得了最佳效果。

8、Regularization:

为了防止过拟合,把Spatial Dropout放在卷积分支的末端,就在加法之前。

04

实验

1、性能比较:

11648ac98c4d5f3fa877b36b4fe3d710.png

2、硬件要求比较:

11493e8b0124935416ddd296d3ffac95.png

3、Cityscapes测试集上的结果比较:

856f93287b476d587dee93b8db6729cb.png

4、CamVid数据集上不同模型的比较:


be8899477bda02615004d3a08a82e876.png

05

代码

网络结构部分的代码详见:

https://github.com/cswhshi/segmentation/blob/master/ENet.py

欢迎大家指正和star~

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

7547e63d989651d361442598ccd66957.png

b4a52016e7d82e740935b2612454bd0a.png

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值