Stable-diffusion

Stable Diffusion

Stable Diffusion was made possible thanks to a collaboration with Stability AI and Runway and builds upon our previous work:

High-Resolution Image Synthesis with Latent Diffusion Models
Robin Rombach*, Andreas Blattmann*, Dominik LorenzPatrick EsserBjörn Ommer
CVPR ’22 Oral | GitHub | arXiv | Project page

参考: https://zhuanlan.zhihu.com/p/573984443

参考: https://zhuanlan.zhihu.com/p/599160988

扩散模型汇总 :https://github.com/heejkoo/Awesome-Diffusion-Models

DDPM 模型在生成图像质量上效果已经非常好,但它也有个缺点, 那就是xt 的尺寸是和图片一致的,xt的元素和图片的像素是一一对应的, 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸是 3×H×W ,如果想生成一张高尺寸的图像, Xt的张量大小是非常大的,这就需要极大的显卡(硬件)资源,包括计算资源和显存资源。 同样的,它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展。

1. 潜在扩散模型(Latent diffusion model,LDM)

2021年德国慕尼黑路德维希-马克西米利安大学计算机视觉和学习研究小组(原海德堡大学计算机视觉小组), 简称 CompVis 小组,发布了论文 High-Resolution Image Synthesis with Latent Diffusion Models,针对这个问题做了一些改进, 主要的改进点有:

  • 引入一个自编码器,先对原始对象进行压缩编码,编码后的向量再应用到扩散模型。
  • 通过在 UNET 中加入 Attention 机制,处理条件变量 y。

潜在空间

针对 DDPM 消耗资源的问题,解决方法也简单。 引入一个自编码器,比如上一章介绍的变分编码器(VAE),先对原始图像进行压缩编码,得到图像的低维表示 z0 ,然后 x0 作为 DDPM 的输入,执行 DDPM 的算法过程,DDPM 生成的结果再经过解码器还原成图像。 由于 z0 是压缩过的,其尺寸远远小于原始的图像,这样就能极大的减少 DDPM 资源的消耗。 压缩后 z0 所在的数据空间称为潜在空间(latent space), z0 可以称为潜在数据

这个自编码器(VAE)可以是提前预训练好的模型,在训练扩散模型时,自编码器的参数是冻住的, 如 图 7.1.2 所示

  • 通过使用预训练的编码器 E,我们可以将全尺寸图像编码为低维潜在空间数据(压缩数据)。
  • 通过使用预训练的解码器 D,我们可以将潜在空间数据解码回图像。

这样在 DDPM 外层增加一个 VAE 后,DDPM 的扩散过程和降噪过程都是在潜空间(Latent Space)进行, 潜空间的尺寸远远小于像素空间,极大了降低了硬件资源的需求,同时也能加速整个过程。

正向扩散过程→给潜在数据增加噪声,逆向扩散过程→从潜在数据中消除噪声。 整个 DDPM 的过程都是在潜在空间执行的, 所以这个算法被称为潜在扩散模型(Latent diffusion model,LDM)。增加一个自编码器并没有改变 DDPM 的算法过程,所以并不需要对 DDPM 算法代码做任何改动。

条件处理

在 DDPM 的过程中,可以增加额外的指导信息,使其生成我们的想要的图像, 比如文本生成图像、图像生成图像等等。

关于注意力机制的实现细节,可以直接参考论文代码, LDM模型论文的代码和预训练的模型已经在 Github 开源,地址为: https://github.com/CompVis/latent-diffusion 。

训练过程

相比于 DDPM ,条件化的 LDM 目标函数稍微变化了一点,具体变化内容可以参考:

生成(采样)过程:

图 7.1.6 是 LDM 采样过程的图形化表示, 过程并不复杂,经过 DDPM 采样生成的 Z0 需要用解码器 D 还原成图像。

 2、稳定扩散模型(Stable diffusion,SD)

LDM 本身是由 CompVis 提出并联合 Runway ML进行开发实现,后来 Stability AI 也参与进来并提供了一些资源, 联合搞了一个预训练的 LDM 模型,称为 Stable diffusion。 所以,Stable diffusion 是 LDM 的一个开源预训练模型,由于它的开源迅速火爆起来。 目前 Stable diffusion 已经占据了图像生成开源领域的主导地位。

由于 Stable diffusion 只是LDM的一个开源预训练模型,没有额外的复杂数学公式需要讨论, 这里我们就直接上代码吧。 我们不用 Stable diffusion 的官方代码库 stablediffusion ,而是 huggingface 开源库 diffusers 中的实现, 它的易读性更好一些。

diffusers 把模型的核心逻辑都封装在各种 DiffusionPipeline 中, StableDiffusionPipeline 核心代码在 diffusers.StableDiffusionPipeline 先看初始化代码,可明显看到整个 StableDiffusionPipeline 包含几个关键组件:vae,text_encoder/tokenizer,unet,scheduler。 这几个组件和 LDM 中是对应的。

  • vae: VAE 自编码器,负责前后的编解码(压缩、解压缩)工作。
  • text_encoder/tokenizer: 文本编码器,负责对文本Prompt进行编码处理。
  • unet: 噪声预测模型,也是DDPM的核心。
  • scheduler: 负责降噪过程(逆过程)的计算,也就是实现 xt−>xt−1 ,对应着 DDPM、DDIM、ODE等不同的降采样实现。
  • safety_checker: 做生成图像安全性检查的,可选,暂时可以不关注它。
  • feature_extractor: 如果输入条件中存在 img,也就是以图生图(img2img),可以用它对条件图片进行特征抽取,也就是图像编码器(img encoder),可选。

stable diffusion:潜在扩散模型

参考:

1、https://zhuanlan.zhihu.com/p/573984443

2、https://zhangzhenhu.github.io/blog/aigc

3、 https://zhuanlan.zhihu.com/p/599160988

