w~视觉~3D~合集6

我自己的原文哦~       https://blog.51cto.com/whaosoft/13986586

#Make-It-3D

给你几张照片,你可以猜到在三维世界中他们究竟长什么样子吗?

我们可以凭借丰富的视觉先验知识,仅凭一张照片轻松推断出其3D几何形态及在不同视角下的样貌。这种能力得益于我们对视觉世界的深入理解。而今,恰如人类,一些卓越的图像生成模型,如Stable Diffusion和Midjourney,同样拥有丰富的视觉先验知识,展现出高质量的图像生成效果。基于这样的观察,研究员们提出假设:一个高质量预训练图像生成模型具有和人类一样的能力,即可以从一个真实或AI生成的图像中推理出3D内容。

这个任务非常具有挑战性,既要估计潜在的 3D 几何结构,也要同时产生未见过的纹理。基于之前的假设,来自上海交通大学、HKUST、微软研究院的研究者们提出了 Make-It-3D 方法,通过使用 2D 扩散模型作为 3D-aware 先验,从单个图像中创建高保真度的 3D 物体。该框架不需要多视图图像进行训练,并可应用于任何输入图像。这篇论文也被 ICCV 2023 所接收。

 论文链接:https://arxiv.org/pdf/2303.14184.pdf

  • 项目链接:https://make-it-3d.github.io/
  • Github链接:https://github.com/junshutang/Make-It-3D

该论文刚公布,就引发了推特上的热烈讨论,随后的开源代码在 Github 累计收获超过 1.1k星星。

那么方法背后的技术细节是什么呢?

该方法在优化三维空间时,主要依据两个核心的优化目标:

1. 在参考视角下的渲染结果应该与输入图片高度一致;

2. 在新视角的渲染结果显示与输入一致的语义。其中,研究者采用 BLIP2 模型来为图片标上文本。

基于这样的优化目标,在一阶段时期,该方法对参考视角周围的相机姿态进行随机采样。在参考视角下对渲染图和参考图施加像素级别的约束,在新视角下利用来自预训练扩散模型的先验信息度量图像和文本之间的相似性。

然而,只用文本难以描述一张图的全部信息,这会导致生成的 3D 模型难以和参考图像完全对齐。因此,为了增强生成几何模型和图片的相关程度,论文额外约束了在扩散过程中的去噪图和参考图之间 的图像相似性,即约束了图像之间的 CLIP 编码距离。这一方法进一步有效提升了生成模型和图片的相似程度。

此外,论文还利用了从单张图估计的单目深度来避免一些几何歧义性,例如凹陷面等问题。然而,研究者认为,优化得到的纹理隐式场,难以完全重建出图片的纹理细节,例如小熊表面的绒毛纹和局部的颜色信息,在一阶段生成的结果中都没有体现。因此该方法提出聚焦于纹理精细化的二阶段优化过程。

在第二阶段,该方法根据第一阶段得到的几何模型,将参考图像的高质量纹理映射到 3D 空间中。然后着重于增强参考视角中被遮挡区域的纹理。为了更好地实现这一过程,该方法将一阶段的隐式表示导出到显式表示形式 —— 点云。与 Marching Cube 导出的噪声网格相比,点云可以提供更清晰的几何特征,同时也有利于划分遮挡区域和非遮挡区域。

随后,该方法聚焦于优化遮挡区域的纹理。点云渲染采用了基于 UNet 结构的 Deferred-Renderer (延迟渲染器),并同样使用来自预训练扩散模型的先验信息优化产生遮挡区域的精细纹理。

从左到右依次是参考图,一阶段优化得到的法向图和纹理渲染结果,二阶段纹理精细化后的渲染结果。

该方法还可以支持多种有趣的应用,包括可以对三维纹理进行自由编辑和风格化。以及用文本驱动产生复杂多样的三维内容。

结语

Make-It-3D作为首个将二维图片拓展到三维空间,同时保持了和参考图片相同的渲染质量和真实感的方法,致力于创作和二维图片视觉效果相同的三维内容。研究员们希望可以通过Make-It-3D这篇工作,引发学术界或工业界对于2D转3D这一方案更多的关注,加速三维内容创作的发展。

#SketchFaceNeRF

这个方法可以高效构建三维模型,精细程度很高。

高真实感且精确可控的三维人脸建模是数字人构建中的重要问题之一。目前,使用现有的基于网格的人脸建模方法需要专业的人员使用复杂的软件并投入大量的时间和精力,且实现逼真的人脸渲染结果较为困难。

虽然神经辐射场作为一种新的三维表示可以合成出逼真的结果,但如何对生成结果进行精确控制和修改,以实现高质量的三维人脸合成仍然是一个待解决的问题。

近期,研究人员提出了基于线稿的三维人脸神经辐射场生成和编辑方法 SketchFaceNeRF [1],相关技术论文发表在计算机图形学顶会 SIGGRAPH 2023,并被收录于图形学顶级期刊 ACM Transactions on Graphics。使用该系统,即使用户不会使用复杂的三维软件,也可以基于线稿自由创作三维人脸。先来看看使用 SketchFaceNeRF 创作的人脸效果:

图 1:使用线稿生成高真实感的三维人脸。

进一步,在给定三维人脸后,用户在任意角度添加编辑操作:

图 2 使用线稿在任意视角编辑三维人脸。

Part 1 背景

最近,AI 绘画非常火爆,基于 Stable Diffusion [2] 和 ControlNet [3] 等方法,通过指定文本可以生成高真实感的二维图像。但是,上述工作无法生成高质量的三维模型。同时,仅使用文本难以控制生成细节,尽管 ControlNet 已经支持线稿的控制,但如何对生成的结果的局部区域进行精准的修改仍然十分困难。

随着神经辐射场 [4] 和对抗式生成网络 [5] 的发展,已有方法,例如 EG3D [6],已经实现了三维人脸模型的高质量的生成和快速的渲染。但是,这些生成模型只支持人脸随机采样,而无法对生成结果进行控制。IDE-3D [7] 和 NeRFFaceEditing [8] 使用语义标记图编辑三维人脸,但是,该类方法难以实现更细节的控制,例如头发的结构细节和皱纹等。同时,用户很难从头绘制复杂的语义图,无法凭空生成三维人脸模型。

线稿作为一种更加友好的交互方式,一直被用于二维人脸图像的生成 [9] 和编辑 [10]。然而,将线稿用于三维人脸的生成存在下述的问题:首先,线稿风格多样且过于稀疏,生成二维图像已经不易,生成三维模型则更加困难;其次,针对三维人脸,用户往往会在任意视角添加编辑,如何生成有效的编辑结果,同时保持三维一致性,是需要解决的问题。

针对上述挑战,SketchFaceNeRF 利用了三平面的表示方法,基于线稿直接预测人脸三平面特征,投影至生成模型的隐空间,得到高质量的人脸 NeRF。多视角的三维人脸编辑问题则被建模为优化问题,通过三平面的局部融合及投影方法预测初值,并基于线稿约束和图像约束反向优化隐码,得到高质量的人脸 NeRF 编辑效果。

Part 2 SketchFaceNeRF 算法原理

图 3 SketchFaceNeRF 的网络架构图,生成流程。

人脸 NeRF 可控生成

给定单视角的手绘线稿后,直接投影到生成模型隐空间,合成的人脸存在对应性差、生成质量低等问题。这是因为二维稀疏线稿与三维人脸的差异过大,并且手绘的线稿风格多样。为解决上述问题,提出一种逐级升维的映射方法:由于输入线稿仅包含稀疏几何信息,但三维人脸具有不同的外观,所以首先使用自适应实例归一化 (AdaIN [11]),将输入的线稿转换到彩色特征图以注入颜色、光照和纹理信息。

进一步,由于二维输入缺乏 3D 信息,算法在体渲染的立体空间中构建 3D 特征体素,空间中的三维点被投影到 2D 特征图,检索得到对应的特征。最后,在 x,y,z 三个轴对三维体素进行形状变换,再基于 2D 卷积网络得到三平面特征图。为了生成高质量的人脸 NeRF,三平面被反投影到生成模型的隐空间,得到隐码表示的人脸 NeRF 模型。

训练过程分为两步:首先,使用 EG3D 构建多视角的训练数据。输入线稿预测三平面后,基于原本 EG3D 的渲染网络生成其他视角的图像,并使用真值作监督,完成线稿三平面预测网络的训练。然后,固定线稿三平面预测网络的权重,训练投影网络,将三平面特征投影至 EG3D 的隐空间。

图 4 SketchFaceNeRF 的网络架构图,编辑流程。

人脸 NeRF 精确编辑

为了支持任意视角的线稿人脸编辑,该工作提出一种三维一致的人脸线稿渲染方法,为 EG3D 添加额外的线稿生成分支,与图像生成分支共享相同的 StyleGAN 主干网络,但具有不同的解码器和超分辨率模块。训练过程则使用线稿真值作监督,并添加正则化项约束线稿视角一致性。

在生成的三维线稿基础上,用户对局部区域进行修改,绘制出新的线稿。由于单视角的线稿输入存在遮挡等问题,无法表示完整原本的三维信息,因此直接推理难以保持编辑前后的非编辑区域一致性。

为此,将人脸的 NeRF 的精细化编辑问题建模为优化问题。该工作先提出一种初值预测方法:使用与生成过程共享的线稿三平面预测网络,先直接预测得到线稿对应的三平面特征。为了保持非编辑区域的不变,进一步将线稿生成的三平面与原始的三平面特征进行融合,并使用与生成过程共享的编码网络,将三平面反投影至生成模型的隐空间,得到人脸的编辑的初值。

进一步,提出反向优化方法实现三维人脸的精细化编辑。具体而言,算法通过线稿生成分支渲染出合成线稿,在编辑区域与手绘线稿计算相似度。同时,在非编辑区域,图像生成分支渲染出人脸图像,与原始图像计算相似度。为了保证编辑前后的空间一致性,进一步约束非编辑区域的光线采样点特征相同。基于上述约束,反向优化隐码,实现人脸的精细化编辑。

Part 3 效果展示

如图 5 所示,给定手绘线稿,基于该方法可以生成高质量的人脸神经辐射场。通过选择不同的外观参考图像,可以指定生成人脸的外观。用户可以自由变换视角,都能得到高质量的渲染结果。

图 5 基于线稿生成的三维人脸。如图 6 所示,给定三维人脸,用户可以选择任意的视角,对渲染出的线稿进行修改,从而编辑人脸 NeRF。左侧展示了对随机生成的人脸进行编辑的效果。右侧则展示给定人脸图像后,使用人脸生成模型进行反投影,并进一步添加编辑的结果。

图 6 基于线稿的三维人脸编辑结果。如图 7 所示,针对一个人脸 NeRF,用户可以在不同视角对人脸添加连续的编辑操作,使用该方法都能得到较好的编辑结果,同时,非编辑的立体区域的特征也被完美保持。

图 7 基于线稿对人脸进行连续的编辑操作。

如图 8 所示,得益于生成模型隐空间的良好性质,对特定人添加的编辑操作后,计算前后的隐码差异得到编辑向量,一些情况下可以直接作用于其他人,得到类似的编辑效果。

图 8 编辑传播结果,左侧的编辑操作的效果,可以传播至右侧人脸。

Part 4 结语

随着人工智能的迅速发展,AI 绘画也涌现出许多的新的方法。与生成二维图像不同,如何生成三维数字内容是更具挑战性的问题。SketchFaceNeRF 提供了一种可行的解决方案,基于手绘线稿,用户可以生成高质量的人脸模型,并支持任意视角的精细化的编辑。

基于该系统,我们无需安装繁杂的三维建模软件并学习复杂的技能,也不需要花费数个小时时间精力,仅仅通过勾勒简单的线条,普通用户也能轻松构建心中完美的人脸模型,并得到高质量的渲染结果。 

SketchFaceNeRF 已经被 ACM SIGGRAPH 2023 接收,并将刊登在期刊 ACM Transactions on Graphics 上。

目前,SketchFaceNeRF 已经提供在线服务供大家使用。在线系统由中科院计算所信息高铁训练推理平台 MLOps 提供智算算力支持,由中科南京信息高铁研究院提供上线工程服务保障。

在线服务链接:http://geometrylearning.com/SketchFaceNeRF/interface

有关论文的更多细节,及论文、视频、代码的下载,请浏览项目主页:

​http://www.geometrylearning.com/SketchFaceNeRF/​

开源代码见:

​https://github.com/IGLICT/SketchFaceNeRF​

#3DPEE

BEV还有提升空间吗?利用3D点编码再涨4个点,即插即用!

图1. 相机射线编码和3D点编码的示意

这里给大家分享一个我们刚中ICCV23的环视3D检测论文,3DPPE: 3D Point Positional Encoding for Multi-Camera 3D Object Detection Transformers。方法比较简洁,针对环视3D目标检测问题,基于优秀的PETR框架(说实话,petr以及streampetr是真好),分析了现有3D目标检测中位置编码的诸多区别,提出了一种新的3D点编码(图1.b),解决了之前射线编码(图1.a)缺乏细粒位置先验的问题,统一了图像特征和query的位置表征,在环视3D检测上实现了卓越性能。在最先进的petr v1/v2以及streampetr上都得到了提升,我们罗列了在经典的v2-99主干+800x320的分辨率下的效果(这个配置里的主干网在深度数据集上预训练过、并且小分辨率对训练的要求降低从而更亲民,适合做消融实验对比性能),具体提升效果如下。

文章链接:https://arxiv.org/abs/2211.14710

代码链接:

  1. ​https://github.com/drilistbox/3DPPE​
  2. ​https://github.com/FiveLu/stream3dppe​

1. 方法简介

第一次看到PETR的时候,感叹作者的认知面的广泛,可以把类似于NERF中的思路迁移过来做3D检测,通过给每个单目2D图像特征赋予一个独立的含有3D信息的位置编码(如图1.a),实现在3D空间中交互索引2D图像特征。但是PETR中含有3D信息的位置编码的机理是什么,含有的3D信息又是啥,一开始还不是很确定,于是我们设计了一系列的实验,来探索3D目标检测中图像特征不同位置编码的影响。

