DDPM(Denoising Diffusion Probabilistic Models)

扩散模型包含两个过程:

①扩散过程:从左到右的过程(DataNoise),表示对图片逐步增加噪声。

②逆扩散过程:从右到左的过程(NoiseData),表示从高斯噪声中逐步去噪,复原出原图。

  1. 扩散过程

扩散过程可以表示为,其中x为原图,z为添加了T次噪声后得到的图像。添加噪声的过程

为正太分布,所以部分加起来也为正太分布,又因为,所以有

在论文中设置,T越大,越大,噪声的权重越大

在设置好响应的之后,前向扩散的过程也就确定了

  1. 逆扩散过程

根据式①可得,设去噪模型为u(x),因此考虑将模型设计为

实际处理时每个去噪重构模型的参数是一样的,t 是转换成位置编码后(详情请参考https://kexue.fm/archives/8231),直接加到残差模块上去的

损失函数为

根据公式①和②有

损失函数表示为

计算上述损失函数需要采样 4 个随机变量:

由于要采样的随机变量越多,就越难对损失函数做准确的估计,反过来说就是每次对损失函数进行估计的波动 (方差) 过大了,通过一个积分技巧来将合并成单个正态随机变量,从而缓解一下方差大的问题。

由于正态分布的叠加性

接下来,我们反过来将用ε,ω重新表示出来

代入公式③得

现在损失函数关于ωω只是二次的,所以我们可以展开然后将它的期望直接算出来,结果是

再次省掉常数和损失函数的权重,我们得到DDPM最终所用的损失函数

原论文中的实际上就是本文的,所以大家的结果是完全一样的。

参考:

### 基于Denoising Diffusion Probabilistic Models (DDPM) 的RePaint Inpainting 技术复现 #### 方法概述 RePaint 是一种基于去噪扩散概率模型(DDPM)的图像修复技术,其核心思想是通过条件化的扩散过程来生成缺失区域的内容。该方法利用已知区域的信息作为条件输入,并通过对噪声逐步去除的方式恢复完整的图像[^2]。 为了实现 RePaint Inpainting 技术的复现,可以按照以下思路构建: --- #### 数据准备 在训练过程中,需要准备好带有随机遮罩的图像数据集。这些遮罩可以采用多种形式,例如矩形、自由绘制的笔刷形状或其他复杂模式。具体来说: - 使用公开的数据集(如 CelebA 或 ImageNet),并为其添加人工合成的遮罩。 - 遮罩的设计应多样化,以便模型能够适应不同的场景和复杂的遮挡情况[^3]。 --- #### 扩散模型架构 扩散模型的核心在于定义前向扩散过程和反向生成过程。以下是具体的实现细节: 1. **前向扩散过程** 定义一个逐渐增加噪声的过程 \( q(x_t|x_0) \),其中 \( t \) 表示时间步长。此过程可以通过高斯噪声逐层叠加完成: \[ q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1},\beta_t I) \] 这里的参数 \( \beta_t \) 控制每一步加入的噪声量[^1]。 2. **反向生成过程** 反向生成的目标是从纯噪声中重建原始图像。这一过程由神经网络学习得到,通常表示为: \[ p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t,t), \sigma_t^2I) \] 其中,\( \mu_\theta(x_t,t) \) 是通过 U-Net 结构预测的均值函数。 --- #### 条件化策略 为了让扩散模型专注于修复被遮盖的部分,需引入条件化机制。具体做法如下: - 将遮罩后的图像 \( x_m \) 和对应的二值遮罩矩阵 \( m \) 输入到模型中。 - 修改损失函数以仅关注未知区域的像素误差。即,在计算重构误差时忽略已知区域的影响: \[ L(\theta) = \sum_{i=1}^{T}\|m_i \odot (\hat{x}_i - x_i)\|^2 \] 此处 \( m_i \) 表示第 \( i \)-th 时间步上的遮罩矩阵。 --- #### 训练与推理流程 1. **训练阶段** - 构造带遮罩的图像对 \( (x_m, m) \) 并将其送入 DDPM 中进行端到端优化。 - 调整超参数(如噪声调度表 \( \beta_t \))、批次大小以及总迭代次数以获得最佳性能。 2. **推理阶段** 给定一张含有缺失区域的新图像及其对应遮罩,执行以下操作: - 初始化全白噪声图作为起始状态; - 按照预训练好的逆采样路径逐步减少噪声直至最终输出清晰的结果。 ```python import torch from torchvision import transforms from diffusers.models.unet_2d_condition import UNet2DConditionModel def inpaint_with_repaint(image_tensor, mask_tensor, model_path): """ Perform inpainting using Repaint method. Args: image_tensor (torch.Tensor): Input masked image tensor of shape [C,H,W]. mask_tensor (torch.Tensor): Binary mask tensor indicating missing regions. model_path (str): Path to pre-trained diffusion model checkpoint. Returns: torch.Tensor: Restored full-image tensor. """ device = 'cuda' if torch.cuda.is_available() else 'cpu' # Load pretrained denoising diffusion probabilistic model unet_model = UNet2DConditionModel.from_pretrained(model_path).to(device) # Define noise scheduler and other hyperparameters here... beta_schedule = ... # Example: linear or cosine schedule noisy_image = add_noise_to_image(image_tensor.clone(), beta_schedule[-1]) * (1-mask_tensor) + image_tensor*mask_tensor restored_image = reverse_diffusion_process(noisy_image=noisy_image, condition=image_tensor, mask=mask_tensor, steps=len(beta_schedule), model=unet_model) return restored_image.clamp(0., 1.) # Helper functions omitted for brevity but should include `add_noise_to_image` & `reverse_diffusion_process`. ``` 上述代码片段展示了一个简化版本的 RePaint 推理逻辑框架,实际应用还需补充更多细节配置。 --- #### 性能评估指标 针对生成质量可选用 SSIM、PSNR 等传统度量标准外加感知相似性得分 FID(Fréchet Inception Distance)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值