扩散概率模型(diffusion probabilistic models)

1、 扩散概率模型(diffusion probabilistic model)

2、降噪扩散概率模型(Denoising diffusion probabilistic model,DDPM)

3、基于分数的解释(Score-based DDPM)

4、扩散模型的三种等价表示

5、改进降噪扩散概率模型(Improved Denoising Diffusion Probabilistic Models,IDDPM)

6. 参考文献

Jascha Sohl-Dickstein, Eric A. Weiss, Niru Maheswaranathan, and Surya Ganguli. Deep unsupervised learning using nonequilibrium thermodynamics. 2015. arXiv:1503.03585.2(1,2,3,4,5,6,7)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.3(1,2,3,4)

Jonathan Ho, Ajay Jain, and Pieter Abbeel. Denoising diffusion probabilistic models. 2020. arXiv:2006.11239.4

Diederik P. Kingma, Tim Salimans, Ben Poole, and Jonathan Ho. Variational diffusion models. 2022. arXiv:2107.00630.5

Yang Song and Stefano Ermon. Generative modeling by estimating gradients of the data distribution. 2019. arXiv:1907.05600.

去噪扩散隐式模型(Denoising Diffusion Implicit Models,DDIM)

Jiaming Song, Chenlin Meng, and Stefano Ermon. Denoising diffusion implicit models. 2022. arXiv:2010.02502.

基于分数的生成模型

Yang Song and Stefano Ermon. Generative modeling by estimating gradients of the data distribution. 2019. arXiv:1907.05600.

Yang Song, Jascha Sohl-Dickstein, Diederik P. Kingma, Abhishek Kumar, Stefano Ermon, and Ben Poole. Score-based generative modeling through stochastic differential equations. 2021. arXiv:2011.13456.

Aapo Hyvärinen and Peter Dayan. Estimation of non-normalized statistical models by score matching. Journal of Machine Learning Research, 2005.

Yang Song and Stefano Ermon. Improved techniques for training score-based generative models. 2020. arXiv:2006.09011.

条件控制扩散模型

Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. arXiv:2105.05233.2(1,2)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.3

Jonathan Ho and Tim Salimans. Classifier-free diffusion guidance. 2022. arXiv:2207.12598.4

Alex Nichol, Prafulla Dhariwal, Aditya Ramesh, Pranav Shyam, Pamela Mishkin, Bob McGrew, Ilya Sutskever, and Mark Chen. Glide: towards photorealistic image generation and editing with text-guided diffusion models. 2022. arXiv:2112.10741.5

Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen. Hierarchical text-conditional image generation with clip latents. 2022. arXiv:2204.06125.6

Chitwan Saharia, William Chan, Saurabh Saxena, Lala Li, Jay Whang, Emily Denton, Seyed Kamyar Seyed Ghasemipour, Burcu Karagol Ayan, S. Sara Mahdavi, Rapha Gontijo Lopes, Tim Salimans, Jonathan Ho, David J Fleet, and Mohammad Norouzi. Photorealistic text-to-image diffusion models with deep language understanding. 2022. arXiv:2205.11487.

 稳定扩散模型(Stable diffusion model)


Robin Rombach, Andreas Blattmann, Dominik Lorenz, Patrick Esser, and Björn Ommer. High-resolution image synthesis with latent diffusion models. 2021. arXiv:2112.10752.

DDPM 模型在生成图像质量上效果已经非常好,但它也有个缺点, 那就是 尺寸是和图片一致的,元素和图片的像素是一一对应的, 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸,如果想生成一张高尺寸的图像, 张量大小是非常大的,这就需要极大的显卡(硬件)资源,包括计算资源和显存资源。 同样的,它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展

潜在扩散模型

2021年德国慕尼黑路德维希-马克西米利安大学计算机视觉和学习研究小组(原海德堡大学计算机视觉小组), 简称 CompVis 小组,发布了论文 High-Resolution Image Synthesis with Latent Diffusion Models 1,针对这个问题做了一些改进, 主要的改进点有:

  • 引入一个自编码器,先对原始对象进行压缩编码,编码后的向量再应用到扩散模型。
  • 通过在 UNET 中加入 Attention 机制,处理条件变量 

清华&MSRA |使用2D扩散模型生成3D新视点图像

本文提出使用2D扩散模型生成3D感知图像的新模型。文章首次在大规模数据集ImageNet上训练该模型,能产生高质量的图像。

3D-aware Image Generation using 2D Diffusion Models

Jianfeng Xiang, Jiaolong Yang, Binbin Huang, Xin Tong

[Tsinghua University & Microsoft Research Asia & ShanghaiTech University]

【论文链接】https://arxiv.org/pdf/2303.17905.pdf

【项目链接】https://jeffreyxiang.github.io/ivid/

【摘要】本文介绍了一种新颖的3D感知图像生成方法,利用了2D扩散模型。作者将3D感知图像生成任务形式化为多视角2D图像集生成,并进一步发展为序列无条件-有条件多视角图像生成过程。这使得能够利用2D扩散模型提高方法的生成建模能力。此外,文章结合来自单目深度估计器的深度信息,使用仅静态图像构建有条件扩散模型的训练数据。作者在大规模数据集ImageNet上训练我们的方法,这是以前的方法没有涉及的。它产生高质量的图像,明显优于以前的方法。此外,该方法展示了其能力,即使训练图像来自“野外”真实环境中不同的未对准的图像,也能生成具有大视角的实例。

AI生成3D模型:DreamFusion、Point-E、Magic3D

1、DreamFusion(谷歌)

项目主页:https://dreamfusion3d.github.io/

paper: https://arxiv.org/abs/2209.14988

code: https://github.com/ashawkey/stable-dreamfusion

该文章解决的是3D重建领域的少视角重建(Sparse-view Reconstruction)问题,结合了扩散模型和NeRF。

