3D Occupancy 预测冠军方案:FB-OCC

文章结尾有视频和连接

背景知识

在这里插入图片描述
Occupancy 更像是一个语义分割任务,但是它是 3D 空间的语义分割它的我们对 Occupancy 分自己的期望是它能够具有通用的这种目标建模的能力,才能够不是不受制于这种目标框这种几何的矩形的这种约束而能够建模任意形状的这种物体,或者这种其他类别。

在这里插入图片描述
(1) LiDAR 方法
(2)RGB-D 方法
(3)相机方法

只用前两种方案,因为它们有深度信息,它们整体的这个难度会更小一点,因为对于 3D 场景建模最大的挑战其实就是对于精确的几何信息的建模,然后这个正是这个摄像头所缺失的,所以只依赖于相机来进行Occupancy问题的重建,其实是最大的这个挑战。

在这里插入图片描述
forward project 方案

基于就是指依据图像的是每个 Pixel 的深度,然后将依靠深度把 Pixel 从 2D 空间投影到 3D 空间,因为我们把这个看作是一个forward的过程。

在这里插入图片描述

backward projection 方案

从 3D 空间出发,我们从既定好的3D 空间上点依靠相机参数投运回 2D 空间,相当于是一个查询的过程。这样从 3D 到 2D 的过程我们叫做 backward protection,然后它的优点在于它能够以任意精度和任意稠密的这种方式去建模这种 BV 或者 voxel,但它的缺点在于现有的这种方案还没有能够把这个深度信息给利用上,

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
MonoScene:它发表就发表在 CPR 2022 上。他的做法跟我们熟知的 BV 方案其实很像,就它的也涉及到一个 view transformation 的模块,它要把图像从 2D 空间转移到 3D 空间,稍微不同的就是它需要建模 3D 空间的 voxel 的表征,然后最后用一个分割的头来预测 occupancy 这个最后的输出。

在这里插入图片描述

是一个两阶段的方案,在第一个阶段它用到深度信息建模了一个相对稀疏的 query proposal,然后在第二阶段他用到了类似于 bevfromer 这种反向投影机制来更新这个 query proposal

比赛概要

在这里插入图片描述

这个比赛,因为这个比赛是既有 nuScenes 数据集构建的 Occupancy,它的输入是 6 个环视摄像机,那我要根据 6 个环视量级的输入构建最后的 occupancy 表征

想法分享

在这里插入图片描述
你其实想要构建一个 Occupancy 跟自己的方法,嗯,其实是一个相对来说比较容易的过程。我们最简单的,我们只需要把 prediction head 从检测头换成一个分割头就可以做到,但我们会发现你只用 BV 表征,比如你先得到 BV 表征,最后再来支持这种 3D 的 occupancy 的任务,它的表征能力有所欠缺,所以现有的 occupancy prediction model 基本都是使用 Voxel 的表征,这样它会有更好的性能。但是我们前面看到的 forward project 或者 backward project,他们从你构建 BV 表征或者 构建 voxel 表征,其实都是可以相对容易的这种转换的,他们之间的转换都是很容易的啊。
在这里插入图片描述

第一个就是我们要在模型结构上设计,设计的应该是最先进的模型结构。
第二个就是我们要把我们的模型尺度放到最大,我们做一个大模型肯定会比小模型,轻而易举的提升性能。
第三个就是我们也比较关注后处理的过程。
在这里插入图片描述
我们会看到在比赛之初我们其实就已经有了不少的这种 occupancy tradition 的开源方案。有的方案比如他们会用到对于表征层面来说,他们有的会用到 Voxel,有的甚至比如 TPV.

在这里插入图片描述