1.1 位置编码的初步探索

这一小节我们想分析camera-ray PE、Lidar-ray PE、Oracle 3D Point PE的联系与区别,他们的简单示意如下图所示。

图5. 环视3D检测中常用的位置编码的卡通示意

(1) camera-ray编码

由于PETR中图像编码的构建用到了内外参,隐约的感觉到像是表征了雷达坐标系下,从相机光心到成像平面上不同像素点的射线信息。于是我们设计了如下的实验来证明PETR的位置编码就是相机射线编码。首先我们将PETR中图像位置编码的构建要素分解成3部分:1.深度bin的个数 ND ;2. 深度离散化的方式 MD ;3. 深度表示范围 RD 。具体实验结果如下表所示,可以看表1中的第2-4行,修改深度离散化的方式,检测效果变化不是很大,说明深度离散化方式对性能影响不大;再看表1中的第4-6行,修改深度感知范围,检测效果变化很小,说明深度感知范围对性能影响不大;在看表1中的最后2行,修改深度bin的个数,检测效果变化很小,说明深度bin的个数对性能影响不大。综上,我们可以感觉到,当这些深度点在相机射线(从光心->成像平面上的像素点)上滑动时,即便采样方式、采样点以及深度感知范围变化,模型的检测效果几乎不变。所以只要能图像位置编码能表针出相机射线信息,那么模型性能和原始的PETR相比几乎不变。因此,PETR的位置编码就是camera-ray编码(相机射线编码),并且我们还发现了最简练的3D camera-ray编码,只要2个在相机射线上的点,就可以表征出对应于PETR中等价的3D位置编码。

表1. 深度bin的个数、深度离散化的方式、深度表示范围对性能的影响

上面分析了camera-ray编码最低编码点数为2,如果点数降为1呢?这是个很有意思的事情,点数降为1时,能决定编码信息的因素就只剩下这个点的深度值怎么取,其实有2种取法:

  • 不正确的深度值(我们将其称为LiDAR-ray);
  • 准确的深度值(我们将其称为Oracle 3D Point);

(2) LiDAR-ray

为啥叫LiDAR-ray等这一小节分析结束后就知道了。我们将用数学建模以及实验证明了这一点。但为了方便理解,我们首先做两个铺垫知识准备:

  1. 先定义LiDAR-ray,每个像素点对应的位置编码由1个点构建,且该点对应的深度值与物体实际深度无关。(其实我们猜测还有一个点是lidar坐标系的原点,但是由于是默认值,并且在构建位置编码时没有显式的用到,网络应该是学习到了雷达坐标系的原点(0,0,0))

图6. 相机射线编码和雷达射线编码的几何关系

  1. 再先铺垫一个简单数学几何信息。如图6所示,我们构建了相机射线编码和雷达射线编码的几何关系。相应的,我们用余弦距离的差异来定义camera-ray和lidar-ray的差异:

公式1. camera-ray和lidar-ray的差异

可以看出,只要d越大,也就是雷达坐标系下的3D点离相机或者雷达越远,那相机射线编码和雷达射线编码就是等价的。

好了,基础知识构建结束。我们现在开始做实验,如表2所示,我们将深度值d依次取为0.2m/1m/15m/30m/60m,我们发现,d为0.2m或者1m时性能相比表1中的结果掉点较多;但是当d为15m/30m/60m时,检测性能与表1中的结果持平。

表2. LiDAR-ray下d值变化对性能的影响

从上面的实验现象,可以总结出:深度值d较小时性能较差、深度值较大时LiDAR-ray与Camera-ray性能持平。而且这个现象也与上面公式1的结论一致。所以大家知道为啥加Lidar-ray了吧,因为这个实验现象与我们前面数学建模的从雷达出发的射线的结论一致。并且与“camera-ray的性能不受深度值影响”的现象不同,Lidar-ray中的深度值d较小时性能较差、深度值较大时LiDAR-ray与Camera-ray性能持平

(3) Oracle 3D Point

和lidar-ray不同,Oracle 3D Point中的深度是通过把点云投射到成像平面上得到的,这样图像特征的每个点都可以得到精确的位置编码信息(由于点云的稀释性,许多像素点其实是没有得到投射后的深度信息的,这些像素点的特征就没有参与训练以及inference)。从表3可以看出,相比于之前的编码方式,这会NDS以及mAP得到了巨大的提升(6.7% NDS, 10.9% mAP, and 18.7% mATE)。由此可以说明,相比较于camera-ray以及lidar-ray中不精确的3D位置先验,拥有准确3D位置先验的位置编码才是3D检测性能提升的关键

表3. 不同位置编码对检测性能能力的影响

但是camera-based感知方案中,没有准确的深度信息,因此我们用了个简单的方法,通过单目深度估计来得到深度信息,具体可以参考下一节。

1.2 模型结构

我们所提方法的框架图如下图所示,由主干网、3D点生成器、3D点编码模块以及decoder构成。主干网以及decoder和之前的petr一样。我们着重说明下3D点生成器以及3D点编码模块这两部分。

图7. 框架图

  1. 3D点生成器

3D点生成器包含深度预测头以及2D到3D的坐标转换模块。

深度预测头模型结构如下图所示,输入图像特征和相机参数,输出的深度值 Dpred 为直接回归深度 DR +期望深度 Dp 的加权和。

图8. 深度检测头

对应的深度值 Dpred为:

公式2. 融合深度

其中 α 是可学习的混合系数。在构建训练用的深度GT的时候,我们直接将点云投射到成像平面上,并得到一个对应的mask来指示哪些像素有深度GT、哪些没有,loss监督的时候只有有点云投射到的地方才有贡献。深度监督loss由smooth l1以及distribution focal loss(检测中用于修正bbox的loss,迁移至深度监督上发现效果也很好)构成:

公式3. 深度监督损失函数

2D到3D的坐标转换模块:得到深度估计后,利用相机内外参,可以将2.5D信息转换为3D信息。然后利用感知范围对齐归一化。

公式4. 2D到3D的坐标转换

  1. 3D点编码模块

这里和PETR里用的一样的正余弦编码:

公式5. 3D点编码

区别在于之前PETR是沿着相机射线方法的64个点,我们现在是1个点。

图9. 相机射线编码和3D点编码的比较

并且在3D点编码的范式下,图像特征的位置编码和锚点的位置编码得到了统一,大家可以共享同一个编码器。

2 实验结果

2.1 和sota方法的比对

我们的方法在nus的验证集以及测试集上都取得了不错的结果。

2.2 深度估计质量对性能的影响

实验表明smooth-l1和dfl一起用效果最好。

表6. 深度估计损失函数对检测性能的影响

2.2 和其他3D position-aware Feature性能的对比

其实3D position-aware Feature是指可能含有3D位置信息的特征,而其中的位置编码可以分为Ray-aware以及Point-aware。其中Ray-aware又可分为camera-ray(PETR中的位置编码)以及Feature-guided(PETRv2中的位置编码),Point-aware可以分为topk-aware(按深度估计概率取置信度最高的k个bin)、Depth Feature-guided(PETRv2的位置编码中引入深度监督)、Depth-guided 3D point(我们提出的3D点编码)。上述5个编码的对比效果如下表所示:

表7. 不同3D position-aware Feature的性能对比

2.3 统一图像特征以及锚点的位置编码表征的好处

由于锚点也是3D点编码,实现形式上和我们提出的用于图像特征的3D点编码一致,都来自3D坐标空间,又都要隐射到高维编码空间进行交互。所以直观感觉是如果这个映射过程是一致的,那边编码表征空间同样一致,这样会更有利于query和图像特征的交互。于是我们对比了3D点编码器是否共享带来的性能差异,实验表明共享3D点编码器效果是最好的。

表8. 3D点编码生成器是否共享的性能差异

2.4 位置编码相似度分析

好的位置编码应该有更强的聚焦,也就是距离越近相似度越高,如果能语义越近相似度越高那更好。我们可视化了不同像素点之间位置编码的相似性,通过在前景、图像边缘以及背景上采点,可以看出,我们的3D点编码的相似度更好,更聚焦。

图10. 前景区域采点示意

图11. 跨图像目标采点示意

图12. 背景区域采点示意

3. 还有哪些坑可以去填

3.1 如何获得更好的3D位置信息

  1. 单目深度估计 -> 时序多帧+环视多目的Stereo depth
  2. 一定要有显式的深度估计或者监督吗?我们这个方法应该是第1个在PETR系列上引入深度估计的工作。但是要得到3D位置先验,到不一定要有显式的深度估计或者监督。抛开显示的深度估计或者抛开显示的深度监督,利用occ预训练或者nerf重建,来隐式的学习深度信息或者根号的几何结构信息。
  3. 利用知识蒸馏得到更好的深度估计。这个在我们论文中的未来改进中有所提及。

表9. Reusing the ground-truth depth for knowledge distillation.

3.2 扩展到Occ预测上

射线编码本身和Nerf就很相似,然后3D点编码的深度位置先验,一下子就找到了物体可能出现的位置,与nerf重建的思路很相似。

3.3 新的位置编码的探索

其实到目前为止,基于transformer范式的3D目标检测的编码范式探索的很少,即便是我们所提的3D点编码,其实也就等价于detr-based的2D检测器中的最原始的位置编码从图像像素层面升级到3D坐标层面。detr-based的2D检测器中许多位置编码设计的理念都可以结合3D任务的特性进行启发性的改进或创新。

3.4 内外参的泛化

现有绝大多数环视3D检测模型,内外参编码的话,模型都需要重训。除了特斯拉aiday提出的虚拟相机相关技术以及百度apollo ai day推出的内外参解耦,可以一定程度解决上面内外参变化模型就需要重训的问题。我们论文中提及的lidar-ray似乎也可以解决上述问题,不过这仅仅是灵光一现,还需要实验验证。

#FlashOcc

标题:FlashOcc: Fast and Memory-Efficient Occupancy Prediction via Channel-to-Height Plugin

论文链接:https://arxiv.org/pdf/2311.12058.pdf

作者单位:大连理工大学 Houmo AI 阿德莱德大学

论文思路:

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

网络设计:

受 sub-pixel convolution 技术[26]的启发,其中图像上采样被通道重新排列所取代,从而实现了通道到空间的特征转换。相应地,在本文的工作中,本文的目标是有效地实现通道到高度的特征转换。鉴于 BEV 感知任务的进步,其中 BEV 表示中的每个像素都包含有关相应 pillar 中沿高度维度的所有对象的信息,本文直观地利用通道到高度变换(channel-to-height transformation) 将扁平化的 BEV 特征重塑为三维体素级别占用 logits。因此,本文专注于以通用和即插即用的方式增强现有模型,而不是开发新颖的模型架构,如图1 (a)所示。具体来说,本文直接用 2D 卷积替换当代方法中的 3D 卷积,并用通过 2D 卷积获得的 BEV 级特征的通道到高度变换(channel-to-height transformation) 替换从 3D 卷积输出导出的占用 logits。这些模型不仅实现了准确性和时间消耗之间的最佳权衡,而且还表现出了出色的部署兼容性。

FlashOcc 成功地以极高的精度成功完成了实时环视 3D 占用预测,代表了该领域的开创性贡献。此外,它还展现了跨不同车载平台部署的增强的多功能性,因为它不需要昂贵的体素级特征处理,其中避免了 view transformer 或 3D(可变形)卷积算子。如图2所示,FlashOcc的输入数据由环视图像组成,而输出是密集的占用预测结果。尽管本文的FlashOcc专注于以通用和即插即用的方式增强现有模型,但它仍然可以分为五个基本模块:(1)2D图像编码器,负责从多相机图像中提取图像特征。(2) 视图转换模块,有助于将 2D 感知视图图像特征映射到 3D BEV 表示。(3) BEV 编码器,负责处理 BEV 特征信息。(4) 占用预测模块,预测每个体素的分割标签。(5) 一个可选的时间融合模块,旨在集成历史信息以提高性能。

图 1.(a) 说明了如何以即插即用的方式实现所提出的 FlashOcc。现代方法使用 3D-Conv 处理的体素级 3D 特征来预测占用率。相比之下,本文的插件替代模型通过 (1) 用 2D-Conv 替换 3D-Conv 以及 (2) 用通道到高度变换(channel-to-height transformation) 替换从 3D-Conv 导出的占用 logits,实现快速且节省内存的占用预测通过 2D-Conv 获取的 BEV 级特征。缩写“Conv”代表卷积。(b) 举例说明了准确性与速度、推理内存消耗和训练持续时间等因素之间的权衡。

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

图 4. 3D 体素级表示处理和本文的插件替换之间的架构比较。

实验结果:

总结:

本文介绍了一种称为 FlashOCC 的即插即用方法,旨在实现快速且内存高效的占用预测。它直接用 2D 卷积替换基于体素的占用方法中的 3D 卷积,并结合通道到高度变换(channel-to-height transformation) 将扁平化的 BEV 特征重塑为占用 logits。FlashOCC 的有效性和通用性已在多种体素级占用预测方法中得到证明。大量的实验证明了这种方法在精度、时间消耗、内存效率和部署友好性方面优于以前最先进的方法。据本文所知,本文是第一个将 sub-pixel 范式(Channel-to-Height)应用于占用任务的,专门利用 BEV 级特征,完全避免使用计算 3D(可变形)卷积或 transformer 模块。可视化结果令人信服地证明 FlashOcc 成功保留了高度信息。在未来的工作中,本文将探索将本文的FlashOcc集成到自动驾驶的感知管道中,旨在实现高效的 on-chip 部署。

相较于目前的基于BEV空间的3D感知算法,Occupancy Network算法可以更好的克服感知任务中存在的长尾问题以及更加准确表达物体的几何形状信息而受到来自工业界和学术界越来越广泛的关注。