摘要

最近扩散模型在上亿级别的文本-图像对数据上训练在文本图像生成上取得巨大的进展,将这种方法应用于3D合成,需要大规模的有标签的3D数据集和高效的架构来去噪3D数据,而这两者目前都不存在。在这项工作中,通过使用预先训练好的二维的文本到图像的扩散模型来绕开这些限制进行文本到3D的合成。本文引入一种基于概率密度蒸馏的损失函数,可以使用2D的扩散模型作为先验用于优化参数化图像生成器。使用这个损失函数就像一个DeepDream-like的过程,(这里的DeepDream是谷歌提出,使用梯度上升的方法可视化网络每一层的特征,即用一张噪声图像输入网络,反向更新的时候不更新网络权重,而是更新初始图像的像素值,以这种训练图像的方式可视化网络)。本文梯度下降优化一个随机初始化的3D模型使得任意随机视角随机渲染的图像都达到较低的损失。生成的模型可以任意修改,不需要三维数据,也不需要修改扩散模型。

本文的方法和DreamFields的方法类似,但是用一个2D扩散模型蒸馏推导而来的损失函数取代CLIP。这个损失函数是通过概率密度蒸馏而来的,就是用KL- divergence最小化前向过程和反向的概率密度,这里的反向过程是是与训练好的2D扩散模型,因为反向过程也是一个估计score的过程,所以我理解这就是他叫 score distillation sampling的原因吧。

该工作基于的3D表示方法也是NeRF中的一种。事实上,基于NeRF的重建方法通常需要针对特定场景的大量的视图,并且对于训练集中出现频率较少的视角,其关于该视角的重建结果也会很差。而对于少视角3D重建,虽然最近已经有很多工作结合了深度网络和渲染公式来完成这样的任务,但是它们要么缺乏3D一致性,要么感知质量比较差。

在3D生成领域,DreamFusion使用文本扩散模型优化3D表示,并且取得了非常好的效果。

如上图,这是DreamFusion的架构图,右边一部分就是Diffusion Model,这里用的是一个预训练的模型,左边一部分就是NeRF,是一个目标场景的3D表示,虽然画的花里胡哨的,但是其实思路非常直白简单:训练的时候锁住Diffusion的梯度,增加视角guidance,用生成结果来优化和训练NeRF;泛化阶段只需要使用优化后的NeRF就可以了。在这里,Diffsuion的作用是根据文本生成相应视角和内容的图片,NeRF的作用是约束3D一致性。

2、Magic3D(NVIDIA)

高分辨率文本到3D内容创建:

项目主页:https://deepimagination.cc/Magic3D/

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

人们只需要输入一段文字比如「一只坐在睡莲上的蓝色箭毒蛙」,AI 就能给你生成个纹理造型俱全的 3D 模型出来。Magic3D 还可以执行基于提示的 3D 网格编辑:给定低分辨率 3D 模型和基本提示,可以更改文本从而修改生成的模型内容。此外,作者还展示了保持画风,以及将 2D 图像样式应用于 3D 模型的能力。

类似于 DreamFusion 用文本生成 2D 图像,再将其优化为体积 NeRF(神经辐射场)数据的流程,Magic3D 使用两阶段生成法,用低分辨率生成的粗略模型再优化到更高的分辨率。

英伟达的方法首先使用低分辨率扩散先验获得粗糙模型,并使用稀疏 3D 哈希网格结构进行加速。用粗略表示作为初始,再进一步优化了带纹理的 3D 网格模型,该模型具有与高分辨率潜在扩散模型交互的高效可微分渲染器。

Magic3D 可以在 40 分钟内创建高质量的 3D 网格模型,比 DreamFusion 快 2 倍(后者平均需要 1.5 小时),同时还实现了更高的分辨率。

Magic3D 可以在较短的计算时间内根据文本 prompt 合成高度详细的 3D 模型。Magic3D 通过改进 DreamFusion 中的几个主要设计选择来使用文本 prompt 合成高质量的 3D 内容。

具体来说,Magic3D 是一种从粗到精的优化方法,其中使用不同分辨率下的多个扩散先验来优化 3D 表征,从而生成视图一致的几何形状以及高分辨率细节。Magic3D 使用监督方法合成 8 倍高分辨率的 3D 内容,速度也比 DreamFusion 快 2 倍。

Magic3D 的整个工作流程分为两个阶段:

  • 在第一阶段,该研究优化了类似于 DreamFusion 的粗略神经场表征,以实现具有基于哈希网格(hash grid)的内存和计算的高效场景表征。
  • 在第二阶段该方法切换到优化网格表征。这个步骤很关键,它允许该方法在高达 512 × 512 的分辨率下利用扩散先验。由于 3D 网格适用于快速图形渲染,可以实时渲染高分辨率图像,因此该研究利用基于光栅化的高效微分渲染器和相机特写来恢复几何纹理中的高频细节。

3、Point-E(OpenAI)

Point·E,可以依据文本提示直接生成 3D 点云:

项目主页:https://openai.com/research/point-e

Github: https://github.com/openai/point-e

通常意义上,文本到 3D 合成的方法分为两类:

方法 1:直接在成对的 (text, 3D) 数据或无标签的 3D 数据上训练生成模型。

此类方法虽然可以利用现有的生成模型方法,有效地生成样本,但由于缺乏大规模 3D 数据集,因此很难扩展到复杂的文本提示。

方法 2:利用预先训练好的 text-to-image 模型,优化可区分的 3D 表征。

此类方法通常能够处理复杂多样的文本提示,但每个样本的优化过程都代价高昂。此外,由于缺乏强大的 3D prior,此类方法可能会陷入 local minima(无法与有意义或连贯的 3D 目标一一对应)。