做的首先就是对于表征层面来说:
1.我们会认为一个 voxel 的表征是必要的,因为毕竟最后的 occupancy 输出你需要在高度层面上它是一对有要求的。
2.我们会发现如果我们在 voxel 表征之外,我们额外添加一个 BV 的表征,但是它也是会有一定的益处的。它对于重建,比如路面这些, surface 这种类别的这种会有一定的帮助。所以我们最后是用到了一个 voxel 表征,联合 BV 表征这样一个方案啊。

在这里插入图片描述
对于投影,我们前面介绍的,不管是 forward project 或者 backward project,他们都有各地各自的优势或者劣势。对于 for 的project,我们讲到了他产生的这个表征会很稀疏,我们统计了一下,比如用到常见的 setting 的话,用 forward project 产生 3D voxel 表征,它会有 75% 的 voxel 是空的,也就是它的 Feature 是全零。因为它接收不到来自任何图像的信息,所以这种稀疏跟我们,比如我们见到的LiDAR点云那种稀疏是不一样的,这种稀疏是由于投影机制和透视关系导致的稀疏,这种吸出是需要我们去稠密化这种稀疏的,

那我们怎么去稠密化这种稀疏呢?

所以我们就看到我们前面讲到了 backward projection,它就是天然的具有这种优势,我们可以从任意 3D 点出发投影回图像层面,然后获取到对应的这种即刻信息。
然后我们这种backward projition,它其实也不受制于,比如说你的,你必须,你的 query 必须组织成一个 BV 或者 3D voxel,这种层面我们可以建立起任意形状、任意形式的这种backward的 project query,获取到我们所需的这个信息。
在这里插入图片描述

bevformer这种建立使用随机初始化的快位,它需要比较多次的这种反复交互。如果我们能够用 follow projection 产生的 query 来初始化,我们带过了 project 所用到的跨位,我们会大大降低这个跨位它的学习难度。我们在这个FB-OCC 方案里面,我们只用一次反向投影就可以有很好的效果。所以我们可以知道 forward projection 和 backward projection,他们有非常好的这种互补的性质

在这里插入图片描述
可以看到我们上面介绍了 forward projection,它会产生这种空白的,这种稀疏的这种 voxel 表征或者 BV 表征。但 forword projection 的缺陷是它没有能够利用到深度,导致它产生的 BV 特征或者 forwork 特征中有很大的 false positive,所以我们将这两种不同的投影机制结合起来,建立一种 forward-backward projection 投影方式。

1.我们先用 forward projection 来构建一个 BV query 的初始化.
2.我们用这个初始化作为 backward projection,query 来反向投影回图像来填充这些系数的特征,
所以这两种机制我们看到它们是极其互补的。

在这里插入图片描述

我们介绍到了刚上面介绍的 backward position 的一个缺点,不能有效的利用深度,所以也就导致了我们可以看到现在 Bevformer 这种性能是劣于 Bevdepth,所以我们能不能想办法把 depth 也用到 backword projection 里面呢?

因为 forward projection 和 backword projection 他们可以看作是那种相机成像的函数,相机成像函数的左右两端,所以我们所有 forward projection 能用到的性质,理论上 backward projection 都能够用到。

为了在 backword projection 里面用到深度信息,我们构建了一个深度的深度匹配的性质。
对于任意一个 3D 点,一个给定的 3D 空间上的一个点,其实我们可以就直接计算出来它在图像上对应的深度,有了这个深度之后,我们可以把这个深度信息电转换成一个深度的分布。
同时我们也知道我们能够预测图像上对应点它的一个深度信息的分布,我们通过计算两个深度分布的这个相似度就可以计算出来这个 3D 空间的点和 2D 空间上的点它的匹配程度,通过我们抑制掉这些匹配程度低的这样一个投影点,我们可以相当于建立起来更加精准的这样一个投影的匹配关系,这样就很像 LSS 它利用,它可以利用到深度的权重那样一个机制。

