前言

这篇文章的标题比较有意思,用谐音梗的方式起了个标题Zero-123。Zero指Zero-Shot,这个词出现很早,是还在小模型时代,模型训练比较依赖数据集的质量/数量。通常需要大量的数据去喂模型,让它在不同场景有泛化性。与此相关的是One-Shot,是指只需要一张图就可以完成模型的训练,Zero-Shot就是类似人脑一样,一张图都不用就知道这个任务怎么做。Zero-Shot在各种任务都是有出现的,目的都是为了降低模型对数据的依赖,从而使得任何个人开发者可以对模型训练或直接使用模型,而得到比较好的效果。

那这里Zero-123的123就是对应One image to 3D object,也即不用任何训练的情况下,就可以把一张图转成3D。

思路介绍

第一章主要是说说本方法的设计思路,以及以前方法的一些痛点。

首先作者解释了自己模型逻辑上的合理性:给你一张手机正面照,你脑海里能立刻“补全”背面——知道大概有个苹果 logo,边缘是圆弧。人类之所以能脑补,无非是一辈子看了太多东西,攒下无数先验。Zero-1-to-3 想做的,就是给模型也攒一份这样的“人生经验”。

现有方法缺点:

  • 传统 3D 重建:像温室里的花朵,离了 CAD 模型或类别先验就蔫了。
  • 最近的热门 open-world 方案:虽然号称“开放世界”,但还得靠 CO3D 这类带相机参数的 3D 数据,规模跟互联网级图文对比起来,只能算小水洼。

作者的想法:

既然 Stable Diffusion 在 50 亿图文对上训练的很好了,对任意物体都能生成的比较好。但是对于视角控制,并不是很精确。如果基于Stable Diffusion强大的生成能力之上,给予它视角控制的能力,那不就能用这个模型生成数据去指导2D迁移至3D的训练了吗?

这样一来,模型就能:零样本泛化到从未见过的物体(包括印象派油画)。顺带把 3D 几何也蒸馏出来,实现“单图→3D”。所以整个文章的思路还是很直观,很好理解的。

在这里插入图片描述

相关工作

3D生成模型

2D的图像生成模型已经非常成熟了,然而将它们扩展到3D领域需要大量带标注的数据。所以最近(当时是23年)方法依赖训练好的大规模2D扩散模型转换成3D数据,这个过程不依赖任何3D标注数据,比较常见的是由NeRF衍生出来的一系列方法,比如DreamFusion,Instant-NGP等。作者说自己的模型有着类似的流水线,2D模型学会视角合成,然后再把合成结果用于重建,比以往的工作而言,他们利用了一组特殊合成数据集让模型学会了视角控制,并且zero-shot泛化做得很好。但作者的意思是:不错,但顺序反了,你们是先 3D 再渲染,我偏要先渲染再 3D,省得每换一只猫就重训一次 NeRF。

单视图 3D 重建

这个问题是最难解决的,就拿人脑来说,人类都很难通过观察一张图就能想象出这个物体完整的样子(而且人还有两个眼睛,是双目视觉)。目前(当时是23年)有三种主流的方向:

  • 基元派(Mesh/Voxel/Point Cloud 全家桶)
    • 用 3D 数据集学一个全局先验,再靠图像编码器对齐。
    • 缺点:数据集一换就翻车,姿势估计歪一点就全崩。
  • 局部特征派(pixelNeRF、IBRNet 等)
    • 直接拿局部图像特征“涂”成 3D,泛化好一点,但视野窄。
  • 最近的新星
    • MCC:用 RGB-D 视频暴力训练,效果确实猛,但离不开深度图。

总结来说要么缺数据、要么缺泛化、要么缺细节。直接利用 Stable Diffusion 的 50 亿张图的先验知识,再教它“转头”——数据、泛化、细节一次性搞定。

方法

文章说的很啰嗦,我直接总结一下,只干三件事:

  1. 让模型学会“给定原图 + 相机转多少的参数 → 画出新图”;
  2. 用这把“转头”能力去蒸馏 3D;
  3. 说明训练/推理时的小技巧,保证既快又不崩。