Occupancy Network算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法去预测每个体素网格被占用的概率以及可能包含的目标类别从而实现对全场景的感知。因其是对空间中的所有体素进行分类,所以对于数据集中未被标注的物体(比如土堆、石块等目标也可以预测为General Objects,从而实现开放集的目标检测,即更好的克服检测中的长尾问题);同时与直接输出一个物体粗糙3D框的算法相比,由于是直接对空间中的每个体素进行预测,所以对于不规则形状的目标,Occupancy Network算法可以给出更加细粒度的形状表示,从而得到每个物体更加丰富的细节结构信息。

尽管目前Occupancy Network相比于之前的基于BEV的3D感知算法有更好的感知优势,但因其将所要感知的环境空间利用3D体素特征进行中间表示,避免不了的会引入3D卷积等算子进行特征提取,无疑会大大增加模型的运算量和内存开销,从而为模型的上车部署造成不小的困难,严重影响了Occupancy Network算法的落地。

所以,本篇将要介绍的Flash-Occ算法(算法流程图见图一)则抛弃了长耗时、难部署的3D卷积模块,继续使用2D卷积模块来完成特征的提取任务。同时,为了减少模型的计算量,Flash-Occ不再使用Voxel体素特征,而是继续使用BEV特征来建模需要感知的3D空间。但为了完成Occupancy Network在3D空间的预测,Flash-Occ算法设计了一个通道-高度转换模块实现将BEV空间的输出结果提升到3D体素空间,完成最终的结果预测。

图一:Flash-Occ算法整体

Flash-Occ算法的论文链接如下:

​https://arxiv.org/abs/2311.12058​​ arxiv.org/abs/2311.12058

算法流程详解

Flash-Occ算法是在BEVDet-Occupancy的codebase上进行改进的,下面是Flash-Occ算法的开源仓库链接

​https://github.com/Yzichen/FlashOCC​​ github.com/Yzichen/FlashOCC

由于Flash-Occ的开源代码当中有很多的配置文件,为了方便大家的理解,本文是基于flashocc-r50-4d-stereo.py配置文件来进行梳理的,我们先看一下Flash-Occ算法的整体流程图,然后再根据源码部分进行细致的讲解~

图二:Flash-Occ算法详细流程图

整体来看,Flash-Occ的网络结构包括2D主干网络、Neck网络、深度估计模块、视角转换模块、2D BEV Encoder、Occupancy Head模块、通道高度转换模块、训练过程的Loss计算等部分组成。

在介绍各个网络模块具体实现细节之前,先定义一下输入到网络中的环视图像的张量大小Tensor([bs, frame, num_cam, 3, H, W])。其中,bs代表batch size大小,frame代表输入到模型中的帧数(该算法模型的输入还包括历史帧的数据),num_cam代表环视图像中相机的个数,H、W分别代表输入图像的高和宽。

2D主干网络

2D主干网络的作用就是对输入的环视图像进行多尺度的特征提取,针对上述提到的配置文件,2D主干网络采用的是ResNet-50。

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

  • 如果当前时刻标记为t,那么对于t-2时刻的环视图像,2D主干网络只会输出降采样四倍的特征图用于后续进行双目立体的深度估计,代码中定义降采样4倍的特征为Stereo Feature。
  • 但是对于t和t-1时刻,2D主干网络在输出降采样4倍Stereo Feature的同时,还会输出降采样16倍和32倍的特征图,用于后续完成多尺度特征的信息融合。

相应的伪代码展示如下,伪代码中的self.extract_stereo_ref_feat()和self.image_encoder()函数均是ResNet-50网络,只是对应的输出特征的降采样步长不同。

# image即当前`t - 2`时刻的环视输入图像
if extra_ref_frame:  # `t - 2`时刻被定义为extra_ref_frame
    stereo_feat = self.extract_stereo_ref_feat(image)  # stereo_feat's downsample ratio = 4.
    return None, None, stereo_feat  # stereo_feat = Tensor([bs * num_cam, 256, H / 4, W / 4])

# 针对`t - 1`以及`t`时刻,网络会同时输出降采样16倍和32倍的Feature List,记作`x`;以及降采样4倍的特征stereo_feat
x, stereo_feat = self.image_encoder(image, stereo=True)

# x = [Tensor([bs * num_cam, 1024, H / 16, W / 16]), Tensor([bs * num_cam, 2048, H / 32, W / 32])]

Neck网络

Neck网络的主要作用是对2D主干网络输出的多尺度特征进行融合,从而实现多尺度语义信息的汇聚。需要注意的是,只有对t和t-1时刻处理后的多尺度环视特征送入到Neck网络进行语义特征的汇聚。

Neck部分的处理逻辑可以总结为以下几个部分

  • 输入多尺度特征:[​​Tensor([bs * num_cam, 1024, H / 16, W / 16]), Tensor([bs * num_cam, 2048, H / 32, W / 32])​​]
  • 第一步:采用Conv1x1卷积降低2D主干网络输出的环视图像多尺度特征的通道数
  • 第二步:将32倍降采样的特征图进行双线性差值得到降采样16倍的特征图
  • 第三步:将融合后的特征过一遍Conv3x3卷积进一步拟合融合后的特征图
  • 输出融合后的特征:​​Tensor([bs * num_cam, 256, H / 16, W / 16])​

相应的伪代码展示如下

第一步:采用Conv1x1卷积降低通道数
laterals = [
    lateral_conv(inputs[i + self.start_level])
    for i, lateral_conv in enumerate(self.lateral_convs)
]

第二步:将32倍降采样的特征图进行双线性差值得到降采样16倍的特征图
prev_shape = laterals[i - 1].shape[2:]
laterals[i - 1] += F.interpolate(laterals[i], size=prev_shape, **self.upsample_cfg)

第三步:将融合后的特征过一遍Conv3x3卷积进一步拟合融合后的特征图
outs = [self.fpn_convs[i](laterals[i]) for i in self.out_ids]
>>> self.lateral_convs
>>> ModuleList(
  (0): ConvModule(
    (conv): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))
  )
  (1): ConvModule(
    (conv): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))
  )
)

>>> self.fpn_convs
>>> ModuleList(
  (0): ConvModule(
    (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  )
)

深度估计模块

根据配置文件中的Stereo关键词可以看出,该算法模型是借鉴了BEVStereo论文中的思路,采用双目深度估计的思路,利用两个连续的时序帧的特征对深度信息进行估计。生成的深度信息同时考虑了深度特征和语义特征,其具体的生成逻辑可以总结为以下几个部分

  • 第一步:为了更好的对深度信息进行估计,代码中将相机的内外参数、bda增强矩阵等参数也喂入到深度估计模块当中,并过了一个BN层,该部分记作mlp_input参数(参考BEVStereo论文中的做法)
  • 第二步:将Neck网络输出的特征图过一层3x3的卷积,该卷积层记作reduce_conv层
  • 第三步:利用包含两层的MLP网络对mlp_input进行编码,该MLP网络记作context_mlp层
  • 第四步:利用通道注意力模块SENet和context_mlp层编码后的mlp_input对reduce_conv层输出的语义特征进行调整得到更加合理的上下文特征context
  • 第五步:将第四步得到的context上下文特征过一层Conv1x1卷积调整特征图的通道数
  • 第六步:利用包含两层的MLP网络对mlp_input进行编码,该网络与第三步的MLP网络并不共享参数,记作depth_mlp层
  • 第七步:利用通道注意力模块SENet和depth_mlp层编码后的mlp_input对第六步输出的深度信息进行调整,得到更加准确的深度信息depth
  • 第八步:同时该深度估计模块还利用了两帧之间的双目立体信息来估计Cost Volumn,从而提高网络对于深度信息的估计能力
  • 第九步:利用两组级连的步长为2的3x3卷积对Cost Volumn特征图进行下采样运算,最后和第七步得到的depth信息concat到一起
  • 第十步:将concat到一起的depth信息利用ASPP模块进行不同感受野分支的特征提取,从而实现多尺度信息的聚合
  • 最终,深度估计模块的输出如下
  • 深度特征为Tensor([bs * num_cam , 88, H / 16, W / 16])
  • 语义特征为Tensor([bs * num_cam, 80, H / 16, W / 16])

相应的伪代码展示如下

# 第一步:将mlp_input过一遍BN层,其中mlp_input包含相机内外参、bda增强等信息
mlp_input = self.bn(mlp_input.reshape(-1, mlp_input.shape[-1]))

# 第二步:对Neck网络输出的`x`特征过一层Conv3x3卷积
x = self.reduce_conv(x)

# 第三步:利用两层MLP网络对mlp_input进行编码
context_se = self.context_mlp(mlp_input)[..., None, None]

# 第四步:将语义特征`x`和`mlp_input`编码后的特征喂入到SENet通道注意力模块,得到修正后的上下文特征`context`
context = self.context_se(x, context_se)

# 第五步:利用Conv1x1卷积调整`context`特征的通道数
context = self.context_conv(context)

# 第六步:利用两层MLP网络对mlp_input进行编码
depth_se = self.depth_mlp(mlp_input)[..., None, None]

# 第七步:将语义特征`x`和`mlp_input`编码后的特征喂入到SENet通道注意力模块,得到修正后的深度信息`depth`
depth = self.depth_se(x, depth_se)

# 第八步:利用两帧之间的Stereo Feature计算Cost Volumn视差
with torch.no_grad():
    cost_volumn = self.cost_volumn_net(cost_volumn)

# 第九步:利用两组级连的步长为2的3x3卷积对Cost Volumn特征图进行下采样运算
cost_volumn = self.cost_volumn_net(cost_volumn)

# 第十步:将得到的Cost Volumn和depth预测信息Concat到一起喂入到ASPP模块中,得到更加精准的结果
depth = torch.cat([depth, cost_volumn], dim=1)
depth = self.depth_conv(depth)
>>> self.bn
>>> BatchNorm1d(27, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

>>> self.reduce_conv
>>> Sequential(
  (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU(inplace=True)
)

>>> self.context_mlp / self.depth_mlp
>>> Mlp(
  (fc1): Linear(in_features=27, out_features=256, bias=True)
  (act): ReLU()
  (drop1): Dropout(p=0.0, inplace=False)
  (fc2): Linear(in_features=256, out_features=256, bias=True)
  (drop2): Dropout(p=0.0, inplace=False)
)

>>> self.context_se / self.depth_se
>>> SELayer(
  (conv_reduce): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))
  (act1): ReLU()
  (conv_expand): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))
  (gate): Sigmoid()
)

>>> self.context_conv
>>> Conv2d(256, 80, kernel_size=(1, 1), stride=(1, 1))