Point·E 结合了 text-to-image 模型以及 image-to-3D 模型,综合以上两种方法的优势,进一步提升了 3D 建模的效率,只需要一个 GPU、一两分钟即可完成文本到 3D 点云的转换。

Point·E 中,text-to-image 模型利用了大型语料库 (text, image pair),使其对复杂的文本提示也能处理得当;image-to-3D 模型则是在一个较小的数据集 (image, 3D pair) 上训练的。

用 Point·E 依据文本提示生成 3D 点云的过程分为三个步骤:

1、依据文本提示,生成一个合成视图 (synthetic view)

GLIDE – 基于扩散模型的文本图像生成大模型

2、依据合成视图,生成 coarse point cloud (1024 point)

3、基于低分辨率点云和合成视图,生成 fine point cloud (4096 Point)

由于数据格式和数据质量对训练结果影响巨大,Point·E 借助 Blender,将所有训练数据都转换为了通用格式。

Blender 支持多种 3D 格式,并配有优化的渲染 engine。Blender 脚本将模型统一为一个 bounding cube,配置一个标准的 lighting 设置,最后使用 Blender 内置的实时渲染 engine 导出 RGBAD 图像。

4、Zero-1-to-3: Zero-shot One Image to 3D Object

项目链接:

https://zero123.cs.columbia.edu/

源码:

https://github.com/cvlab-columb

Method

We learn a view-conditioned diffusion model that can subsequently control the viewpoint of an image containing a novel object (left). Such diffusion model can also be used to train a NeRF for 3D reconstruction (right). Please refer to our paper for more details or checkout our code for implementation.

Text to Image to Novel Views

Here are results of applying Zero-1-to-3 to images generated by Dall-E-2.

5、SceneDreamer:从2D图像中学习生成无限3D场景

来自南洋理工大学 S-Lab 的研究者提出了一个新的框架 SceneDreamer,专注于从海量无标注自然图片中学习无界三维场景的生成模型。

  • 项目主页:https://scene-dreamer.github.io/
  • 代码:https://github.com/FrozenBurning/SceneDreamer
  • 论文:https://arxiv.org/abs/2302.01330
  • 在线 Demo:https://huggingface.co/spaces/FrozenBurning/SceneDreamer

为满足元宇宙中对 3D 创意工具不断增长的需求,三维场景生成最近受到了相当多的关注。3D 内容创作的核心是逆向图形学,旨在从 2D 观测中恢复 3D 表征。考虑到创建 3D 资产所需的成本和劳动力,3D 内容创作的最终目标将是从海量的互联网二维图像中学习三维生成模型。最近关于三维感知生成模型的工作在一定程度上解决了这个问题,多数工作利用 2D 图像数据生成以物体为中心的内容(例如人脸、人体或物体)。然而,这类生成任务的观测空间处于有限域中,生成的目标占据了三维空间的有限区域。这就产生了一个问题,我们是否能从海量互联网 2D 图像中学习到无界场景的 3D 生成模型?比如能够覆盖任意大区域,且无限拓展的生动自然景观

想要达成这样的目标,我们面临着如下三个挑战:

1)无界场景缺乏高效三维表征:无边界场景常常占据了一个任意大的欧氏空间,这凸显了高效且具备表现力的底层三维表征的重要性。

2)缺乏内容对齐:已有三维生成工作使用具备对齐性质的数据集(如人脸、人体、常用物体等),这些有界场景中的目标物体通常具备类似的语义、相近的尺度位置和方向。然而,在海量的无标注二维图像中,不同物体或场景常常具备迥异的语义,且拥有多变的尺度、位置和方向。这样缺乏对齐的性质会带来生成模型训练的不稳定性。

3)缺乏相机位姿先验:三维生成模型依赖于准确相机位姿或相机位姿分布的先验来实现图像到三维表征的逆向渲染过程。但互联网自然图像来源于不同的场景和像源,让我们无法获取其相机位姿准确信息或先验。

为此我们提出了一个原则性的对抗学习框架 SceneDreamer,从海量的无标注自然图像中学习生成无界三维场景。该框架包含三个主要模块:1)高效且高表现力的鸟瞰(BEV)三维场景表征;2)学习场景通用表征的生成式神经哈希网格;3)由风格驱动的体积渲染器,并经过对抗学习的方式直接从二维图像中进行训练。

6、 Shap・E,合成 3D 条件生成式模型

我们先来看一下生成效果。与根据文字生成图像类似,Shap・E 生成的 3D 物体模型主打一个「天马行空」。

本文提出的 Shap・E 是一种在 3D 隐式函数空间上的潜扩散模型,可以渲染成 NeRF 和纹理网格。在给定相同的数据集、模型架构和训练计算的情况下,Shap・E 更优于同类显式生成模型。研究者发现纯文本条件模型可以生成多样化、有趣的物体,更彰显了生成隐式表征的潜力。

不同于 3D 生成模型上产生单一输出表示的工作,Shap-E 能够直接生成隐式函数的参数。训练 Shap-E 分为两个阶段:首先训练编码器,该编码器将 3D 资产确定性地映射到隐式函数的参数中;其次在编码器的输出上训练条件扩散模型。当在配对 3D 和文本数据的大型数据集上进行训练时, 该模型能够在几秒钟内生成复杂而多样的 3D 资产。与点云显式生成模型 Point・E 相比,Shap-E 建模了高维、多表示的输出空间,收敛更快,并且达到了相当或更好的样本质量

研究者首先训练编码器产生隐式表示,然后在编码器产生的潜在表示上训练扩散模型,主要分为以下两步完成:
1. 训练一个编码器,在给定已知 3D 资产的密集显式表示的情况下,产生隐式函数的参数。编码器产生 3D 资产的潜在表示后线性投影,以获得多层感知器(MLP)的权重;

