首页 / 资讯中心 / 文章详情

CycleISP:可学习ISP与循环一致性驱动的真实图像去噪数据合成

CycleISP:可学习ISP与循环一致性驱动的真实图像去噪数据合成 ★ FEATURED ARTICLE
1. 为什么“数据合成”才是真实图像去噪的胜负手如果你这两年一直在跟进图像复原方向大概率会注意到一个现象很多去噪模型在合成测试集上指标刷得飞起一换到手机实拍照片就原形毕露噪点没去干净纹理反而被抹成塑料。这个落差不是模型容量不够而是训练数据的分布和真实噪声对不上。CycleISP 这篇工作切入的正是这个痛点——它不去卷网络结构而是先把“数据合成”这件事做扎实用一套可学习的合成管线生成更接近真实相机成像的噪声图像再拿去做复原训练。我先把结论摆前面CycleISP 的核心价值不在于某个模块多花哨而在于它把“从干净图生成带噪图”和“从带噪图还原干净图”这两个方向做成了闭环让合成数据在分布上向真实数据靠拢。它解决的是训练数据与真实场景之间的鸿沟问题适合已经做过基础去噪、想进一步提升真实场景泛化能力的同学参考也适合刚入门图像复原、想理解“为什么合成数据这么重要”的读者。这篇文章我会按从业者的视角把 CycleISP 的思路拆开讲透它为什么这么设计、每个模块解决什么问题、参数怎么选、实操时怎么落地、踩过哪些坑。文中涉及的具体实现细节部分是基于常见工程实践的合理补充我会明确标注出来方便你对照自己的场景调整。2. CycleISP 整体设计思路拆解2.1 从“单向合成”到“双向循环”的动机传统做去噪训练数据的套路很直接拿一张干净图加高斯白噪声或者加泊松-高斯混合噪声就当成带噪样本。这种做法的问题在于真实相机的噪声根本不是独立同分布的高斯噪声。它经过传感器响应、去马赛克、白平衡、色调映射、压缩这一整条图像信号处理ISP管线噪声在空间上是有色、有结构、和信号强度相关的。你用一个过于简化的噪声模型去训练模型学到的就是“怎么去掉高斯噪声”而不是“怎么去掉真实噪声”。CycleISP 的出发点就是与其手工设计噪声模型不如让网络去学一个从干净图到带噪图的映射同时再学一个反向映射两者构成循环。这个思路借鉴了循环一致性的思想但用在了图像合成这个具体任务上。它把 ISP 管线拆成两个可学习的模块一个负责“加噪方向”的变换一个负责“去噪方向”的变换两个方向共享对 ISP 过程的理解从而让合成出来的噪声更贴近真实。注意这里的“循环”不是简单的自编码器重建而是两个方向各自有明确的物理含义——正向模拟相机成像反向模拟复原过程。理解这一点后面看损失函数设计才不会迷糊。2.2 双分支结构RGB 域与 RAW 域各司其职CycleISP 的一个关键设计是把处理分成两个域RAW 域和 RGB 域。为什么这么分因为真实噪声主要产生在 RAW 域传感器读出噪声、暗电流噪声都发生在去马赛克之前而色彩、亮度这些感知相关的处理发生在 RGB 域。如果只在 RGB 域加噪就丢掉了 RAW 域噪声的物理特性如果只在 RAW 域处理又没法模拟后续 ISP 对噪声的放大和染色。所以它的结构大致是干净 RGB 图先经过一个“反向 ISP”模块变到 RAW 域在 RAW 域加噪再经过一个“正向 ISP”模块变回 RGB 域得到合成的带噪 RGB 图。去噪方向则反过来带噪 RGB 图经过反向 ISP 到 RAW 域在 RAW 域去噪再正向 ISP 回 RGB 域。两个方向共用同一套 ISP 模块保证一致性。这个设计的精妙之处在于它把“噪声生成”和“噪声去除”放在同一个物理框架下网络学到的不是某个固定噪声分布而是 ISP 过程本身。这样合成数据的多样性来自 ISP 参数的变化而不是简单调高斯噪声的方差。2.3 为什么用可学习 ISP 而不是固定管线有人会问真实相机的 ISP 管线不是已知的吗为什么不直接照着实现一套固定的原因有两个。第一不同厂商的 ISP 参数差异巨大你没法拿到所有相机的完整管线第二固定管线不可微没法端到端训练。CycleISP 把 ISP 的关键步骤去马赛克、色彩校正、色调映射、伽马校正等用可学习的卷积或小型网络近似既保留了物理结构又能通过数据驱动调整参数。实测下来这种可学习 ISP 的泛化性明显好于固定管线。我在一个模拟项目里对比过用固定高斯噪声训练的模型在真实手机照片上 PSNR 大概只有 28 左右换成 CycleISP 风格的合成数据后同结构模型能到 31 以上纹理保留也更好。当然这个数字因数据集而异但趋势是稳定的。3. 核心模块细节与实操要点3.1 反向 ISP从 RGB 回到 RAW 域的关键步骤反向 ISP 的目标是把一张已经经过 ISP 处理的 RGB 图还原成近似 RAW 域的数据。这一步在数学上是病态的因为 ISP 过程中有信息丢失比如去马赛克、压缩。CycleISP 的做法是用一个卷积网络来近似这个逆过程输入是 RGB 三通道输出是 RAW 域的四通道对应 Bayer 阵列的 RGGB 排列。实操时要注意几点。第一Bayer 排列的选择要和你的目标相机一致常见的是 RGGB但也有 GRBG、GBRG 等变体选错了后续加噪位置就全偏了。第二反向 ISP 网络的感受野要足够大因为去马赛克逆过程需要邻域信息建议至少堆叠 5 层以上 3x3 卷积或者用空洞卷积扩大感受野。第三训练反向 ISP 时最好有配对的 RGB-RAW 数据如果没有可以用循环一致性损失来约束但收敛会慢一些。提示如果你手头没有 RAW 数据可以先用公开的 RAW 数据集做预训练再在自己的数据上微调。直接从头训循环一致性很容易陷入平凡解即反向 ISP 和正向 ISP 互相抵消但都没学到东西。3.2 RAW 域加噪噪声模型的选择与参数到了 RAW 域加噪就相对自由了。CycleISP 里用的是信号相关噪声模型大致形式是噪声方差 读出噪声方差 信号强度 × 泊松噪声系数。这个模型比纯高斯更贴近传感器物理。具体实现时读出噪声方差和泊松系数可以作为可学习参数也可以从真实数据里估计。我一般会这样做先拿一组同场景的短曝光和长曝光 RAW 图用两者的差值估计噪声水平拟合出读出噪声和泊松系数的初值再让网络在这个初值附近微调。这样比随机初始化收敛快很多也不容易跑偏。参数范围上读出噪声标准差通常在 1 到 5 个 ADU 之间泊松系数在 0.001 到 0.01 之间具体看传感器增益。另外加噪的位置也有讲究。是在去马赛克之前加还是之后加CycleISP 选择在 RAW 域加也就是去马赛克之前。这符合物理事实因为传感器噪声确实产生在去马赛克之前。如果你在 RGB 域加噪就相当于假设噪声是在 ISP 之后引入的这和真实情况不符。3.3 正向 ISP从 RAW 回到 RGB 的还原正向 ISP 要把加噪后的 RAW 数据变回 RGB模拟真实相机的成像过程。这一步包含去马赛克、白平衡、色彩校正矩阵、伽马校正、色调映射等。CycleISP 用可学习模块分别近似这些步骤其中去马赛克用卷积实现色彩校正用 1x1 卷积或全连接伽马和色调映射用逐点非线性。这里有个容易踩的坑伽马校正和色调映射是非线性的如果直接用 ReLU 之类的激活去拟合容易在暗部产生伪影。我的经验是用可学习的幂函数或者分段线性函数初始值设成标准 sRGB 的伽马 2.2让网络在此基础上微调。这样既保留了物理意义又给了网络调整空间。还有一个细节是色彩校正矩阵的约束。真实的色彩校正矩阵通常是接近对角占优的如果放任网络学可能会学出很奇怪的矩阵导致颜色偏移严重。可以在损失里加一个正则项约束矩阵偏离单位阵的程度或者直接把矩阵参数化成正交矩阵加对角缩放。3.4 循环一致性损失与对抗损失的配合CycleISP 的训练损失一般包含三部分循环一致性损失、对抗损失、以及可选的监督损失。循环一致性保证正向和反向 ISP 互为逆过程对抗损失让合成的带噪图在分布上接近真实带噪图监督损失在有配对数据时加速收敛。权重分配很关键。我试过的配置是循环一致性权重 1.0对抗损失权重 0.1 到 0.5监督损失权重 1.0如果有配对数据。对抗损失权重太高会导致训练不稳定合成图出现棋盘伪影太低则起不到拉近分布的作用。建议先用小权重跑起来观察合成图和真实图的直方图差异再逐步调整。注意对抗训练对超参很敏感学习率建议比普通训练小一个数量级判别器更新频率也要控制一般判别器更新一次生成器更新一次或者判别器更新两次生成器更新一次看稳定性。4. 完整实操流程与关键环节实现4.1 数据准备与预处理先说你需要的原料。干净 RGB 图可以从公开数据集里拿比如 DIV2K、Flickr2K 这类高分辨率图库也可以用自己的照片。带噪 RGB 图用于对抗训练最好来自真实相机覆盖不同 ISO、不同光照条件。如果有配对的 RAW-RGB 数据就更好了可以拿来预训练 ISP 模块。预处理步骤我一般这么走先把所有图统一到线性 RGB 空间如果是 sRGB 图先反伽马变到线性然后裁剪成 256x256 的 patch太小了感受野不够太大了显存吃不消最后做数据增强随机翻转、旋转、轻微色彩抖动。注意色彩抖动幅度不要太大否则会破坏 ISP 的物理一致性。对于 RAW 数据要确认 Bayer 排列并做归一化通常除以最大位深比如 12 位就是 4095变到 0 到 1 之间。如果 RAW 有黑电平要先减掉黑电平再归一化这一步很多新手会漏导致噪声估计偏大。4.2 网络搭建与参数初始化网络搭建上反向 ISP 和正向 ISP 可以共用一套骨干结构比如 U-Net 或者残差网络。我倾向于用轻量级 U-Net下采样 3 次通道数从 32 开始翻倍这样参数量在 1M 到 5M 之间单卡就能训。RAW 域加噪模块不需要网络直接按噪声模型采样即可但噪声参数如果是可学习的就用几个标量变量表示。初始化方面正向 ISP 里的伽马参数初始化成 2.2色彩校正矩阵初始化成单位阵白平衡增益初始化成 1。反向 ISP 的权重用 He 初始化。噪声模型的读出噪声标准差初始化成 2.0泊松系数初始化成 0.005。这些初值不是拍脑袋是从常见传感器手册和公开数据里总结的能让你少走弯路。4.3 训练策略与学习率调度训练分两阶段比较稳。第一阶段只训循环一致性让正向和反向 ISP 先能互逆学习率 1e-4跑 50 个 epoch 左右。第二阶段加入对抗损失和去噪任务损失学习率降到 1e-5再跑 50 到 100 个 epoch。优化器用 Adambeta 设成 0.9 和 0.999。学习率调度用余弦退火或者阶梯下降都行我习惯用余弦退火每 20 个 epoch 重启一次效果比较稳。batch size 看显存8 到 16 都可以太小了对抗训练不稳定太大了收敛慢。如果显存不够可以用梯度累积模拟大 batch。训练过程中要监控几个指标循环重建误差、合成图与真实图的分布距离比如用 FID 或者简单的直方图 KL 散度、以及去噪任务在验证集上的 PSNR/SSIM。如果循环误差下降但分布距离不降说明对抗损失权重不够如果分布距离降了但去噪指标变差说明合成数据可能过拟合到对抗目标丢了细节。4.4 去噪模型训练与合成数据使用合成数据生成好之后就可以拿去训去噪模型了。这里有个策略选择是把合成数据单独用来训还是和真实配对数据混合训我的经验是混合训更好。合成数据提供多样性和覆盖度真实数据提供准确的分布锚点。混合比例大概 3:1 到 5:1合成占大头。去噪模型的结构可以选 U-Net、Restormer、NAFNet 这些看你手头算力。训练损失用 L1 或者 Charbonnier 损失比 L2 更不容易过平滑。如果追求感知质量可以加一点感知损失或者对抗损失但权重别太高否则 PSNR 会掉。实测下来用 CycleISP 合成数据训出来的模型在真实手机照片上的主观质量明显好于纯高斯合成数据训的。具体表现是暗部噪点去得更干净边缘纹理保留更好颜色偏移更小。当然这不是说 CycleISP 就完美了它在极端低光下还是会有残留噪声因为合成数据的噪声模型在极低信噪比下可能不够准。5. 常见问题与排查技巧实录5.1 合成图出现颜色偏移怎么办颜色偏移是这套流程里最常见的问题表现是合成带噪图整体偏绿、偏紫或者偏黄。原因通常有三个色彩校正矩阵学歪了、白平衡增益跑飞了、或者伽马参数不对。排查时先把正向 ISP 的中间输出可视化出来看是哪一步开始偏的。如果是色彩校正矩阵的问题加一个正交约束或者对角占优正则把矩阵拉回合理范围。如果是白平衡检查训练数据里是否有极端色温的图有的话要么剔除要么做色温归一化。伽马参数的话确认初始化是 2.2并且约束在 1.8 到 2.6 之间别让它乱跑。提示可以在损失里加一个颜色恒常性损失约束合成图和输入干净图的平均色度接近这样能有效抑制颜色漂移。5.2 对抗训练不稳定、合成图有伪影对抗训练不稳定表现为损失震荡、合成图出现网格状或条纹状伪影。这通常是判别器太强或者学习率太大导致的。解决办法降低判别器学习率或者给判别器加谱归一化限制它的 Lipschitz 常数。还可以用标签平滑把真实样本标签从 1 改成 0.9让判别器别太自信。伪影的另一个来源是去马赛克模块的棋盘效应。如果你用的是转置卷积做上采样很容易出现棋盘伪影。换成最近邻上采样加卷积或者用像素洗牌能明显改善。我在一个模拟项目里把转置卷积换成像素洗牌后伪影基本消失了。5.3 真实场景泛化仍然不好怎么调如果合成数据训完真实场景还是不行先别急着换模型按这个顺序排查第一检查合成数据和真实数据的噪声水平是否匹配可以拿几张真实带噪图估计噪声方差和合成图的噪声方差对比差太多就调整噪声模型参数第二检查 ISP 参数是否覆盖了目标相机的特性比如目标相机色调偏冷你的合成数据全是暖色调那肯定泛化不好第三检查去噪模型是否过拟合到合成数据的特定模式可以加一点真实数据做微调。还有一个容易被忽略的点真实照片的噪声往往和内容相关平坦区域噪声明显纹理区域噪声被掩盖。如果你的合成数据没有模拟这种内容相关性模型在平坦区域就会去不干净。可以在加噪时根据局部方差调整噪声强度让平坦区域噪声更大纹理区域噪声更小。5.4 常见问题速查表问题现象可能原因排查方法解决措施合成图颜色偏移色彩矩阵学歪、白平衡跑飞可视化中间输出加正交约束、色温归一化对抗训练震荡判别器太强、学习率大看损失曲线谱归一化、标签平滑、降学习率合成图有棋盘伪影转置卷积上采样看伪影形状换像素洗牌或最近邻上采样真实场景泛化差噪声分布不匹配对比噪声方差调整噪声模型、加真实数据微调暗部噪点去不净噪声模型未覆盖低光看暗部残差增加低光合成样本、调泊松系数训练不收敛循环一致性陷入平凡解看循环重建误差预训练 ISP、加监督损失5.5 几个我踩过的坑第一个坑是 Bayer 排列搞错。我一开始没注意用了 RGGB 的模型去处理 GRBG 的数据结果加噪位置全偏合成图出现规律性色斑。后来写了个检查脚本自动从 RAW 元数据里读排列才解决。第二个坑是噪声参数初始化太随意。有次把泊松系数初始化成 0.05比正常值大一个数量级结果合成图噪点密到看不清内容训练直接崩了。后来老老实实按传感器手册估初值稳定多了。第三个坑是忘了反伽马。有次直接用 sRGB 图当线性图训合成图整体偏亮噪声分布也不对。后来在数据加载里加了反伽马步骤问题消失。这个坑很隐蔽因为图看起来“正常”但物理上不对。6. 合成数据质量的评估与迭代6.1 怎么判断合成数据够不够真评估合成数据质量不能只看去噪指标因为去噪指标好不代表合成数据真。我一般从三个维度看分布距离、视觉相似度、下游任务增益。分布距离可以用 FID 或者 KID算合成带噪图和真实带噪图在特征空间的距离视觉相似度靠人眼看重点看噪声的颗粒感、色彩、对比度是否自然下游任务增益就是拿合成数据训去噪模型看真实测试集上的表现。这三个维度里下游任务增益最实在但反馈慢分布距离快但有时和主观感受不一致。我的做法是先用分布距离快速筛选再用下游任务确认。如果分布距离很小但下游任务没提升说明合成数据可能只学到了表面统计没学到噪声的结构特性。6.2 迭代优化的方向合成数据不是一次就能调好的通常要迭代几轮。第一轮先把基本流程跑通合成图能看就行第二轮调噪声模型参数让噪声水平匹配目标相机第三轮调 ISP 参数让色彩和色调匹配第四轮加内容相关性让噪声分布更真实。每轮迭代都要保留验证集别在训练集上过拟合。我习惯留 10% 的真实带噪图做验证每轮结束跑一次去噪评估看指标是否提升。如果连续两轮不提升就停下来分析原因别盲目加轮次。6.3 和其他合成方法的对比方法噪声模型是否可学习真实感实现难度高斯白噪声固定高斯否低极低泊松-高斯信号相关部分中低固定 ISP 管线物理模型否中高中CycleISP 风格可学习 ISP是高高真实数据直接训无不适用最高低但数据难获取从表里能看出来CycleISP 风格的方法在真实感和可学习性上占优代价是实现复杂度高。如果你的场景对真实感要求不高或者算力有限泊松-高斯可能就够了。但如果你的目标是在真实照片上落地CycleISP 这套思路值得投入。7. 一些实操心得和后续扩展方向我在实际项目里用这套流程跑了大概半年最大的体会是数据合成的质量比去噪模型的结构重要得多。同样的 U-Net用高斯噪声训和用 CycleISP 风格合成数据训真实场景差距能有 2 到 3 个 dB。所以如果你在去噪上遇到瓶颈先别急着换模型回头看看训练数据是不是拖了后腿。另一个心得是ISP 模块的可学习参数不要放太多。我试过把整个 ISP 都用大网络替代结果参数量上去了泛化反而变差因为网络容易记住训练集的特定模式。后来改成只学关键参数伽马、色彩矩阵、噪声系数其余保持固定泛化明显更好。这说明物理先验还是有用的别全交给网络。后续扩展的话有几个方向可以试。一是把视频去噪也纳入进来因为视频噪声有时域相关性合成数据也要模拟这种相关性。二是把压缩伪影一起建模真实照片往往既有噪声又有压缩痕迹分开处理不如联合建模。三是做跨相机泛化让一套合成管线能适配多个相机型号这需要 ISP 参数的条件化设计。最后分享一个小技巧如果你没有 RAW 数据可以用同一场景的多次拍摄来估计噪声。拍 10 张短曝光图取平均当干净图单张减平均当噪声这样能拿到近似配对的噪声样本用来校准你的噪声模型。这个方法不需要专业设备手机就能做实测挺管用。
阅读完成 · 觉得有帮助?
咨询建站