>>> self.cost_volumn_net
>>> Sequential(
  (0): Conv2d(88, 88, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
  (1): BatchNorm2d(88, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): Conv2d(88, 88, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
  (3): BatchNorm2d(88, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)

>>> self.depth_conv <=> 3 * Res blocks + ASPP/DCN + Conv
Sequential(                                                                                                                                                                                                                                             
(0): BasicBlock(                                                                                                                                                                                                                                                    
     (conv1): Conv2d(344, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)                                                                                                                                                                          
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)                                                                                                                                                                           
     (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)                                                                                                                                                                          
     (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)                                                                                                                                                                           
     (relu): ReLU(inplace=True)                                                                                                                                                                                                                                        
     (downsample): Conv2d(344, 256, kernel_size=(1, 1), stride=(1, 1))                                                                                                                                                                                                 )                                                                                                                                                                                                                                                                   
(1): BasicBlock(                                                                                                                                                                                                                                                    
     (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)                                                                                                                                                                          
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)                                                                                                                                                                           
     (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)                                                                                                                                                                          
     (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)                                                                                                                                                                           
     (relu): ReLU(inplace=True))                                                                                                                                                                                                                                    
(2): BasicBlock(
     (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
     (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU(inplace=True))
(3): ASPP(
     (aspp1): _ASPPModule(
     (atrous_conv): Conv2d(256, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
     (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU())

     (aspp2): _ASPPModule(
     (atrous_conv): Conv2d(256, 96, kernel_size=(3, 3), stride=(1, 1), padding=(6, 6), dilation=(6, 6), bias=False)
     (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU())

     (aspp3): _ASPPModule(
     (atrous_conv): Conv2d(256, 96, kernel_size=(3, 3), stride=(1, 1), padding=(12, 12), dilation=(12, 12), bias=False)
     (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU())

     (aspp4): _ASPPModule(
     (atrous_conv): Conv2d(256, 96, kernel_size=(3, 3), stride=(1, 1), padding=(18, 18), dilation=(18, 18), bias=False)
     (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU())

     (global_avg_pool): Sequential(
     (0): AdaptiveAvgPool2d(output_size=(1, 1))
     (1): Conv2d(256, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
     (2): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (3): ReLU())

     (conv1): Conv2d(480, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
     (relu): ReLU()
     (dropout): Dropout(p=0.5, inplace=False)

(4): Conv2d(256, 88, kernel_size=(1, 1), stride=(1, 1))
)

视角转换模块

由于深度估计模块已经得到了丰富的语义特征context以及深度信息depth,作者这里是直接利用了原BEVDet生成BEV特征的模块Voxel Pooling v2,从而获得BEV空间特征:Tensor([bs, 80, BEV_H, BEV_W])。

Voxel Pooling v2模块的代码如下

def voxel_pooling_v2(self, coor, depth, feat):
    ranks_bev, ranks_depth, ranks_feat, \
    interval_starts, interval_lengths = \
    self.voxel_pooling_prepare_v2(coor)
    if ranks_feat is None:
        print('warning ---> no points within the predefined '
              'bev receptive field')
        dummy = torch.zeros(size=[
            feat.shape[0], feat.shape[2],
            int(self.grid_size[2]),
            int(self.grid_size[0]),
            int(self.grid_size[1])
        ]).to(feat)
        dummy = torch.cat(dummy.unbind(dim=2), 1)
        return dummy
    feat = feat.permute(0, 1, 3, 4, 2)
    bev_feat_shape = (depth.shape[0], int(self.grid_size[2]),
                      int(self.grid_size[1]), int(self.grid_size[0]),
                      feat.shape[-1])  # (B, Z, Y, X, C)
    bev_feat = bev_pool_v2(depth, feat, ranks_depth, ranks_feat, ranks_bev,
                           bev_feat_shape, interval_starts,
                           interval_lengths)
    # collapse Z
    if self.collapse_z:  # self.collapse_z = True
        bev_feat = torch.cat(bev_feat.unbind(dim=2), 1)
    return bev_feat

再得到BEV特征之后,继续使用2D卷积层进行特征提取,该2D卷积层记作self.pre_process_net(),从而获得某一帧对应的BEV Feature = Tensor([bs, 80, BEV_H, BEV_W])

对应的代码如下

bev_feat = self.pre_process_net(bev_feat)[0]
>>> self.pre_process_net
>>> CustomResNet(
  (layers): Sequential(
    (0): Sequential(
      (0): BasicBlock(
        (conv1): Conv2d(80, 80, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn1): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (conv2): Conv2d(80, 80, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn2): BatchNorm2d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (relu): ReLU(inplace=True)
        (downsample): Conv2d(80, 80, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      )
    )
  )
)

2D BEV Encoder模块

上文有提到,当前梳理的代码同时用到了历史帧的信息,所以对于2D BEV Encoder模块的输入BEV Feature实际上是一组BEV Feature沿着通道concat的结果,即t时刻和t-1时刻的BEV Feature沿着通道维度concat的结果。

针对2D BEV Encoder模块而言,其包括img_bev_encoder_backbone()和img_bev_encoder_neck()两个子模块,分别完成多尺度的2D特征的提取以及多尺度2D特征的融合。

  • img_bev_encoder_backcone

该模块用于实现对视角转换模块输出的BEV特征进行多尺度的特征提取。输入特征Tensor([bs, 160, BEV_H, BEV_W])

对应的伪代码如下

x = self.img_bev_encoder_backbone(x)

# 输出多尺度的BEV特征
- Tensor([bs, 160, BEV_H / 2, BEV_W / 2]) = f0
- Tensor([bs, 320, BEV_H / 4, BEV_W / 4]) = f1
- Tensor([bs, 640, BEV_H / 8, BEV_W / 8]) = f2
img_bev_encoder_neck

该模块用于实现对img_bev_encoder_backbone模块输出的多尺度特征进行融合,首先将降采样8倍的BEV特征f2上采样4倍大小,然后与f1特征图沿着通道concat到一起,利用卷积操作进行通道上的特征融合。最后输出的特征继续上采样2倍差值以及2D卷积层,获得输出特征Tensor([bs, 256, 200, 200])

对应的伪代码如下

f2, f1 = feats[self.input_feature_index[0]], feats[self.input_feature_index[1]]

f2 = self.up(f2)    
f1 = torch.cat([f2, f1], dim=1)     
x = self.conv(f1)  
x = self.up2(x)     

>>> self.up
>>> Upsample(scale_factor=4.0, mode=bilinear)

>>> self.conv
>>>  Sequential(
  (0): Conv2d(800, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU(inplace=True)
  (3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (5): ReLU(inplace=True)
)

>>> self.up2
>>> Sequential(
  (0): Upsample(scale_factor=2.0, mode=bilinear)
  (1): Conv2d(512, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (3): ReLU(inplace=True)
  (4): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1)))

Occupancy Head模块

对于Occupancy Head,用于去预测空间中的每个体素是否被占据,如果没有被占据就是预测为free类别,如果被占据则预测对应的所属类别。

在进行最终的类别预测之前,首先会将2D BEV Encoder模块的输出过下2D卷积层,然后去联合预测BEV空间每个网格的高度和语义特征,输出Tensor([bs, 200, 200, 288 = num_classes * height])。

对应的伪代码如下

occ_pred = self.final_conv(img_feats).permute(0, 3, 2, 1)        
occ_pred = self.predicter(occ_pred)

>>> self.final_conv
>>> (final_conv): ConvModule(
    (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (activate): ReLU(inplace=True))

>>> self.predicter
>>> Sequential(
    (0): Linear(in_features=256, out_features=512, bias=True)
    (1): Softplus(beta=1, threshold=20)
    (2): Linear(in_features=512, out_features=288, bias=True))

通道高度转换模块

通道高度转换模块也是本文所提出的核心插件,可以理解成Occupancy Head的预测头类似YOLO中的思路,将语义特征和高度联合在一起进行预测,最后通过Tensor的view操作实现2D特征转换为3D的体素预测结果。

occ_pred = occ_pred.view(bs, Dx, Dy, Dz, num_classes)
# Tensor([bs, 200, 200, 288]) -> Tensor([bs, 200, 200, 16, 18])

>>> bs = batch size; 
>>> Dx = BEV空间的大小; Dy = BEV空间的大小; Dz = 体素高度; num_classes = 类别数目

Loss的计算

代码当中主要对模型预测的深度depth信息以及最终的3D分割结果进行了监督学习(计算Loss,更新模型的参数)

  • 针对depth预测的监督,代码当中只对当前帧预测出来的depth信息计算了损失,对于前几帧估计的depth信息不会进行损失的计算。
  • 针对3D体素分割预测的监督,代码对于Occupancy Head输出的结果会利用Cross Entropy计算相应的loss,从而更新模型的参数。

实验部分

下面放一下Flash-Occ的实验效果

结论

目前,Occupancy Network由于可以天然的缓解3D感知中的长尾问题,并且还能更加细粒度的描述目标的几何形状信息,所以受到了来自自动驾驶社区非常广泛的关注。但由于对于3D体素的特征表示以及后续的特征提取过程非常占用内存,且3D卷积模块无法部署,严重阻碍了Occupancy Network的上车部署。

本文介绍的Flash-Occ算法提出了一个通道高度转换模块,使得所有操作均和之前的BEV感知操作类似,极大提高了模型的推理速度,降低了模型的运算量,对上车部署更加友好。

#Far3D

近来在 Arxiv 读到一篇纯视觉环视感知的新工作,它延续了 PETR 系列方法,主要关注如何解决纯视觉感知的远距离目标检测问题,将感知范围扩大到150m。直接干到150m,视觉3D目标检测新思路

原标题:Far3D: Expanding the Horizon for Surround-view 3D Object Detection
论文链接:https://arxiv.org/abs/2308.09616
作者单位:北京理工大学 & 旷视科技

任务背景

三维物体检测在理解自动驾驶的三维场景方面发挥着重要作用,其目的是对自车周围的物体进行精确定位和分类。纯视觉环视感知方法具有成本低、适用性广等优点,已取得显著进展。然而,它们大多侧重于近距离感知(例如,nuScenes的感知距离约为 50 米),对远距离探测领域的探索较少。检测远距离物体对于实际驾驶中保持安全距离至关重要,尤其是在高速或复杂路况下。

近来,从环视图像中进行三维物体检测取得了显著进展,其部署成本较低。然而,大多数研究主要集中在近距离感知范围,对远距离检测的研究较少。将现有方法直接扩展到覆盖长距离会面临计算成本高、收敛性不稳定等挑战。为了解决这些局限性,本文提出了一种新的基于稀疏查询的框架,称为 Far3D。

论文思路

现有的环视感知方法根据中间表征可大致分为两类:基于 BEV 表征和基于稀疏 query 表征的方法。基于 BEV 表征的方法,由于其密集的 BEV 特征计算,计算量非常大,难以扩展到远距离场景。而基于稀疏query表征的方法,会从训练数据中学习到全局 3D query,计算量会小许多,且扩展性较强。但它也有弱点,虽然可以避免 query 数目的平方增长,但全局固定 query 不易适应动态场景,在远距离检测中通常会遗漏目标。

图1:Argoverse 2 数据集上,3D 检测和 2D 检测的性能对比。

在远距离检测中,基于稀疏 query 表征的方法有两个主要挑战。

  1. 首先是召回性能较差。由于 query 在 3D 空间分布的稀疏性,在远距离范围只能产生少量匹配的 positive query。如上图所示,3D 检测的召回率较低,而现有 2D 检测的召回率要高得多,两者之间存在明显的性能差距。因此,利用高质量的 2D 物体先验来改进 3D query 是一种很有潜力的方法,它有利于实现物体的精确定位和全面覆盖。
  2. 其次,直接引入 2D 检测结果来帮助 3D 检测会面临误差传播的问题。如下图所示,两种主要来源是 1) 由于深度预测不准的物体定位误差;2) 随着距离的增大,视锥变换中的 3D 位置误差也会增大。这些 noisy query 会影响训练的稳定性,需要有效的去噪方法来优化。此外,在训练过程中,模型会表现出对密集的近距离物体过度拟合的倾向,而忽略稀疏分布的远距离物体。

为了解决上述问题,本文做了以下设计:

  1. 除了从数据集中学到的 3D global query 外,还引入了由 2D 检测结果生成的 3D adaptive query。具体地,首先利用 2D 检测器和深度预测网络得到 2D 框和对应深度,再通过空间变换投射到 3D 空间,作为 3D adaptive query 的初始化。
  2. 为了适应不同距离的物体的尺度不同,设计了 Perspective-aware Aggergation。它使得 3D query 可以和不同尺度的特征交互,有利于不同距离物体的特征捕捉。比如,远处物体需要大分辨率的特征,而近处则不同。模型通过这种设计可以自适应地与特征交互。
  3. 设计了一种称为 Range-modulated 3D Denoising 的策略,以减轻 query 错误传播和收敛缓慢的问题。考虑到不同距离的 query 回归难度不同,noisy query 根据真实框的距离和尺度来调整。将 GT 附近的多组 noisy query 输入解码器,来分别实现重建3D 真实框(对于正样本)和舍弃负样本的作用。

主要贡献

  1. 本文提出了一种新的基于稀疏 query 的检测框架,它利用高质量的 2D object prior 来生成 3D adaptive query, 从而扩大三维检测的感知范围。
  2. 本文设计了 Perspective-aware Aggregation 模块,它从不同尺度和视角聚合视觉特征,以及一个基于目标距离的 3D Denoising 策略,来解决 query 误差传播和框架收敛问题。
  3. 在远距离的 Argoverse 2 数据集的实验结果表明,Far3D 超越了此前的环视方法,并优于几种基于激光雷达的方法。并且在 nuScenes 数据集上验证了其通用性。

模型设计

Far3D 流程概览:

  1. 将环视图像输入主干网络和 FPN 层,编码得到 2D 图像特征,并将其与相机参数进行编码。
  2. 利用 2D 检测器和深度预测网络,生成可靠的 2D 物体框及其相应深度,然后通过相机变换投影到 3D 空间。
  3. 生成的3D adaptive query 与初始的 3D global query 相结合,由解码器层迭代回归,以预测 3D 物体框。更进一步,该模型可通过长时序的 query 传播实现时序建模。

Perspective-aware Aggregation:

为了给远距离检测模型引入多尺度特征,本文应用了 3D spatial deformable attention。它先在 query 对应的 3D 位置附近进行偏移采样,而后通过 3D-2D 视图变换聚合图像特征。这种方法替代 PETR 系列中的 global attention 的优势在于,计算量可以大幅降低。具体地,对于 3D 空间中的每个 query 的参考点,模型会学习其周围的 M 个采样偏移,并将这些偏移点投影到不同的 2D 视图特征中。

其后,3D query 与投影得到的采样特征交互。通过这种方式,来自不同视角和尺度的各种特征将通过考虑其相对重要性汇聚到三维查询中。

Range-modulated 3D Denoising:

不同距离的 3D query 具有不同的回归难度,这不同于现有的 2D Denoising 方法(如 DN-DETR, 通常同等对待的2D query)。难度差异来自于 query 匹配密度和误差传播。一方面,与远处物体相对应的 query 匹配度低于近处物体。另一方面,在 3D adaptive query 中引入二维先验时,2D 物体框的微小误差会被放大,更不用说这种影响会随着物体距离的增加而增大。因此,GT 框附近的一些 query 可被视为 positive query,而其他有明显偏差则应被视为 negative query。本文提出一种 3D Denoising 方法,旨在优化那些正样本,并直接舍弃负样本。

具体地,作者通过同时添加正样本和负样本组来构建基于 GT 的 noisy queries。对于这两种类型,都会根据物体的位置和大小应用随机噪声,以促进远距离感知中的去噪学习。形式上,正样本定义在 3D 框内的随机点,而负样本则在 GT 施加更大的偏移,范围随着物体的距离变化。这种方式可以在训练过程中模拟有噪声的候选正样本和 false postive 样本。

实验结果

Far3D 在 150m 感知范围的 Argoverse 2 上取得了最高的性能。并且模型 scale up 之后,可以达到几个 Lidar-based 方法的性能,展现了纯视觉方法的潜力。

为了验证泛化性能,作者也在 nuScenes 数据集上做了实验,表明其在验证集和测试集上都达到 SoTA 性能。       

通过 Ablation 实验表明了 3D adaptive query, perspective-aware aggregation 和 range-modulated 3D denoising 各自的增益。

论文思考

Q:这篇文章有什么 novelty?
A:主要 novelty 是解决远距离场景的感知问题。现有方法拓展到远距离场景有许多问题,计算成本和收敛困难等。本文作者为这个任务提出了一个高效的框架。尽管单拎出来各个模块似曾相识,它们都是服务于远处目标的检测的,目标明确。

Q:相比 BevFormer v2, MV2D 有什么区别?
A: MV2D 主要是依赖 2D anchor 去取对应的特征对 3D 进行了绑定,但是没有显式的深度估计,所以对于远距离物体来说不确定性就会比较大,然后难收敛;BevFormer v2 主要解决的是2D backbone与 3D 任务场景之间的domain gap,一般 2D 识别任务上预训练的 backbone 察觉 3D 场景的能力存在不足,并没有探索远距离任务中的问题。

Q: 时序上能否改进,如 query propagation 再加上 feature propagation?
A: 理论上是可行的,但是实际应用中应该考虑performance-efficiency tradeoff。

Q: 还有哪些需要改进的地方?
A: 在长尾问题和远距离评测指标上都值得改进。在 Argoverse 2 这样的 26 类目标上,模型在长尾类别上表现不佳,最终也会降低平均精度,这一点尚未被探索。另一方面,使用统一的指标来评估远距离和近距离物体可能并不合适,这就强调了对实用的动态评估标准的需求,以适应现实世界的不同场景。

#HACK-Model

全新参数化人脸模型HACK助力3D角色生成,忠实再现逼真颈部运动

在当前的生成式人工智能浪潮中,3D 生成一直是备受瞩目的话题。而要生成高质量、符合工业界标准的几何模型,一直是 3D 生成任务的重要难点。但对于 3D 里最为重要的品类之一 —— 人物头部几何的生成,却早就不再受困于这个问题。

由于人类面部拓扑的相似性,通过 PCA(主成分分析)等手段参数化建立人脸模型的手段已经被证明是一种非常有效的解决方案,可以高质量、快速、符合工业界标准地生成人物头部的几何模型。诸如 3DMM(3D Morphable Model)、FLAME(Face, LAndmark, MOrphology, and Expression model)等参数化人脸模型已经广泛应用于数字娱乐、虚拟现实、医学和安防等领域。

然而,当前开源的参数化人脸模型仍然面临着问题。首先,由于数据集以欧美面孔为主,缺少亚洲人数据,覆盖度不全,无法完全表现所有人种特征。其次,在拓扑结构和表情变形体(BlendShape)方面过于简化,达不到工业标准,无法精细还原各种结构(如面部肌肉、胸锁乳突肌等),也无法实现个性化(Personalized)控制运动。最后,在注重脸部的同时,缺少对颈部肌肉和喉结运动的建模,颈部旋转的表现也过于极简化,导致缺乏运动真实度。

由上海科技大学与影眸科技、华中科技大学联合提出的全新参数化人脸模型 HACK 解决了这些问题。HACK 是一个新的开源参数模型,用于构建数字人的头部和颈部区域。该模型旨在解耦颈部和喉部运动、面部表情和外观变化,实现对头部的全方位控制,特别是对于颈部区域的控制更加个性化和解剖学一致,实现了比现有头颈模型更准确和表现力更强的结果。HACK 已经被应用于影眸科技的 3D AIGC 数字角色生成平台 ChatAvatar 中,通过文本 / 图像直接生成并导出能够用于 Unity/UE/Maya 等主流 CG 软件中的模型文件。

这项工作已经被计算机图形领域国际顶级期刊 Transactions on Graphics 接收,并将在国际计算机图形顶级会议 SIGGRAPH 2023 上展示。值得一提的是,HACK 还入选了 ACM ToG 当期的扉页与 SIGGRAPH 2023 Technical Paper 预告片。

  • 项目链接:https://sites.google.com/view/hack-model
  • 论文链接:https://arxiv.org/abs/2305.04469
  • GitHub:https://github.com/ZoneLikeWonderland/HACK-Model/

数据采集该研究使用一种便携式实时 3D 超声成像系统,使用超声断层扫描技术捕捉颈椎相对于演员静止姿态的解剖正确位置。对于颈椎的扫描图像,射科医生被要求用 3D 标志标记颈椎的七个椎骨,然后根据头骨和颈部的外部形状提取解剖学上匹配的 3D 旋转信息。

此外,该研究建立了 PlenOptic Stage,捕捉各种外貌特征的静态扫描、FACS 表情和 PBR 纹理、头部和颈部的动态表现以及细致的喉部运动法线(Normal)序列。 

通过对这些原始数据进行处理,该研究得到了一个全面的数据集,包括:1)颈椎关节和相应的面部网格,来自超声扫描;2)大规模静息 mesh(不包括喉部几何形状),由 PlenOptic Stage 和 ICT-FaceKit 获得;3)喉部几何形状;4)从静态扫描中制作表情的 mesh;5)动态 mesh 序列;6)外观纹理;7)说话的图像和计算的法线。然后该研究在这些数据上训练了整个 HACK 模型。

模型训练

为了训练 HACK 模型,该研究使用类似于人脸和身体建模的技术。具体来说,将头部和颈部分为形状、姿势、面部表情和喉部 BlendShape,并学习个体特征。

它还使用喉部 BlendShape 来控制喉部变形,以实现更符合解剖学的真实运动。例如,表达喉结大小的变化以及声带移动时的细微动作。

将头部和颈部视为一个整体,创造了更精确和更具表现力的动作。由于颈部的细节动作与面部表情和头部动作相关,因此观众会感受到比以往更高的真实感。

HACK 提供了多种可控制的参数,来更好的呈现头、颈、喉部形状的多样性,通过进一步添加表情、姿势、喉部位置参数,创建了具有高度表现力的模型,有广泛的运动范围。

通过结合与模型身份特征相关的颈椎关节位置、姿势和表情 BlendShape,HACK 能够生成更具个性化的动画效果。

模型应用

HACK 模型可以应用于各种场景中。首先,给定一个目标扫描或网格,我们可以通过拟合 HACK 参数来精确地重建它。与现有的参数化模型(如 FLAME)相比,HACK 在形状和姿势匹配方面具有更低的重建误差,并且可以操纵参数来创建不同的表情、姿势和外观。

此外,我们可以从输入的头部方向和表情序列中推断出姿势参数,以使喉部运动动画化。通过将 HACK 与现有的面部表演捕捉技术结合使用,它可以用于角色动画。HACK 的外貌特征相关的姿势和表情 BlendShape,实现了高保真度和表现力强的动画。 

由于 HACK 的头部和颈部骨骼解剖学上一致,哺乳动物之间共享相同的颈部骨骼结构,HACK 甚至可以用于在不同主体之间转移颈部动画,包括从人类到长颈鹿。

结语 

在构建逼真的数字人脸时,要考虑眼睛、鼻子、嘴巴等部位的运动、皮肤细节和光照条件等因素。针对这些方面,研究团队已经进行了大量研究。

颈部作为连接下巴、头部和肩部的重要部位,对头部和面部的自然运动至关重要。颈部以各种姿势和角度可见,直接影响数字人的整体外观。此外,通过设计颈部的运动,可以为面部动作增添精致和真实感,并增加非语言交流。因此,对解剖学知识的了解是非常重要的。

研究团队认为,数字角色制作不仅仅是数据和美学的结合,引入解剖学研究可以进一步提高数字角色的丰富度和真实性,为数字角色的应用场景拓展更广阔的空间。

#SweetDreamer

生成模型在图像生成领域取得了巨大的成功,但将这一技术扩展到 3D 领域一直面临着重重挑战。典型的多头怪问题,即文本生成3D中多视角一致性问题,一直得不到很好的解决。谭平团队最新的研究论文都致力于解决这一基础问题,为这一领域带来了突破和创新。

谭平博士是香港科技大学电子与计算机工程系教授。他曾经担任阿里巴巴达摩院XR实验室负责人,人工智能实验室计算机视觉首席科学家。于近期创立公司光影焕像,依然专注在3D领域,将自己多年的研究成果进行转化。港科大谭平团队突破3D生成领域关键性问题,让多头怪不再出现

论文 "SweetDreamer" 采用3D数据对2D扩散模型进行Alignment,成功实现文本生成高质量3D模型的任务,解决几何不一致问题。通过赋予 2D 模型视角感知能力和引入规范坐标映射(CCM),它有效地对齐了 3D 几何结构,保留了多样化高质量物体的生成能力,并在人类评估中取得了 85% 以上的一致性,远超以往方法(仅 30% 左右),为文本到 3D 生成领域带来了新的技术突破。

  • 论文地址:https://arxiv.org/pdf/2310.02596.pdf
  • 论文网站:https://sweetdreamer3d.github.io/

论文 "Ctrl-Room" 采用了两阶段生成方式,即 "布局生成阶段" 和 "外观生成阶段",解决了文本生成 3D 室内场景的多视角不一致性问题。在布局生成阶段,该方法生成了合理的室内布局,考虑到了家具类型和位置,以及墙壁、门窗等因素。而在外观生成阶段,它生成了全景图像,确保了不同视角图像之间的一致性,从而保证了 3D 房间结构和家具排列的合理性。"Ctrl-Room" 甚至允许用户对生成的 3D 房间进行灵活编辑,包括调整家具大小、位置和语义类别等操作,以及替换或修改家具。

论文地址:https://arxiv.org/abs/2310.03602v1

论文网址:https://fangchuan.github.io/ctrl-room.github.io/

接下来,我们一起来看看这两篇论文的关键内容。

SweetDreamer

谭平团队和腾讯、华南理工共同合作的 SweetDreamer 重点解决文本生成 3D 物体中的多视角不一致性问题,通过改进 2D 扩散模型,成功将文本转化为高质量的 3D 对象,实现了文本到 3D 生成的重大突破。

“SweetDreamer” 的核心贡献在于解决了文本到 3D 生成中的多视图不一致性问题。团队指出,现有方法中的主要问题来自几何不一致性,即在将 2D 结果提升到 3D 世界时,由于 2D 模型仅学习视角无关的先验知识,导致多视图不一致性问题。这种问题主要表现为几何结构的错位,而解决这些错位结构可以显著减轻生成结果中的问题。因此,研究团队通过使 2D 扩散模型具备视角感知能力,并生成规范坐标映射(CCM),从而在提升过程中与 3D 几何结构对齐,解决了这一问题。

论文中的方法只使用了粗略的 3D 信息,只需要少量的 3D 数据。这种方式不仅解决了几何不一致性问题,还保留了 2D 扩散模型生成从未见过的多样化高质量物体的能力。 

最终,他们的方法在人类评估中取得了 85% 以上的一致性,远超过以往的方法 30% 左右的结果,这意味着他们的方法在文本到 3D 生成领域实现了新的技术突破。这一研究不仅对于 3D 生成具有重要意义,还对于虚拟现实、游戏开发、影视制作领域等有着广泛的应用前景,为实现更高质量、更多样化的 3D 生成打开了新的可能性。

方法介绍

“SweetDreamer” 的核心目标是解决多视角不一致性的问题。这个问题主要可以从两个角度来看:几何不一致性问题,以及外观不一致性问题。团队通过研究发现,大多数 3D 不一致性问题的主要原因是几何结构的错位,因此这项技术的主要目标是通过改进 2D 先验模型,使其能够生成 3D 一致的几何结构,同时保持模型的通用性。

为了实现这一目标,团队提出了一种方法,即通过与 3D 数据集中的规范坐标映射(CCM)对齐的方式,确保 2D 扩散模型中的几何先验能够正确生成 3D 一致的几何结构。这项技术依赖 3D 数据集,并假设数据集中的模型都具有规范的方向和标准化的尺寸。然后,从随机角度渲染深度图,并将其转换为规范坐标。需要注意的是,这个过程的目标是对齐几何先验,而不是生成几何细节。 

最后,通过对 2D 扩散模型进行微调,就能够在指定的视角下生成规范坐标图,从而对齐 2D 扩散模型中的几何先验。这些对齐的几何先验(AGP)可以轻松集成到各种文本到 3D 生成管道中,从而显著减轻了不一致性问题,最终产生高质量和多样化的 3D 内容。

“SweetDreamer” 的关键步骤如下:

  • 规范坐标映射(CCM)。首先,为了简化建模过程,研究人员假设在训练数据中,同一类别的所有物体都遵循规范的方向。然后,他们将物体的大小归一化,使得其包围框的最大范围长度为 1,并且位于原点的中心。此外,他们还对从物体渲染的坐标映射进行了各向异性缩放,以增强不同视角下薄结构的空间坐标差异,从而改善了对 3D 结构的感知。
  • 相机信息注入。虽然规范坐标映射包含粗略的视角信息,但研究人员发现扩散模型难以有效利用它。因此,他们将相机信息注入模型以提高视角感知。这个步骤的目的是生成粗略的几何结构,而不是准确的 3D 模型。
  • 微调 2D 扩散模型。在获得规范坐标映射和相应的相机参数之后,研究人员微调 2D 扩散模型,以在特定视角条件下生成规范坐标映射,最终对齐 2D 扩散模型中的几何先验。

这一技术不仅解决了多视角 3D 结构一致,并且保持了 2D 扩散模型的灵活性和丰富性,可以被集成到不同的渲染管线中。团队在文中展示了两种不同的渲染管线,分别是基于神经辐射场(NeRF)的 DreamFusion 和基于传统三角网格的 Fantasia3D。

基于神经辐射场的管线:团队对 3D 对象进行体素渲染,以获取 RGB 图像,并将其输入到扩散模型以计算 SDS 损失。在优化期间,团队渲染规范坐标映射(CCM),并将其输入到对齐几何先验(AGP),以计算几何 SDS 损失来更新 NeRF 的几何分支。

基于传统三角网格的管线:这里只需要添加一个额外的并行分支,将对齐几何先验(AGP)纳入原始流程的几何建模监督中。在优化的时候,团队将对齐几何先验(AGP)在粗略和精细几何建模阶段都作为额外的监督引入,就可以轻松获得高质量和视角一致的结果。

实验结果呈现

通过将 AGP 集成到文本生成 3D 的网络中,结果得到了显著改善。原始的方法容易受到多视角不一致性的干扰,而生成多头、多手等几何结构错乱的结果。团队发现新的方法对结果有明显的提升,生成的结果明显具有高度的 3D 一致性。

团队的定量评估着重于评估 3D 结果的多视角一致性。具体而言,团队随机选择了 80 个文本提示,执行文本到 3D 合成,生成了每种方法的 80 个结果。然后手动检查和统计 3D 不一致性(例如,多个头、手或腿)的出现次数,并报告成功率,即 3D 一致对象的数量除以生成结果的总数。结果表明,SweetDreamer 在两种渲染管线中的成功率都超过了 85%,而之前的方法只有大约 30%。

团队认为,尽管同时期的工作 MVDream 也可以解决多视角不一致性问题,但它容易过拟合有限的 3D 数据,扩散模型的泛化性能受到影响。例如使用提示词 “一张猪背着背包的图像”,MVDream 会漏掉 “背包” 的存在。相比而言,AGP 的结果有更丰富的外观,这是因为 AGP 仅对几何建模产生影响,而不会影响由扩散模型从数十亿真实图像中学到的强大的外观先验。

Ctrl-Room

谭平团队和南开大学共同合作的 Ctrl-Room 重点解决文本生成 3D 室内场景中的多视角不一致性问题,通过解耦布局和外观,可以用文字提示实现逼真的 3D 室内场景生成,而且还可以对室内物品进行灵活编辑,包括调整大小和移动位置等操作。

"Ctrl-Room" 的核心贡献在于方法采用了一种创新的两阶段生成方式,分别是 "布局生成阶段" 和 "外观生成阶段"。在布局生成阶段,该方法可以生成合理的室内布局,包括各种家具类型和位置,甚至考虑到了有门窗的墙壁。这一阶段的关键是采用了一种全面的场景代码参数化方法,将房间表示为一组对象,每个对象由一个向量表示,其中包括其位置、大小、语义类别和方向。

在外观生成阶段,该方法生成了室内场景的外观,将其呈现为全景图像。与以往的文本生成全景图方法不同,这一方法明确遵循了室内布局约束,能够确保各个不同视角图像之间的一致性,确保了 3D 房间结构和家具排列的合理性。

最重要的是,由于布局与外观分离的设计,"Ctrl-Room" 允许对生成的 3D 房间进行灵活编辑。用户可以轻松地调整家具物品的大小、语义类别和位置。这一方法甚至允许用户通过指令或鼠标点击来替换或修改家具,而无需昂贵的特定于编辑的训练。

方法介绍

这项技术分为两个关键阶段:布局生成阶段和外观生成阶段。在布局生成阶段,团队通过一种全面的场景代码来描述室内场景,并利用扩散模型学习其分布。这样就可以从文字输入中生成房间的整体结构,包括墙壁和各种物品的位置和大小。用户可以随心所欲地编辑这些物品,拖拽它们、调整它们的类型、位置或大小,以满足用户的个性化需求。

在外观生成阶段,团队通过一个经过预训练的扩散模型生成室内场景的纹理,将室内布局转化为全景图。为了确保图像的左右连贯,团队提出了一种新的循环一致性采样方法,使室内场景看起来更加真实。最终,通过估算生成的全景图的深度图来获得带纹理贴图的 3D 场景。

“Ctrl-Room” 的关键步骤如下:

1. 布局生成阶段

这个阶段的主要目标是从文本输入中创建室内三维场景的布局。与以往方法不同,团队不仅仅考虑了家具,还包括了墙壁、门和窗户等要素,以更全面地定义室内场景的布局。

团队将室内场景中的各个元素编码成一种统一的格式,并将其称为 “场景代码”。这个代码包含了室内场景中所有元素的信息,包括它们的位置、尺寸、朝向和类别。然后团队利用这个场景代码来构建一个扩散模型,用于学习场景布局的分布。

这个模型通过逐渐向场景代码添加高斯噪声来创建一个离散时间的马尔可夫链。噪声逐渐增加,直到最终的分布呈现高斯分布。然后,通过训练神经网络来反向这个过程,从添加了噪声的场景代码中还原出干净的场景代码。这个过程能够将文本输入转化为具体的场景布局,为后续的场景生成和编辑提供了基础。

在布局生成阶段的末尾,场景代码被表示为一组不同语义类型的包围盒,这些包围盒将用于后续的交互式编辑,允许用户根据自己的需求自定义 3D 场景。

2. 外观生成阶段

这个阶段旨在根据室内场景的布局信息生成合适的全景图像,以表现其外观。过去有的方法采用增量式的方式,逐步生成不同视角的图像来合成全景图,但容易受到多视角不一致性的影响,导致最终的全景图不能保持合理的房间结构。这里团队利用了 ControlNet 技术,根据布局的结果一次性生成整个全景图,可以更好保持房间结构。

为了实现这一点,团队将包围盒表示的布局转换成了语义分割全景图。然后,研究团队对 ControlNet 进行了微调,使用了结构化 3D 数据集来增强训练数据。团队还引入了 "循环一致采样" 的概念,以确保生成的全景图在左右两侧无缝连接。

3.交互编辑
这个模块允许用户通过更改物体包围盒的位置、语义类别和大小来修改生成的三维室内场景。这一编辑过程需要实现两个目标,即根据用户的输入改变内容,并保持未编辑部分的外观一致性。

这个编辑过程分为两个步骤,填充步骤和优化步骤。填充步骤是为了将物体移动后露出部分进行填充。而优化步骤是为了保持被移动过的家具、物品的外观一致性。

实验结果呈现

研究人员使用了包含 3,500 个由专业艺术家设计的房屋的 3D 室内场景数据集 Structured3D 对模型进行评估。为了评估方法,研究人员选取了 4,961 个卧室和 3,039 个客厅,其中 80% 用于训练,其余用于测试。

相比以往的算法,例如 Text2Room 和 MVDiffusion,Ctrl-Room 能够更好保持房间结构。而 Text2Room 和 MVDiffusion 往往在不同视角的图像中反复生成同一个物体,例如在客厅中多次重复壁炉、电视机,在卧室中多次重复床等显著性高的物体。因此这些方法生成的场景往往从全局结构上看非常混乱。而 Ctrl-Room 通过显示的引入房间布局的生成,并用布局引导最终室内场景的生成,可以非常好的解决这个问题。

为了衡量生成的全景图像的质量,团队使用了 Frechet Inception Distance (FID)、CLIP Score (CS) 和 Inception Score (IS) 等指标。此外,研究人员还比较了生成 RGB 全景图像的时间成本,以及生成的 3D 室内场景的质量,包括 CLIP Score (CS) 和 Inception Score (IS)。

Ctrl-Room 在生成全景图像方面表现出色。它在 FID 指标上取得了最佳成绩,并大幅领先其他对比方法,这意味着它能更好地捕捉房间的外观,因为它能忠实地恢复房间布局。而 CS 指标对房间内物体的数目并不敏感,即便一个卧室中生成了 3-4 张床 CS 指标也可以很高,因此不能准确评价场景生成。与此同时,Ctrl-Room 在生成时间方面表现出色,相对于其他方法,它需要更短的时间。

团队还进行了用户研究,询问了 61 名用户对最终室内场景的感知质量和 3D 结构完整性进行评分。Ctrl-Room 技术也被用户认为在房间布局结构和家具排列方面具有更清晰的优势。

#GenN2N

来自香港科技大学,清华大学的研究者提出了「GenN2N」,一个统一的生成式NeRF-to-NeRF的转换框架,适用于各种NeRF转换任务,例如文字驱动的NeRF编辑、着色、超分辨率、修复等,性能均表现极其出色!

论文地址:https://arxiv.org/abs/2404.02788

主页:https://xiangyueliu.github.io/GenN2N/

Github:github.com/Lxiangyue/GenN2N

近年来,神经辐射场(NeRF)因其紧凑、高质量、多功能性在三维重建、三维生成和新视角合成领域引起了广泛关注。然而,一旦创建了NeRF场景,这些方法通常缺乏对生成几何和外观的进一步控制。因此,NeRF编辑(NeRF Editing)最近成为了一个值得关注的研究重点。

目前的NeRF编辑方法通常是针对特定任务的,例如NeRF的文本驱动编辑、超分辨率、修复和着色。这些方法需要大量的特定任务领域知识。而在2D图像编辑领域,开发通用的图像到图像(Image-to-image)转换方法成为一种趋势,例如利用2D生成模型stable difussion支持多功能的图像编辑。因此,我们提出了利用基础的2D生成模型进行通用的NeRF编辑。

随之而来的挑战是NeRF和2D图像之间的表示差距,尤其是图像编辑器通常会为不同视角生成多种不一致的编辑。最近的一种基于文本的NeRF编辑方法Instruct-NeRF2NeRF对此进行了探究。其采用“渲染-编辑-聚合”的流程,通过逐步渲染多视角图像、编辑这些图像,将编辑图像聚合到NeRF中逐步更新NeRF场景。然而这种编辑方法,针对特定的编辑需求,经过大量的优化,只能生成一种特定编辑的结果,如果用户不满意则需要反复迭代尝试。

因此,我们提出了「GenN2N」,一种适用于多种NeRF编辑任务的NeRF-to-NeRF通用框架,其核心在于用生成的方式来刻画编辑过程多解性,使其可以借助生成式编辑轻松产生大量符合要求的编辑结果供用户挑选。

在GenN2N的核心部分,1)引入了3D VAE-GAN的生成式框架,使用VAE来表征整个编辑空间,来学习与一组输入的2D编辑图像对应的所有可能的3D NeRF编辑的分布,并用GAN为编辑NeRF的不同视图提供合理的监督,确保编辑结果的真实性,2)使用对比学习解耦编辑内容和视角,确保不同视角间的编辑内容一致性,3)在推理时,用户简单地从条件生成模型中随机地采样出多个编辑码,就可以生成与编辑目标对应的各种3D编辑结果。

相比于各种NeRF编辑任务的SOTA方法(ICCV2023 Oral等),GenN2N在编辑质量、多样性、效率等方面均优于已有方法。

方法介绍

我们首先进行2D图像编辑,然后将这些2D编辑提升到3D NeRF来实现生成式的NeRF-to-NeRF的转换。

A. 隐式蒸馏(Latent Distill)

我们用Latent Distill Module作为VAE的encoder,为每张编辑图像学习一个隐式的编辑码,在NeRF-to-NeRF转换中通过此编辑码控制生成的内容。所有编辑码在KL loss的约束下服从于一个良好的正态分布,以便更好地采样。为了解耦编辑内容和视角,我们精心设计了对比学习,鼓励相同编辑风格视角不同的图片的编辑码相近,不同编辑风格但视角相同的图片的编辑码互相远离。

B. NeRF-to-NeRF的转换(Translated NeRF)

我们用NeRF-to-NeRF Translation作为VAE的decoder,其以编辑码作为输入,将原始的NeRF修改为一个转换NeRF。我们在原NeRF网络隐藏层之间添加了残差层,这些残差层以编辑码作为输入来调制隐藏层神经元,使得转换NeRF既能够保留原本NeRF的信息,又可以根据编辑码来控制转换3D内容。同时,NeRF-to-NeRF Translation也作为生成器参与生成对抗训练。通过生成而非优化的方式,使得我们可以一次性得到多种转换结果,显著提升了NeRF转换效率和结果多样性。

C. 条件判别器(Conditional Discriminator)

转换NeRF的渲染图片构成了需要判别的生成空间,这些图片的编辑风格、渲染视角各异,导致生成空间非常复杂。因此我们提供一个condition作为判别器的额外信息。具体而言,判别器在鉴别生成器的渲染图片Cj(负样本)或训练数据中的编辑图片Sj(正样本)时,我们都从训练数据中再挑选一张相同视角的编辑图片Sk作为条件,这使得判别器在鉴别正负样本时不会受到视角因素的干扰。

D. 推理(Inference)

在GenN2N优化后,用户可以从正态分布中随机采样出编辑码,输入转换NeRF即可生成出编辑后的高质量、多视角一致性的3D NeRF场景。

实验

我们在多种NeRF-to-NeRF任务上进行了大量的实验,包括NeRF的文本驱动编辑、着色、超分辨率、修复等。实验结果展示了GenN2N卓越的编辑质量、多视角一致性、生成的多样性、和编辑效率。

A. 基于文本的NeRF编辑

B. NeRF着色

C. NeRF超分辨率

D. NeRF修复

视频太大发不了..

对比实验

我们的方法与各种特定NeRF任务的SOTA方法进行了定性和定量对比(包括文本驱动编辑、着色、超分辨率和修复等)。结果表明,GenN2N作为一个通用框架,其表现与特定任务SOTA相当或者更好,同时编辑结果具有更强的多样性(如下是GenN2N与Instruct-NeRF2NeRF在基于文本的NeRF编辑任务上的对比)。

A. 基于文本的NeRF编辑

#Building3D

图1:Building3D数据集中最大的城市Talinn以及建筑物和房屋点云,mesh和线框模型。

为了促进测绘领域实景三维重建的发展,我们提出了Building3D​​(Building3D: An Urban-Scale Dataset and Benchmarks for Learning Roof Structures from Point Clouds)​​,一个高质量的基于航空点云的房屋建模数据集。本数据集有三个主要优势:

  1. 真实世界:区别于现有的人工构造的三维建筑物数据集,它由真实世界的爱沙尼亚共和国的建筑物构成。
  2. 类别丰富:覆盖了100多种房屋类型的约16万个三维点云建筑物数据。
  3. 标注丰富:包括了建筑物和房屋屋顶的表面点云,mesh和线框模型。

Building3D是目前学界最大的真实世界三维模型数据集,为未来的实景三维白模建模研究提供了广阔空间。利用该数据集,我们探讨了房屋表面重建,点云补全,去噪去野值,三维模型生成等多种学术任务的鲁棒性和泛化性,提出了很多有价值的发现,并验证了其从去躁去野值、三维重建到三维模型生成的开发应用前景。我们希望building3D以及对应的算法基准测试能够为学术研究和工业应用带来新的挑战和机会。

  • Project page: http://building3d.ucalgary.ca/
  • Paper: https://arxiv.org/abs/2307.11914
  • Dataset Download:
  1. 入门级水平数据集现已开放。
  2. Tallinn 城市数据将在8.15号之前发布
  3. 测试服务器也将在8.15号前可用

面向真实世界的三维重建与模型生成是测绘领域与智慧城市构建一直倍受关注的问题,也在近年来取得了一定的进展。然而,由于学术界和工业界缺乏大规模的实采 3D 建筑物数据库,大部分技术方法仍依赖于仿真和质量有限的ROOFN3D[1]数据集。因此,社区迫切需要一个大规模且高质量的真实世界 3D 建筑物数据集,这将有助于推进许多3D重建任务和下游应用。

数据集特点

Building3D为每一个建筑物提供了三种模态信息,包括:建筑物和屋顶点云、建筑物和屋顶mesh模型和建筑物和屋顶的线框模型。它具有100多种房屋模型,下图二展示了一些经典房屋类型以及它们对应的点云,线框(俯视图以及侧视图)以及屋顶和线框mesh模型。

图2:Building3D数据集中典型的10种房屋类型对应的点云、俯视图和侧视图的线框图以及房屋和线框图对应的mesh模型。 

同时由于是真实世界中的数据集,可能也存在点云稀疏以及建筑物棱角点消失以及建筑物棱角点数量过多的情况。

下游应用

Building3D为学界带来了广泛的探索空间,在本文中,我们选取了三维建筑物重建任务见图3进行评估与分析。我们提出一个统一的有监督和自监督的端到端房屋建模框架,将三维重建任务分成两部分:1)建筑物棱角点检测识别;2)建筑物有效边连接工作。