2. 将编码器应用于数据集,然后在潜在数据集上训练扩散先验。该模型以图像或文本描述为条件。
研究者在一个大型的 3D 资产数据集上使用相应的渲染、点云和文本标题训练所有模型。

3D 编码器:

潜在扩散
生成模型采用基于 transformer 的 Point・E 扩散架构,但是使用潜在向量序列取代点云。潜在函数形状序列为 1024×1024,并作为 1024 个 token 序列输入 transformer,其中每个 token 对应于 MLP 权重矩阵的不同行。因此,该模型在计算上大致相当于基础 Point・E 模型(即具有相同的上下文长度和宽度)。在此基础上增加了输入和输出通道,能在更高维度的空间中生成样本。

7、Make-it-3D:diffusion+NeRF从单张图像生成高保真的三维物体

Title: Make-It-3D: High-Fidelity 3D Creation from A Single Image with Diffusion Prior
Paper: https://arxiv.org/pdf/2303.14184.pdf
Code: https://make-it-3d.github.io/

人类具有一种与生俱来的能力,可以轻松地想象3D几何和虚构出从不同角度看物体的外观,这基于他们对世界的先验知识

在本文中,研究者的目标是实现类似的目标:从一个真实或人工生成的单张图像中创建高保真度的3D内容。这将为艺术表达和创意开辟新的途径,例如为像Stable Diffusion这样的前沿2D生成模型创建的幻想图像带来3D效果。通过提供一种更易于访问和自动化的创建视觉上惊人的3D内容的方法,研究者希望吸引更广泛的受众加入到轻松的3D建模世界中来。

本文探讨了仅使用单张图像创建高保真度3D内容的问题。这本质上是一项具有挑战性的任务,需要估计潜在的3D几何结构,并同时产生未见过的纹理。为了解决这个问题,论文利用训练好的2D扩散模型的先验知识作为3D生成的监督。论文的方法名为:Make-It-3D,采用两阶段优化pipeline:第一阶段通过在前景视图中结合参考图像的约束和新视图中的扩散先验来优化神经辐射场;第二阶段将粗略模型转化为纹理点云,并利用参考图像的高质量纹理,结合扩散先验进一步提高逼真度。大量实验证明,论文的方法在结果上显著优于先前的方法,实现了预期的重建效果和令人印象深刻的视觉质量。论文的方法是第一个尝试从单张图像为一般对象创建高质量3D内容的方法,可用于text-to-3D的创建和纹理编辑等各种应用。

论文的主要贡献总结如下:

  1. 论文提出了Make-It-3D框架,使用2D扩散模型作为3D-aware先验,从单个图像中创建高保真度的3D物体。该框架不需要多视图图像进行训练,并可应用于任何输入图像,无论是真实的还是生成的。
  2. 通过两个阶段的创建方案,Make-It-3D是首个实现普适对象高保真3D创建的工作。生成的3D模型展现出精细的几何结构和逼真的纹理,与参考图像相符。
  3. 除了图像到3D创建之外,论文的方法还能实现高质量text-to-3D创建和纹理编辑等多种应用。

论文利用了文本-图像生成模型和文本-图像对比模型的先验知识,通过两阶段(Coarse Stage和Refine Stage)的学习来还原高保真度的纹理和几何信息,所提出的两阶段三维学习框架如图2所示。

8、ProlificDreamer:直接文本生成高质量3D内容

论文:《ProlificDreamer: High-Fidelity and Diverse Text-to-3D Generation with Variational Score Distillation》

清华大学 TSAIL 团队最新提出的文生 3D 新算法 ProlificDreamer,在无需任何 3D 数据的前提下能够生成超高质量的 3D 内容。ProlificDreamer 算法为文生 3D 领域带来重大进展。利用 ProlificDreamer,输入文本 “一个菠萝”,就能生成非常逼真且高清的 3D 菠萝:

将 Imagen 生成的照片(下图静态图)和 ProlificDreamer(基于 Stable-Diffusion)生成的 3D(下图动态图)进行对比。有网友感慨:短短一年时间,高质量的生成已经能够从 2D 图像领域扩展到 3D 领域了

在数字创作和虚拟现实等领域,从文本到三维模型(Text-to-3D)的技术具有重要的价值和广泛的应用潜力。这种技术可以从简单的文本描述中生成具体的 3D 模型,为设计师、游戏开发者和数字艺术家提供强大的工具。然而,为了根据文本生成准确的 3D 模型,传统方法需要大量的标记 3D 模型数据集。这些数据集需要包含多种不同类型和风格的 3D 模型,并且每个模型都需要与相应的文本描述相关联。创建这样的数据集需要大量的时间和人力资源,目前还没有现成的大规模数据集可供使用。由谷歌提出的 DreamFusion [1] 利用预训练的 2D 文本到图像扩散模型,首次在无需 3D 数据的情况下完成开放域的文本到 3D 的合成。但是 DreamFusion 提出的 Score Distillation Sampling (SDS) [1] 算法生成结果面临严重的过饱和、过平滑、缺少细节等问题。高质量 3D 内容生成目前仍然是非常困难的前沿问题之一。ProlificDreamer 论文提出了 Variational Score Distillation(VSD)算法,从贝叶斯建模和变分推断(variational inference)的角度重新形式化了 text-to-3D 问题。具体而言,VSD 把 3D 参数建模为一个概率分布,并优化其渲染的二维图片的分布和预训练 2D 扩散模型的分布间的距离。可以证明,VSD 算法中的 3D 参数近似了从 3D 分布中采样的过程,解决了 DreamFusion 所提 SDS 算法的过饱和、过平滑、缺少多样性等问题。此外,SDS 往往需要很大的监督权重(CFG=100),而 VSD 是首个可以用正常 CFG(=7.5)的算法。

