Fast-SCNN:多分支结构共享低级特征的语义分割网络

2023-05-16

介绍一篇 BMVC 2019 语义分割论文 Fast-SCNN:Fast Semantic Segmentation Network,谷歌学术显示该文已有62次引用。


论文:https://arxiv.org/pdf/1902.04502.pdf

代码:https://github.com/Tramac/Fast-SCNN-pytorch (PyTorch实现,星标200+,非官方)

0

绪论

自动驾驶和移动机器人的兴起,对实时语义分割算法的需求越来越强烈。在自动驾驶或者移动机器人的应用场景下,对语义分割算法一般有着额外的需求:

  • 算法要有实时性,最好实时性非常高,因为语义分割仅仅是整个视觉感知系统中预处理的一部分,语义分割的结果往往作为后续感知或融合模块的输入;

  • 算法要占用比较低的内存,以允许部署在低成本的嵌入式设备中。

一般来讲,基于卷积神经网络做语义分割通常使用encoder-decoder结构,比如下面2篇文章:

  • Fully convolutional networks for semantic segmentation.

  • SegNet: A Deep Convolutional Encoder-Decoder Architecture for Im8 age Segmentation.

在此基础上,很多实时性的语义分割算法还会使用多分枝网络结构,比如下面3篇文章:

  • Contextnet: Exploring context and detail for semantic segmentation in real-time.

  • Bisenet: Bilateral segmentation network for real-time semantic segmentation.

  • Guided Upsampling Network for Real-Time Semantic Segmentation.

在2分支的网络结构中,较深的分支输入低分辨率图片,目的是为了在保证较少计算开销的前提下有效地提取全局上下文特征;较浅的网络分支输入高分辨率图像,目的是提取空间细节信息。两个分支的计算结果融合,形成最终的语义分割结果。

1

动机

在2分支结构的网络中,2个分支基本保持着相对独立的计算流程。“深网络+低分辨率输入”和“浅网络+高分辨率输入”的组合能够较好地控制计算开销,以保证算法的实时性。如下图所示:

2个分支的浅层部分,实际上都是在提取浅层特征,若能将2个分支的浅层部分合并在一起,则可以进一步减少计算量。基于此,作者提出了“learning to downsample”模块,2个分支共用该模块提取浅层特征。并以learning to downsample模块和2个分支为基础,构建实时性语义分割网络Fast-SCNN。如下图所示:


2

Fast-SCNN

2.1 总体结构

Fast-SCNN的总体结构如下图所示:

从上图可以看出,2个分支共享learning to downsample模块,以进一步减少计算量。整个网络由learning to downsample模块、全局特征提取器、特征融合模块和分类器4部分组成,下面分别介绍。

2.2 Learning to Downsample模块

该模块包括3个卷积层,第一个卷积层为普通的卷积层,后面两个卷积层使用深度可分离卷积以提高计算效率。

每个卷积层的步长都是2,因此该模块输出特征的长(或宽)为输入图像的1/8。每个卷积层的卷积核尺寸为3x3,每个卷积层后面都有BN层和ReLU激活函数。

2.3 全局特征提取器

Fast-SCNN使用全局特征提取器来提取全局特征,此处的全局特征提取器类似于传统2分支结构中的深度分支。传统的2分支结构中深度分支的输入是低分辨率的输入图像,而Fast-SCNN中全局特征提取器的输入为learning to downsample模块的输出feature map。可以这么理解:Fast-SCNN中的learning to downsample模块代替了传统2分支结构中深度分支的前几个卷积层。

使用MobileNet-v2中提出的bottleneck residual block构建全局特征提取器,bottleneck residual block中的深度可分离卷积有利于减少全局特征提取器的参数量和计算量。

全局特征提取器还包含pyramid pooling模块(PPM),用于提取不同尺度的上下文特征。关于PPM的相关内容可参考论文《Pyramid Scene Parsing Network》。

2.4 特征融合模块

特征融合模块用于融合2个分支的输出特征,Fast-SCNN使用了相对比较简单的结构完成特征融合,以最大限度地提高计算效率。

特征融合模块的结构如下表所示:

为了使得2个分支的输出特征尺寸一致,需要对深度分支的特征做上采样操作,即上表中的“Upsample x X”操作。两个分支的最后都有1个卷积核尺寸为1x1的卷积操作用于调整通道数,将两个卷积操作的输出特征相加,之后使用激活函数进行非线性变换。