图3:三维建筑物重建结果

未来工作

关于数据集本身,会致力于不断扩大和更新数据集以满足更广泛的研究需求。除了现有的应用,我们还计划进一步发展其他下游任务,如稀疏点云补全,语义分割和如何在棱角点消失的情况下生成棱角点,提高棱角点检测准确度等问题。

#One-2-3-45

3D AI 生成最近发展得如火如荼,不少最新工作都能够从一句话 / 一张图生成高质量的三维模型。然而从去年下半年的 DreamFusion 和 Magic3D 到最新的 ProlificDreamer,绝大多数工作都通过对每个物体进行优化的方式来生成 3D 模型。这种方式使得现有的 3D AI 生成方法都非常耗时,譬如 ProlificDreamer 的作者就曾在知乎上表示方法目前的主要局限之一便是生成时间太慢了!3D AI生成出新玩法了:无需数小时,只要45秒,单张图片即可生成 3D模型

“一般而言,使用 stable-diffusion 生成一张图片在 PC 上只需要几秒钟,哪怕微调 LoRA 也很快;然而,我们生成一个 3D 物体需要数个小时,尤其是分辨率越高越慢。这主要是因为我们本质上还是借助于随机梯度下降来优化 3D 表示(NeRF 或 Mesh)的参数,这样的优化过程需要很多步的迭代,并且对 GPU 的显存也有一定要求。我们最终展示的效果是 512 分辨率的结果,这些结果的优化确实非常耗时,所以目前个人使用者还是很难在 PC 上直接使用我们的算法。