作者选用Stable Diffusion的模型作为基础模型,是认为该模型有很强的Zero-Shot的能力(训练它用了大量的数据,所以基本囊括了所有的概念)那么这个时候就可以通过对同一物体控制其生成的视角,生成不同视角下同一物体的图像。然后那这些图片去训练模型,听着很熟悉是吗?这就是DreamFusion在做的事情。但是作者也说了这个方法有个比较大的问题,即由文字控制的生成结果,会带有一些偏见(这主要是由数据集带来的)比如你输入正放家具,A模型喜欢生成正放微微右斜的家具,B模型喜欢生成正方微微俯斜的家具。

Bias.png

其次,大规模生成模型的结果,没有对应视角的标签,这两个问题极大地阻碍了从大规模扩散模型中提取3D知识的能力。

控制相机视角

假设大diffusion模型已经在海量数据集中学习到了足够的先验,那么当人赋予模型一种学习、控制视图视角的机制时,模型的视图合成能力就会被解锁。因此给定一个成对的图像数据集(原始图像,对应视角的图像,视角标签)表示为 ( x , x ( R , T ) , R , T ) (x, x_{(R,T)},R,T) (x,x(R,T),R,T)。其中 R , T R, T R,T是所需视点的相对相机旋转和平移参数,这一对图像和标签喂给SD模型进行微调,对模型微调之后让模型学习对相机参数的控制而不破坏其他表示。具体流程如下:

  1. 把原图先塞进 CLIP,拿 768 维语义向量;
  2. 把相机相对位姿压成embedding;
  3. 把这两个向量拼在一起喂给U-Net,让它在扩散去噪时"知道该往哪个角度画"。

优化函数为:
min ⁡ θ E z ∼ , ε ( x ) , t , ϵ ∼ N ( 0 , 1 ) ∥ ϵ − ϵ θ ( z t , t , c ( x , R , T ) ) ∥ 2 2 \min_{\theta} \mathbb{E}_{z\sim,\varepsilon{(x)},t,\epsilon\sim\mathcal{N}(0,1)} \Vert \epsilon-\epsilon_\theta(z_t,t,c(x,R,T)) \Vert_2^2 θminEz,ε(x),t,ϵN(0,1)ϵϵθ(zt,t,c(x,R,T))22
公式看着复杂,其实还是很常见的。编码器 ϵ \epsilon ϵ、去噪器UNet θ \theta θ和解码器 D D D,其中 c ( x , R , T ) c(x,R,T) c(x,R,T)是输入视图和相对摄像机外延的embedding。

当整个训练完成后,我们的得到的Stable Diffusion就会有相机视角的精确控制能力。论文给出了一个公式:
x ^ R , T = f ( x , R , T ) \hat{x}R,T = f(x, R, T) x^R,T=f(x,R,T)
给定一个RGB图像 x x x R , T R, T R,T是所需视点的相对相机旋转和平移参数,我们将 x ^ R , T \hat{x}R,T x^R,T定义为合成图像。也就是说 f f f是训练好的Stable Diffusion模型。

整个过程流程和下图一致:

F3.png

带视角条件的扩散模型

从单幅图像进行三维重建既需要低级感知(深度、阴影、纹理等),也需要高级理解(类型、功能、结构等)。作者为了链接底层感知和高级理解,采用了一种混合调节的机制:CLIP embedding,与 ( R , T ) (R,T) (R,T)相连接,压成772维度,也即上面公式提及到的 c ( x , R , T ) c(x,R,T) c(x,R,T)。送进UNet训练(又说了一遍,其实和上面的流程是一样的)。训练时随机把条件“全丢”掉 10%(引用的文章中这么建议的),——让条件信号更强势,画面更稳。

3D重建

到这里就没什么好说的了,主要文章也没写太多细节。作者说自己利用了开源框架SJC来优化出三维表示。一个月左右后的作品里出现了效果较好的基于此工作的三维表示,那篇是One-2-3-45: Any Single Image to 3D Mesh in 45 Seconds without Per-Shape Optimization[http://arxiv.org/abs/2306.16928],这篇的工作主要就是视角合成了。正好下一篇要阅读这个文章了。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