2.5 分类器

分类器模块中包含2个深度可分离卷积和1个卷积核尺寸为1x1的卷积以提高网络性能。

在分类器模块中还包含1个softmax操作。在网络训练时,softmax操作用于计算损失。在推理时,使用argmax操作代替softmax以提高推理速度。

2.6 网络结构总结

下表为这4部分的网络结构参数:

上表中第3列~第6列表示网络结构的参数,其中t表示bottleneck residual block的expansion factor,具体含义在论文《MobileNetV2: Inverted Residuals and Linear Bottlenecks》中有讲解,简单来说,就是bottleneck residual block内部feature map的通道数与bottleneck residual block输入端feature map通道数的比值;c表示该计算模块输出的feature map通道数;n表示该模块重复的次数;s表示卷积的步长,若计算模块重复了很多次,s所表示的步长只适用于第一次使用该模块时。

3

一些实现细节

  • 使用交叉熵损失函数进行训练,在learning to downsample模块和全局特征提取器后面分别添加了权重为0.4的辅助损失函数用于训练。

  • 在softmax的前一个卷积层中使用了dropout。

  • 使用ReLU激活函数,而没有使用MobileNet中的ReLU6激活函数,实验证明训练Fast-SCNN时使用ReLU收敛更快、性能更好。

  • 训练时迭代多次性能仍有提高,在Cityscapes数据集上训练了1000个epochs。

4

实验结果

使用Cityscapes数据集训练Fast-SCNN,在Cityscapes测试集上测试,,结果如下表所示:

从表中可以看出,Fast-SCNN的性能好于大多数算法,比BiSeNet和GUN略差,但是Fast-SCNN的参数量只是BiSeNet的1/5。

调整Fast-SCNN的输入图片分辨率,测量算法的运行时间,得到下表:

从表中可以看出,在同等GPU架构和输入图片分辨率下,Fast-SCNN的运行速度要远远快于BiSeNet和GUN。上表中的“Our prob”表示在Fast-SCNN推理时使用了softmax函数得到最终的类别,“Our cls”表示在推理时使用了计算量更小的argmax操作得到最终类别,可以看出使用argmax代替softmax,速度有很大的提升。

需要特别指出的是,Fast-SCNN网络结构支持多种输入图片分辨率,因此改变输入图片分辨率并不需要改变网络结构。

5

总结

  • 指出在多分枝结构的语义分割网络中,2个分支共用浅层网络能够进一步精简网络结构,达到提高运算速度的目的。

  • 设计出了learning to downsample模块,2个分支共用该模块提取低级特征。

  • 以learning to downsample模块、bottleneck residual block为基础,构建了Fast-SCNN用于语义分割任务,通过实验证明了Fast-SCNN的高性能与高实时性。

仅用于学习交流!

END

备注:分割

图像分割交流群

语义分割、实例分割、全景分割、抠图等技术,若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号 : aicvml

QQ群:805388940

