432.4 FPS 快STDC 2.84倍 | LPS-Net 结合内存、FLOPs、CUDA实现超快语义分割模型(一)

简介: 432.4 FPS 快STDC 2.84倍 | LPS-Net 结合内存、FLOPs、CUDA实现超快语义分割模型(一)

多尺度学习框架被认为是促进语义分割的一类模型。然而,这个问题并不想象的那么轻描淡写,特别是对于现实应用的部署,这通常需要高效率的推理延迟。

在本文中,作者从轻量级语义分割的角度彻底分析了卷积块的设计(卷积类型和卷积中的通道数)以及跨多个尺度的交互方式。通过如此深入的比较,作者总结出3个原则,并相应地设计了轻量级和渐进式可扩展网络(LPSNet),它以贪婪的方式扩展了网络的复杂性。从技术上讲,LPSNet 首先利用这些原理来构建一个微型网络。然后,LPSNet 通过一次扩展单个维度(卷积块的数量、通道的数量或输入分辨率)逐步将微型网络扩展到更大的网络,以满足最佳速度/准确性权衡。

在3个数据集上进行的大量实验一致地证明了 LPSNet 优于几种有效的语义分割方法。更值得注意的是,LPSNetCityscapes 测试集上实现了 73.4% mIoU,在 NVIDIA GTX 1080Ti 上的速度为 413.5FPS,相对于STDC性能提升 1.5%。


1、简介


语义分割是将语义标签分配给图像或视频帧的每个像素。随着深度神经网络的发展,最先进的网络已经成功地突破了语义分割的极限,并带来了显著的性能提升。例如,DeepLabV3+ 和 Hierarchical Multi-Scale Attention 在 Cityscapes 测试集上达到 82.1% 和 85.4% mIoU,在该数据集上几乎饱和。这些成功背后的秘诀源于多尺度学习。

在文献中,最近的进展涉及利用多尺度学习沿3个不同维度进行语义分割:U-shapePyramid PoolingMulti-Path Framework

  • U-shape结构分层融合特征,逐步提高空间分辨率,自然产生多尺度特征。
  • Pyramid Pooling方法通过在多个尺度上执行空间或空洞空间金字塔池化来深入研究多尺度信息。
  • Multi-Path Framework将输入图像的大小调整为多个分辨率或尺度,并将每个尺度输入到深度网络的单独路径中。通过这样做,Multi-Path设计将输入分辨率从高到低并行放置,并明确维护高分辨率信息,而不是从低尺度特征图恢复。因此,学习到的特征可能更有能力对每个像素进行分类和定位。

本文宜久采用优雅的Multi-Path Framework方法,并进一步发展这种类型的架构,并在语义分割方面具有良好的准确性/速度折衷。本文的设计理念来自2个方面:

  1. 用于语义分割的轻量化计算单元
  2. 在平衡准确性和推理延迟的同时逐步扩大网络

作者建议通过探索卷积块的基本单元来探索第1个问题,包括卷积的类型和卷积中的通道数,基于有效语义分割中的几个唯一性(例如,大特征图、细通道宽度)。

此外,作者进一步详细阐述了在精度/速度权衡方面跨多条路径的不同交互方式。基于这些轻量级的实践,作者构建了一个微小的模型,然后沿着多个可能的维度逐步扩展微小模型,并在每一步中选择一个实现最佳权衡的单一维度,以缓解精度/速度平衡问题。

为了实现这个想法,作者提出了用于高效语义分割的轻量级和渐进式可扩展网络 (LPSNet)。具体来说,作者基于低延迟机制设计了新的Multi-Path机制并应用到LPSNet。每条路径都将调整大小的图像作为单个网络的输入,该网络由堆叠的卷积块组成。跨路径的网络共享相同的结构,但具有独立的可学习权重。所有路径的输出被聚合以生成分数图,通过双线性上采样对像素级预测进行上采样。

为了实现轻量级和高效的架构,作者还研究了卷积块的基本单元,并根据经验建议纯粹使用具有 -通道宽度的 3×3 卷积。此外,利用一种简单而有效的双线性插值方法来促进路径之间的相互交换和交互。有了这些实用的策略,LPSNet首先构建了一个微型网络,然后以渐进的方式将微型网络扩展到一个更大的网络。

image.png

从技术上讲,LPSNet通过一次扩展卷积块数、通道数或输入分辨率的单个维度来执行网络复杂性的增长,如图 1 所示。在案例中,LPSNet确保在扩展过程中准确度和推理速度之间取得了很好的平衡,并显示出优于其他手动/自动设计的模型,如图 2 所示。

image.png

总之,本文做出了以下贡献:

  1. 卷积块的轻量化设计和Multi-Path Framework中的路径交互方式被证明能够作为高效语义分割的实用原则;
  2. 精心设计的 LPSNet 被证明能够逐步扩展网络复杂性,同时实现正确的准确性-效率折衷;
  3. LPSNet 已经通过对3个数据集的广泛实验得到了适当的验证,在实验中,在 NVIDIA GPU 和嵌入式设备上都观察到了卓越的性能。

2、LPSNet