与以往方法不同,ProlificDreamer 并不单纯优化单个 3D 物体,而是优化 3D 物体对应的概率分布。通常而言,给定一个有效的文本输入,存在一个概率分布包含了该文本描述下所有可能的 3D 物体。基于该 3D 概率分布,我们可以进一步诱导出一个 2D 概率分布。具体而言,只需要对每一个 3D 物体经过相机渲染到 2D,即可得到一个 2D 图像的概率分布。因此,优化 3D 分布可以被等效地转换为优化 2D 渲染图片的概率分布与 2D 扩散模型定义的概率分布之间的距离(由 KL 散度定义)。这是一个经典的变分推断(variational inference)任务,因此 ProlificDreamer 文中将该任务及对应的算法称为变分得分蒸馏(Variational Score Distillation,VSD)。具体而言,VSD 的算法流程图如下所示。其中,3D 物体的迭代更新需要使用两个模型:一个是预训练的 2D 扩散模型(例如 Stable-Diffusion),另一个是基于该预训练模型的 LoRA(low-rank adaptation)。该 LoRA 估计了当前 3D 物体诱导的 2D 图片分布的得分函数(score function),并进一步用于更新 3D 物体。该算法实际上在模拟 Wasserstein 梯度流,并可以保证收敛得到的分布满足与预训练的 2D 扩散模型的 KL 散度最小。

3D表示+2D Diffusion做3D任务的四个流派:

  1. 用Diffusion优化3D隐式场(其中Diffusion是预训练的),特别是NeRF相关工作,例如DreamFusion和SparseFusion;
  2. 使用3D Unet定制3D Diffusion,特别是point cloud相关工作;
  3. 把3D表示拆解并且重新拼接,变成超多通道2D图像,直接复用2D Diffusion,特别是Triplane相关工作,例如3D Neural Field Generation using Triplane Diffusion;
  4. 把2D Diffusion的Unet()换成一个renderer+encoder的结构,即间接引入3D约束,例如RenderDiffusion;
  5. 将3D约束编码成条件,用来约束2D Diffusion,例如DiffPose;

9: GET3D 英伟达:噪声—->3D物体

A Generative Model of High Quality 3D Textured Shapes Learned from Images (NeurIPS 2022 )

代码:https://github.com/nv-tlabs/GET3D

GET3D 包括两个分支:

1.几何分支:可微的输出任意拓扑的表面mesh

2.纹理分支:根据查询的表面点来产生 texture field,还可以扩展到表面的其他属性,比如材质

训练过程中,一个有效的可微栅格器将生成的带纹理 3D 模型投影到 2D 的高分辨率图片。整个过程都是可微分的,使得整个对抗训练可以从 discriminator 传递到两个分支。


10. DragGAN meets GET3D for interactive mesh generation and editing.

https://github.com/ashawkey/Drag3D

https://github.com/XingangPan/DragGAN

Diffusion Models从入门到放弃:必读的10篇经典论文

前言:diffusion models是现在人工智能领域最火的方向之一,并引爆了AIGC领域,一大批创业公司随之诞生。笔者2021年6月开始研究diffusion,见证了扩散模型从无人问津到炙手可热的过程,这些篇经典论文专栏里都详细介绍过原理、复现过代码。这篇博客以时间发展顺序,串讲一下从入门到精(放)通(弃)的10篇必读的经典论文。

摘自:https://zhuanlan.zhihu.com/p/595866176

1、DDPM奠基之作:《Denoising Diffusion Probabilistic Models》

推荐理由:本文是DDPM的奠基之作,是本领域最经典的论文之一。其实扩散模型并不是一个新的概念,这篇论文第一个给出了严谨的数学推导,可以复现的代码,完善了整个推理过程。后面diffusion models相关的论文基本都继承了前向加噪-反向降噪-训练这样的体系。所以强烈推荐初学者精读这篇论文!

博客地址Diffusion Models扩散模型与深度学习(数学原理和代码解读)

代码地址GitHub – lucidrains/denoising-diffusion-pytorch: Implementation of Denoising Diffusion Probabilistic Model in Pytorch

2、从DDPM到DDIM:《Denoising Diffusion Implicit Models》

推荐理由:作者使用简单的重参数化和混合学习目标来学习反向过程方差,该目标将VLB与DDPM的简化目标相结合。在混合目标下,所提出模型获得的对数似然比通过直接优化对数似然获得的对数似然更好,并发现后一个目标在训练期间具有更多的梯度噪声。最关键的是,原先的DDPM需要长达1000steps的推理步骤,而DDIM改善了反向扩散过程中的噪声水平,改变了xt递推公式,在更少的推理步骤(如100步)上取得了更好的结果。这项成果堪称革命性的,后面的大部分diffusion models论文(特别是运算量高的)都采用这一改进技术。

博客地址深入解读:从DDIM到Improved Denoising Diffusion Probabilistic Models

代码地址GitHub – ermongroup/ddim: Denoising Diffusion Implicit Models

3、第一波高潮!首次击败GANs:《Diffusion Models Beat GANs on Image Synthesis》

推荐理由:其实前面diffusion models也只是在生成领域小火了一把,并没有引起太多人的关注。主要原因有两点:一是扩散模型并没有太多数学理论上的创新;二是在生成指标上不如GANs。而这篇论文的出现把diffusion models的推向了第一波高潮!这篇论文有三个需要重点学习的地方:

一是在Unet基础上有了很多改进的小trick(不亏是OpenAI的作品),改进之后的Unet更能适配噪声,因此指标上也进步了很多:

如果看完这部分不妨反问自己这几个问题:模型结构是如何共享信息参数的?self-attention的作用是什么?预测噪声数据和预测真实数据有没有本质区别?为什么要分层设计?为什么一定要使用Unet结构?如果不清楚,欢迎看看我之前的博客:《为什么Diffusion Models钟爱U-net结构?》