在这里插入图片描述
所以接下来就是我们整个的这个网络结构图,我们可以看到,首先对于多视图,我们用 backbone 之后,我们会有图像信息和对应的深度信息。对于 backward projection 机制,我们在 forward projection 上会用到图像进行一个深度信息,生成一个 3D 的 voxel 表征,同时也是出于计算量的考虑,在 backward projection 阶段,我们会把 voxel 表征给压缩成一个 BEV 的表征,作为 backward projection 的初始化。在backward projection 的阶段,我们也会用到图像特征和深度信息来相当于稠密化这个 BEV 表征。然后最后我们会把 BV 表征恢复到 3D voxel 表征这个形式作为一个加权融合,最后会得到一个相对来说比较稠密的 3D voxel表征,这样整个方案我们相当于既融合了voxel和 BEV 表征,也同时融合了 backward forward 和 forward projection 两种不同的投影方式,是一个比较综合的方案。
在这里插入图片描述
接下来就是我们这个occupancy,这个 head 的构建,我们在 head 的构建上其实并没有花过多的精力,基本都是沿用现有的方案,对于给定一个 voxel 表征来说,其实它就是相当于做一个 3D 层面的语义分割。这里面比较关键的模块在于类似于一个 U-net 或者 backbone FPN 这样一个结构,它需要这个层面它的作用。
首先第一个层,第一个作用是扩大这个表征的感受野。另一个我们能想到的点就是这个表征,我们建立这个表征的时候是从 2D 特征里面投影过来的,在 3D 层面他们的特征很有可能会,他们没有那么连续的性质,所以我们会用一个比较深层的 encoder 来恢复这个特征层面的连续性。

scaling-size

在这里插入图片描述
Internlmage-H 1B量级这个 image in code 给用起来,但直接用这个 1B 量级的参数肯定是不太合理的,因为我们有一个 10 亿参数的模型,

在这里插入图片描述

但我们的数据集 nuScence 这个数据集它的样本其实是少于 40K 的。你直接应用这么一个大的数据,大的模型,训练这么少的数据,它很容易导致过拟合的问题。

在这里插入图片描述
Depth 和 Semantic 这个联合预训练
在这里插入图片描述
nuScance 它其实没有提供这个图像 2D 的语义分割标签,所以在这次比赛里面我们其实也用到了,就是在那个 SAM_anything 这个模型来帮助我们做这个图像的自动化的比语义分割的这个标注

在这里插入图片描述

具体做法就是因为 nuScance 它其实提供了对于 sim 类别,它其实提供了 3D call,我们可以把 3D 框变成 2D 框。然后用 SAM 的 box 这个提示就可以得到质量相对来说非常高的这个,这个 instant segmentation 这个标签。
当然是另一方面对于 stars 类别,就是像路面这种类别,路面 building 这种类别其实我们是没有它的框的,然后但是 nuScance 提供了稀疏的 LiDAR 点的分割,我们在这里的做法就是把 LiDAR 点投影到图像上,随机选取几个对和一个类别,我们随机选取几个 LiDAR 点,然后做点提示来生成最优的标签。
其实我们可以看到只用点标签做分割的话,效果其实,嗯,在一定程度上是可以满足要求,但不是那么完美,主要原因就是我们随机的点是不可控的。然后对于树木这些它有可能的点是十分分散,在我们随机三个点是随机到一棵树上就可以看到最后只分割出来一棵树,然后其他树其实是没有分割出来的。但这里我们对于没有分割、没有标签的那些类别,我们其实最后预测过程中是不预测的,相当于我们尽可能保证我们这个 mask 预测在它这个准确率,我们最后的准确率其实是相对来说比较高。

后处理

在这里插入图片描述