微博/知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fast-SCNN:多分支结构共享低级特征的语义分割网络 的相关文章

  • 使用APP inventor来制作一个属于自己的蓝牙串口软件

    使用APP inventor来制作一个属于自己的蓝牙串口软件 本文主要讲述蓝牙的发送和接收功能的制作 一 准备 1 APPinventor的网址 xff1a http app gzjkw net 二 蓝牙APP界面的设置 首先我们新建一个项
  • 一起卷吧,arduino/mixly语音识别模块,10元,可以自定义,提供自制的mixly库

    一 效果演示 制作的语音风扇演示一起卷吧 xff01 语音识别 xff0c 10元 xff0c 串口通信 xff0c arduino可用 xff0c 提供自制的mixly库 操作简单 xff0c 可以语音播报 哔哩哔哩 bilibili 制
  • arduino/mixly红外发射接收模块

    一 资料 http 资料链接 xff1a https pan baidu com s 1idRcrVCxQ5zWLh59EFpi9g 提取码 xff1a n8ud 默认波特率9600 串口通信 xff0c 可以发送也可以接收 发送格式 二
  • openmv学习十三:特征点匹配

    适用于匹配多角度的物体 xff0c 需要现场提取之后才能使用 http docs openmv io library omv image html http docs openmv io library omv image html cla
  • arduino/Mixly使用TCS230颜色识别传感器

    一 器材 TCS230 arduino uno 二 接线 TCS230arduino unoGNDGNDVCC5VS0D2S1D3S2D4S3D5OE LEDD6OUTD7 三 程序 mixly程序 arduino程序 define tcs
  • arduino/Mixly心知天气

    一 准备 首先百度一下心知天气 xff0c 获取一下密钥 xff0c 具体的可以看这一篇Blynk中WebHook组件的使用方法 moshanghuaw的博客 CSDN博客 然后再准备一个esp8266或者esp32都可以 二 程序 mix
  • C For Linux之内存访问-内存简介

    1 内存 1 1 计算机为什么需要内存 存储器是计算机系统中非常重要的组成部分 计算机中的存储器分为两类 xff1a 内存储器的外存储器 xff08 也叫辅助存储器 xff09 所谓外存储器在PC机中一般指硬盘 U盘 光盘等 xff0c 而
  • 每天一分钟玩转golang:基础类型之字符串(四)

    大家好 xff0c 我是加摩斯 xff0c 觉得文章有帮助的小伙伴 xff0c 记得一键三连哟 xff5e 申明 xff1a 本系列两天更新一篇 xff0c 纯原创 xff0c 转载前请与我沟通 字符串类型也是一种基本类型 xff0c 底层
  • 项目二:电子骰子

    项目二 xff1a 电子骰子 文章目录 项目二 xff1a 电子骰子一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 1分钟 4 图形化块介绍 1分钟 5 单个
  • 项目三:双人骰子

    项目三 xff1a 双人骰子 文章目录 项目三 xff1a 双人骰子一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 1分钟 4 图形化块介绍 1分钟 5 单个
  • 项目四:无极调光台灯

    项目四 xff1a 无极调光台灯 文章目录 项目四 xff1a 无极调光台灯一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 5分钟 4 图形化块介绍 10分钟
  • Windows10安装anaconda之后pip3不能使用

    1 在命令行中切换到你自己的anaconda环境中 xff0c 2 在命令行中 xff0c 切换到你的anaconda环境中的Scripts目录中像我是在 xff1a D software anaconda3 az envs py3 pyt
  • UE4蓝图通信-蓝图接口

    蓝图接口 除了最常用的cast to蓝图节点可以实现通信以外 xff0c 进阶的通信方式就是蓝图接口 目的 xff1a 与多个对象中的特定几个对象进行通信方式 xff1a 对检测到的对象发送消息消息 xff1a 发出的消息是接口消息 xff
  • UE4蓝图通信-事件分发器(Event Dispatcher)

    事件分发器在蓝图编辑器的我的蓝图选项卡中创建 在我的蓝图 xff08 My Blueprint xff09 面板中的 进行创建输入事件分发器的名称 xff0c 该字段显示在 我的蓝图 xff08 My Blueprint xff09 选项卡
  • UE4项目优化(帧数优化)相关知识

    控制台命令 r screenpercentage 0 100 0是百分之百 如果改了这个 游戏运行超级流畅说明瓶颈在GPU上stat fps 显示帧率 Frame Per Second 或者快捷键Crlt 43 Shift 43 H 显示帧
  • 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)

    快速跳转 xff1a 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMa
  • 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)

    快速跳转 xff1a 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMa
  • 【重心坐标插值、透视矫正插值】原理以及用法见解(GAMES101深度测试部分讨论)

    文章目录 1 Barycentric Coordinates xff08 重心坐标 xff09 1 1 重心坐标概念1 2 重心坐标计算方式1 3 重心坐标插值 2 重心坐标计算公式推导3 透视投影插值矫正3 1 透视矫正后的 96 深度插
  • gcc之inline函数探究

    1 引子 xff1a 内联函数 xff08 以下称为inline函数 xff09 的行为类似于宏 xff0c 但是会像函数一样进行参数的静态类型检查 因此gcc中很多地方倾向于使用inline函数来替代宏 但是inline函数在gcc中应该
  • Visual Studio中多个源文件、多个main()函数如何分开运行

    对于跟网课的小伙伴 xff0c 有些初学者可能像我以前一样 xff0c 想记录每一课的代码 xff0c 会一节课一个 sln解决方案 xff0c 这样非常不方便 如果一个 cpp放一个main函数 xff0c 再F5运行肯定报错咯 xff0

随机推荐