高昂的推断成本不仅使得研究者的实验迭代变慢,也阻碍了 3D AIGC 技术对于很多实时应用的商业落地和推广。

然而就在最近,来自 UCSD 等机构的研究者发布了一项最新工作,One-2-3-45,它摆脱了逐物体优化的生成范式,能够在 45 秒内从任意单张图片 / 文本生成 3D 纹理网格,且在测试时无需针对每个物体进行优化。

  • Project Page: http://one-2-3-45.com 
  • Paper: https://arxiv.org/pdf/2306.16928.pdf
  • Code: https://github.com/One-2-3-45/One-2-3-45
  • Demo:https://huggingface.co/spaces/One-2-3-45/One-2-3-45

视频都发不了 就这样看吧.. 没办法 

通过与现有的文生图模型(如 DALL-E2)结合,One-2-3-45 也支持从任意文本生成 3D 模型。

论文一发布,就被推特大佬 AK 宣传转发,并受到网友的广泛关注。

网友 Xin Kong 评论到:“这是最好的时代,也是最坏的时代。这可能是 3D 扩散生成中的 Instant NGP 时刻。30 分钟 ->45 秒,无分数蒸馏,2D 视图到 3D 是必经之路!”

方法

由于 3D 数据的稀缺性,学术界最近的绝大多数 3D AI 生成工作都通过利用 2D 扩散生成模型来指导 3D 表示(如 NeRF)的优化,从而实现 3D 内容生成。One-2-3-45 没有遵循这个范式,而是先利用 2D 扩散模型生成多视角图像,然后希望利用这些多视角图像来重建 3D 模型。