1.最简单的 TTA 其实就是图像空间、 BV 空间这些简单的反转。
2.我们也引入了一个时序的TTA。我们因为我们发现,因为对于我们预测结果的准确率是随着这个 voxel 离 EGO car 如果距离变得越远,这个性能是急剧下降,因为越远处它的深度估计会非常的不准确。然后我们就会想到对静态的物体。对于一个静态的物体,我们可以用前一时刻,如果它离 ego car 更近,在当前时刻它离 EGO car 更远,然后我们可以用前一时刻的预测结果来替代当前时刻,然后最后我们也是用到了加权融合的方式。这种 Temporal TTA 也能带来接近一个点的提升,但由于整个数据集它在标注层面的高度没有,它的连续性其实是没有得到保障的。我们相信如果我们有更精准的数据集的标注,最后这个 Temporal TTA 的效果还是能够更进一步的发挥它的这个效果。
在这里插入图片描述
除了 TTA 之外,当然打比赛肯定大家都会用到 Ensemble 策略,在这里面我们的 Ensemble 也是非常简单直接的,对于不同的模型的预测结果,对于每一个 voxel,我们会赋予这个 voxel 两个不同的权重,一个是它的类别权重,另一个是它的模型权重。
模型权重是根据整个结果最后的整体的 IOU 决定的, MIOU 决定的类别权重是根据它这个 voxel 所处的类别,它的特定的这个 IOU 决定的。当然我们对于每个权重,我们都会给它一个可学习的参数,我们会用一个自动搜索的框架 NI 来搜索最佳的参数,来确定最终的这个 Ensemble 的策略。
在比赛里面,我们基本上会把我们所有可能会用的所有训练好的模型结果都会拿进来 Ensemble,我们最后也是用到了大概来 7 个模型的结果来 Ensemble。

在这里插入图片描述
第二个,相比于不同于以往, object detection 的结论是在这里边,在对于 occupancy prediction 任务来说,我们需要考虑一个 visible mask,就是我们对于相机不可见的那些 voxel,在训练的时候我们需要把它忽略掉,就是降给模型的学习压力做一个放松。这样一个放松我们可以看到带来,可能带来将近 8 个点的提升,

在这里插入图片描述
我们可以看到我们最开始的 baseline 用 R50 ,嗯,是有 67.8 兆的参数。最后我们用到了Internlmage-H,一个 11 参数量级的backbone,那我们整体的模型尺度也达到了,你达到了 12 亿参数。在 12 亿参数的量级上面,相比于最开始的R50,我们大一共获得了 10 个点以上的提升,这也是我们。嗯,最后这个大尺度的模型也必须依赖于 80G 的 A100 模型,其实我们也想要证明的就是现有的这个模型它仍然是符合放松规律的,越大的模型仍然会带来更好的效果。

在这里插入图片描述我们证明了就是使用 voxel 和 BEV 的联合表征可以提高模型在 surface 类别,就是 surface 这种路面或者人行道这种类别的这种准确率会看到对于路面、人行道或者绿化带这些基本都会带来可能 0- 1 个点的提升,说明 BV 表征对于最后模型的预测还是有益的。

在这里插入图片描述

视频连接
文档连接

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

欧科云链:ETH Dencun升级倒计时,哪些数据需要重点关注?

2024年3月13日 21:55(epoch 269,568),以太坊将完成坎昆-德内布升级 (Dencun 升级),OKLink 专题数据页传送门 👉 oklink.com/eth/dencun-upgrade 此次升级的主要目标是提升 Layer 2 网络的可扩展…

特殊文本文件、日志技术

