ProlificDreamer
ProlificDreamer
今天我要分享的这篇论文是结合NeRF神经辐射场和生成模型Diffusion的一个3d生成的工作,叫做ProlificDreamer,使用作者提出的VSD的方法实现文本到3d内容的高保真和多样性的生成,这个可以称为里程碑之作,一作是清华大学的两个博士生,虽然代码没有开源但是github上只有一个readme文件,但已经有1.1k个star了。
从2020年DDPM论文真正让diffusion模型火起来到现在,diffusion模型在2d的文字到图像的生成上已经达到了非常好的效果,可以实现很高的分辨率和图像精度,比如imagen和stable diffusion这些工作。然而在3d方面的相关工作却发展缓慢,去年提出的相关工作有dreamfusion,nvidia提出的magic3d,latent-nerf这些,但是他们的效果都不是特别的好,而这篇论文实现的效果是非常的惊人的,下面是一个生成的内容,描述的是一个蓝色的什么鸟站在一大篮子的彩虹马卡龙上,可以看到它的纹理细节是非常丰富的,prolificdreamer不仅可以生成一个物体,他还能生成一整个的场景,包括前景后景深度这些。下面这些是论文中贴出的效果,可以得到非常逼真的纹理mesh网格,很高的一个分辨率和高保真的结构和复杂的一些光影烟雾这些。同时,在同一个prompt的输入下,也可以生成多样的效果。
论文首先介绍了它的三个前期工作,第一个就是最开始的Diffusion model,主要就是一个前向加噪,然后用网络预测噪声进行去噪的过程。然后是将diffusion与nerf相结合用做3d生成的工作,首先对于一个3d的场景,采样nerf中的经典方法,选取一个相机的视角,渲染出一张2d的图片,然后将这个渲染的图像和一个文本prompt送到这个text to image的diffusion里去,然后让模型去模拟预测一个噪声,通过这个噪声由计算损失函数,然后再梯度回传到nerf这边,去优化3d的场景,来让nerf这边生成渲染的图片和Diffusion当中给定text prompt生成的图片的分布近似。具体的以dreamfusion来举例,就是左边是一个神经辐射场,dreamfusion里用的就是mipnerf360,也是比较新的一个工作。然后右边是用的imagen,具体的论文我还没有看,但它里面也是用unet实现的,然后再dreamfusion里,在计算优化3d场景用的损失函数时,它用的SDS,分数蒸馏采样。首先这里nerf的模型的参数时θ,然后SDS的优化目标就是,优化nerf的模型参数θ,然后让nerf渲染图像的扩散加噪过程的边缘分布靠向预训练的text-image的边缘分布,公式中也是让它们的KL散度尽可能的小。
而这篇工作他就发现基于SDS的工作效果都不是特别的好,而SDS就是其中最重要的限制它们的一个因素,会导致生成内容过度的光滑,饱和度太高,颜色非常显然,并且生成的内容没有很好的多样性,于是,作者提出的这个工作主要就是将这里的这个换成了VSD。 导致SDS效果不好的原因主要是SDS它倾向在不断优化中生成最可能的case,导致diffusion原有的多样性消失。比如输入的文本是山,而最有可能出现的是左上角的这种。因为以前仅仅建模一个nerf场,而如果我们可以同时建模四个nerf场,左边是四个nerf场,渲染出四种不同风格的图片。目的就是让3d渲染图片分布和diffusion的图片分布相同,但是直接计算p0的分布过于困难,于是作者就提出了迭代式的优化过程。作者这里不是使用神经网络模型来建模μ,而是一种基于粒子的方法来建模分布,用n个参数,每个参数被称为一个粒子,然后迭代优化μ的粒子,知道收敛。也就是说选用了n个参数来表示μ的分布,每个参数就表达了nerf场的参数,各不相同的参数就可以表达μ的大致的估计