具体而言,One-2-3-45 利用了一个基于视角控制的 2D 扩散生成模型,Zero123。该模型通过微调 Stable Diffusion,实现了输入单张图片和一个相机的相对位姿变换,便能够预测该物体在变换后的视角下的对应图像的能力。

通过借助这类 2D 扩散生成模型,我们能够从一张图片预测生成对应的多视角图像。 

一个很自然的想法,便是将这些多视角图像传给经典的基于 NeRF 的重建方法来生成 3D 模型。然而研究者发现这样并不能生成高质量的 3D 模型(如下图所示)。 

这其实是因为网络预测的多视角图像具有潜在的不一致性。然而对于基于 NeRF 的优化类重建方法,一些微小的不一致便已足以使得方法崩溃。 

如上图所示,通过将预测的多视角图像与真实数据进行对比,研究者发现 Zero123 预测的多视角图像虽然不具备像素级别的高精确度(PSNR 不高)。但整体轮廓(mIoU)以及语义 / 感知相似性(CLIP 相似度)都很高,尤其当相机相对位姿变换较小时。这些结果说明了用网络预测的多视角图像进行三维重建的可能性。在 One-2-3-45 中,研究者使用了基于 cost volume 的可泛化 NeRF 类的方法来实现三维重建。这类方法将多视角图像作为输入,在训练后能够直接推断 3D 内容而无需额外优化。由于这类方法通过从训练数据学习了有关多视角预测不一致性的先验知识,他们更有希望能从不一致的多视角预测中生成 3D 模型。

One-2-3-45 方法流程图

具体来说,One-2-3-45 首先通过对多视角图像抽取 2D 图像特征,并通过相机位姿来构建 3D cost volume。然后 One-2-3-45 通过 3D 卷积神经网络来从 3D cost volume 推断输入多视角图像对应的潜在 3D 几何,并最后通过 MLP 来预测物体的 SDF 和颜色,进行体积渲染。

通过结合 2D 扩散生成模型和基于 cost volume 的可泛化 NeRF,One-2-3-45 能够在一次前向传播中生成 3D 模型。摆脱了耗时的逐物体 3D 优化后,One-2-3-45 生成一个高质量 3D 纹理网格的时间从数小时降到了 45 秒!

然而在实现这个想法的过程中,研究人员却遇到了一些具体的挑战:

1. 现有的可泛化 NeRF 方法大都是将具有一致性的多视角图像作为输入(渲染自真实物体)。但如何将这类方法扩展到不完全一致的多视角预测上呢?

2. 现有的可泛化 NeRF 方法很多都专注于前景区域的重建。但在 3D 生成的问题中,我们希望得到 360 度的完整模型。

3. 由于 Zero123 采用了球坐标系来描述相对相机位姿。为了提供多视角图像的相机位姿给重建模块,我们需要得到输入图片对应的相机俯仰角(elevation)。

为了解决这些挑战,研究者提出了一系列关键的训练策略(如分阶段预测多视角图像)和一个俯仰角预测模块。详情请参考原论文。

研究者还特别指出由于重建模块主要依赖于局部的对应关系(correspondence),因此其只需少量的数据进行训练,并具有很强的可泛化性。

与现有 3D AI 生成方法的比较

研究者表示,得益于 “2D 多视角预测 + 3D 可泛化重建” 的技术路线,One-2-3-45 与现有的 3D AI 生成方法相比,除了推断时间显著降低外,还在输入的多样性、输出的几何表示、结果的 3D 一致性、与输入的相似性,以及所需的 3D 数据规模上,具有多方面的优势。

具体来说,许多基于逐物体优化的方法虽然能生成高质量 3D 内容,但目前只支持文字生成 3D(如 DreamFusion,Magic3D 和 ProlificDreamer)。而 One-2-3-45 既支持文字生成 3D 也支持图片生成 3D。下图展示了 One-2-3-45 与现有的主要图生 3D 的方法的对比。

可以看到一些基于 NeRF 优化的方法(如 RealFusion 和 3D Fuse)虽然从新视角合成的角度上得到了还不错的结果,但 NeRF 所输出的几何质量却不尽人意。类似地,Point-E 的原生输出是稀疏点云,在经过后处理重建后仍易存在部分区域破碎缺失的问题。而 One-2-3-45 通过预测 SDF 来提取网格,输出的几何质量要更具优势。

另外一个重要的点便是现有方法的输出没有完全遵循(adherence)输入图片的指示。比如对于第一列的背包,Zero123+SD 生成的背包只有一条背带;Shap-E 生成的背包没有背带。对于第二列的单只灭火器,Shap-E 和 Point-E 都预测了两个两个连体的灭火器。对于第四列的凳子,可以看到只有 One-2-3-45 和 3DFuse 保留了输入图片的椅腿结构。但需要注意的是,3DFuse 生成的所有 3D 内容在具体风格和细节上均与输入图片有较大出入。

此外,研究者还指出基于逐物体优化的方法通常会遇到 3D 一致性的挑战。他们生成的 3D 模型通常会出现多面现象(或者 Janus 问题)。比如在上图中,RealFusion 生成了一个双面背包。相比之下,One-2-3-45 生成结果的 3D 一致性要好很多。

研究者还提到了 OpenAI 的 Point-E 和 Shap-E 在训练时用到了数百万级别的内部 3D 数据。由于 3D 数据的稀缺性,这样的训练数据规模目前对于很多研究者 / 机构来说还是比较严苛的条件。

可以看到除了之前提过的问题外,现有的文生 3D 方法对输入文本的把握能力并不是很强。比如,对于输入文本 “一棵空心的大树”,“一只有绿腿的橙色凳子”,“一顶哈瓦那风格菠萝形状的帽子” 以及 “一只木头质地的蘑菇” 等,现有方法都无法生成精确对应的 3D 内容。相比之下,One-2-3-45 所采纳的在 2D 生成对应图片再提升到 3D 似乎是一条能够对输入文本有更加精确控制的路线。

结语

One-2-3-45 提出了 “2D 多视角预测 + 3D 可泛化重建” 这样一项新颖的 3D AI 生成玩法,并在许多方面都展示出了其优越性。虽然目前 One-2-3-45 的生成质量可能还比不上部分基于逐物体优化的文生 3D 模型,但这个新玩法的探索和提高空间可能是充满潜力的。

#DiffPack

蛋白质由氨基酸经脱水缩合反应形成,可折叠为复杂的 3D 空间结构,是生物体内执行各种功能(催化生物化学反应、传递信号)的主要分子,而其中蛋白质的侧链结构对其功能至关重要。侧链的化学性质和空间排列决定了蛋白质如何折叠,以及蛋白质如何与其他分子(包括其他蛋白质、DNA、RNA、小分子等)相互作用。这些相互作用可以是氢键、离子键、疏水相互作用和范德华力等。理解这些相互作用,可以帮助我们更好的寻找药物与受体的结合位点,设计催化效果更强的酶。因此,准确预测蛋白质的侧链构象对于理解蛋白质的功能和设计新的药物至关重要。

传统的蛋白质侧链构象预测算法(如 RosettaPacker)通常通过在能量函数定义的概率分布中采样得到蛋白质侧链构象,此类算法通常依赖于人为设计的能量函数,受限于能量函数设计的精准度。另一方面,尽管以 AlphaFold2 为首的一系列深度学习模型在蛋白质结构预测方面取得了比较大的突破,但其对侧链构象的预测通常依赖于端对端的学习,无法捕捉侧链构象的整体分布,因此准确度上受到了一定的限制。

近日,来自 Mila 的唐建团队提出了一种新的侧链构象预测方法 DiffPack。该方法使用扭转角空间中的自回归扩散模型,与目前已知的最优方法相比,在 CASP13 和 CASP14 上取得了大幅提升实现了超过 10% 的提升,且仅需要 1/60 的参数量。此外,作者进一步验证了 DiffPack 能够给有效改进 AlphaFold2 的侧链预测结果。

  • 论文链接:https://arxiv.org/abs/2306.01794
  • 代码链接:https://github.com/DeepGraphLearning/DiffPack

方法

过去的 AI 算法以端对端的方式从原子位置的均方根偏差 (RMSD)定义损失函数。尽管此类方法存在速度上的优势,但他们通常被端对端的建模方式所限制,无法捕捉蛋白质侧链构象的整体分布,倾向于生成侧链的 「平均构象」。DiffPack 基于扩散模型提出了一种新颖的侧链构象预测方法。通过对蛋白质侧链构象加入噪声并学习去噪过程,模型能够更准确地学习到蛋白质侧链构象的整体概率分布。

蛋白质侧链的构象通常较为复杂,如果直接使用空间坐标的扩散过程建模会引入过多的自由度从而增加问题的复杂性。同时由于蛋白质的侧链构象由至多四个扭转角(χ1, χ2, χ3, χ4)构成,研究人员选择将扩散过程定义在四个扭转角构成的扭转空间中,在前向扩散过程中引入非欧几里得噪声,同时通过针对蛋白质结构设计的图神经网络 GearNet 学习对四个扭转角的逆向去噪过程。

在实验中,研究人员发现对四个扭转角的联合加噪过程会会产生偏差累积效应,从而降低预测的准确度。研究人员由此进一步提出了一种新颖的自回归扩散模型,将四个扭转角的联合概率分布分解为一系列条件概率分布,在每一个概率分布中引入扩散模型。通过将扩散模型与自回归过程结合,DiffPack 能够以很小的模型规模实现高精度的侧链构象预测。

实验研究人员在包括天然主链结构和由 AlphaFold2 预测得到的非天然主链结构上进行了实验。DiffPack 在预测蛋白质侧链构象中超越了基于传统能量函数的方法和其他端对端的深度学习模型。表 1 总结了在 CASP13 中的实验结果,DiffPack 无论是在内部残基(82.7%)和表面残基(57.3%)上,都表现出了最高的角度精度。对于表面残基,其精度比之前的最先进模型 AttnPacker 提高了 20.4%。

