最近image-to-3D方面的工作不少,李飞飞 (Fei-Fei Li) 创立的公司World Labs发布了一项单图生成交互3D场景的成果:Generating Worlds。同期,智源(BAAI)也发表了一篇image-to-3D的成果:See3D。下面就来详细解读这篇paper
1. 3D生成现状
目前的3D生成方法主要有两类:naive 3D generation(直接生成3D asset)和2D diffusion lifting(利用二维扩散模型先生成多视角图像,再lift到三维)。目前的3D生成效果还是不够理想,最主要限制来自于数据量。目前主流3D数据集的数据量级都小于百万级(<1M),对比训练二维扩散模型的亿级数据量,显然是太少了。为了借助diffusion priors获得更高生成质量,目前2D diffusion lifting这一方法比较常见。然而2D diffusion是在二维图像上训练的,模型里是缺少3D priors的,不能保证对多个视角的生成内容完全一致。
See3D就对以上两个问题:数据量小、多视角不一致进行优化。
2. See3D方法详解
2.1)针对数据量小的问题:Video Data Curation
人类对所处的三维空间的感知是通过对物体的多角度观察而形成的,而互联网海量视频数据其实可以提供类似的知识。所以一个自然的思路就是获取互联网上对同一个观察对象的多角度拍摄视频,那么这类视频的每一帧都可以作为同一对象的多视图图像。那么接下来要做的就是从互联网海量视频中筛选出符合要求的数据,我们的要求可以具体列为以下几点:
-
1. 是对同一个物体的观察。
-
2. 多视图之间保持一致性。那么观察对象必须做刚性运动(保持形状不变)
-
3. 观察视角尽量多。变化角度小的视频只能提供少量视角的图像,对模型训练意义不大
作者设计了一个自动化的pipeline来筛选数据,核心步骤有四步:
-
a) Temporal-Spatial Downsampling. 这一步主要是为了提高pipeline效率,将空间分辨率下采样到480p,时间下采样率设置为2。
-
b) Semantic-Based Dynamic Recognition.这一步主要是为了筛选出static scenes,保证是对同一对象拍摄的视频。采用Mask R-CNN生成潜在对象的masks,滤除包含潜在对象的视频帧百分比低于阈值的。
-
c) Non-rigid Dynamic Filtering. 这一步主要是为了保持多视角一致性。See3D的目的是生成静态的3D asset,如果观察对象在相机移动的过程中姿态发生了变化,比如人在挥手,那么根据多视角图像生成3D asset的时候就无法决定手到底在什么位置了,这种就是非刚性运动类的视频,需要删除。
-
d) Tracking-Based Small Viewpoint Filtering. 根据前三个步骤可以筛选出观察同一个对象的静态场景的多视角视频,但是还无法保证有足够多的观察视角,这就是这一步的目的。通过光流法计算关键点的运动轨迹,计算运动轨迹对应的最小外切圆半径,半径小的表示视角变化不大,需要滤除。
经过上面四步就能自动筛选出满足我们要求的视频。通过这个pipeline,最终筛选出了15.99M大小的数据集,总时长约四年半。相比之前的数据集规模(<1M),这个数据集大了两个数量级,这对训练出具有强3D生成能力的扩散模型是非常重要的。
左图:data filtering pipeline,右上:互联网视频数据集来源以及最终数据集规模,右下:(a)为被滤除的视频示例,(b)为留下的视频示例
2.2)针对2D diffusion缺少3D priors的问题:Visual-conditional multi-view diffusion
注意一个问题,在上一节获取的互联网视频数据和以往的3D数据不同之处在于,它是不提供相机内外参信息的。也就是说接下来训练diffusion的时候,无法像以前的一些方法一样直接把相机视角作为条件输入diffusion里,在这里只能通过2D-inductive visual hints来隐式地引导视角控制。
模型的整体流程如下图,这里的diffusion模型是一个video diffusion模型,不同的是这里删除了时间上的控制。因为模型不被希望也不需要通过时间上的连贯性来预测新视角图像,而是应该通过visual condition来预测。
See3D主要可以分为三部分,(a)最左侧为数据集构建以及模型训练集与预测目标设置;(b)构建visual condition;(c)multi-view diffusion model
See3D主要可以分为三部分:
(a)最左侧为数据集构建以及模型训练集与预测目标设置:当前视频共N帧,先对视频帧做shuffle打乱顺序,避免模型根据视频帧的时间连续性预测新视角,随后选择shuffle后的前S张作为reference views,后L张作为target views。
(b)构建visual condition:先随机mask掉target views(这一步应该是为了模拟推理时的warped image)再在其上加噪形成corrupted images,corrupted images再和加噪后的输入混合作为visual condition。
首先这里为什么要对masked 后的target views加噪:避免target views的信息泄露。混合后作为visual condition也是一样的目的。
对masked images加噪和对输入加噪不同,这里加噪的程度弱于对 xti 的加噪。首先设置一个单调递增函数 t′=f(t) ,随后对masked images的加噪为:
.
对比对 的加噪:
.
可以发现 t′<t⇒αt′>αt⇒ Ct 的噪声 <Xt 的噪声。这样可以保证避免在时间步较大的时候出现的信息泄露的同时不会损失visual hints的引导性。这一步在论文里叫做Time-dependent Noise。
在时间步较小的时候同样需要避免信息泄露问题,而时间步较小的时候输入 xti 已经有比较清晰的信息了,所以直接用输入与 Ct 的混合:
Wt∈[0,1] 单调递减, 为mask,保留前S张frame作为reference,随机mask后L张frame作为target views。这一步在论文中叫做Time-dependent Mixture。
(c)multi-view diffusion生成多视角图像:模型整体是一个video diffusion但是去掉了时间上的限制,因为模型希望完全通过visual condition来隐式控制camera movement,而不是通过temporal cues。另外,损失函数只在target views上计算。
2.3)Image-to-3D推理过程
上面两步都是训练过程,推理的时候和训练大体一致但是稍有不同。训练的时候有target views(也就是groundtruth)的信息但是推理的时候没有,相应的替换是warped images。warped images的意思是由原视角下的图像经过变换得到的新视角图像,放两张图理解一下:
warped image示例
因为是直接从原视角图像得到的,而原视角下不可避免地会有一些没有拍摄到的新视角下需要的信息,所以不可避免地会出现空白区域(也就是没有信息的地方),这也是为什么在训练的时候要对target views加mask,我个人理解是为了模拟推理时的这一情况。那么接下来要做的事情就是得到warped images,思路是通过预定义的camera poses和estimated global depth迭代地生成warped images,核心步骤有三步:
生成warped images
(a) pixel-wise depth scale alignment. 稀疏点深度图修正
因为要通过深度图引导生成warped images,所以深度图要尽量准确。而通过单图预测depth一般是通过学习模型,难免有误差。这里先修正稀疏点处的深度,提取稀疏点的步骤大致为:
提取稀疏点步骤
通过最小化匹配点之间的重投影误差获取缩放参数和平移参数,K、T分别表示相机内外参
然后修正每个稀疏点的深度
(b) global metric depth recovery 全局深度图修正
上一步只修正了稀疏点的深度,这一步要把深度修真拓展到全图,这是一个回归问题Locally Weighted Linear Regression (LWLR):
迭代计算每个待估计位置,最后获得全局深度图缩放矩阵 和平移矩阵 ,完成全局修正:
(c) novel view generation 基于修正后的全局深度图生成新视角的warped images
对于新视角j,直接利用视角n与视角j之间的几何关系和修正后的视角n下的深度图,即可获得j的图像:
这里第一个公式后面的In是我自己加的,我理解的是应该不能直接从深度图就能生成新视角图像 ,还需要加入原始图像的信息,这里K、T还是相机内外参。
后续就直接把warped images代替masked images输入模型完成新视角生成,生成足够多的新视角后用Gaussian Splatting生成3D asset。
3. See3D的效果
1)Single view to 3D
这里*表示作者复现的效果
2)Sparse view to 3D