特殊文件 为什么要用这些特殊文件? 存储多个用户的:用户名、密码 特殊文件:Properties属性文件 特点: 都只能是键值对键不能重复文件后缀一般是.properties结尾的 作用:存储一些有关系的键值对数据 Properties 是一个Map集合(键…

基础-笔试题2

1、int a[10]{1,2,3,4,5,6,7,8,9,0}; int *p&a[1]; 则p[6]等于_ 答:8 ,考察数组和指针的基本用法; 2、整数数组清零的方法? bzero(),memset()。 memset() 是C语言标准库中的一部分,用于将内存区域设置…

leetcode刷题日记之串联所有单词

题目描述 解题思路 一开始考虑的就是暴力破解,每次切片切words中字母的个数,然后根据每个词语的长度进行进一步的切片,将切出来的单词放入列表,然后每次对比一次,如果存在,就从原来的列表中,删…

LeetCode Python - 58. 最后一个单词的长度

目录 题目描述解法运行结果 题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hel…

Leet code 34 在排序数组中查找元素的第一个和最后一个位置

解题思路 二分查找 核心就是 先找到左端点的位置 再找到右端点的位置 二分查找整体不难 但难在细节处理 一旦处理不好就是死循环 定义rightnums.size()-1 left0 if(nums[mid] < target) 更新 left leftmid1 if(nums[mid] > target) 这里为什么要大于等于我们不…

idea error java:compilation failed:internal java compiler error

idea中编译运行maven项目报错如下 idea error java:compilation failed:internal java compiler error 尝试如下操作 注意&#xff1a;jdk8 需要设置4个地方 1.首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设置一致&#xff0c;如下…

【LeetCode热题100】148. 排序链表(链表)

一.题目要求 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输…

日期与时间(Java)

文章目录 日期与时间&#xff08;Java&#xff09;一、JDK8之前的1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、 JDK8之后的2.1 LocalDate、LocalTime和LocalDateTime2.2 ZoneId和ZonedDateTime2.3 Instant2.4 DateTimeFormatter2.4 Period和 Duration &#x1f389;写在最后…

数据结构:详解【链表】的实现(单向链表+双向链表)

目录 一&#xff0c;前言二 &#xff0c;有关链表的概念&#xff0c;结构和分类三&#xff0c;无头单向非循环链表&#xff08;单链表&#xff09;1.单链表的功能2.单链表功能的实现3.完整代码 四&#xff0c;带头双向循环链表&#xff08;双链表&#xff09;1.单链表与双链表的…

YOLOv9改进策略:注意力机制 | 归一化的注意力模块(NAM)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; NAM作为一种高效且轻量级的注意力机制。采用了CBAM的模块集成并重新设计了通道和空间注意子模块。 yolov9-c-NAMAttention summary: 965 layers, 51000614 parameters, 51000582 gradients, 238.9 GFLOPs 改…

Java基础 - 9 - 集合进阶(二)

一. Collection的其他相关知识 1.1 可变参数 可变参数就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型…参数名称; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录 SpringBoot-Web应用-路由响应 SpringBoot-数据库应用-Mybatis SpringBoot-模版引擎-Thymeleaf 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

PyTorch学习笔记之激活函数篇(二)

文章目录 2、Tanh函数2.1 公式2.2 对应的图像2.3 对应生成图像代码2.4 优点与不足2.5 torch.tanh()函数 2、Tanh函数 2.1 公式 Tanh函数的公式&#xff1a; f ( x ) e x − e − x e x e − x f(x)\frac{e^x-e^{-x}}{e^xe^{-x}} f(x)exe−xex−e−x​ Tanh函数的导函数&am…

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误&#xff1a;IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧&#xff0c;但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧&#xff01;咋整呢&#xff1f;听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

C++之类(持续更新)

1、类的基础知识点 1.1、类和对象 和C中的结构体不同&#xff0c;在C类中不仅可以定义变量&#xff0c;也可以定义函数。【在C结构体中也可以定义变量和函数&#xff0c;但是一般情况下都使用类】。 类的成员属性默认都是private&#xff1b;结构体的成员属性默认都是public。…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

特殊文件——属性文件、XML文件

目录 特殊文件 ——属性文件、XML文件 特殊文件的作用 需要掌握的知识点 Properties文件 ​编辑 构造器与方法​编辑 使用Properties 把键值对数据写出到属性文件中 ​编辑 XML文件​编辑 XML文件的作用和应用场景 解析XML文件 使用Dom4J框架解析出XML文件——下载…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…