同样,DiffPack 在 CASP14 数据集的表现也优于其他方法(表 2),尽管没有将损失函数直接定义在原子位置上,DiffPack 在内部残基原子位置的均方根偏差精度上依然相比于之前的 SOTA 提高了 23%。   由于 AlphaFold2 等计算结构生物学技术的发展,当前人们的关注重心逐渐转移到非天然主链结构的应用上。因此研究人员将 DiffPack 进一步应用到有 AlphaFold2 生成的非天然主链结构,表 3 给出了包括 AlphaFold2 自身的侧链预测算法在内的不同算法在非天然主链结构测试集上的定量结果。DiffPack 在大多数指标上实现了最先进的水平,这说明了 DiffPack 可以进一步优化 AlphaFold2 预测的潜力。

DiffPack 除了在对侧链构象的准确度上优于其他方法,其模型的总参数量要显著(3,043,363)少于此前的 SOTA 模型(208,098,163),这使得 DiffPack 成为预测侧链构象的更具计算可行性和可扩展性的解决方案。

总结

  • 研究人员基于扩散模型提出了一种新的针对蛋白质侧链构象的预测算法 DiffPack,DiffPack 将扭转空间中的扩散模型与自回归过程结合,能够更好地捕捉蛋白质侧链构象分布。
  • DiffPack 在天然主链结构与非天然主链结构的预测上都表现出了一定的优势,同时其模型规模要显著小于其他方法。

#JM3D~

本篇文章介绍 ACM MM 2023 论文​​Beyond First Impressions: Integrating Joint Multi-modal Cues for Comprehensive 3D Representation​​,3D和图文模态的碰撞,多视角多模态的统一表征。

  • 论文地址:https://arxiv.org/abs/2308.02982
  • 代码地址:https://github.com/Mr-Neko/JM3D

现有的3D领域受限于数据集的规模和数据标注模式,3D相关的预训练工作一直难有大的突破。之前的部分工作借助于大规模的图文数据及图文预训练模型,尝试将3D表征和图片、文本表征统一。然而这类方法存在两个最主要的缺陷:

  1. 之前的方法忽略了多角度图片带来的信息增益,同时文本构成简单单一,这使得3D模型的表征能力并没有充分的发挥出来
  2. 之前方法选择将3D表征分别独立与图片与文本表征对齐,简化了图片和文本特征的潜在对齐,导致了优化困难的问题

出于此,我们提出了JM3D(Joint Multimodal 3D),包括了SMO(Structured Multimodal Organizer)与JMA(Joint Multi-modal Alignment)分别解决对应的问题。JM3D在不引入额外结构和设计的情况下,适用于任何3D表征的backbone,并可有效提高任意backbone的表征效果。

 图1 JM3D的过程,红线表示独立对齐,绿线表示JMA修正过的对齐方式

图2 JM3D的整体框架,SMO构建多角度图片和层次化文本,JMA则完成联合模态的对比学习

方法

Framework

JM3D本质上是一种提升任意点云表征的预训练框架,由一对预训练过的图文大模型和一个任意的3D backbone组成。在训练过程中,框架分别提取对应模态的表征,并通过一个对比学习任务和一个聚类任务拉近三个模态表征之间的距离。

SMO(Structured Multimodal Organizer)

SMO是一种新的数据组织方式。我们分别为视觉和语言模态设计了不同的组织方式。对于视觉模态而言,我们为每个3D素材渲染了30个视角的图片,并设计了一种临近连续采样方式去采样不同视角的图片。这种方式保证所有图片的视角在一定范围内,因此视觉特征具有连续的特点。

JMA(Joint Multi-modal Alignment)本质上,表征学习的本质是希望获得相同实例对于不同模态的概率分布,也就是:

因此,在实验中,之前的方法会将3D表征分别与图片表征及文本表征独立做对比学习进行对齐。然而,视觉模态和语言模态应当存在一定的隐关系,这个隐关系是可以通过图文的表征获得的。因此,我们在JMA中对该公式重新进行了推导,获得了如下的形式: 

JMA通过这种形式,完成了联合模态的建模,从而提升了模型的效果。

实验

我们在3D分类、3D分割、3D召回等任务上进行了大量的实验,这些实验表明我们的方法可以有效提高各种backbone的表征效果。在ModelNet40和ScanObjectNN下的3D分类实验,更多的实验可以参照原文:

对于SMO和JMA的消融实验:SMO

JMA 

图片召回3D模型 

总结

我们提出了JM3D,这是一个全面的预训练框架,采用SMO和JMA,能够无缝地将语言、图像和点云特征整合到一个统一的语义空间中,而无需任何专门的设计。通过精心组织数据,SMO模块充分利用了每种模态的信息,而JMA模块则通过联合建模来优化模态对齐。消融研究验证了所提出的SMO和JMA的有效性。此外,JM3D在零样本3D分类和图像检索任务中表现出卓越的性能,创造了新的最先进水平,突显了其出色的跨模态能力。未来,我们将探索不同的数据和替代的联合建模方法,进一步拓展3D的统一表示学习。

#UniTR

UniTR是第一次针对3D感知的多模态Transformer Backbone,开创统一且一致的多模态3D编码与融合新方案 ,通向3D感知大模型的必由之路!UniTR:统一多模态Transformer Encoder!

针对3D感知的统一多模态transformer encoder

UniTR: A Unified and Efficient Multi-Modal Transformer for Bird's-Eye-View Representation

论文:https://arxiv.org/pdf/2308.07732.pdf

代码:https://github.com/Haiyang-W/UniTR

前置工作:高效的点云transformer encoder

DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets

论文:https://arxiv.org/abs/2301.06051

代码:https://github.com/Haiyang-W/DSVT

本文为大家分享一篇ICCV2023中稿论文UniTR: 用于BEV表征的统一高效多模态Transformer Backbone。UniTR是第一次针对3D感知的多模态Transformer Backbone,开创统一且一致的多模态3D编码与融合新方案,为3D感知大模型打下坚实基础,引领新的设计潮流。

问题背景

通用的3D特征表示

随着人工智能的发展,人们对感知周围物理环境的需求越来越大,例如自动驾驶、虚拟增强现实和机器人等,都需要对周围的3D环境有很好的建模感知才能进行之后的决策。另一方面随着NLP领域快速发展,大模型的兴起正在革新人工智能各个领域的科研范式。似乎当有一个比较好的框架后,大部分数据都是data centric的,足够多的数据就可以模型有很好的泛化能力.

那么在3D Vision 领域呢?受到自然语言大模型的启发,越来越多的领域开始设计自己的foundation model。特别是3D vision领域,人们迫切需要一种框架范式能建模所有的3D视觉数据。但这并不是一个简单的事情,对于一个智能体来说,首先其需要接收各种模态的3D数据,例如2D多视角图像以及3D雷达点云,然后建模处理这些异构的数据并执行各种不同的任务。这里问题可以拆解成如下两个子问题:

  • General Representation:如何处理不同传感器的异构感知数据并学到通用的特征表示。
  • Unified Modeling: 基于得到的通用表示,如何统一各种任务框架。

本文侧重解决目前最关键的unified encoder这一步,这也是3D感知大模型的瓶颈所在,只有得到general representation才能进行接下来的unified modeling。

前人方法与问题

3D感知数据主要侧重多视角图像和雷达点云,这两种数据分布非常不一样,前者是2D Dense的图像,后者是3D稀疏的点云分布,用一种通用的框架处理挑战较大。之前的工作都是分别用各自领域的Encoder串行处理各自的模态,最后再用一个复杂耗时的后处理融合步骤得到通用的特征表示。这种方式大大拖慢的运行速度并且没有解决一个模型处理多种模态的需求。一种Unified Multi-Modal Encoder也可以对齐不同模态的信息,迫使网络学习到更本质的场景理解表示。

本文贡献

  • 提出了一种用于各自模态内特征学习的Transformer Block,可以参数共享的并行处理不同模态的感知数据。
  • 为了高效融合来自不同传感器的异构数据,我们设计了一个强大的跨模态Transformer Block,通过考虑2D透视和3D几何结构关系,实现了不同模态的高效融合。
  • 借助以上设计,我们第一次针对3D感知提出真正意义上的统一多模态Transformer Backbone,用于处理各种模态数据。
  • UniTR在nuScenes多种3D感知任务的测试中取得了最好的性能,包括3D Object Detection(+1.1)和BEV Map Segmentation(+12.0),并且具有更低的延迟。

我们希望UniTR的出色性能和新颖结构可以作为一个强大且简单的baseline,促进3D Foundation Model和通用框架的发展。

预备知识:DSVT

3D感知主要关注多视角图像和激光雷达这两种模态数据,前者被广泛研究,2D image的技术可以被直接应用过来,但后者由于稀疏的数据特性,难以利用之前成熟的视觉技术。Transformer天然适合处理稀疏变长数据,并且适合针对不同模态灵活设计结构,但把Transformer用来处理大规模点云数据并不是一个简单的事情。我们首先回顾一下DSVT, CVPR2023的关于Efficient Point Cloud Transformer的工作。UniTR是在DSVT的基础上搭建的。

Dynamic Sparse Voxel Transformer (DSVT) 是一种用于从点云进行室外三维感知的window-based Transformer Backbone。为了以完全并行的方式高效处理稀疏数据,他们将标准window attention重新定义为在一系列window-bounded和size-equivalent 的local set内进行并行计算的自注意力策略。为了允许跨子集的交互,DSVT设计了一种旋转的子集划分策略,该策略在连续的注意力层之间交替使用两种切分配置,实现了不同set的体素在不同层之间交互。

通过这种方式,原始的sparse window attention将近似地重构为多个set attention,这些注意力计算可以在同一batch内并行处理。值得注意的是,DSVT 中使用的集合划分配置是通用的,可以灵活地适应不同的数据结构和模态。

UniTR的流程图

本节将描述我们的统一架构,用于处理各种不同的传感器模态(多视角摄像头和激光雷达)和任务(检测和分割)。上图展示了这一架构。在给定不同的传感器输入后,模型首先使用特定于模态的Tokenizer将不同模态输入转换成相应的Token Embeddings。然后,采用与模态无关的Transformer backbone来并行的执行单模态和跨模态表示学习,以用于各种下游三维感知任务。

单模态表示学习模块

在自动驾驶场景中感知三维场景需要可靠的多模态表示,例如多视角图像和稀疏点云。由于它们的不同表示方式,先前的方法通常通过单独的编码器对每种模态的特征进行编码,这些编码器一般按顺序处理,降低了推理速度,限制了它们在现实世界中的应用。为了解决这些问题,我们提出了使用统一架构并行处理每个传感器的模态内特征,其参数对所有模态共享。

  • Tokenization

给定Images和Point Clouds后,每个模态对应的轻量的tokenizer会将输入的原始数据转换成对应的token embedding。这里对于image采用的是常用的image patch tokenizer,对于point clouds采用的是Dynamic Voxel Feature Encoding。

  • 与模态有关的Set Attention

为了高效并行的学习各自模态内部的特征学习,我们在得到image和point clouds的tokens之后,

值得注意的是上述模块所有模态对应的计算参数都是共享的,并行的模态特征学习也比之前传统的串行方式快将近两倍,大大提升了推理速度。

多模态表示学习模块

为了有效地整合自动驾驶场景中来自多个传感器的视角不一致的信息,现有的方法通常涉及为每个传感器设计单独的encoder,并通过复杂的后处理方法融合信息,大大拖慢了运行的速率并且用多个分支,增加了训练难度。为了允许在encoder 前传过程中有效的跨模态交互并充分利用2D-3D互补的信息,我们设计了两种模态无关Transformer block。这两种block分别用于在2D image和3D Lidar space中不同模态的信息交互,并随着网络加深交替配置自动融合多模态数据。

  • 图像透视空间

为了利用语义丰富的2D图像邻接关系,我们首先利用相机的内外参,将所有点云token投影到图像平面,并将它们放置在相应的2D位置如下:

这一步采用一种与模态无关的切分方式,根据在image space中的位置将多种模态的tokens分组到相同的2D local set中,然后这些混合模态的子集将由若干DSVT block进行跨模态交互。

  • 三维几何空间

为了在三维空间中统一多模态输入,需要一个高效且稳健的视图投影,来将图像patch唯一地映射到3D space中。然而,由于与每个图像像素相关的深度具有不确定性,从2D到3D的变换是一个病态问题。尽管之前的可学习深度估计器可以预测出具有可接受精度的深度图像,但它们需要额外的计算密集型预测模块,并且通用性能较差。为了克服这些限制,受到MVP[2]的启发,我们提出了一种非可学习且可预先计算的方法,用于将图像patch高效地转换到3D space以用来后续的3D切分  

首先,我们在3D space 采样生成一些伪点, 然后将所有虚拟伪点投影到2D image space生成它们相应的虚拟图像坐标。得到这些虚拟图像点后,我们可以从每个图像patch的最近图像虚拟邻居中检索深度估计,

考虑2D和3D的跨模态的Transformer Block被实验验证是有效的,能很好地利用语义丰富的2D邻接关系和几何意义丰富的3D邻接关系。另外,因为cross-modal和single-modal的transformer block都是以DSVT为基础,所以两者可以无损的结合在一起组成真正意义上的多模态3D网络。

实验结果

我们在室外多模态标准数据集NuScenes进行了一系列实验来验证模型的性能如下:

由图中所示,我们的模型在NuScenes上多个3D感知任务都表现很好,远超之前最好的方法。更多实验结果和分析请参考原文。

总结

在本论文中,我们第一次针对3D感知提出了一个统一的多模态Transformer backbone,用单一模型和共享参数处理不同模态的数据。通过专门设计的用于模态内和模态间的表示学习Transformer block,我们的方法在标准的nuScenes数据集上取得了多种3D感知任务的SOTA性能,获得了显著的提升。相信UniTR可以为促进更高效和通用的三维感知大模型的发展提供坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值