二是classifier-guidance的引入,这段推导用了二阶泰勒展开,非常精彩!之后的很多论文将类别引导扩展到一般的条件引导上,包括后来大火的GLIDE。这在latent diffusion models没出来之前,是一项非常成功、被广泛使用的条件引导技术!

三是规范化的代码guided-diffusion。OpenAI的工匠精神,这份代码打磨得非常好,堪称工业级!后面很多顶会论文都是在这份代码的基础上改进的。如果想要学习diffusion models的代码,推荐以这份代码为基础。

博客地址击败GANs的新生成式模型:score-based model(diffusion model)原理、网络结构、应用、代码、实验、展望

代码地址GitHub – openai/guided-diffusion

4、条件分类器技术进一步发展:《Classifier-Free Diffusion Guidance》

推荐理由:我推荐的其他论文基本上都发表机器学习/计算机视觉顶会,而这篇文章虽然只发表于cvpr workshop,但是作者提出了一个新的分数估计函数:有条件分数函数和无条件分数函数的线性组合,平衡了有条件的分数函数和无条件分数函数。当然在论文中作者先论述了《Diffusion Models Beat GANs on Image Synthesis》中提出的分类器技术的问题:额外训练一个分类器,并且往往会造成多样性下降的特点。当然这个问题也是必然出现的,因为分类器就是在生成质量和生成多样性中间做平衡。之所以推荐这篇论文,因为这项技术被后来的论文广泛应用,简单有用,值得学习!

博客地址无分类器指导的Classifier-free Diffusion Models技术

代码地址https://github.com/lucidrains/classifier-free-guidance-pytorch

5、Image-to-Image经典之作《Palette: Image-to-Image Diffusion Models》

推荐理由:我不确定Palette是不是第一个实现diffusion models 图像翻译工作的,但是一定是第一个火起来让很多圈内人关注的!Palette从pix2pix GANs中获取灵感,能够实现图像着色、图像修复、图像剪裁恢复、图像解压缩(超分)等等任务,最大的意义在于让更多人看到了diffusion models在图像翻译领域的潜力。从cvpr 2021开始,海量的相关论文被发表。

博客地址用Diffusion Models实现image-to-image转换

代码地址https://github.com/Janspiry/Palette-Image-to-Image-Diffusion-Models

6、畅游多模态领域:GLIDE

推荐理由:经典的三篇text-to-image的论文:DALLE 2、Imagen、GLIDE。在上半年各领风骚,让text-to-image方向成为diffusion中最受关注的领域。这三篇论文最先推荐的GLIDE的原因是它最先放出完成代码和预训练模型。预训练模型很重要!因为text-to-image领域都是大模型,不放出模型的话,我们这些非大组(指能分到40块显卡以上的)研究者根本无法在这基础上自己做迁移学习。GLIDE的核心跨模态引导公式来自《Diffusion Models Beat GANs on Image Synthesis》中的分类器引导,不同的是,这篇文章并没有给出严谨的证明过程。但是实验结果表明确实取得了很好的效果,后面的研究者从中获得启示,把其他的多模态信息按照这种方法注入,也取得了非常惊艳的结果。

博客地址2021年度最火Diffusion Models:用于图像编辑和text引导图像生成的GLIDE

代码地址https://github.com/openai/glide-text2im/tree/main/glide_text2im

7、stable diffusion的原型:《High-Resolution Image Synthesis with Latent Diffusion Models》

推荐理由:全体起立!终于讲到stable diffusion models了!这篇论文发表在cvpr 2022上,当时就受到了很多研究者们的关注,但是谁也没想到,一年后以latent diffusion models会孵化出stable diffusion这样彻底火出圈的作品。这篇论文有两个关键点值得关注:一是用encoder-decoder放缩到latent域上操作,又回到了生成领域最经典的结构,在latent域(即z)上操作,这种方法在vae上也算常用。二是cross-attention的结构,这种方法早在2020年的论文handwriting diffusion上就用过,但是当时并没有引起广泛的注意。在这之后cross-attention成为多模态的一种常用方法,成为新的常用条件扩散模型。

博客地址详细解读Latent Diffusion Models:原理和代码

代码地址https://github.com/CompVis/latent-diffusion

8、高调进军视频领域:《Video Diffusion Models》

推荐理由:有位“诗人”曾经说过:站在风口上X都能飞。这篇论文出现的时候,diffusion models已经在图像、多模态、3D等领域大杀四方了。video生成很显然是下一个风口,这时候谷歌研究院的作品video diffusion models横空出世。这篇论文需要注意两个点:一是怎样引入时序信息的方法,很值得借鉴。二是梯度引导法是首次被提出,当时我写的博客中说如果好用肯定会很快流行。事实证明,谷歌出品必属精品,果然流行的一番!

Video Diffusion Models:基于扩散模型的视频生成_沉迷单车的追风少年的博客-CSDN博客

博客地址Video Diffusion Models:基于扩散模型的视频生成

代码地址https://github.com/lucidrains/video-diffusion-pytorch

9、了不起的attention:《Prompt-to-Prompt Image Editing with Cross Attention Control》

推荐理由:在今年的ICLR中,diffusion models超过图神经网络,成为投稿最多的主题。这几千篇投稿中,这篇论文取得了审稿人的一致accept好评。这篇文章沿用了latent diffusion models提出了cross-attention的结构,但是做了不少改进,特别需要注意的是可解释性问题,作者将QKV可视化,替换attention map达到控制的目的。这种控制技术相比于LDM更细腻,更有说服力。

博客地址【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt

代码地址https://github.com/bloc97/CrossAttentionControl

10、Unet已死,transformer当立!《Scalable Diffusion Models with Transformers》