具体来说,首先介绍 LPSNet 中采用Multi-Path Framework的宏架构。然后,提出了3个设计原则来从轻量级的角度升级这个架构,包括卷积的类型卷积中的通道数以及多路径的交互方式。基于这些实用指南,通过一次扩展单个维度以寻求最佳速度/准确性权衡,以渐进方式设计了一系列可扩展 LPSNet

2.1、宏观架构

图 3 描绘了 LPSNet 中宏架构的概述。宏架构基本上是在Multi-Path Framework设计中构建的,它将输入图像的大小调整为多个尺度,并将每个尺度馈送到一个单独的路径中。

形式上,给定分辨率为  的输入图像,具有  个路径的 LPSNet(例如,图 3 中的 )将图像大小调整为 ,作为第  个路径的输入。这里  表示缩放比例。每条路径都实现为5个阶段的卷积块堆栈,第  个阶段包含  个块。通道数(即通道宽度)在每个阶段内保持不变。Stage 1∼4 中的第1个卷积块将空间维度减少了2倍。通过这样做,最后阶段的输出特征图的分辨率为 。

此外,将交互模块放置在阶段 3∼5 的末尾,旨在促进路径之间的相互交互。所有路径的输出被聚合并输入到分割头中,以生成具有 num 类通道的分数图。

最后,对分数图执行双线性上采样,产生分辨率为  的输出,与输入分辨率完全匹配。请注意,路径的缩放比例 ,卷积块的重复数 ,并且可以灵活设置该宏架构中的通道数,以使网络结构适合目标推理时间,并调整LPSNet的可扩展性。

2.2、卷积块

卷积块是卷积神经网络中的基本计算单元。卷积块的堆栈自然会在整个网络中消耗很大比例的推理时间。因此,轻量化卷积块对于高效的网络至关重要。在本节中从2个维度深入研究 LPSNet 中基本计算块的设计:

  1. 卷积块的类型
  2. 通道数

1、卷积块的类型

为了追求更少的计算复杂度,已经提出了一系列创新来改造卷积块。在这些工作中,浮点运算(FLOPs)的数量经常被用作计算复杂度的度量,它指导着用于图像识别的轻量级网络的设计。然而,FLOPs 忽略了显着影响网络推理延迟的内存访问成本 (MAC) 和并行度,从而导致 FLOPs 和实际延迟之间的差异。

image.png

更重要的是,由于高效语义分割的几个独特性(例如,更大的特征图和细通道宽度),轻量级设计从图像识别到语义分割的扩展并非易事。为此,在图 4 中对标准卷积和广泛采用的深度可分离卷积 (SepConv) 进行了比较。这里将输入特征图的Shape设置为 32 × 128 × 128,这是最常见的形状用于语义分割的轻量级网络。

通过在具有 1070Ti GPU 的 PC (i7-8700K/16GB RAM) 上执行块来评估延迟。FLOPs-efficiency 表示每单位运行时间处理的浮点运算的数量,用作效率度量。如图 4 所示,标准卷积的 FLOPs 效率(3987 MFLOPs/ms)是 SepConv(357 MFLOPs/ms)的 10 倍。因此,本文选择用标准卷积作为 LPSNet 中的构建块。

2、通道数

通道宽度是影响卷积 FLOPs 效率的另一个重要因素。从理论上讲,计算复杂度需要随着通道宽度的增加而二次级数。然而,由于现代库/设备中高度优化的软件(例如,BLAS、cuDNN)和硬件(例如,CUDA Core、Tensor Core),实际上推理时间和通道宽度之间的关系变得模糊。

image.png

为了分析这种关系,在图 5 中比较了具有不同通道宽度的 3×3 卷积的 FLOP 和延迟。正如预期的那样,当通道宽度从 1 增加到 17 时,FLOP 呈二次增长(参见图 5(a) 中的蓝色曲线);同时,延迟仅线性增长并在大约 8 和 16 通道宽度处达到平台期(参见图 5(a) 中的红色曲线)。这种具有高 FLOPs 效率的通道宽度设置被视为卷积的“sweet spots”。类似地,在图 5(b) 中,在 32 和 64 通道宽度处获得了高 FLOPs 效率。这些优点主要归功于具有 -divisible 通道宽度的卷积的可并行化实现。因此,将 LPSNet 中卷积的通道宽度设为-divisible,其中 n 尽可能大。

2.3、 Multi-Path交互

为了在多个尺度上优雅地传播互补信息,作者设计了Multi-Path交互模块,鼓励 LPSNet 中路径之间的相互交换和交互。具体来说:

将交互模块 I 定义为 ,其中和 分别表示输入对和输出对。输入对由高分辨率特征图  和低分辨率特征图  组成,其中  且 。每条路径的分辨率在交互过程中保持不变。

image.png

在这里研究了6种交互模块的变体,它们可以分为3类(图 6)。对于第1类(Direct-A/B),转换后的低分辨率特征通过元素求和或通道连接直接集成到高分辨率特征中。

对于第2类不是简单地组合来自两条路径的特征,而是采用注意力机制来促进多路径交互,即 Attention-A/B

