Latent Diffusion Models(LDM) / Stable Diffusion,Diffusion如何根据条件生成图像(文生图)?

本文探讨了基于LatentDiffusionModels(LDM)的高分辨率图像合成技术,特别关注其与DDPM的区别,强调了使用AutoEncoder进行感知压缩以降低计算复杂度,并介绍了cross-attention在多模态任务中的应用,如文本生成图像。LDM在无条件和条件图像生成任务上表现出色,尤其在处理高分辨率和复杂场景时性能显著。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

High-Resolution Image Synthesis with Latent Diffusion Models(CVPR 2022)
https://arxiv.org/abs/2112.10752
latent-diffusion
stable-diffusion

cross-attention(用于多模态任务)

Cross-attention vs Self-attention:Cross-attention的输入来自不同的序列,Self-attention的输入来自同序列,也就是所谓的输入不同,但是除此之外,基本一致。

假设有文本数据和图像数据:

1.文本通过一个Transformer编码器处理,输出作为查询q向量。

2.图像通过CNN处理,输出经过线性变换生成键k和值v向量。

3.计算文本查询向量q与图像键向量k的点积,得到注意力分数。

4.使用这些分数对图像的值向量v进行加权,生成最终输出。


DDPM和LDM的区别和共同点

 

LDM基本思路:【论文将这个方法称之为感知压缩(Perceptual Compression)】:在AutoEncoder的编码器 E 对图片进行压缩 ==> 然后在潜在表示空间上做diffusion操作 ==> 最后再用解码器 D 恢复到原始像素空间

回顾DDPM:Diffusion Model(DDPM)训练过程就是训练UNet预测每一步的noise,从而逐步还原原始图像。原始图像空间的Diffusion Model目标函数如下:

共同点:这里函数 \epsilon 的参数使用神经网络UNet拟合,UNet在DDPM和LDM中的作用都是预测噪声。

区别:

1. 加入Autoencoder(上图中左侧红色部分),使得扩散过程在latent space下,提高图像生成的效率;

2. 加入条件机制,能够使用其他模态的数据控制图像的生成(上图中右侧灰色部分),其中条件生成控制通过Attention(上图中间部分QKV)机制实现。


论文贡献

  • Diffusion model相比GAN可以取得更好的图片生成效果,然而该模型是一种自回归模型,需要反复迭代计算,因此训练和推理代价都很高。论文提出一种在潜在表示空间(latent space)上进行diffusion过程的方法,从而能够大大减少计算复杂度,同时也能达到十分不错的图片生成效果。
  • 相比于其它空间压缩方法,论文提出的方法可以生成更细致的图像,并且在高分辨率图片生成任务(如风景图生成,百万像素图像)上表现得也很好。
  • 论文将该模型在无条件图片生成(unconditional image synthesis), 图片修复(inpainting),图片超分(super-resolution)任务上进行了实验,都取得了不错的效果。
  • 论文还提出了cross-attention的方法来实现多模态训练,使得条件图片生成任务也可以实现。论文中提到的条件图片生成任务包括类别条件图片生成(class-condition), 文图生成(text-to-image), 布局条件图片生成(layout-to-image)。这也为日后Stable Diffusion的开发奠定了基础。

使用Autoencoder减少需要的算力(感知压缩

为了降低训练扩散模型的算力,LDMs使用一个Autoencoder去学习能尽量表达原始image space的低维空间表达(latent embedding),这样可以大大减少需要的算力。

自编码器的方法有几个优点:

  1. 通过离开高维图像空间,获得计算效率高得多的diffusion models,因为采样是在低维空间上进行的。
  2. 利用了从其UNet架构[71]继承而来的diffusion models的归纳偏差,这使它们对具有空间结构的数据特别有效,从而减轻了对之前方法所要求的激进的、降低质量的压缩水平的需求。
  3. 得到了通用的压缩模型,其潜空间可用于训练多个生成模型,也可用于其他下游应用,如单图像片段引导的合成。

Latent Diffusion Models整体框架如上图,首先需要训练好一个自编码模型(AutoEncoder,包括一个编码器 E 和一个解码器 D )。这样一来,我们就可以利用编码器对图片进行压缩,然后在潜在表示空间上做diffusion操作,最后我们再用解码器恢复到原始像素空间即可,论文将这个方法称之为感知压缩(Perceptual Compression)。个人认为这种将高维特征压缩到低维,然后在低维空间上进行操作的方法具有普适性,可以很容易推广到文本、音频、视频等领域。

在潜在表示空间上做diffusion操作其主要过程和标准的扩散模型没有太大的区别,所用到的扩散模型的具体实现为 time-conditional UNet。但是有一个重要的地方是论文为diffusion操作引入了条件机制(Conditioning Mechanisms),通过cross-attention的方式来实现多模态训练,使得条件图片生成任务也可以实现。

下面我们针对感知压缩、扩散模型、条件机制的具体细节进行展开。

Diffusion根据条件生成图像?

主要就是通过“cross-attention”机制来实现,DDPM的UNet可以根据当前采样的t预测noise,但没有引入其他额外条件。但是LDM实现了“以文生图”,“以图生图”等任务,就是因为LDM在预测noise的过程中加入了条件机制,即通过一个encoder将条件和Unet连接起来。

★★★具体的讲解可以看:AIGC专栏2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例-CSDN博客

将条件嵌入UNet中

这里引入一个新的encoder E(这个是用于条件编码的encoder,和上面提到的用于降维的是不同的)来将条件 y 映射到 T(y)

1、LDM训练阶段

1)整体感受一下:

2)具体将文本和时间步t插入到U-Net的哪个位置

标准的LDM的SpatialTransformer的数量共21个,self.input_blocks(8)+ middle_block(1)+ self.output_blocks(12)= 21

3)训练阶段每个模块之间的交互如图:

图像噪声作为Q,文本condition作为K、V 

2)LDM推理阶段

AIGC专栏2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例-CSDN博客

一文读懂Stable Diffusion 论文原理+代码超详细解读 - 知乎

### 使用 MATLAB 实现扩散模型进行图像生成 #### 3.1 定义正向扩散过程 在扩散模型中,正向扩散过程是指逐步将原始数据转换成噪声的过程。这通常通过一系列离散的时间步来完成,在每一步中加入少量的高斯噪声。 ```matlab function noisy_image = forward_diffusion(image, timesteps) % 初始化参数 beta_start = 0.0001; beta_end = 0.02; betas = linspace(beta_start, beta_end, timesteps); alphas = 1 - betas; alpha_bars = cumprod(alphas); % 随机选择时间步 timestep = randi(timesteps); sqrt_alpha_bar_t = sqrt(alpha_bars(timestep)); one_minus_sqrt_alpha_bar_t = sqrt(1 - alpha_bars(timestep)); noise = randn(size(image)); % 添加随机噪声 % 计算带噪图像 noisy_image = sqrt_alpha_bar_t * image + one_minus_sqrt_alpha_bar_t * noise; end ``` 此函数实现了从给定图像到加噪版本的转变[^1]。 #### 3.2 构建反向扩散网络架构 为了逆转上述过程并尝试从未知的纯噪声重建原,需要训练神经网络学习这一映射关系。然而由于MATLAB并非主流深度学习框架首选平台,这里仅提供概念性的伪代码表示: ```matlab % 假设已定义好Unet类用于构建U-net结构 unet_model = Unet(input_shape=[height width channels]); for epoch=1:num_epochs for batch_idx=1:num_batches % 获取当前batch的数据及其对应的t时刻 X_batch, ts = get_next_batch(); predicted_noise = unet_model.predict({X_batch, ts}); loss_value = compute_loss(X_batch, predicted_noise); update_weights(unet_model, gradients(loss_value)); end end ``` 这段代码展示了如何利用循环遍历整个数据集来进行模型训练[^2]。 #### 3.3 图像去噪与生成流程 一旦完成了对UNet或其他类型的生成对抗网(GANs)变体的学习,则可以通过以下方式执行实际的图像合成操作: ```matlab function generated_image = generate_image(model, img_size, num_steps) initial_noisy_img = randn(img_size); % 初始全噪声输入 for step=num_steps:-1:1 time_step_input = ones([img_size.height, img_size.width])*step/num_steps; % 时间编码 estimated_noise = model.predict({initial_noisy_img, time_step_input}); % 预测噪音成分 sigma = calculate_sigma(step, num_steps); % 调整系数 if step>1 z = randn(img_size); % 新增随机扰动项 initial_noisy_img = ... (initial_noisy_img - sigma*estimated_noise)/sqrt(1-sigma^2)+z*sigma; else break; end end generated_image = clip_values(initial_noisy_img); % 将像素值裁剪至合理范围 end ``` 该算法描述了由完全无序的状态逐渐演化回有序状态的具体步骤[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pengsen Ma

太谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值