
简介本资源聚焦于基于倒向随机微分方程BSDE的图像去噪与重建算法实现面向图像处理、计算数学及人工智能方向的高年级本科生、研究生与科研开发者解决传统滤波方法易模糊边缘、丢失纹理细节的痛点问题。压缩包共10个文件171KB含6幅去噪前后对比图JPG/PNG、2个核心C源文件.cpp、1个头文件.h及1个测试入口程序完整覆盖BSDE建模、离散化求解、图像信号恢复与效果可视化全流程。已有319人学习下载代码结构清晰模块划分明确——differEquationDenoise.h/.cpp封装BSDE数值求解逻辑test.cpp驱动X光医学图像bit8-x-ray等典型场景实验result目录存放输出结果便于快速复现与参数调优。读者可直接运行验证PSNR/SSIM指标提升效果深入理解随机微分方程在反问题中的建模思想与工程落地路径。1. 项目概述当图像去噪遇上“时光倒流”的数学魔法最近在整理一些老照片和实验数据时我又一次被图像噪声问题困扰了。无论是手机在暗光下拍摄的模糊照片还是医学CT、天文观测中那些被各种干扰“污染”的珍贵图像如何从中还原出清晰、真实的原始信息一直是个既经典又充满挑战的课题。传统的滤波方法像是用一把“钝刀”切削噪声去掉了细节也模糊了而一些深度学习方法又像个“黑箱”效果虽好但背后的机理和可控性总让人心里没底。直到我重新审视了“倒向随机微分方程”这个数学工具才感觉找到了一个兼具理论优雅和实用潜力的新思路。这个项目就是尝试用BSDE这套“时光倒流”的数学框架来解决图像去噪与重建问题。简单来说我们可以把一张干净的图像想象成故事完美的“开端”而观测到的带噪图像则是经历了各种随机干扰噪声后的“结局”。BSDE的强大之处在于它允许我们从已知的“结局”带噪图像出发逆向推导出“开端”干净图像应该是什么样子。这听起来有点像电影《信条》里的逆熵操作但在数学上它是严密且可计算的。这个方法不仅适用于常见的椒盐噪声、高斯噪声去除对于图像超分辨率重建从低清变高清、甚至一些更特殊的去噪场景如点云数据平滑、信号基线漂移校正都有启发意义。它为我们提供了一种基于随机过程理论的、可解释的建模方式让我们对“去噪”这个过程有了更深的理解而不仅仅是调参炼丹。如果你对图像处理、数学建模或者想了解如何将前沿的随机分析理论落地到工程实践感兴趣那么这篇分享或许能给你带来一些不一样的视角和实实在在的工具箱。2. 核心思路拆解为什么是倒向随机微分方程在深入代码和公式之前我们必须先搞清楚一个根本问题图像去噪凭什么能用上倒向随机微分方程这种看似高深的数学工具理解这一点是后续一切实操和调优的基础。2.1 把图像看作一个随机演化场我们首先需要跳出“图像是一个静态像素矩阵”的固有观念。想象一下一张干净的理想图像它的每一个像素值例如灰度强度都是确定的。现在我们让这张图像“动起来”经历一个虚拟的“时间”过程。在这个过程里噪声如同随机扰动持续地作用于每个像素。我们可以用一个正向的随机微分方程来描述这个“退化”过程dX_t μ(X_t, t)dt σ(X_t, t)dW_t这里X_t代表了在时刻t的图像状态可以理解为所有像素值构成的高维向量μ是漂移项描述图像自身的确定性变化趋势在纯加性噪声模型中可能为0σ是扩散项描述噪声的强度而dW_t是标准布朗运动维纳过程代表了随机噪声的注入。从初始的干净图像X_0开始随着“时间”t推进到终点时刻T我们就得到了观测到的带噪图像X_T。注意这里的“时间”是一个数学上的虚拟维度并不对应真实时间。它可以理解为噪声添加的强度、迭代的步数或者图像在退化过程中所处的某个阶段。这种将空间问题图像转化为时空问题图像虚拟时间的思想是许多高级图像处理方法的精髓。2.2 逆向求解从结局反推开端现在问题来了我们观测到的只有带噪的“结局”X_T而我们想知道的是干净的“开端”X_0。这正是倒向随机微分方程大显身手的地方。BSDE的一般形式是-dY_t f(t, Y_t, Z_t)dt - Z_t dW_t, 且满足终端条件 Y_T ξ在这个框架下Y_t是我们要找的倒向过程它从终端时刻T向初始时刻0演化。终端条件ξ就是我们观测到的带噪图像X_T。而方程中的生成元f和过程Z_t是关键的未知部分它们共同编码了从带噪图像恢复到干净图像所需的“逆变换规则”。为什么BSDE适合去噪天然的逆向建模去噪的本质是逆向推断BSDE的数学形式本身就是为逆向问题设计的这与我们的目标高度契合。包含不确定性信息Z_t这个过程项在金融中代表对冲风险在图像处理中它可以被解释为对噪声统计特性如方差的估计或者恢复过程中需要保留的细节与需要平滑的噪声之间的权衡信息。这比单纯给出一个点估计如去噪后的像素值包含了更多信息。灵活的框架生成元f可以设计成各种形式从而融入我们对图像先验知识的理解。例如我们可以让f包含图像梯度信息从而在去噪时保护边缘或者包含一个深度学习子网络让数据来学习最优的逆变换规则。2.3 与热词场景的关联思考看看我们关联的热词BSDE的思路其实能提供一种统一的视角点云去噪点云可以视为三维空间中的离散采样。BSDE可以建模每个点位置在噪声影响下的随机扰动通过逆向过程将点“拉回”到它更可能所属的真实物体表面。这比“滚球法”等几何启发式方法提供了更概率化的基础。图像超分辨率重建可以将低分辨率图像视为高分辨率图像经过了下采样确定性退化和噪声随机退化后的结果。构建一个包含下采样算子的BSDE逆向求解即可同时实现去噪和上采样重建。信号滤波如脉搏波去基线漂移基线漂移可以看作一个低频的随机扰动。用SDE建模信号脉搏波和基线漂移的耦合演化再用BSDE逆向分离理论上可以实现自适应的滤波避免传统滤波方法如MATLAB中的数字滤波器需要手动设置截止频率的麻烦。核心思路就是用正向SDE建模“退化”过程噪声如何添加用倒向BSDE来求解“复原”过程。接下来的所有工作都是围绕如何具体构造这个方程以及如何数值求解它。3. 从理论到实践构建图像去噪的BSDE模型理论很美妙但要让计算机帮我们算出来就需要一个可操作的数学模型。这里我们聚焦于一种相对经典且易于实现的框架基于去噪得分匹配Denoising Score Matching与随机微分方程的关联。3.1 关键连接点得分函数与SDE/BSDE近年来基于得分函数Score Function的生成模型如NCSN, SGM取得了巨大成功。得分函数是数据概率分布对数密度的梯度即s(x) ∇_x log p(x)。它指向了概率密度增加最快的方向。在去噪语境下如果我们知道带噪图像y条件下干净图像x的后验分布p(x|y)的得分函数那么我们就可以沿着这个方向对y进行修正从而得到x的估计。神奇的是某些特定形式的正向SDE描述图像加噪过程其对应的逆向SDE描述去噪过程的形式恰恰依赖于这个得分函数。例如一个常用的正向SDE是方差爆炸Variance Exploding, VESDEdx √(d[σ^2(t)]/dt) dW其中σ(t)是一个随时间单调递增的函数控制噪声水平。当σ(t)很大时x(t)的分布会趋近于一个简单的高斯分布。这个正向SDE对应的逆向SDE根据Anderson等人的工作为dx -[dσ^2(t)/dt] s(x, t) dt √(dσ^2(t)/dt) dW_t看逆向SDE的漂移项里出现了得分函数s(x, t)这意味着如果我们能以某种方式估计出得分函数s(x, t)我们就完全确定了逆向去噪过程的BSDE。3.2 模型构建的具体步骤所以我们的BSDE去噪模型构建就转化为以下几步定义正向噪声过程选择一种噪声调度σ(t)通常令t ∈ [0, 1]σ(0)0无噪σ(1)为一个很大的值如50。这定义了我们如何从干净图像x(0)逐步加噪到x(1)一个近似纯高斯噪声的图像。训练得分估计网络这是整个项目的核心。我们需要一个神经网络s_θ(x, t)其目标是逼近真实的得分函数∇_x log p_t(x)其中p_t(x)是在时刻t带噪图像的边际分布。训练采用去噪得分匹配目标L(θ) E_{t, x(0), x(t)} [λ(t) * || s_θ(x(t), t) - ∇_{x(t)} log p_{0t}(x(t)|x(0)) ||^2]这里x(0)是干净图像x(t)是通过正向SDE在时刻t加噪得到的样本∇ log p_{0t}(x(t)|x(0))是给定x(0)时x(t)的条件分布的得分对于高斯扩散过程这个值有解析解-(x(t) - x(0)) / σ(t)^2。λ(t)是一个正的加权函数通常取σ(t)^2。构建逆向BSDE求解器一旦我们有了训练好的得分网络s_θ(x, t)逆向SDE就确定了。我们可以采用多种数值方法从t1噪声积分到t0干净图像欧拉-丸山法这是最简单直接的方法离散化逆向SDE进行迭代。x_{i-1} x_i [dσ^2(t)/dt]_i * s_θ(x_i, t_i) * Δt √([dσ^2(t)/dt]_i * Δt) * z_i, 其中z_i ~ N(0, I)。预测-校正法结合了基于得分的预测步和基于朗之万动力学的校正步通常能获得更高质量的样本。ODE求解器逆向SDE存在一个确定性的概率流ODEPF-ODE。求解这个ODE同样可以从噪声得到图像且通常更快速、稳定。3.3 一个简化的实例离散时间步建模为了更直观我们也可以完全在离散时间步上构建模型这更接近扩散模型DDPM的视角。我们可以定义一系列噪声水平{β_t}正向过程为x_t √(1-β_t) * x_{t-1} √β_t * ε_t,ε_t ~ N(0, I)其逆向过程需要估计p_θ(x_{t-1} | x_t)。通过推导可以发现逆向过程的均值参数依赖于一个预测噪声的网络ε_θ(x_t, t)。而这个ε_θ与得分函数s_θ存在线性关系s_θ(x_t, t) ≈ -ε_θ(x_t, t) / σ_t。因此在这个框架下我们的BSDE模型构建就变成了训练一个噪声预测网络ε_θ(x_t, t)。逆向采样时每一步计算x_{t-1} 1/√α_t (x_t - (β_t/√(1-α_t)) ε_θ(x_t, t)) σ_t z其中α_t1-β_t,σ_t是方差参数。 这本质上就是在求解一个离散形式的逆向随机差分方程。实操心得对于初次尝试我强烈建议从离散时间步的DDPM框架入手。它的训练目标预测噪声更直观代码实现资料丰富社区支持好。待深刻理解后再过渡到连续时间的SDE/BSDE视角你会对“噪声调度”、“得分函数”等概念有融会贯通的理解。选择β_t线性增长或余弦调度的噪声计划是实践中稳定训练的关键。4. 实战演练基于PyTorch的BSDE去噪模型实现理论铺垫完毕现在我们来动手实现一个可运行的版本。我们将基于离散时间步的DDPM框架因为它更易于理解和实现并且其本质是BSDE的离散化形式。4.1 环境准备与依赖安装首先确保你的环境有Python和PyTorch。我推荐使用Conda管理环境。# 创建并激活环境 conda create -n bsde-denoise python3.9 conda activate bsde-denoise # 安装核心依赖 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本调整 pip install numpy matplotlib Pillow scikit-image tqdm # 可选用于更复杂的网络结构或数据加载 pip install einops accelerate4.2 核心模块代码拆解我们将构建几个核心类定义噪声调度的BetaScheduler、用于预测噪声的U-Net网络DenoisingUNet、以及整合训练和采样流程的BSDE_Diffusion类。1. 噪声调度模块这个模块负责生成正向加噪过程中每一步的系数。import torch import numpy as np class BetaScheduler: def __init__(self, timesteps1000, beta_start1e-4, beta_end0.02, schedulelinear): self.timesteps timesteps if schedule linear: self.betas torch.linspace(beta_start, beta_end, timesteps) elif schedule cosine: # 更好的调度推荐 steps timesteps 1 x torch.linspace(0, timesteps, steps) alphas_cumprod torch.cos(((x / timesteps) 0.008) / 1.008 * torch.pi * 0.5) ** 2 alphas_cumprod alphas_cumprod / alphas_cumprod[0] betas 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1]) self.betas torch.clip(betas, 0.0001, 0.9999) else: raise NotImplementedError(fSchedule {schedule} not implemented.) self.alphas 1. - self.betas self.alphas_cumprod torch.cumprod(self.alphas, dim0) self.sqrt_alphas_cumprod torch.sqrt(self.alphas_cumprod) self.sqrt_one_minus_alphas_cumprod torch.sqrt(1. - self.alphas_cumprod) def add_noise(self, original, noise, t): 根据时刻t将噪声添加到原始图像上。 original: 干净图像 [B, C, H, W] noise: 高斯噪声 [B, C, H, W] t: 时间步索引 [B] sqrt_alpha_cumprod_t self.sqrt_alphas_cumprod[t].view(-1, 1, 1, 1) sqrt_one_minus_alpha_cumprod_t self.sqrt_one_minus_alphas_cumprod[t].view(-1, 1, 1, 1) return sqrt_alpha_cumprod_t * original sqrt_one_minus_alpha_cumprod_t * noise2. 噪声预测网络U-Net这是一个简化的U-Net用于根据带噪图像x_t和时间步嵌入t来预测噪声ε。import torch.nn as nn import torch.nn.functional as F class SinusoidalPositionEmbeddings(nn.Module): 将时间步t编码为向量 def __init__(self, dim): super().__init__() self.dim dim def forward(self, time): device time.device half_dim self.dim // 2 embeddings np.log(10000) / (half_dim - 1) embeddings torch.exp(torch.arange(half_dim, devicedevice) * -embeddings) embeddings time[:, None] * embeddings[None, :] embeddings torch.cat((embeddings.sin(), embeddings.cos()), dim-1) return embeddings class DenoisingUNet(nn.Module): def __init__(self, in_channels3, out_channels3, time_emb_dim32): super().__init__() self.time_mlp nn.Sequential( SinusoidalPositionEmbeddings(time_emb_dim), nn.Linear(time_emb_dim, time_emb_dim * 4), nn.GELU(), nn.Linear(time_emb_dim * 4, time_emb_dim) ) # 一个极简的降采样-升采样块实际应用需更深的U-Net self.conv1 nn.Conv2d(in_channels time_emb_dim, 64, 3, padding1) self.down nn.Conv2d(64, 128, 3, stride2, padding1) self.mid nn.Conv2d(128, 128, 3, padding1) self.up nn.ConvTranspose2d(128, 64, 3, stride2, padding1, output_padding1) self.conv2 nn.Conv2d(64, out_channels, 3, padding1) def forward(self, x, t): # x: [B, C, H, W], t: [B] t_emb self.time_mlp(t) # [B, time_emb_dim] t_emb t_emb.unsqueeze(-1).unsqueeze(-1) # [B, time_emb_dim, 1, 1] t_emb t_emb.expand(-1, -1, x.shape[2], x.shape[3]) # [B, time_emb_dim, H, W] x torch.cat([x, t_emb], dim1) # 将时间嵌入与图像拼接 x F.relu(self.conv1(x)) x F.relu(self.down(x)) x F.relu(self.mid(x)) x F.relu(self.up(x)) x self.conv2(x) # 预测的噪声 return x3. 主模型类整合训练与采样这个类封装了前向加噪、损失计算和逆向采样BSDE求解的全流程。class BSDE_Diffusion: def __init__(self, timesteps1000, img_size64, channels3, devicecuda): self.timesteps timesteps self.img_size img_size self.channels channels self.device device self.scheduler BetaScheduler(timestepstimesteps, schedulecosine) # 将调度器的张量移到设备 for key, value in self.scheduler.__dict__.items(): if isinstance(value, torch.Tensor): setattr(self.scheduler, key, value.to(device)) self.model DenoisingUNet(in_channelschannels, out_channelschannels).to(device) self.optimizer torch.optim.Adam(self.model.parameters(), lr1e-4) def train_step(self, clean_imgs): 单次训练迭代。 clean_imgs: 一批干净图像 [B, C, H, W] batch_size clean_imgs.shape[0] # 1. 采样随机时间步 t torch.randint(0, self.timesteps, (batch_size,), deviceself.device).long() # 2. 采样随机噪声 noise torch.randn_like(clean_imgs) # 3. 前向加噪得到 x_t noisy_imgs self.scheduler.add_noise(clean_imgs, noise, t) # 4. 模型预测噪声 predicted_noise self.model(noisy_imgs, t) # 5. 计算损失 (简单的均方误差) loss F.mse_loss(predicted_noise, noise) self.optimizer.zero_grad() loss.backward() self.optimizer.step() return loss.item() torch.no_grad() def sample(self, num_samples1, return_intermediatesFalse): 逆向采样求解BSDE从噪声生成图像。 num_samples: 生成图像数量 return_intermediates: 是否返回中间过程 self.model.eval() # 从纯噪声开始 x torch.randn((num_samples, self.channels, self.img_size, self.img_size), deviceself.device) intermediates [x.cpu()] if return_intermediates else None # 从 tT 到 t0 迭代 for i in reversed(range(0, self.timesteps)): t torch.full((num_samples,), i, deviceself.device, dtypetorch.long) # 预测噪声 predicted_noise self.model(x, t) # 计算当前时间步的系数 alpha_t self.scheduler.alphas[t].view(-1, 1, 1, 1) alpha_cumprod_t self.scheduler.alphas_cumprod[t].view(-1, 1, 1, 1) beta_t self.scheduler.betas[t].view(-1, 1, 1, 1) if i 0: noise torch.randn_like(x) else: noise torch.zeros_like(x) # 逆向采样公式 (DDPM论文中的公式) x (1 / torch.sqrt(alpha_t)) * (x - (beta_t / torch.sqrt(1 - alpha_cumprod_t)) * predicted_noise) torch.sqrt(beta_t) * noise if return_intermediates and i % 50 0: intermediates.append(x.cpu()) self.model.train() if return_intermediates: return x, intermediates return x4.3 训练与测试循环示例有了核心类我们可以构建一个简单的训练循环。这里以MNIST或CIFAR-10数据集为例。from torchvision import datasets, transforms from torch.utils.data import DataLoader # 数据准备 transform transforms.Compose([ transforms.Resize((64, 64)), transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # 对于单通道如MNIST ]) dataset datasets.MNIST(./data, trainTrue, downloadTrue, transformtransform) dataloader DataLoader(dataset, batch_size32, shuffleTrue, num_workers2) # 初始化模型 device cuda if torch.cuda.is_available() else cpu diffusion BSDE_Diffusion(timesteps1000, img_size64, channels1, devicedevice) # 训练循环 epochs 50 for epoch in range(epochs): epoch_loss 0 for batch_idx, (clean_imgs, _) in enumerate(dataloader): clean_imgs clean_imgs.to(device) loss diffusion.train_step(clean_imgs) epoch_loss loss if batch_idx % 100 0: print(fEpoch {epoch}, Batch {batch_idx}, Loss: {loss:.4f}) print(fEpoch {epoch} Average Loss: {epoch_loss/len(dataloader):.4f}) # 每5个epoch保存一次模型并生成样例 if epoch % 5 0: torch.save(diffusion.model.state_dict(), fmodel_epoch_{epoch}.pth) samples diffusion.sample(num_samples16) # 保存samples为图片查看效果注意事项这个示例U-Net非常浅仅用于演示原理。在实际去噪任务中尤其是对自然图像你需要使用更深、更复杂的U-Net结构如带有注意力机制、残差连接的U-Net并在大规模数据集如ImageNet上进行长时间训练才能获得良好的去噪和生成效果。此外img_size需要与你训练数据的大小一致。5. 效果评估、调优与问题排查模型跑起来只是第一步如何判断它去噪效果的好坏以及当效果不佳时如何排查和优化才是真正体现经验的地方。5.1 效果评估指标不能只靠“肉眼看着舒服”。对于去噪任务如果有干净的真实图像作为参考即全参考图像质量评价可以使用峰值信噪比最常用的指标值越大越好表示去噪后图像与真实图像之间的误差越小。但它与主观感知有时不完全一致。结构相似性指数比PSNR更符合人眼视觉感知它从亮度、对比度、结构三个方面比较图像相似性范围[-1,1]值越大越好。如果没有真实图像无参考评价则更具挑战性可以结合自然图像质量评价器一种基于自然图像统计特性的无参考评价指标分数越高通常表示图像质量越好。人工主观评价对于重要的应用组织人员进行主观评分仍然是黄金标准。对于本项目BSDE方法一个有趣的评估角度是生成样本的多样性。由于逆向过程是随机的σ_t z项对同一张带噪图像进行多次去噪应该能得到略有不同的、但都合理的干净图像。这体现了模型对解空间的不确定性建模能力。5.2 模型调优实战心得噪声调度是灵魂β_t或σ(t)的选择至关重要。线性调度简单但可能导致终端噪声分布不纯高斯或训练不稳定。余弦调度在实践中被广泛证明更优它能让加噪过程更平滑模型训练更稳定生成质量更高。如果你发现训练损失震荡或生成图像有瑕疵首先检查并调整噪声调度。网络容量与深度得分估计网络s_θ的能力直接决定上限。简单的U-Net可能只能处理MNIST级别的简单去噪。对于复杂图像增加网络深度和通道数。引入注意力机制特别是对于较大图像让模型关注全局关系。使用残差连接和组归一化来稳定深层网络的训练。考虑使用预训练的网络作为特征提取器进行微调。损失函数的加权损失函数中的λ(t)不是随便设的。通常设置为σ(t)^2或1/σ(t)^2来平衡不同噪声水平下的损失贡献。错误的加权会导致模型在某些噪声水平下表现很差。可以尝试不同的加权策略并观察模型在不同t下的预测误差。采样器的选择与加速上述代码使用了最简单的DDPM采样器需要迭代1000步非常慢。实践中可以使用DDIM采样器一种确定性采样器源自ODE形式通常20-50步就能获得不错效果极大加速推理。DPM-Solver专门为扩散模型ODE设计的高阶求解器可能10步就能达到媲美1000步DDPM的效果。知识蒸馏训练一个更少的步数的学生网络来模仿多步教师网络的行为。5.3 常见问题排查速查表问题现象可能原因排查与解决思路训练损失不下降或为NaN学习率过高网络梯度爆炸噪声调度导致数值不稳定。降低学习率如从1e-4降至1e-5检查网络初始化添加梯度裁剪尝试更温和的余弦噪声调度确保β_t不会过大或过小。生成图像模糊网络容量不足损失函数过度强调MSE导致平均化采样步数太少。使用更深的U-Net加入注意力机制在损失中尝试结合感知损失增加采样步数或换用更优的采样器如DDIM。生成图像有重复纹理或模式模型崩溃训练数据多样性不足损失函数陷入局部最优。检查训练数据是否足够多样尝试在损失中加入正则化项使用EMA指数移动平均来平滑模型权重。去噪后图像仍有残留噪声模型未能充分学习高分噪声下的得分逆向采样过程方差项 (σ_t) 设置不当。确保训练数据覆盖了所有噪声水平检查逆向采样公式中的系数计算是否正确可以尝试在采样后期小t时减小随机噪声的强度。处理大图像时内存溢出网络或特征图过大。使用更小的批处理大小采用梯度累积降低图像分辨率进行训练或使用分块patch处理的方法。对特定噪声类型如椒盐噪声效果差训练数据噪声类型与目标不符高斯扩散假设不适用。使用包含目标噪声类型的混合噪声数据进行训练考虑修改正向SDE使其更贴合目标噪声的退化过程如使用跳跃扩散模型处理脉冲噪声。5.4 超越简单去噪向超分辨率与特定领域拓展BSDE框架的灵活性使其能轻易扩展到更复杂的重建任务。以图像超分辨率为例修改正向过程正向SDE不再只是加噪而是结合一个下采样算子H如双线性插值下采样和加噪dX_t (H(X_t) - X_t) dt σ(t) dW_t 更常见的做法是将低分辨率图像y视为高分辨率图像x经过一个固定的退化过程如y Hx n得到。我们可以构建一个条件扩散模型。条件生成在训练噪声预测网络ε_θ时除了输入带噪的高分辨率图像x_t和时间t额外输入低分辨率图像y。即网络变为ε_θ(x_t, t, y)。这样网络在学习去噪的同时也学会了如何使生成结果与低分辨率输入y保持一致。逆向采样采样时从噪声开始在每一步都将当前估计x_t通过H下采样与真实的y进行比较并将这个误差信息以某种方式如梯度引导注入到逆向更新步骤中引导生成过程。对于点云去噪或信号滤波思路是相通的定义合适的正向退化SDE描述点位置扰动或信号基线漂移的随机过程然后训练一个网络来估计逆向过程的漂移项得分函数最后进行逆向采样。关键在于如何设计网络架构来处理非网格化数据如点云使用PointNet信号使用一维卷积网络。我个人在将BSDE思想应用于一些医学图像去噪时发现最大的挑战往往不是算法本身而是领域知识的融入。例如对于CT图像噪声并非独立同分布的高斯噪声而是具有泊松特性。生搬硬套高斯扩散模型效果有限。这时需要根据物理成像模型重新设计正向SDE或者利用后处理步骤加入解剖结构的先验约束。理论框架是通用的但成功的落地离不开对具体问题领域的深刻理解。本文还有配套的精品资源点击获取