赞
踩
照老样子先说为什么会写这篇文章,因为到目前我的分割大模型对实际部署的小模型并没有帮助。这让我有点郁闷,更郁闷的是后面蒸馏的环节目前也不是我在做,照理直接拿推理结果当hard label来搞也不是不可以吧。卡不够我的大模型还在训,等训完想自己上手搞一搞蒸馏,我还就不信了学不好!所以这段时间就写一写看过的paper了,看Bev的时候occupancy相关的有些文章也顺便看了,写一写挺好的。
ok,那第一个,为什么自动驾驶感知都已经有bev了,又出来了occupancy(占用网格)?
这是2022年特斯拉提出来的一个“技术?”。他和bev最主要的区别就是,bev是二维的呈现形式把所有的结果在高度上拍扁了,而occupancy则是三维的,空间上的。那他的好处显而易见,他可以表达存在在空中的东西以及空间中的状态 。拿一个场景来举例,比如大家在小区的车位上会有一个地锁。或者高速收费站停车场的抬杆,这个地锁或者杆子如果你从bev的视角去看由于没有高度信息地锁关闭和打开看起来是一样的。但如果是传统2D的检测或者occupancy这样可以看到3D空间的占用状态,这样的是可以检出来的。不管怎么说,occupancy相比原来的bounding box,细粒度更高,更加能够表达物体的细节了,这些细节则代表了更多的corner case可以被解决。
下面拿雷总的图来举个例子,该图来自2023年12月28日小米技术发布会
原本的占用网格像“我的世界”一样,使用一个一个的小立方体来代表物体,立方体越小,物体的分辨率就越高,越吃算力。小米这次出的超分矢量算法还是有点东西,看起来输出的结果像是mesh拟合了物体,但没有很精细还是有很多空洞。当然这样并非首创,特斯拉在前段时间也有放出泊车视频,也是这样的形式但更加精细和连贯。
在share paper之前还是说一些题外话,占用网格理论上可以说Bev的升级版,把占用网格切换到鸟瞰图的视角下就可以当bev来用。关于bev之前已经有写过文章讲过(万字长文谈自动驾驶bev感知(一) )大家感兴趣可以看一下。
第二个是关于bev和occupancy,这两个东西并不是完全割裂的,许多bev检测的算法也都在支持occ task,比如我们之前介绍过的bevdet,方法叫BEVDet4D-Occ
再有就是Semantic Scene Completion 与 occupancy,因为占用网格之前都是一个一个带语义的小方块,所以有个任务和他很相似叫做语义场景补全在semantic kitti上有个task,他的真值是对激光雷达数据的逐点标注,把他体素化后就可以拿来做occupancy的预测。现在的占用网格真值大家一般也都是这样搞起来的,当然nuscenes也可以。但这两个task还是不太一样的,3D Semantic Scene Completion更关注于从稀疏的输入数据中恢复出完整的3D场景的几何和语义信息,而Occupancy则更侧重于通过体素网格来表示和理解3D空间的占用情况。
之前我也有想过和同学一起搞一下占用网格,但是太耗资源了根本搞不起来,能搞得起占用网格的都是大户人家(ps 这是重点!!!)。在自动驾驶里面小公司是根本搞不起的,大多数公司还在追bev的方案,其实跑通真正量产了的不多,占用网络应该是下一个要追赶的技术点了。
对着上面的图通俗易懂的简单说一下,一个图像进来,过2D UNET,flosp(Features Line of Sight Projection),再过3d unet,3D UNET中间插入了一个3D CRP(3D Context Relation Prior)模块,然后做语义补全任务。
最核心的是FLOSP模块,如何将2D特征提升到3D? 其实就是从不同尺度下3D投影到2D,拿到多个尺度采样特征后混合相加完了给后面的3D Unet,就是这样。
剩下的3D Context Relation Prior也不细说,关系矩阵和超体素特征点乘也算是一种算注意力了,超体素是用来建模体素空间关系的。后面的Loss设计部分大家也可以看一看的。
点评:清华和鉴智的工作,说是首次证明基于视觉的方法在nuScenes LiDAR分割任务上实现了与基于lidar的方法相当的性能。当然也在semantic kitti上测了但没说。可惜的是跑起来太慢了,当然这也是所有occ算法的通病。不过有个点是,他们的工作也比较有连续性,截止到2023年12月29日在github看到他们在上个月发布了占用网格世界模型!,突出一个紧跟时事。
基本流程:简单和大家说一下,就是voxel太慢太复杂,bev拍扁了,tpv用三视图来做
复杂的就不讲了,看paper里面的公式,1是体素表达xyz,2是bev表达xy,3 4 5 是三视图表达xy,zx,yz。S是sampling,V,B,T都是features。
整体流程:
至于网络特征怎么提取,transformer怎么做注意力大家可以看文章,后面有时间应该会对文章有更细致的讲解,核心思想就是我的特征是从三个视图拿到的加起来,然后去做prediction。就是这样。
然后给大家share一下,“米式对比法”,看看就好。
点评:清华天大和鉴智的工作,部分是原班人马,不过这次思路完全不一样了,不搞三视图了。由于是靠后一些出的文章,所以结果当然会比TPVFormer强很多。
基本流程:如下图多张图像经过backbone network((e.g. ResNet-101)后出来的是多尺度的特征图X,然后每个体征图分别过2D-3D Spatial Attention模块,将2D特征转为3D,再然后将上一层3D特征进行反卷积和本层特征相加拿到最终特征后,再做occupancy prediction,这里不同尺度的预测每一个都是有监督的。
总体流程讲完再简单说一下关键点
2D-3D Spatial Attention:就是把2d特征转到3d空间下的模块。首先3D体积查询定义为Q∈RC×H×W ×Z,这个Q就是3D reference point,然后对于每个Q,会根据给定的内外参将其对应的 3D 点投影到 2D 视图(就是虚线箭头部分)。然后只使用 3D 参考点命中的点,在这些投影的 2D 位置周围采样 2D 特征(怎么采样就是下面的DeformAttn,Qp查询是3D 参考点,P(qp,i )是2D采样,X是camera feature)。模块输出 F ∈ RC×H×W ×Z 是根据可变形注意机制的采样特征的加权和。公式化如下:
至于Multi-scale Occupancy Prediction这个部分上面其实已经说过了,下面就是公式化,Deconv就是反卷积拿来做上采样,这算个小知识点,大家不熟悉的可以了解一下。
总结说一下,上面提到的只是关键点,其实还有很多细节的部分是没有提到的,这个大家一定要知道!!!
点评:这篇就比较厉害了,全是鉴智的人,而且还挂了联合创始人兼CTO都大龙,按道理挂大佬名字的paper一般都不会太差,当然本身也没有太差毕竟也是ICCV2023。先上流程图
-
本文提出了 OccFormer,一种用于基于相机的 3D 语义占用预测的双路径变换器网络。为了有效地处理相机生成的 3D 体素特征,提出了双路径变换器块(Dual-path Transformer Encoder),它有效地捕获了具有局部和全局路径的细粒度细节和场景级布局。此外也是第一个使用掩码分类模型进行 3D 语义占用预测的人。鉴于固有的稀疏性和类不平衡,所提出的保留池和类引导采样显着提高了性能。OccFormer 在 SemanticKITTI 测试集上实现了语义场景补全的最先进的性能,在 nuScenes 测试集上实现了基于相机的 LiDAR 分割。好,先简单说一下上面的depth 和context点乘这是LSS的经典操作,下面的我们看重点看几个
Dual-path Transformer Encoder
这里的局部细粒度细节和全局路径的场景级布局是怎么搞的呢?local path 主要是提取细粒度语义结构。水平方向包含了最多的变化,所以用一个共享编码器,来并行处理所有 BEV 切片,同时保留大部分语义信息。具体来说,我们将高度维度合并到批次维度(batch dimension)中,并采用 windowed self-attention 作为局部特征提取器可以动态地关注具有适度计算的远程区域。(这里的窗口自注意力就是在一个固定范围内算自注意力,如果大家不了解注意力机制,这不行,这得了解,后面看什么时候我把去年做的transformer PPT放出来)global path 的目的是有效地捕捉场景级的语义布局 ,首先通过沿高度维度的平均池化来获得BEV特征,利用来自 local path 的相同的windowed self-attention 来处理相邻语义的BEV特征。由于发现 BEV 平面上的 global self-attention 会消耗过多的内存,因此采用ASPP来捕捉全局的语义。公式化输出如下
中间的Multi-Scale3DDeformableAttention就不说了,见过很多次了无非就是2D变3D用到三线性特征采样trilinear feature sampling。接下来说一下Transformer Occupancy Decoder ,就是transformer 的decoder,这一层特征加上上一层的特征,确实没啥好说的。至于里面提出的Preserve-Pooling就是个max-pooling也没啥特别只是用的比较好;Class-Guided Sampling就是添加类别权重的超参,看起来高大上罢了。
ok,到这里就可以开始讲一讲
这是在Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction, CVPR 2023,github官方的代码仓库贴出来的信息,一般来说后出来的paper效果都应该好一些,但大家请看下面两个表格,上面的是前面讲过的surroundOcc(ICCV 2023),下面是我们这篇文章的OccFormer(iccv2023)。好像后面发出来occformer还要差一些,同时也没和自己的工作surroundOcc对比(应该那时候surroundOcc还没中)
(不重要的ps,如果大家以后为了能发paper只跟差的比不跟好的比那就没意思了,搞学术还是得严谨一点)
点评:同样是一篇挂了大佬名字,也是今年iccv 2023的paper。也同样有鉴智和清华,当然也有来自中国科学院自动化研究所和中国科学院大学的。这篇就简单说一下,因为这篇主要不是做网络而是做Benchmark,而且最重要的是没什么好说的,这篇不是重点,下一篇才是重点,重点到什么程度呢?这么跟你说,这也是一篇我非常欣赏的工作。这篇讲的是现有的相关基准缺乏城市场景的多样性,它们只评估前视图预测。为了对周围的感知算法进行全面基准测试,我们提出了OpenOpcupancy,这是第一个周围的语义占用感知基准。在 OpenOpcupancy 基准测试中,我们扩展了具有密集语义占用注释的大规模 nuScenes 数据集。
人员构成大家自己看一下
和其他数据集的对比
(机器翻译如下:LiDAR 分支利用 3D 编码器提取体素化的 LiDAR 特征,相机分支使用 2D 编码器来学习环绕视图特征,然后将其转换为生成 3D 相机体素特征。在多模态分支中,自适应融合模块动态集成两种模态的特征。所有三个分支都利用 3D 解码器和占用头来产生语义占用。在占用率结果中,红色和紫色圆圈突出显示的区域表明多模态分支可以生成更完整和准确的预测(放大时效果更好))
Cascade Occupancy Network以及可视化效果
image序列过来后会先进行Depth Prediction,这里是直接利用现成的深度估计模型,如单眼深度或立体深度估计,直接预测每个图像像素(u, v)的深度Z(u, v)。之后,深度图 Z 将反投影到 3D 点云中,但由此产生的3D点云质量较低,特别是在远程区域。(因为地平线的深度非常不一致;只有少数像素决定了大区域的深度)。
Depth Prediction 下面有个Voxel Queries Q,预定义的体素查询为 3D 网格形可学习参数 ,Q ∈R h×w×z×d 其中 h × w × z 的空间分辨率低于输出分辨率 H × W × Z 。
接着Depth Prediction 和Voxel Queries Q被送到Depth-based Query Proposal。这里有一个点,为了获得好的Q,使用模型 Θocc 以较低空间分辨率预测占用图来帮助校正图像深度。具体来说,首先将合成点云转换为二值体素网格映射图M(in),如果至少占用一个点,每个体素被标记为1。然后我们可以通过 M(out) = Θocc(Min) 预测占用率,其中 M(out) ∈ {0, 1}h×w×z 的分辨率低于输入 M(in) ∈ {0, 1}H×W ×Z,因为较低的分辨率对深度误差更稳健并与体素查询的分辨率兼容。简单来说就是低分辨率更鲁棒现在就可以来proposal Q了,Q是怎么出呢?
Q从上面的低分辨率预测占用图来选,这样的话通过删除许多空白空间和保存计算和内存,再者通过减少错误 2D 到 3D 对应关系引起的歧义来简化注意力学习。
到这里就完成了第一个阶段的Class-Agnostic Query Proposal,接下来就是第二个阶段Class-Specific Segmentation.
ResNet-50 backbone来 提取 2D features ,然后2D 的Feature作为k,v,有了第一阶段的Q,就可以做注意力了。
Deformable Cross-Attention 老熟人了,2d 3d版本也都有了。
经过几层可变形交叉注意后,Q将被更新。然后我们再接着看就能看到Mask Token了,这就是类似于掩码自动编码器(MAE)的3D场景补全了。在前面虽然选择了一些体素查询来处理图像;剩余的体素将与另一个可学习的参数关联起来补全3D体素特征。为了简洁起见将这种可学习的参数命名为mask token,因为没被选择的Q,就类似于从Q中被屏蔽掉了。具体来说,每个mask token是一个可学习的向量,表示存在一个待预测的缺失体素,位置嵌入也被添加。MAE也是如此,重建mask掉的token。
输入的token有了,接下来就是算Deformbale Self-Attention,获得refined voxel features。
在往后就是上采样和全连接,输出预测结果。
抱歉这里把双目的语义补全单独列了出来,主要是单目可以当多目来用也还好,但双目输入来做占用网络就有些特别了,他要求是左右两个视图。而且上面也有说语义场景补全和占用网格的区别,所以可以简单看一下。
输入左右两个视图的图像过2D U-Net编码成二维特征F2D,l, F2D,r∈RH×W ×C。然后将二维特征融合到三维体素中,通过立体软特征分配(stereo - sfa)模块学隐式深度信息。接下来,通过占用感知深度(OAD)模块将显式深度信息添加到3D特征中。
Stereo Soft Feature Assignment Module 如下。通过计算左右二维特征之间的相关性得到的隐式深度信息被编码为三维特征的权重。
上面有三个方程,这三个方程就是Stereo Soft Feature Assignment Module的过程了。首先公式一中x是voxel的中心坐标,3D-2D投影表示为π(x),φx(M)是采样在坐标x处的特征映射M。直白的解释就是从图像特征中采样出对应的3D体素特征。当投影的2D点在图像之外时,3D特征将设置为0。
公式二是用来将从左右特征图中采样出的3D特征进行加权融合。其中 w 表示由 V3D,l 和 V3D,r 之间的相关性计算的权重。在文中用的是余弦相似度来衡量特征的相关性。可以和上面的图对应上。
公式三是为了扩大感受野,用的多尺度 2D 特征图,其中 S = {1, 2, 4, 8} 是一组下采样尺度。
接下来是Occupancy-Aware Depth Module,下面的图为了简单起见仅展示了单图像 的处理流程。
首先,单尺度图像特征F2d过来后,用一个NetD来预测多视图输入图像的深度特征 FD;然后使用 softmax 将FD变换为截锥体的深度分布GD,在然后利用摄像机标定矩阵P∈R3×4,将截锥深度分布GD转换为具有可微grid sampling过程的体素空间深度分布表达VD∈RX×Y ×Z。
公式中中 M 是用来平均左右两个输入之间重叠区域的体素像素的掩码,重叠区域的值为 0.5,其他值为 1.0,VD 可以表示为体素空间中的占用概率先验。然后乘起来拿到感知占用的体素特征Vocc。
这一类也比较特殊,属于没开源但实打实可以涨点的,可以学习一下技巧。
其中Zi和Ci分别在{1,N}和{CBEV,CVoxel}之间均匀分布。Bt−1和Bt两个时序上的bev特征通过前馈网络提升到V ’ t−1,i和V ’ t,i,经过第i个体素解码器,得到细化的V ’ t,i,后面的步骤遵循相同的方案。每个体素解码器包括基于体素的时间自注意力(Voxel based Temporal Self-Attention)和基于体素的空间交叉注意力模块(Voxel-based Spatial Cross-Attention),并分别使用历史 V 't−1,i 和图像特征 Ft 细化 V 't,i。模型逐渐增加Zi,减少Ci,有效高效地学习最终的占用描述符Vt。就是说Z的高度是从C特征维度这里来的。而这里的时间自注意力和空间交叉注意力也见过是从前面bevformer那里来的,代码部分也是有继承bevformer。这里只是简单说一下,想要真的弄懂还是得一步一步去看代码。这里先简单说,后面如果我还有时间的话再写代码部分。
点评:nvidia出品,确实做了不少工作,但个人觉得主要还是预训练做得好,毕竟不缺卡可以大力出奇迹,LSS+BEVformer说的很清楚了。有个好消息是,人家开源了https://github.com/NVlabs/FB-BEV。
机器翻译如下
FB-OCC,是基于一个名为FB-BEV的3D物体检测方法。在这里,我们提供一个简短的介绍,以便更好地理解FB-OCC。相机只能3D感知模型的核心模块是视图转换模块。这个模块包括两个突出的视图转换:前向投影(由List-Splat-Shoot表示)和后向投影(由BEVFormer表示)。FB-BEV提供了一个统一的设计,利用这两种方法,提升了每种方法的优点,改善了感知结果,同时克服了它们的局限性。在FB-OCC的情况下,我们使用前向投影来生成初始的3D体素表示。然后,我们将3D体素表示压缩成一个扁平化的BEV特征图。BEV特征图被视为BEV空间内的查询,并参与图像编码器特征以获取密集的几何信息。然后将3D体素表示和优化的BEV表示的融合特征输入到后续的任务头中。
在前向投影模块中,我们坚持LSS的原则,以考虑每个像素深度估计的不确定性。这使我们能够根据它们对应的深度值将图像特征投影到3D空间。与LSS不同,后者模拟BEV特征,我们直接模拟3D体素表示,以捕获3D空间中更详细的信息。此外,我们采用BEVDepth的方法,利用点云生成精确的深度地面真实值,这有助于监督我们的模型的深度预测,以提高准确性。LSS倾向于产生相对稀疏的3D表示。为了解决这个问题,我们引入了一个后向投影方法来优化这些稀疏的3D表示。考虑到计算负担,我们在这个阶段使用BEV表示,而不是3D体素表示。后向投影方法借鉴了BEVFormer。然而,与BEVFormer不同,后者使用随机初始化的参数作为BEV查询,我们将获得的3D体素表示压缩成BEV表示,从而融入更强的语义先验。此外,我们的后向投影方法在投影阶段利用深度分布,使得投影关系的建模更为精确。
在获得3D体素表示和优化的BEV表示后,我们通过扩展BEV特征的过程将它们结合起来,得到最终的3D体素表示。
点评:小米和北大的工作,用nerf渲染的结果来做语义和深度的监督信号训occupancy,挺会玩。
题外话 在雷总的发布会上看到了embodied ai,emmmmmm,这说明了什么呢?我也不知道哈哈哈
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。