经典文献阅读之--FlashOcc(快速且内存高效的占用预测模块)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务,并且需要GPU资源,可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时,并附带200G的免费磁盘空间。通过链接注册并联系客服,可以获得20元代金券(相当于6-7H的免费GPU资源)。欢迎大家体验一下~

0. 简介

鉴于能够缓解 3D 目标检测中普遍存在的长尾缺陷和复杂形状缺失的能力,占用预测已成为自动驾驶系统的关键组成部分。然而,三维体素级表示的处理不可避免地会在内存和计算方面引入大量开销,阻碍了迄今为止的占用预测方法的部署。与使模型变得更大、更复杂的趋势相反,《FlashOcc: Fast and Memory-Efficient Occupancy Prediction via Channel-to-Height Plugin》认为理想的框架应该对不同的芯片进行部署友好,同时保持高精度。为此,本文提出了一种即插即用范例,即 FlashOCC,以巩固快速且节省内存的占用预测,同时保持高精度。特别是,本文的 FlashOCC 基于当代体素级占用预测方法做出了两项改进。首先,特征保留在 BEV 中,从而能够使用高效的 2D 卷积层进行特征提取。其次,引入通道到高度变换(channel-to-height transformation) ,将 BEV 的输出 logits 提升到 3D 空间。本文将 FlashOCC 应用于具有挑战性的 Occ3D-nuScenes 基准的各种占用预测基线,并进行广泛的实验来验证其有效性。结果证实了本文的即插即用范例在精度、运行时效率和内存成本方面优于以前最先进的方法,展示了其部署潜力。该代码将可供使用。

1. 主要贡献

  1. 在我们的工作中,我们旨在高效实现通道到高度特征转换。鉴于BEV感知任务的进展,其中BEV表示中的每个像素包含沿高度维度的相应柱中所有对象的信息,我们直观地利用通道到高度转换来将扁平化的BEV特征重塑为三维体素级占用对数。

  2. 以一种通用且即插即用的方式增强现有模型,而不是开发新的模型架构,如图1(a)所示。具体来说,我们将当代方法中的3D卷积直接替换为2D卷积,并用通过2D卷积获得的BEV级特征的通道到高度转换替换从3D卷积输出中得出的占用对数。这些模型不仅在准确性和时间消耗之间取得了最佳平衡,而且表现出了出色的部署兼容性。

在这里插入图片描述

图1(a)说明了如何以即插即用的方式实现所提出的FlashOcc。当代方法使用经过3D卷积处理的体素级3D特征来预测占据情况。相比之下,我们的插件替代模型通过(1)用2D卷积替换3D卷积和(2)用2D卷积获取的BEV级特征的通道到高度转换来实现快速且内存高效的占据情况预测。缩写"Conv"代表卷积。图1(b)举例说明了准确性与速度、推理内存消耗和训练持续时间等因素之间的权衡。有关M0-8的详细配置,请参阅表2。"FO"是FlashOcc的缩写,"FO()“表示相应模型的插件替代,该模型以”"命名。最佳观看方式为彩色显示。

2.框架

FlashOcc 在该领域做出了开创性的贡献,成功实现了具有显著准确性的实时全景3D占据预测。此外,它在不同车载平台上展示了增强的多功能性,因为它避免了昂贵的体素级特征处理,其中避免了视图变换器或3D(可变形)卷积运算符的需求。如图2所示,FlashOcc的输入数据包括全景图像,而输出是密集的占据预测结果。尽管我们的FlashOcc专注于以一种通用和即插即用的方式增强现有模型,但它仍然可以分为五个基本模块:(1)负责从多摄像头图像中提取图像特征的2D图像编码器。(2)一个视图变换模块,用于将2D感知视图图像特征映射到3D BEV表示。(3)负责处理BEV特征信息的BEV编码器。(4)占据预测模块,用于预测每个体素的分割标签。(5)一个可选的时间融合模块,旨在整合历史信息以提高性能。

3. 图像编码器

图像编码器将输入图像提取为感知视图中的高级特征。具体来说,它利用骨干网络提取多尺度语义特征,随后将其馈送到颈部模块进行融合,从而充分利用具有不同粒度的语义信息。经典的ResNet [8]和强大的SwinTransformer [18]通常被选择为骨干网络。ResNet的多个残差块设计使其能够优雅地获取具有丰富和多粒度语义信息的特征表示。Swin Transformer引入了一个分层结构,将输入图像分成小块并逐步处理。通过利用移位窗口机制,SwinTransformer在保持竞争性能的同时实现了高效性和可扩展性。至于颈部模块,简洁的FPN-LSS [9, 25]被选中。它将细粒度特征与直接上采样的粗粒度特征进行整合。事实上,由于所提出的范式从未局限于特定的架构,因此骨干网络可以替换为其他先进模型,如SwinTransformer [18],Vit [5]。颈部模块也可以替换为其他具有竞争力的变体,如NAS-FPN [7],BiFPN [29]。

4. 视角变换器

视角变换器是全景视图3D感知系统中的关键组件,它将2D感知视图特征映射到BEV表示。最近的工作中广泛使用了Lift-splat-shot(LSS)[9, 25]和激光雷达结构(LS)[13]。LSS利用像素级密集深度预测和相机内/外参数将图像特征投影到预定义的3D网格体素上。随后,沿垂直维度(高度)应用池化操作以获得扁平的BEV表示。然而,LS依赖于均匀分布的深度假设来转移特征,这导致特征错位,随后在相机光线方向上引起虚假检测,尽管计算复杂度降低。

5. BEV编码器

BEV编码器增强了通过视角变换获得的粗略BEV特征,从而产生更详细的3D表示。BEV编码器的架构类似于图像编码器,包括骨干和颈部。我们采用了第4节中概述的设置。通过在骨干中的几个块之后进行特征扩散,改善了LSS中缺失的中心特征[6]或LS中的混叠伪影。如图2所示,集成了两个多尺度特征以增强表示质量。

6. 占用预测模块

如图2所示,从颈部获取的BEV特征用于占用预测,输入到一个占用头中。它由一个多层卷积网络[1, 22, 23]或者复杂的多尺度特征融合模块[15]组成,后者具有更优越的全局感受野,能够更全面地感知整个场景,同时也提供了对局部详细特征更精细的表征。占用头产生的BEV特征然后通过通道到高度模块。该模块对通道维度执行简单的重塑操作,将BEV特征从 B × C × W × H B × C × W × H B×C×W×H的形状转换为具有 B × C ∗ × Z × W × H B × C^∗ × Z × W × H B×C×Z×W×H形状的占用对数,其中 B B B C C C C ∗ C^∗ C W W W H H H Z Z Z分别代表批处理大小、通道数、类别数、3D空间中 x / y / z x/y/z x/y/z维度的数量,且 C = C ∗ × Z C = C^∗ × Z C=C×Z

7. 时间融合模块

时间融合模块旨在通过整合历史信息来增强对动态对象或属性的感知。它由两个主要组件组成:时空对齐模块和特征融合模块,如图2所示。对齐模块利用自车信息将历史BEV特征与当前激光雷达系统进行对齐。这一对齐过程确保历史特征被正确插值并与当前感知系统同步。一旦对齐完成,对齐的BEV特征被传递到特征融合模块。该模块整合了对齐的特征,考虑了它们的时间上下文,生成了动态对象或属性的全面表示。融合过程结合了历史特征和当前感知输入的相关信息,以提高整体感知准确性和可靠性。

在这里插入图片描述

图2. 该图示意了我们的FlashOcc的总体架构,最好以彩色和缩放功能查看。
虚线框标识的区域表示可替换模块的存在。每个可替换模块的特征形状分别用代表2D图像、BEV级别和体素级别特征的图标表示。浅蓝色区域对应可选的时间融合模块,其使用取决于红色开关的激活。

04 主干网络部分

4.1 选择更合适的主干网络

目标检测任务中常见的主干网络包括:Resnet,Swin-transformer,ViT,Efficientnet,Vovnet,ShuffleNet,MobileNet,GhostNet,其中Resnet,Swin-transformer,Vovnet较为常见,Resnet-101,Resnet-50网络更是大多数模型的主干网络。

ResNet(Residual Network)是由微软亚洲研究院的Kaiming He等人提出的,它在2015年的ILSVRC比赛中斩获了冠军,成为了经典的深度学习骨干网络之一。下面我们将对ResNet进行详细介绍。

EfficientNet是由谷歌研究团队提出的一种基于复合缩放的神经网络架构,其主要特点是在不增加计算复杂度的情况下提升模型性能。EfficientNet使用了一种称为复合缩放(Compound Scaling)的方法,同时调整网络的深度、宽度和分辨率,从而在不增加计算成本的情况下提高了模型的效果。

虽然传统ResNet在一定程度上改善了传统深层网络的训练困难问题,但相比EfficientNet,ResNet仍然存在参数量大、计算量大的问题,使得在移动设备等资源受限的环境下应用时性能不尽如人意。实际应用中,不同的骨干网络具有各自的优势和局限性。EfficientNet在目标检测任务中表现出色,尤其适合资源受限的场景;而ResNet虽然在一些任务上表现较好,但对于目标检测任务来说可能存在训练速度较慢的问题。

4.2 FlashOcc主干网络

在FlashOcc中主干网络对输入的环视图像进行多尺度的特征提取,2D主干网络采用的是ResNet-50。

需要注意的是,由于当前的config配置是将时序上连续的三帧环视图像一起输入到网络模型当中,所以模型对于不同帧的处理方式是不同的。

  • 如果当前时刻标记为t,那么对于t-2时刻的环视图像,2D主干网络只会输出降采样四倍的特征图用于后续进行双目立体的深度估计,代码中定义降采样4倍的特征为Stereo Feature。

  • 但是对于t和t-1时刻,2D主干网络在输出降采样4倍Stereo Feature的同时,还会输出降采样16倍和32倍的特征图,用于后续完成多尺度特征的信息融合。

05 前后向投影模式

该模式由FB-Occ提出,在精度预测和推理速度上在当时都是领先的存在,该模式包含两部分:前向投影和后向投影模式。

5.1 前向投影

  1. 使用前向投影来生成3D体素表示

  2. 将 3D 体素表⽰压缩为扁平化的BEV特征图 3)最后将 3D 体素表⽰和优化的 BEV 表⽰的融合特征输⼊到后续任务头中

前向投影总结:相对原来的LSS是投影到BEV空间中,这里是投影到3D体素空间中

5.2 后向投影

  1. 3D体素表示压缩为BEV表示,从⽽结合更强的语义

  2. 利⽤了投影阶段的深度分布,能够更精确地建模投影关系

后向投影总结:灵感来源于BEVFormer

  1. 与使⽤随机初始化参数作为 BEV 查询的 BEVFormer 不同

  2. 在推理阶段使用了深度分布,从而保证了更加精确的

最后获得3D体素表示和优化后的BEV表示后, 通过扩展BEV特征的过程将他们组合起来, 从而产生最终的3D体素。

06 BEV特征解码

在三维空间中对提升的体素特征进行直接解码相比,由于维度的减少,二维BEV解码器会比三维解码器速度更快。将三维体素特征的z dim与其嵌入通道结合即,得到2D BEV特征B‘∈R(C2×Z2)×H2×W2如下图所示:

…详情请参照古月居

<think>嗯,我现在需要处理用户关于ReadAscii和OCC在软件开发中的用法或实现的问题。首先,我得明确这两个术语的具体含义和应用场景。OCC可能指的是OpenCASCADETechnology,一个开源的CAD/CAM/CAE几何内核。而ReadAscii应该是OCC中处理ASCII格式CAD文件的函数或模块。接下来,用户提到的ReadAscii可能有几种可能的含义。回忆OCC的功能,STEP和IGES是两种常见的CAD数据交换格式,通常有ASCII和二进制版本。OCC提供了相应的读写工具。比如STEPControl_Reader和IGESControl_Reader类,但用户直接提到了ReadAscii,这可能指具体的函数或方法名。需要确认OCC中是否有直接命名为ReadAscii的函数,或者用户可能泛指读取ASCII格式的文件。查阅OCC文档,发现没有直接叫ReadAscii的函数,但STEP文件通常以ASCII存储,所以使用STEPControl_Reader::ReadFile()方法即可读取。因此,用户所说的ReadAscii可能实际指读取STEP或IGES的ASCII文件的操作。因此接下来可能需要指导用户如何使用这些读写器类。然后考虑用户可能的场景,用户可能在开发中需要导入或导出CAD文件,尤其是处理ASCII格式的STEP或IGES文件。所以需要提供代码示例,展示如何实例化Reader,加载文件,处理转移,最后获取形状。同时注意异常处理和性能优化建议。另外,用户可能需要了解实现机制,比如OCC在解析过程中的数据结构和流程。例如,STEP文件被分解为实体和属性,OCC的转换器将这些映射到内部的数据模型如TopoDS_Shape。这部分的实现细节可能需要简述,帮助用户理解底层过程。还需要确认是否有其他可能的解释,比如是否有第三方库或特定模块中的ReadAscii函数。但根据OCC的常见用法,STEP和IGES应该是主要关联点。因此,核心答案围绕这两个格式展开比较合理。在回答结构上,先解释术语关联,然后分步介绍使用方法,包括代码示例,注意事项,性能考虑,最后提到其他相关格式如BREP的文本格式。同时用户可能遇到的问题如字符编码、大文件处理等也需提及,确保回答全面。</think> 好的,我们来梳理一下 `ReadAscii` 与 Open CASCADE Technology(OCC)相关的信息和使用方法。 在 OCC 的语境中,`ReadAscii` 通常**不是**指代一个特定的、叫 `ReadAscii` 的函数或类。它更常代表**读取 ASCII 文本格式文件**这一**操作**或**需求**,而 OCC 提供了用于读取特定**工业标准 ASCII 格式**的组件,最常见的是 STEP (AP203, AP214, AP242) 和 IGES。 以下是详细解释和使用方法: 1. **关联的核心组件 - OCC Data Exchange Modules**: * OCC 实现 CAD 数据交换主要通过其 `DataExchange` (或早期版本中的 `STEPControl`, `IGESControl`) 模块。 * 对于 STEP 格式:使用 `STEPControl_Reader` 类。 * 对于 IGES 格式:使用 `IGESControl_Reader` 类。 * **关键点:** 虽然 STEP 和 IGES 文件通常以 **ASCII 文本**形式存储(`.step`, `.stp`, `.iges`, `.igs` 文件),但这些读取器类会自动识别和解析 ASCII 格式。你不需要显式调用一个名为 `ReadAscii` 的方法。调用 `ReadFile()` 即可,它会处理 ASCII 编码的文件。 2. **核心用法 - 读取 STEP/IGES 文件**: 这里以 STEP 文件为例 (IGES 流程非常相似): ```cpp #include <STEPControl_Reader.hxx> #include <TopoDS_Shape.hxx> #include <Message_ProgressIndicator.hxx> // 可选,用于进度反馈 #include <Standard_TypeDef.hxx> // 包含 Standard_Integer 等 // 1. 创建读取器对象 STEPControl_Reader reader; // 2. 读取文件 (处理 ASCII 解析) IFSelect_ReturnStatus stat = reader.ReadFile("path/to/your/file.step"); // 3. 检查读取状态 if (stat != IFSelect_RetDone) { // 处理错误: 文件无法打开、格式错误等 Standard_SStream aSStream; stat = aSStream; std::cerr << "读取文件失败。状态: " << aSStream.str() << std::endl; return; } // 4. 指定读取参数或传输根 (TransferRoots) // 设置需要的读取模式 (STEPControl_AsIs, STEPControl_FacetedBrep, STEPControl_ShellBasedSurfaceModel, STEPControl_ManifoldSolidBrep) reader.SetReadMode(STEPControl_AsIs); // 5. 将文件内容转移到 OCC 内存模型 (TransferRoots) // 此过程解析STEP实体并将其转换为OCC拓扑结构 Standard_Integer NbRoots = reader.NbRootsForTransfer(); Standard_Integer nbr = reader.TransferRoots(); // 可选: 查看转移了多少个实体 std::cout << "转移了 " << nbr << " 个根实体。" << std::endl; // 6. 检查转移状态 if (nbr == 0) { // 处理转移错误: 没有实体成功转换 std::cerr << "实体转移失败!" << std::endl; return; } // 7. 获取形状结果 // 通常只有一个根形状(完整的装配体或零件) Standard_Integer nbs = reader.NbShapes(); if (nbs > 0) { TopoDS_Shape resultShape = reader.OneShape(); // 获取合并后的形状 // 或者遍历所有转移的形状 (例如,对装配体中的每个零件) // for (Standard_Integer i = 1; i <= nbs; ++i) { // TopoDS_Shape oneShape = reader.Shape(i); // ... 处理单个形状 ... // } // 现在你可以使用 `resultShape` 进行后续操作:可视化、布尔运算、计算属性等 } else { // 处理错误: 没有生成形状 std::cerr << "警告:读取器报告已转移实体 (" << nbr << "),但未生成任何形状。" << std::endl; } ``` 3. **处理“ReadAscii”可能涉及的其他 OCC 格式**: * **BREP 格式 (ASCII)**: OCC 的本地 BREP 格式也有 ASCII 表示。使用 `BRepTools::Read()` 函数。 ```cpp #include <BRepTools.hxx> TopoDS_Shape shape; BRep_Builder builder; Standard_Boolean success = BRepTools::Read(shape, "path/to/brepfile.brep", builder); if (!success) { /* error handling */ } ``` * **其他文本格式 (如 CSV,自定义格式)**: `ReadAscii` 可能也指读取非 CAD 标准的文本数据(如点云坐标、特定格式的测量数据)。OCC **本身** 没有专门的工具类用于通用 ASCII 文本解析。你需要: * 使用 C++ 标准库 (`<fstream>`, `std::getline`) 或第三方库来读取文本文件行内容。 * 自行编写解析逻辑,提取坐标(`gp_Pnt`)、向量(`gp_Vec`)或其他所需信息。 * 使用 OCC 的几何建模工具 (`BRepBuilderAPI_MakeVertex`, `Geom_BezierCurve` 等) 基于解析的数据构建几何对象。 4. **重要注意事项**: * **模型完整性**: 转换过程 (TransferRoots) 是关键一步。复杂的模型或非标准实体可能导致转换不完全或丢失特征。检查读取器的警告和错误消息至关重要。 * **单位**: STEP/IGES 文件中的单位可能与你的 OCC 应用默认单位不同。读取后可能需要进行比例缩放。 * **装配结构**: `reader.OneShape()` 会将整个模型(零件+装配体)作为一个大的组合形状返回。如果需要保留装配层次信息,需使用 `reader.NbShapes()` 和 `reader.Shape(i)` 遍历,并结合 `XCAFDoc` 相关类处理高级装配结构 (AP242 通常包含此信息)。 * **性能**: 解析大型 ASCII STEP/IGES 文件可能较慢占用内存。考虑文件大小和性能需求。 * **字符编码**: 虽然 OCC 能处理 ASCII 文件,但如果文件中包含扩展字符(如中文注释),确保文件编码(如 UTF-8)和你的系统/工具链设置兼容。 **总结**: 在 OCC 开发中,"ReadAscii" 的核心实现通常是通过 `STEPControl_Reader` 或 `IGESControl_Reader` 的 `ReadFile()` 方法间接完成的,它们负责解析 STEP/IGES **ASCII 文本格式** 并将其转换为 OCC 的拓扑结构 (`TopoDS_Shape`)。流程是:**实例化读取器 -> 调用 `ReadFile` -> 设置参数 -> 调用 `TransferRoots` -> 获取转移后的 `Shape` 或 `Shapes`**。对于非标准 ASCII 数据文件,需要自行解析文本并使用 OCC API 构建几何对象。理解 `TransferRoots` 的工作原理是解决常见转换问题的关键所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敢敢のwings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值