基于视觉的3D Occupancy论文阅读:MonoScene等最新文章!

作者 | stella  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/613162521

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【3D目标检测】技术交流群

后台回复【OccupanyNetwork】获取Occupany Network相关论文干货资料!

本文调研了4篇基于视觉的3D Occupancy预测及语义补全的方法。该任务输入一帧或多帧图像,输出栅格形式的占据情况及语义类别。更多方法可以参考这篇综述。

MonoScene: Monocular 3D Semantic Scene Completion,CVPR 2022,

MonoScene的主要贡献:提出了一种从单目图像直接预测三维语义栅格+语义补全的框架(github)

算法整体流程

方法的大致流程比较简单:

  1. 2D UNet提取图像特征

  2. 三维栅格从图像中提取特征

  3. 类似3D Unet的结构提取三维特征

  4. 预测head输出每个栅格是否占据+语义类别

754f35afbcc33127cc258f065873e126.png

图像特征提取及投影

图像特征提取:采用预训练的https://arxiv.org/pdf/1905.11946.pdf,参数不固定,网络训练时也参与训练。对应代码https://github.com/astra-vision/MonoScene/blob/master/monoscene/models/unet2d.py

特征投影:栅格的中心投影到图像平面上,在特征图1,2,4,8四个层级上插值得到对应的特征(对应代码https://github.com/astra-vision/MonoScene/blob/master/monoscene/models/flosp.py),四个层级的特征求和后作为栅格特征(对应代码https://github.com/astra-vision/MonoScene/blob/7e3c573a34a0d5bf030cbc129752f0854415ac07/monoscene/models/monoscene.py#L101)。超出图像范围的栅格特征设为0。

bafb03b75f9d3ede8922192de7741027.png

三维特征提取及输出

e6c39c63dd25e971b19d1cbbae9de8ad.png

采用两级的3D UNet结构,其中最底层增加了一个3D Context Relation Prior(CRP)模块。之后接一个3D ASPP层+softmax输出占据和类别预测。这部分对应代码 https://github.com/astra-vision/MonoScene/blob/master/monoscene/models/unet3d_kitti.py

3D CRP 模块主要的作用是预测每一个栅格和其他所有栅格是否属于同一类别,并分别把同类/不同类的其他栅格特征通过某种方式(类似加权求和)拿过来,和当前特征concat,作为最终特征。可以理解为带有inductive bias的cross attention。

具体细节:借鉴了CPNet这篇论文,建立一个(Z* Y* X)× (Z* Y* X/s^3)的关系矩阵描述voxel<->super voxel的关系(为了降低复杂度,将边长为s内的所有voxel合在一起考虑)。关系分为4种情况:(当前voxel和该super voxel均为&语义类别不同),(当前voxel和该super voxel均为&语义类别相同),(当前voxel和该super voxel有一个不空&语义类别相同),(当前voxel和该super voxel有一个不空&语义类别不同)。实际上只有三种情况,因为不存在voxel都为空且语义不相同的情况。

a5db95f6111ddd5f039724ba6b7b3a3f.png

网络需要预测这个关系矩阵,通过关系矩阵可以得到4个attention map。关系矩阵和3D栅格特征(reshape到(Z/s* Y/s* X/s) × feature_dim)矩阵相乘得到4个特征,通过concat等方式和当前特征组合,作为最终的特征。这部分对应代码monoscene/models/CRP3D.py(下图为s=2的示意图)

4fa2c2d5a7312e05262068d097f78990.png

训练

训练的loss包含4个部分:

  1. 每个栅格预测的占据/语义的Cross-entropy Loss,占据和语义合在一起,即free作为一个语义类别与语义的unknown合并为一类,其中free的类别权重为0.05

  2. 3D CRP预测的关系矩阵Cross-entropyLoss

  3. 3D CRP预测的Scene-Class Affinity Loss

  4. 作者提出的Frustum Proportion Loss

Scene-Class Affinity Loss 将类内voxel和类间voxel视为两个整体来指导网络学习关系矩阵,按照类似Percision, Recall, Specificity给出了loss的计算。(具体的原理我也不太理解。。。)

4b41bb71d65afc695a295aaa6ea7b75f.png 7f199cf1bdf127a180fe56b066103afe.png

Frustum Proportion Loss 主要是为了让网络关注到视锥上类别的分布,比如视锥中一般会有地面(即使被物体遮挡),loss可以理解为一组视锥上语义真值的概率分布(栅格数量的比例)与网络实际预测的分布的KL散度。

25f6cbc14e5d0ea6bde948d80b78563a.png

OccDepth: A Depth-aware Method for 3D Semantic Occupancy Network

OccDepth的主要贡献:提出了一种基于双目图像预测三维语义栅格+语义补全的框架。github

算法整体流程

整体流程和MonoScene非常像(代码也是在MonoScene基础上改的):

  1. 2D UNet提取双目图像特征

  2. 三维栅格从左右目图像中pull特征并融合

  3. Occupancy Aware Depth Module利用深度估计对栅格特征进行类似attention的操作

  4. 和MonoScene一样的UNet结构提取三维特征

  5. 预测head输出每个栅格是否占据+语义类别

667f262681ba0e7fdeecba6533ddef1d.png

图像特征提取及投影

图像特征提取:与MonoScene相同,采用预训练的
https://arxiv.org/pdf/1905.11946.pdf

特征投影:左右目图像的特征投影与MonoScene相同,OccDepth的特殊之处在于:栅格的特征是将左右目的特征进行平均并乘以权重,权重的计算方法是左右目特征的Cosine Similarity;如果左右目没有重叠则使用单目的特征。个人感觉这个很有道理,因为这个计算特征相似度的过程相当于在进行双目匹配,如果左右目特征不吻合说明这个栅格很可能是空的。因此加上cos similarity应该可以帮助网络更好地学习双目匹配

89774c96615999c2849e1a5f8c5f1114.png

Occupancy Aware Depth Module

除了Cosine Similarity,OccDepth还使用了单目深度估计来指导特征投影过程,OAD模块的主要流程是:

  1. 左目/右目图像scale=8层的特征图经过一个网络提取Net_D深度特征

  2. 经过softmax,得到每个视锥对应的深度分布

  3. 根据内参矩阵和外参矩阵,投影至栅格对应的坐标系,采样得到每个栅格对应的深度概率

  4. 每个栅格对应的深度概率作为注意力权重,乘以上一步特征投影得到的特征。(对于有双目视野重叠的栅格,深度概率会取左右目的均值。)

0a126efa928691b452eb4ad8a443eaad.png

训练

Loss的计算和MonoScene基本一样,不同之处为:

  • 为了帮助训练深度预测模型,作者使用双目图像估计的深度指导深度网络Net_D的学习。具体是使用双目深度预测网络https://proceedings.neurips.cc/paper/2020/file/fc146be0b230d7e0a92e66a6114b840d-Paper.pdf的深度预测离散化后的one-hot真值,用Cross-entropy Loss训练。

  • 是否占据的预测和语义类别的loss分开计算。而MonoScene将是否free作为一个语义类别。

VoxFormer: Sparse Voxel Transformer for Camera-based 3D Semantic Scene Completion,CVPR 2023

VoxFormer的主要贡献:提出了一种基于单目图像序列预测三维语义栅格+语义补全的框架,github

算法整体流程

VoxFormer的整体流程有点类似Tesla Occupancy Network的方案,流程中大部分用到了Transformer:

  1. ResNet-50提取图像特征

  2. 生成一些类别无关的3D栅格Proposal用于后续query

  3. 3D栅格Proposal作为query从图像中取特征(Cross Attention)

  4. 类似MAE的流程,以3D栅格Proposal的特征为输入,通过Self Attention得到完整栅格特征

  5. 预测head输出每个栅格是否占据+语义类别

35fa197b544ba1a88df67419c9babfbe.png

类别无关的3D栅格Proposal生成

这一步主要是选择一些在相机视野内的,比较重要的栅格。主要通过深度估计+占据概率预测的方式实现。具体流程如下:

  • 深度估计:使用单目或双目深度估计网络预测每个像素的深度(实验中使用了https://arxiv.org/pdf/2108.09770.pdf),然后根据相机内参投影到相机坐标系中

  • 深度修正(占据概率预测):深度估计直接投影的点云存在很多噪声,因此使用基于3D栅格的occupancy预测网络。具体是将深度投影的点云进行0-1栅格化,然后用3D Unet架构输出栅格分辨率更低的占据预测。(实验中使用了类似https://arxiv.org/pdf/2008.10559.pdf的网络,LMSCNet是一个基于激光雷达的3D语义补全方法)

  • query栅格生成:上一步预测的所有占据栅格作为query栅格

三维特征提取及输出

主要分为3个部分,query栅格和图像特征的Cross Attention,以及query栅格和其他所有栅格的Self Attention,以及最后的输出。其中attention均采用Deformable Attention(在Deformable DETR中提出的,BEVFormer也用到了)

Deformable Transformer我理解的流程是这样的:给定Query按照某种方式得到一个参考点,同时经过几个可学习layer得到offset->参考点附近按照offset采样得到KV -> Transformer的Cross Attention。主要的优点是在Cross Attention时不需要使用所有的栅格的KV,而是通过可学习的方式选择一定数量的感兴趣的位置,从而减少计算量。具体细节可以参考大佬的这篇文章。

Deformable Cross Attention 主要是把每一个Query栅格的坐标投影到各帧图像上,投影点作为Deformable Attention的参考点(reference point),参考点附近采样一些点(可学习),这些点对应的图像特征作为Key,Value输入。同一个栅格可能会投到多帧图像上,那么多帧图像的attention输出进行平均,作为最终的输出。

Deformable Self Attention 是把所有栅格(HxWxZ)的特征作为输入,但对于非Query栅格,使用一个mask token替换原有特征。其中Deformable Attention参考点(reference point)为栅格中心坐标。

训练

第一阶段的网络(类别无关的3D栅格Proposal生成)的loss为栅格是否占据的Cross-entropy Loss。

第二阶段的网络(Deformable Attention及输出层)的loss包括:

  • 语义类别的Cross-entropy Loss

  • MonoScene的Scene-Class Affinity Loss

TPVFormer: Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction,CVPR 2023

TPVFormer的主要贡献:提出了一种三维特征的表示方法,通过三个正交平面上的特征来近似表示三维点/三维栅格的特征。这种表示形式可以用于3D点云语义分割、3D语义补全等任务。也是学术界对Tesla Occupancy Network的一种复现和改进方案。

作者先定义了TPV特征;然后给出了基于TPV平面上一个给定query点的两种Cross Attention,分别是和图像的attention以及和三个TPV之间的attention;最后基于这两种attention构建网络即为TPVFormer,完成各种感知任务。

TPV特征

由于三维栅格的空间和时间复杂度都是随着边长三次方增长,很难在真机实时部署;BEV虽然复杂度降低但高度方向的信息可能会有一定丢失,因此TPVFormer提出将空间的点向三个正交平面投影的方式(类似https://www.cvlibs.net/publications/Peng2020ECCV.pdf中提出的2D版本),将三维点特征由三个平面的特征来表示。

TPV特征是在水平、径向、横向三个平面中分别保存的特征图。当下游任务需要获取三维点/三维栅格时,可将query的点/栅格投影到各平面,从各平面对应位置采样feature (双线性插值),然后通过某种aggregate方法(求和)得到三维特征。

TPVFormer

TPVFormer包含两种attention,一种是TPV特征到图像的Cross Attention,另一种是三个特征平面之间的Cross Attention。

TPV特征到图像的Cross Attention(ICA)

和VoxFormer类似,采用Deformable Attention。

对于一个TPV平面上(如XY平面)的某个像素(记为Query点),该点的垂直方向上采样一些 三维参考点(如不同的Z值),这些点投影到各个图像上,得到的二维坐标,作为Deformable Attention的参考点(记为二维参考点)。如果该点在所有图像视野外,则剔除该三维点。

  • 然后所有这些二维参考点附近采样一些点(可学习),作为Deformable Attention的KV。也就是说一个TPV平面上的Query对应N个图像的n_z个参考点的附近的n_offset个采样点的KV(因为有很多高度不同的三维参考点投影到各个图像,并在附近采样多个KV),即一个Query对应N* n_z*n_offset个KV。

  • 同一个三维参考点从不同图像Cross Attention来的特征计算平均则为该三维参考点最终的的特征。

TPV特征平面间的Cross Attention(CVHA)

和上一部分TPV到图像的Cross Attention类似:

  • 对于一个TPV平面上(如XY平面)的某个像素(记为Query点),会在该点附近采样一些点,然后在这些点高度方向上采样一些点,投影到另外两个TPV平面上。

  • 剩下的步骤和TPV到图像的Cross Attention一样了。

算法整体流程

4461a5a9c783bb1b7c499fccd90f1217.png

算法的整体流程是:

  1. 根据任务类型定义一些点/栅格,比如语义补全任务可以初始化一些栅格

  2. 每个栅格可以作为query,得到三个平面上的TPV query

  3. 每个TPV平面的query经过若干层 ICA和CVHA层得到融合后的特征

  4. 3个TPV特征加起来作为该栅格特征

  5. 预测head输出该栅格是否占据+语义类别

a6e661c855371dfefe104c0f8b20e575.png

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

34c5d487b1d83f732cc646f2ed879dda.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

ade8e01dc5e2daebd0be9bb94cfed656.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值