新开源!实时语义分割算法Light-Weight RefineNet

  • 2019 年 12 月 27 日
  • 筆記

前几日52CV君分享了论文《Real-Time Joint Semantic Segmentation and Depth Estimation Using Asymmetric Annotations》(详见:17毫秒每帧!实时语义分割与深度估计),引起了广泛关注,被转载到多个网站。

文中原作者修改了一篇BMVC2018的论文《Light-Weight RefineNet for Real-Time Semantic Segmentation》中提出的算法,使用知识蒸馏的方法,使轻量级模型17毫秒完成语义分割与深度估计任务。 可惜那篇文章并没有开源代码。其使用的Light-Weight RefineNet模型非常值得参考。 恰巧昨日原作者开源了Light-Weight RefineNet,今天我们就来看看其庐山真面目。 作者信息:

该文的目的很简单,在CVPR2017的RefineNet语义分割算法基础上减少模型参数和计算量。

RefineNet的网络架构:

RefineNet使用经典的编码器-解码器架构,CLF为3*3卷积,卷积核个数为语义类的个数,编码器的骨干网可以是任意图像分类特征提取网络,重点是解码器部分含有RCU、CRP、FUSION三种重要结构。

RCU即residual convolutional unit(残差卷积单元),为经典残差网络ResNet中的residual block去掉batch normalisation部分,由ReLU和卷积层构成。 CRP为链式残差池化(chained residual pooling),由一系列的池化层与卷积层构成,以残差的形式排列。 RCU与CRP中使用3*3卷积和5*5池化。 FUSION部分则是对两路数据分别执行3*3卷积并上采样后求和SUM。

Light-Weight RefineNet改进方法

改进图示:

1)替换3*3卷积为1*1卷积 虽然理论3*3卷积理论上有更大的感受野有利于语义分割任务,但实际实验证明,对于RefineNet架构的网络其并不是必要的。

2)省略RCU模块 作者尝试去除RefineNet网络中部分及至所有RCU模块,发现并没有任何的精度下降,并进一步发现原来RCU blocks已经完全饱和。

表格中RefineNet-101为原始RefineNet网络,RefineNet-101-LW-WITH-RCU为使用了1)中的改进替换卷积,RefineNet-101-LW为使用了1)与2)中的改进替换卷积并省略RCU。 从上图表格中可知,1)的改进直接减少了2倍的参数量降低了3倍的浮点计算量,2)的改进则进一步使参数更少浮点计算量更小。

3)使用轻量级骨干网 作者发现即使使用轻量级NASNet-Mobile 、MobileNet-v2骨干网,网络依旧能够达到非常稳健的性能表现,性能不会大幅下降。

实验结果 软硬件平台:8GB RAM, Intel i5-7600 处理器, 一块GT1080Ti GPU,CUDA 9.0 ,CuDNN 7.0。 作者首先在NYUDv2 和 PASCAL Person-Part数据集上进行了实验,结果如下:

可以看到虽性能略有下降,但参数量和计算时间大幅降低。

同时作者也在PASCAL VOC数据库上进行了实验,并加入NASNet-Mobile 、MobileNet-v2骨干网,发现对比于使用相同骨干网路的目前几乎是最先进的语义分割架构DeepLab-v3,RefineNet-LW的性能表现更具优势。

语义分割结果对比图示:

总结 这篇文章的改进非常简单,几乎所有想法都来自于实验摸索出来的。原来通过实验发现现有模型中的计算冗余也很有价值啊!

代码地址: https://github.com/DrSleep/light-weight-refinenet 论文地址: http://bmvc2018.org/contents/papers/0494.pdf