具体来说,在 Attention-A 中,首先从  计算出注意力图 ,然后在特征聚合之前将其应用于变换后的  和 :

image.png

其中 F 和 U 分别表示卷积变换和空间上采样。Attention-B 通过将每条路径与来自另一条路径的注意力相结合,进一步以双向方式升级了简单的注意力。

在实践中,由于大量的转换和注意力,上述4种类型的交互模块在计算上是昂贵的。因此,技术通常将它们放置在多路径网络的末端,而使早期阶段的路径交互未被利用。

为了缓解这个问题,设计了2个有效的交互模块来实现早期阶段的交互,即 Bilateral-A/BBilateral-A 转换低分辨率特征并将其注入高分辨率特征,反之亦然。这种对称设计平等地对待每条网络路径,简单的转换以有效的方式在早期阶段触发交互。Bilateral-B 进一步消除了 Bilateral-A 中的卷积变换,通过仅在输入特征图上应用空间调整大小和元素求和来实现最简单的交互:

其中 U 和 D 表示特征图的上采样和下采样。所有6种交互变体之间的比较将在实验中进行详细说明,凭经验验证 Bilateral-B 实现了最佳速度/准确性权衡。因此,采用 Bilateral-B 作为 LPSNet 中的默认交互模块。

2.4、可伸缩架构

给定选定的卷积块和交互模块,特定的 LPSNet 架构可以定义为 N = {B, C, R},其中 B, C, R 是第 3.1 节中描述的可调参数。因此,网络复杂度由这些参数从3个维度决定。深度维度(B)是决定网络捕获高级语义信息能力的块数。宽度维度(C),即每个阶段的通道数,会影响每个卷积的学习能力。分辨率维度 (R) 表示每条路径的空间粒度。在设计 LPSNet 架构时,为了平衡这3个维度,首先构建一个微型网络,然后以渐进的方式一次扩展一个维度。

从技术上讲,将小网络  的参数设置为 , , 。请注意,不包括 r = 0 的路径,因此微型网络仅包含单个路径。通过这种方式,微型网络非常高效,在单个 GPU 上只有 0.38 毫秒的延迟,通过多步扩展进一步将其扩展到更重的网络。展开操作的所有候选 Δ = ΔB ∪ ΔC ∪ ΔR 定义在表 1 中。当 N = {B, C, R} 扩展 δ 时,δ 将沿其对应维度添加到 N 并产生扩展网络(例如,当 δ ∈ ∆B 时,{B + δ, C, R})。对于每一步,通过比较每个操作 δ ∈ Δ 的速度和准确性之间的权衡来贪婪地确定执行的扩展操作。具体来说,对于第 i 步,扩展后的目标延迟首先由不同扩展操作之间的最大延迟确定:

其中  表示最后一步的架构,Lat(·) 测量网络的延迟。然后,每个操作的步长计算如下:

目标是在扩展不同的操作后更好地将产生的延迟与 LT 对齐。然而,由于扩展只产生离散步骤的网络,扩展网络的延迟可能会超过 LT。如果操作的选择仅取决于扩展网络的性能,则可能会偏向于导致较大延迟增加的操作。为了解决这个问题,最终通过最大化每一步扩展后的性能增长和延迟增长的比率来选择最优扩展操作δ∗:

其中 Perf(·) 评估语义分割的性能。因此,从微小的网络  开始迭代地执行网络扩展 I 次,最终推导出一个具有不同复杂度的 LPSNet 族。算法 1 总结了 LPSNet 的扩展算法。


相关文章
|
3月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
55 2
|
4月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
56 6
|
16天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
2月前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
142 5
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
数据库连接 开发者
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第15天】在.NET中,有两种有效的资源释放方式:一是使用`using`语句,适用于实现`IDisposable`接口的对象,如文件流、数据库连接等,能确保资源及时释放,避免泄漏;二是手动调用`Dispose`方法并处理异常,提供更灵活的资源管理方式,适用于复杂场景。这两种方式都能有效管理资源,提高应用性能和稳定性。
|
2月前
|
算法 Java 数据库连接
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第14天】在 .NET 中,`IDisposable` 接口提供了一种标准机制来释放非托管资源,如文件句柄、数据库连接等。此类资源需手动释放以避免泄漏。实现 `IDisposable` 的类可通过 `Dispose` 方法释放资源。使用 `using` 语句可确保资源自动释放。此外,.NET 的垃圾回收器会自动回收托管对象所占内存,提高程序效率。示例代码展示了如何使用 `MyFileHandler` 类处理文件操作并释放 `FileStream` 资源。
|
3月前
|
存储 并行计算 算法
CUDA统一内存:简化GPU编程的内存管理
在GPU编程中,内存管理是关键挑战之一。NVIDIA CUDA 6.0引入了统一内存,简化了CPU与GPU之间的数据传输。统一内存允许在单个地址空间内分配可被两者访问的内存,自动迁移数据,从而简化内存管理、提高性能并增强代码可扩展性。本文将详细介绍统一内存的工作原理、优势及其使用方法,帮助开发者更高效地开发CUDA应用程序。
|
3月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
下一篇
无影云桌面