一、问题背景:光谱马赛克重建
输入是一个快照式光谱相机拍摄的原始数据:
- 测量值
meas:传感器直接输出的单通道马赛克图像(每个像素只记录了16个波段中的一个) - MSFA 模板
Phi:4×4 的滤波器阵列,指示每个像素采样的是哪个波段
目标是从严重欠采样的马赛克图像中重建出16个完整波段的高光谱图像。
二、基础框架:DIP + TV 正则(UnNull 原版)
原始 UnNull 方法的核心是一个 Deep Image Prior (DIP) 网络,流程如下:
LRHSI (初始插值) ──> UR_Net ──> 残差 ──> + LRHSI ──> 重建结果↑ ↓网络参数 测量一致性 Loss←──── 反向传播 ────────── + TV 正则
UR_Net 是一个 2 层 U-Net 变体(UR_Net.py),包含:
- 2 级下采样 encoder(stride conv + Channel Attention)
- 2 级上采样 decoder(PixelShuffle + channel attention + skip connection)
- 输入:初始插值
LRHSI(shape:(1, 16, H, W)) - 输出:残差,加到
LRHSI上形成重建
Forward 的特殊设计(UR_Net.forward):
recon = self.forward_once(x) # DIP 网络直接输出
# 然后对重建结果再次做 MSFA 采样 + 插值,作为"自回归"修正
pred_meas = recon * Phi # MSFA 采样
LRHSI_new = weight_conv(pred_meas) # 重插值回全波段
return recon - LRHSI_new # 最终输出残差
这个设计让网络输出是 DIP 直接估计 - 自回归插值 的残差,起到一种自监督约束作用。
优化目标(原始 UnNull):
Loss = L1(meas, A(recon)) + L2(meas, A(recon)) + 3.0 × TV_spectral(recon)
- 前两项:测量一致性,要求重建结果经过 MSFA 采样后与原始马赛克一致
- TV 正则:光谱维度的 TV,惩罚相邻波段之间的突变
三、扩散模型先验的引入
PnP-UnNull v3 用预训练的 PaDIS 扩散降噪器替代 TV 正则,核心思路是 "周期性地去噪 → 作为先验目标 → 拉近 DIP 输出"。
3.1 PaDIS 扩散降噪器
PaDIS 是一个预训练的无条件 16 波段扩散模型(PaDISDenoiser 类),训练数据是 NTIRE 高光谱数据集:
输入:噪声图像 x_noisy (1, 16, H, W), 噪声水平 σ
输出:去噪图像 x_clean (1, 16, H, W)
使用细节:
- 数值范围转换:DIP 输出在
[0, 1],PaDIS 需要[-1, 1],去噪后再转回来 - 位置编码:PaDIS 需要 2D 坐标编码(归一化到
[-1, 1]),由build_position_encoding()生成 - Padding:64 像素的
-1填充,匹配 PaDIS 训练时的尺寸约定
3.2 PnP 优化循环
每 20 轮迭代,执行以下操作(pnp_unnull_core.py:216-238):
1. 取当前 DIP 输出 model_out
2. 以当前噪声水平 σ 调用扩散降噪器 → 得到 denoised
3. 【关键】测量一致性投影:对 denoised 做 MSFA 采样 → 与真实 meas 比较 → 残差反投影回各波段denoised += (meas - A(denoised)) / Phi_sum * Phi
4. 将投影修正后的去噪结果冻结为 prior_target
5. 在接下来的 20 轮中,DIP 通过 MSE loss 拉向这个 prior_target
优化目标(PnP 版本):
Loss = L1(meas, A(recon)) + L2(meas, A(recon)) + λ × MSE(recon, prior_target)↑扩散先验项(替代 TV)
3.3 σ 衰减调度
噪声水平 σ 在优化过程中线性衰减:
σ = 0.05 → 0.01 (随迭代从 start 到 end)
这遵循了扩散模型的标准用法——前期大 σ 提供粗粒度的结构先验,后期小 σ 保留细节。
在 500 轮迭代中,σ 从 0.05 逐步降到 0.01,共触发 25 次降噪(每 20 轮一次)。
四、测量一致性投影(关键机制)
这是 PnP 版本中确保"扩散先验不违背数据"的核心设计(pnp_unnull_core.py:224-233):
# 扩散去噪结果在测量空间的残差
pred_meas_d = A(denoised, Phi) # 去噪结果 → 模拟马赛克
meas_residual = meas - pred_meas_d # 与真实马赛克的偏差# 将残差按 MSFA 模式反投影回各波段
# 每个像素只修正它被采样的那个波段
denoised += (meas_residual / Phi_sum) * Phi
为什么这很重要:
- 扩散模型是无条件训练的,不知道当前图像的具体测量值
- 直接拿扩散去噪结果作为 prior_target,可能把 DIP 拉向一个"好看但不满足测量约束"的方向
- 投影修正确保 prior_target 同时满足两个条件:
- 被扩散模型去除了噪声/伪影(结构先验)
- 经过 MSFA 采样后与真实测量一致(数据保真)
五、完整流程总结
┌─────────────────────────────────────────┐│ PnP-UnNull 优化循环 ││ │LRHSI ──> UR_Net ──> + ──> recon ──> 测量一致性 Loss │↑ │ (L1 + L2 vs meas) ││ │ ││ └──> MSE Loss(recon, prior_target) ││ ↑ ││ prior_target ││ ↑ ││ 每 20 轮更新一次 ││ ┌─────────┴──────────┐ ││ │ 扩散降噪 + 测量投影 │ ││ │ PaDIS(σ_t) │ ││ │ σ: 0.05 → 0.01 │ ││ └────────────────────┘ ││ │└─────────── 反向传播更新参数 ◄─────────────────────┘
六、为什么扩散先验有效
-
强结构先验:PaDIS 在 NTIRE 数据集上训练,学到了高光谱图像的自然光谱统计规律(平滑、相关性、纹理-光谱的联合分布)
-
TV 的局限:TV 正则只惩罚相邻波段的差异,是一种"盲"正则——它不知道什么样的光谱变化是合理的
-
扩散先验的优势:扩散模型知道"一个好高光谱图像应该是什么样",可以:
- 修正 TV 无法处理的复杂伪影
- 恢复丢失的纹理细节
- 保持光谱曲线的自然形状(SAM 大幅改善的根源)
-
λ 的甜区:v3 通过网格搜索确定 λ=5~10 是最优区间——太小(0.1)时扩散先验被数据拟合梯度淹没,太大(50)时过度压制测量保真度