推荐理由:Unet本来是发源于医疗图像分割的backbone,后来pix2pix GANs开始引入到生成领域,diffusion models的研究者们一直想替换掉这个backbone,用更原生的方法。在语音领域、时间序列领域,早在2020年就有论文引入transformer作为backbone。不过笔者尝试将其引入到二维图像生成上,并没有取得好的效果。最近的一项研究成果成功用改进版本的transformer替换掉Unet,并取得了更好的效果。笔者最近复现了代码,大为震撼!我觉得这项研究生过会很快流行,强烈推荐!

博客地址:尚未写完,敬请期待哈哈

代码地址https://github.com/facebookrese

Learning Stereo from Single Images

论文:https://github.com/nianticlabs/stereo-from-mono/

[ECCV 2020] Learning stereo from single images

导读:在进行立体匹配的过程中成对且带标签的训练数据是很难去获取的,对此现有的很多方法都是在虚拟的合成数据(如SceneFlow、FlayingThings3D等数据集)上训练完成的,自然其在实际多样化的场景中泛化迁移能力是很弱的。对此文章通过使用MiDas对任意的输入图像进行深度估计,并将深度图转换到视差图,之后按照视差图对源图像进行变换得到另外一个视图,其中会对生成的另外一个视图进行修复和补偿优化从而构建一个双目立体图像对。自此,双目立体图像对构造完成,接下来便是使用一个双目立体匹配网络在这些数据上进行训练。正是由于训练数据的多样化文章提出的算法相比合成数据上训练得到的匹配网络更加鲁棒。

文章的算法在做立体匹配的时候并没有采用合成数据,而是在多样化真实数据基础上通过策略得到合成的图像对,从而极大增加了网络的泛化能力,下面图中展示的就是两种训练策略的对比:

文章中使用到的风格多样化数据集称之为MfS(Mono for Stereo’ dataset),其中包含的数据集有:COCO 2017 ,Mapillary Vistas,ADE20K ,Depth in the Wild,DIODE 。经过整理之后其中包含的数据总量为:597727。

方法设计

文章算法的整体pipeline见下图所示:

数据生成优化策略

depth sharpening:文章使用的是一个单目深度估计网络进行深度预标注,自然其中的几何约束性比较弱,因而按照深度估计结果对原图向进行warp之后存在一些孤立的像素点(flying points),也就是下图中中间部分的效果:

对此,文章为了解决该问题首先通过Sobel梯度算子去检测那些梯度响应大于3的区域(也就是文章说的flying points),之后将这些点的深度之设置为最近非flying points区域的值。从而实现depth sharpening,在图3中也比较了有无该策略对于做后效果的影响。这部分实现的代码可以参考:

datasets/warp_dataset.py#L112

if not self.disable_sharpening:
# now find disparity gradients and set to nearest – stop flying pixels
edges = sobel(disparity) > 3 # 选择梯度大的区域,大概率为flying points
disparity[edges] = 0 # 将其设置为0
mask = disparity > 0 # 取出需要插值的位置

try:  # 对视差图不为0的区域进行插值,重点关注的就是flying points
    disparity = griddata(np.stack([self.ys[mask].ravel(), self.xs[mask].ravel()], 1),
                         disparity[mask].ravel(), np.stack([self.ys.ravel(),
                                                            self.xs.ravel()], 1),
                         method='nearest').reshape(self.feed_height, self.process_width)
except (ValueError, IndexError) as e:
    pass  # just return disparity

occlusion和collision区域处理:

对于这一部分的代码可以参考下面的实现过程:

# datasets/warp_dataset.py#L227
def project_image(self, image, disp_map, background_image):

    image = np.array(image)
    background_image = np.array(background_image)

    # set up for projection
    warped_image = np.zeros_like(image).astype(float)
    warped_image = np.stack([warped_image] * 2, 0)
    pix_locations = self.xs - disp_map  # 根据视差计算新的坐标

    # find where occlusions are, and remove from disparity map
    mask = self.get_occlusion_mask(pix_locations)  # 根据可见性准则获取occlusion mask(对应部分为0)
    masked_pix_locations = pix_locations * mask - self.process_width * (1 - mask)

    # do projection - linear interpolate up to 1 pixel away
    weights = np.ones((2, self.feed_height, self.process_width)) * 10000

    for col in range(self.process_width - 1, -1, -1):  # 按照有效像素进行插值得到右视图
        loc = masked_pix_locations[:, col]
        loc_up = np.ceil(loc).astype(int)
        loc_down = np.floor(loc).astype(int)
        weight_up = loc_up - loc
        weight_down = 1 - weight_up

        mask = loc_up >= 0
        mask[mask] = \
            weights[0, np.arange(self.feed_height)[mask], loc_up[mask]] > weight_up[mask]
        weights[0, np.arange(self.feed_height)[mask], loc_up[mask]] = \
            weight_up[mask]
        warped_image[0, np.arange(self.feed_height)[mask], loc_up[mask]] = \
            image[:, col][mask] / 255.

        mask = loc_down >= 0
        mask[mask] = \
            weights[1, np.arange(self.feed_height)[mask], loc_down[mask]] > weight_down[mask]
        weights[1, np.arange(self.feed_height)[mask], loc_down[mask]] = weight_down[mask]
        warped_image[1, np.arange(self.feed_height)[mask], loc_down[mask]] = \
            image[:, col][mask] / 255.

    weights /= weights.sum(0, keepdims=True) + 1e-7  # normalise
    weights = np.expand_dims(weights, -1)
    warped_image = warped_image[0] * weights[1] + warped_image[1] * weights[0]  # 按照插值权重进行融合
    warped_image *= 255.

    # now fill occluded regions with random background
    if not self.disable_background:  # occlusion部分补充
        warped_image[warped_image.max(-1) == 0] = background_image[warped_image.max(-1) == 0]

    warped_image = warped_image.astype(np.uint8)

    return warped_image

实验结果

文章提出的两种数据优化策略,其有效性对比见下表所示:

立体匹配数据生成方法在最后性能上的比较:

文章的方法与基准的对比: