【占用网络】SurroundOcc:基于环视相机实现3D语义占用预测 ICCV 2023

前言

本文分享“占用网络”方案中,来自ICCV 2023的SurroundOcc,它基于环视相机实现3D语义占用预测

使用空间交叉注意力多相机图像信息提升到3D体素特征,即3D体素Query到2D图像中查询融合特征的思想

然后使用3D卷积逐步体素特征进行上采样,并在多个层次特征图上进行损失监督。

论文地址:SurroundOcc: Multi-Camera 3D Occupancy Prediction for Autonomous Driving

代码地址:https://github.com/weiyithu/SurroundOcc

同时,SurroundOcc介绍了如何通过多帧点云,构建稠密的3D语义占用栅格数据集,这部分也是挺重要的。

数据集地址:清华大学云盘

一、模型框架

SurroundOcc 通过环视相机,也就是多视角图像数据,实现3D语义占用预测。

  1. 输入多视角图像数据,比如6个环视相机,6组图像数据。
  2. 经过主干网络RestNet101,对于输入图像进行特征提取;然后经过FPN特征金字塔结构生成多尺寸特征图。特征图分辨率大的,保留更多细节信息;特征图分辨率小的,经过更多的下采样,具有更多的上下文信息,特征更为抽象和有概括性。
  3. 初始体素查询,通过“可变形交叉注意力”,Deformable Attention,融合图像信息,即:3D体素Query到2D图像中查询融合特征思想
  4. 然后经过前馈网络3D卷积操作生成3D体积特征,即3D体素特征
  5. 得到的3D体积特征,进行3D语义占用预测。
  6. 同时较小分辨率的3D体积特征,通过3D卷积操作上采样,生成大分辨率的3D体积特征,供下一层阶特征使用。(3D卷积用来处理相邻3D体素之间的特征交互)
  7. 最终通过多尺寸的3D体素特征(包括当前层和上一层特征;上一层特征通过3D卷积上采样,得到和当前层相同大小;两者拼接起来,再做特征提取,得到当前层3D语义占用预测),生成多个不同分辨率大小3D语义占用预测输出

注意:作者在多个不同分辨率大小3D语义占用预测输出,分别进行了训练损失监督。

其中SurroundOcc的方法思路比较简单易理解,简单概括为:

  • 输入图像数据,提取图像特征。
  • 初始体素查询,通过交叉注意力,体素查询在图像特征中融合对应信息,得到3D体素特征。
  • 通过FPN特征金字塔结构,生成多个3D语义占用预测输出。

这些3D特征被用来预测空间中每个体积元素(voxel)是否被物体占用。这是通过监督学习完成的,其中模型被训练以预测3D网格中的每个元素是否为空或被物体占用。

下面梳理一下模型的输入输出。

  • 输入:多视角图像数据,比如6个环视相机,6组图像数据。
  • 中间层: 3D体素特征,多尺寸中每一层中各自输出一个3D特征张量V,其形状为HxWxZ,代表预测的3D占用空间。3D张量的值在0和1之间,表示网格占用的概率。
  • 输出:3D语义占用,将3D体素特征提升到一个(L, H, W, Z)形状的张量,其中L是类别数量,可以得到3D语义占用网格,类别0表示非占用网格。

二、核心内容——生成3D体素特征

SurroundOcc是直接从2D图像信息提升为3D体素特征而不是BEV特征,下面分析一下其中的细节。

现有方法的局限性:

  • 许多3D场景重建方法将多视图2D特征集成到3D空间中,通常是通过将2D特征重新投影到已知姿态的3D体积中。
  • 这些方法简单地通过对同一网格中的所有2D特征取平均来计算网格特征。
  • 然而,这种方法假设不同视图3D体素查询的贡献是相等的,这并不总是成立的,尤其是当某些视图被遮挡模糊时

提出的方法:

  • 为了解决这个问题,作者采用了交叉视图注意力来融合多摄像头特征。
  • 通过投影3D参考点到2D视图,并使用可变形注意力来对3D参考点周围2D视图特征进行查询。
  • 二维“BEV查询”不同,他们构建了“3D体素查询”以保留更多的3D空间信息。(因为BEV查询融合图像特征后,会在高度方向进行压缩的)
  • 通过这种方法,可以定义特定的3D体素查询,为每个查询将其对应的3D点投影到2D视图,并使用3D参考点命中的视图来采样2D特征。

可变形注意力机制(Deformable Attention:

  • 通过可变形注意力机制,权重和采样位置可以调整,从而使网络能够根据每个特定情况更有效地融合来自不同视图的信息。
  • 输出的是交叉视图注意力层的加权特征和,是根据可变形注意力机制采样的特征的加权和。

 

 F是输出特征的元素,它是通过可变形注意力计算得出的命中视图的平均值。

Qp是3D体素查询,P是从3D到2D的投影函数,Vhit​是命中视图的集合。

这种方法通过在多视图融合过程中使用更加复杂的权重分配策略来提高3D重建的精度。

可变形注意力机制允许网络在将2D特征转换为3D表示时,根据每个特征点的具体情况进行更加灵活的调整。(对3D参考点周围2D视图特征进行查询)

这种方法的优势在于它可以更好地处理视图遮挡和模糊,为3D场景重建提供了更准确的3D空间信息。

三、重要设计——多尺度占用预测

多尺度方法的必要性:

  • 与3D检测任务不同,3D场景重建需要捕捉更多的低层次特征学习细粒度的细节
  • 从不同尺度(大小、分辨率)的2D图像中提取特征,每个尺度捕获不同的信息。较小的尺度可以捕获精细的细节,而较大的尺度则捕获更广泛的结构。
  • 这是因为场景重建涉及到理解和复现一个场景的所有细节,而不仅仅是识别场景中的物体。

2D-3D U-Net架构:

  • 为了解决细节捕捉的问题,采用了2D-3D U-Net架构。U-Net是一种常见的深度学习架构,它特别擅长在图像分割任务中捕获多尺度的空间特征。
  • 多尺度2D特征被输入到不同数量的2D-3D空间注意力层以提取多尺度3D体素特征。

特征上采样与融合:

  • 下面公式描述了如何将一个尺度的特征上采样,并与下一尺度的特征融合。
  • 这通过3D反卷积层(Deconvolution layer)完成,它通常用于上采样,即增加数据的分辨率。

不同分辨率的占用预测:

  • 网络在每个级别输出具有不同分辨率的占用预测结果,这允许网络在不同的尺度上捕捉和预测空间占用情况。
  • 这种多分辨率的输出有助于获取精细的细节同时也保留了全局结构的信息。

高层和低层特征的融合:

  • 为了获得强大的高层次和低层次3D特征,网络在每个尺度上都进行监督学习。
  • 这意味着每个尺度的输出都通过特定的损失函数进行训练,以确保网络能够在不同级别捕捉到有用的特征。

损失函数:

  • 对于3D语义占预测:使用多类别交叉熵损失。
  • 对于3D场景重建:使用二分类形式的损失函数。

A、在3D语义占用预测中,通常需要区分多个类别(例如不同类型的物体或空间区域),因此使用多类别交叉熵损失是合适的。

网络试图对每个体素的类别进行分类,这可能包括多种物体类别以及空闲空间。

B、3D场景重建的任务,如果目标是简单地区分空间是否被占用(不关心占用的是什么类型的物体),那么二分类损失函数就足够了。

在这种情况下,网络的目标是判断每个体素是否为空(例如,没有被物体占用)或非空(被某种物体占用)。这是一个典型的二分类问题。

四、重要参考——生成稠密的3D语义占用数据

SurroundOcc介绍了如何通过多帧点云,构建稠密的3D语义占用栅格数据集,这部分也是挺重要的。

背景:

  • 实验发现,仅使用稀疏的LiDAR(激光雷达)点云数据进行监督的网络无法预测足够密集的占用信息。
  • 这是因为稀疏的数据不足以覆盖场景中所有可能的占用区域,尤其是在远距离或者遮挡较多的场合。

稠密的占用标签的重要性:

  • 为了提高预测的密集度,需要生成密集的占用标签。
  • 这里所谓的“稠密占用”指的是场景中每个体素(三维空间中的像素)是否被占用的详细信息。

挑战:

  • 如SemanticKITTI 中提到的,为一个包含数百万体素的3D场景,手动标注密集占用信息是非常复杂且劳动密集的。

自动生成标签方法:

  • 为了解决这一问题,作者设计了一个自动生成密集占用标签,这个方法利用现有的3D检测和3D语义分割标签,而不需要额外的人工注释。
  • 一个直观的方法是直接将多帧LiDAR点云序列变换到统一的坐标系中,并将这些点云体素化(转换为体素网格)。但这种简单的方法只适用于完全静态的场景,忽略了移动物体,并且可能因为点云的稀疏性而产生错误的占用标签。
  • 为了解决这些问题,提出了将动态物体静态场景多帧LiDAR点云分别缝合的方法。
  • 还采用了Poisson Reconstruction方法来填补点云中的空洞,并将获得的网格体素化,以得到密集的体积占用信息。

关键步骤1——多帧点云拼接

用于处理和合成多帧LiDAR(激光雷达)点云数据的方法,特别是在处理动态(可移动)和静态(不动的)对象时。

这个过程是为了创建一个统一的场景表示,该表示可以用于后续的体素化和占用空间的预测。

动态与静态数据的分离:

  • 对于每一帧LiDAR数据,首先根据3D边界框标签点云中剪切出可移动的对象,这样就可以分别得到静态场景和可移动对象的3D点

多帧数据集成:

  • 然后,将收集到的静态场景段移动对象段集成到各自的集合中。
  • 这意味着动态对象与背景环境的数据被分开处理和储存。

坐标变换:

  • 将多帧段的坐标转换到世界坐标系统中,这涉及使用校准矩阵和自我位置(ego-pose)信息来校正每一帧数据的位置和方向。

最终场景构建:

  • 根据对象的位置和当前帧的自我位置,可以通过合并静态场景和移动对象的3D点来得到该帧的3D点 P。
  • 使用变换矩阵将静态场景和对象的点,从世界坐标系转换到当前帧的坐标系。

 这个方法的关键在于能够区分和独立处理动态对象和静态场景的数据,从而能够在动态环境中准确地进行点云重建。

通过合适的坐标变换和数据集成,可以为后续的体素化过程提供更丰富的信息。

关键步骤2——通过Poisson重建来提高点云数据的密度

通过步骤1的多帧点云缝合方法提高了点云的密度,由于LiDAR束的限制,点云中仍然存在许多间隙,且点的分布不均匀。

法向量计算

  • 为了解决这个问题,首先需要计算点云中点的法向量。
  • 法向量是垂直于点云表面的一个重要属性,能够指示表面的方向。
  • 后续的Poisson重建方法需要每个点的法向量,这些法向量通常通过分析点云的局部结构计算得出。

Poisson重建

  • Poisson重建是一种流行的算法,它使用点云及其法向量作为输入,并输出一个连续的、封闭的三角网格模型,这个模型填补了原始点云中的空隙。
  • 输入:点云和法向量,利用这些信息推断出一个三维表面。
  • 输出:是一个三角网格,这是一种由三角形组成多边形网格,用于在计算机中表示3D形状。该网格紧密地拟合原始点云数据,并填补由点云稀疏部分导致的空隙。

获得的网格和体素化

  • 一旦得到连续的三角网格,就可以将其转换为体素表示。体素化是将连续几何体转换为离散的网格体积元素的过程,类似于在三维空间中填充小立方体来近似形状。
  • 得到的三角网格由顶点和边组成。这个网格提供了一个更加连续和均匀的表面表示,它可以用来填补点云的空洞。
  • 进一步将这个网格转换成密集的体素 。

通过这种方法,可以有效地从稀疏或不均匀的点云数据中生成一个高质量的、密集的3D模型。

五、模型效果

SurroundOcc在nuScenes 验证集上的 3D 语义占用预测结果,如下图所示。(说实话没有太大提升,但是呢,这篇论文的思路很经典,而且提出了3D语义占用数据集,还是值得学习和致敬的)

具有挑战性的场景的示例,尽管 RGB 图像的质量在雨天和夜晚会下降,但然可以预测详细的占用情况。 

下面是一些可视化效果:

分享完成~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行、关键字断行等等内容格式整理

首先,需要用到的这个工具: 百度 密码:qwu2蓝奏云 密码:2r1z 打开工具,切换到“文章工作域”(嗯...默认就是) 找到这个,多内容断行分割 点击打开,出现如下窗口设置 相关的…

Netty-Netty基础应用与了解

前言 Netty 的优势 1、 API 使用简单,开发门槛低; 2、功能强大,预置了多种编解码功能,支持多种主流协议; 3、定制能力强,可以通过 ChannelHandler 对通信框架进行灵活地扩展; 4、性能高…

【教程】通过Excel宏/Pandas两种方法来自动添加渐变数据条

这种数据真的很难看懂: 一般会对其画折线图或者数据条,相比起来就非常直观: 但是每一列都要手动这样设置就非常累了,所以这里就用到了VBA宏(或者Pandas)。 VBA宏方法 从这里进入宏: 随便写一个宏名后点创建&#xff1…

PyTorch项目源码学习(1)

PyTorch PyTorch是一个开源的深度学习框架,项目地址 https://github.com/pytorch/pytorch 在学术工作中的使用频率较高。 其主体由C开发,PyTorch是Torch的Python调用版本。学习PyTorch项目源代码的目的在于学习其中的实现方法与技巧,增加训练…

LangChain 69 向量数据库Pinecone入门

LangChain系列文章 LangChain 50 深入理解LangChain 表达式语言十三 自定义pipeline函数 LangChain Expression Language (LCEL)LangChain 51 深入理解LangChain 表达式语言十四 自动修复配置RunnableConfig LangChain Expression Language (LCEL)LangChain 52 深入理解LangCh…

毕业论文idea

三大模块 分级、分类、系统 多看医学图像处理毕业论文。 Swin Transformer的模型表现不如MobileViT 使用高像素的数据集在云服务器上训练时,如果您发现Swin Transformer的模型表现不如MobileViT,这可能由几个因素导致: 模型架构与数据匹配…

机器视觉在OCR字符检测的应用

在产品质量 检测过程中,对于字符、条码等标识信息的识别、读取、检测是非常重要的一部分,比如在食品饮料包装检测中,生产日期 、保质期 、生产批号 、条码等字符信息是产品管理和追溯必不可缺的,因此利用机器视觉技术进行OCR字符采…

【实用技巧】Windows电脑向iPhone或iPad传输视频方法2:有线传输

一、内容简介 本文介绍如何使用 Windows 电脑向 iPhone 或 iPad 传输视频,以 iPhone 为例,iPad的操作方法类似,本文不作赘述。 二、所需原材料 Windows 电脑(有 USB-A 或 USB-C 接口)(桌面或其它文件夹中…

Web组件的使用

文章目录 1 概述2 加载网页加载在线网页加载本地网页 3 网页缩放文本缩放 4 Web组件事件Web组件处理JS confirm事件 5 Web和JavaScript交互启用JavaScriptWeb组件调用JS方法JS调用Web组件方法 6 处理页面导航7 调试网络应用8 参考链接 1 概述 相信大家都遇到过这样的场景&…

Mixtral Moe代码解读

一直对稀疏专家网络好奇,有些专家没被选中,那么梯度是否为0,这一轮被选中有梯度,下一轮没被选中无梯度,模型可以训练收敛吗? 由于每个token都会选择topk个专家,所以在每一轮epoch中,…

python工具-udp-tcp-client-server-demo

python工具-udp-tcp-client-server-demo server tcp-server: python xxx.py -type tcp -ip “127.0.0.1” -port 1234udp-server: python xxx.py -type udp -ip “127.0.0.1” -port 1234 client python xxx.py -type udp -ip “127.0.0.1” -port 1111python xxx.py -type tc…

依赖Kafka的Go单元测试例解

Kafka[1]是Apache基金会开源的一个分布式事件流处理平台,是Java阵营(最初为Scala)中的一款杀手级应用,其提供的高可靠性、高吞吐量和低延迟的数据传输能力,让其到目前为止依旧是现代企业级应用系统以及云原生应用系统中使用的重要中间件。 在…

pytorch无法把共享内存写入文件

环境: 在容器中跑pytorch模型的训练 问题表现: ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm). Traceback (most recent call last): File "/root/anaconda3/lib/python3.8/m…

flutter getTemporaryDirectory()的使用

下面是上传音视频流的截图,先保存在缓存,然后请求接口,成功或者失败会删除文件。 可以在Device File Explorer查看, Android: 会返回 /data/data//cache 这个目录,是应用私有的缓存目录。 iOS: 会返回 Library/Caches 下的一个…

Java学习笔记-day06-响应式编程Reactor API大全(上)

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…

191. 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…

LeetCode 2645. 构造有效字符串的最少插入数

一、题目 1、题目描述 LeetCode 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 "a"、"b" 或 "c" 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。如果2645. 构造有效字符串的最少插入数 2、接口描述 ​ class Solut…

SpringCloud微服务 【实用篇】| RabbitMQ快速入门、SpringAMQP

目录 一&#xff1a;初始RabbitMQ 1. 同步和异步通讯 1.1 同步调用 1.2 异步调用 2. MQ常见框架 二&#xff1a;RabbitMQ快速入门 1. RabbitMQ概述和安装 2. 常见消息队列模型 3. 快速入门案例 三&#xff1a;SpringAMQP 1. Basic Queue 简单队列模型 2. Work Queu…

Hive事务表转换为非事务表

环境&#xff1a;hive3.1.0 由于建表时默认会建为非事务表 CREATE TABLE bucket_text_table2(column1 string,column2 string,column3 int) CLUSTERED BY (column3) into 5 BUCKETS STORED AS TEXTFILE; 执行完成后&#xff0c;查看默认建表语句&#xff1a; ---------------…

PHP 微信小程序获取 手机号码

PHP代码 $param $_POST; $app_id ""; $app_secret "";$url_get https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid . $app_id . &secret . $app_secret;$tmptoken json_decode(curl($url_get), true);$token $tm…