这几天梳理底层视觉方向的笔记,又把单幅图像去雨这个老问题翻出来重新过了一遍。标题里这篇工作做的是 Rain Streak Removal for Single Image via Kernel Guided CNN,核心可以压缩成一句话:不要直接让整个卷积网络黑盒地去学雨纹残差,而是先用一个可学习的核(kernel)去估计雨纹的局部结构,再用这个结构信息去引导后续网络做干净的背景恢复。这个方法恰好站在传统先验建模和纯数据驱动端到端网络之间,代表性很强,也很有启发。
想读明白这篇工作的,通常有两类人:一类是刚进图像复原方向的研究生,需要快速理解“结构引导网络”的常见设计套路;另一类是实际项目里要加图像预处理模块的工程师,想判断核引导这种设计在成本、效果、部署上到底值不值。这篇博文就按论文阅读笔记的方式,讲清楚它解决的痛点、方法骨架、实验呈现,以及我在复现和理解这类结构时比较关注的问题。
1. 先弄明白:单幅图像去雨这道题到底难在哪
1.1 本质上是个信号分解问题
单幅图像去雨,任务定义非常简单:给定一张带雨纹的图 O,恢复出干净的背景图 B。传统上会把退化过程写成 O = B + R,有些场景还会写成 O = B ⊙ M + R,其中 R 是雨纹/雨滴层,M 是雨痕造成的遮挡掩膜。
看起来是做一次“加法逆运算”,但真正的麻烦在于:一张输入图可以分解成无数种 (B, R) 组合。哪怕 R 取极小值、B 几乎等于原图,也能在数值上“满足方程”;反过来让 R 把所有纹理都捞走,B 变得一片模糊,同样也能自圆其说。这就是典型的病态(ill-posed)问题。
所以所有去雨方法,本质上都是在干同一件事:给这个病态问题补充额外约束,让网络或优化算法在众多可行解里挑出“最像真实背景”的那一个。约束来自哪里,不同方法的路线就从哪里分岔。传统方法从图像内部统计特性里找,深度学习方法从大数据配对样本里学,而这篇文章的思路,是想把“雨纹长什么样”这种知识作为可学习的先验,直接嵌入到CNN的结构里。
1.2 难在约束不足、先验难找、数据不真实
除了病态性,去雨任务还有几个非常实际的坎。
第一,雨纹的形态差异极大。细密雨丝、大雨滴形成的椭圆斑、雨雾混合造成的整体模糊、夜间光照下的高亮雨线,它们的视觉特征完全不同。没有任何一个简单的统计先验能同时描述所有情况。
第二,真实的雨图没有配对标签。我们无法拿到“同一场景、同一时刻、有雨没雨”的两张图,所以训练数据只能靠合成。合成数据里用PS来叠加雨纹,和真实相机拍摄到的雨纹之间始终存在域差异。这也是很多去雨模型在合成指标上跑得很高、一到真实照片就露馅的原因。
第三,雨纹和背景纹理在频带、方向、尺度上都有重叠。很多雨纹是高频的、是细长的,但背景里的栏杆、树枝、建筑边缘同样可以是高频且细长的。网络如果只算一个全局残差,很容易把真实边缘一起削掉,造成背景结构损伤。
在进入核引导方法之前,有必要看一眼方法谱系,方便后面理解它的位置:
| 方法类别 | 核心思路 | 优点 | 典型问题 |
|---|---|---|---|
| 传统优化 | 利用稀疏字典、低秩、高斯混合模型等手工先验近似雨纹 | 可解释性高、无需数据 | 先验表达能力有限,复杂场景崩 |
| 端到端CNN | 直接在合成数据上学 O→B 的映射 | 效果好、速度快 | 依赖训练数据,可解释性差 |
| 物理/结构引导网络 | 把某种可微的物理模型或结构先验塞进网络 | 兼顾学习能力与可解释性 | 引导设计本身有讲究,需谨慎 |
| 生成对抗方法 | 用判别器约束输出图像分布 | 视觉质感好 | 训练不稳定,容易出现假纹理 |
核引导CNN属于第四类路线里相当典型的一种。它不打算完全抛弃手工先验,也不愿意被黑盒网络牵着走,而是挑了一个轻量、可微、可学习的结构核,作为网络内部的“罗盘”来用。
2. 核引导CNN的整体思路:把“雨纹长什么样”这个先验,做进网络结构里
2.1 kernel是什么:用结构化的假设换学习效率
先解释术语。标题里的 Kernel Guided,直译是“核引导”,这里的核不是图像处理里常见的那些固定卷积核,也不是支持向量机里的核函数,而是用来刻画雨纹局部退化模式的一组参数化函数。
说得再具体一点:雨滴在成像时,由于曝光时间内的运动和镜头光学特性,会在图像局部形成带有方向性的模糊痕迹。这种痕迹可以近似成某个方向上拉长的高斯核,或者带有角度参数的椭圆核。如果我们能估计出每个像素位置最合适的核参数,就相当于拿到了雨纹的“方向地图”和“强度地图”。
这正是这篇文章强调引导的关键点。与其让网络从零开始理解什么叫雨纹,不如先给网络递一张纸条,告诉它:雨纹大致在这个方向、这个尺度、这个位置上分布。网络后续做分离时就有了明确依据,学习和推理都会容易很多。
我类比过很多次:把去雨比作在一堆混在一起的叠层文件里把某一页抽出来。端到端网络是一个蒙着眼睛的助手,靠手感去抽,抽多了自然熟练;核引导方法先让助手戴上一副透视镜,这层透视镜不保证百分之百准确,但已经标出了那页纸的位置和方向,剩下的抽取动作就容易了。
2.2 引导机制:引导信息是怎么进入网络的
知道了核是什么,下一个问题是:核信息以什么形式、在哪个阶段进入CNN。这直接关系到方法能不能work。
从这类引导型网络的成熟设计来看,可以还原出几条路径:
- 通道拼接:把核响应图和原始雨图在通道维度上拼接起来,作为网络最底层的输入。这种方式最简单,适合显存不充裕的情况,但缺点是引导信息只在浅层起作用,越深的网络层越容易“忘掉”引导信号。
- 分层融合:不仅在最底层拼接,还在网络中间层的特征图上再次注入核响应信息,让网络能从不同尺度反复参考结构先验。
- 门控调制:把核信息经过一个小型网络映射成逐通道、逐像素的调制系数,用它去缩放主网络的特征图。这种设计比单纯的拼接更精细,可以让网络学会“什么时候该听引导、什么时候该忽略”。
对照标题里的核引导思想,最合理的还原是:这类方法往往有两个分支——一个分支专门负责估计核参数或者说核响应图,另一个分支是主去雨网络,接收原始雨图的同时,把核分支的输出作为引导条件。整个结构看起来像是一条主干道加一条导航侧路,导航侧路的输出不断汇入主干道。
2.3 网络结构怎么搭:核估计模块 + 去雨模块
如果我要根据这个标题搭一个可复现的原型,通常会拆成三个部分。
第一,浅层特征提取骨干。用两三个卷积层把输入雨图从像素空间编码到特征空间,得到基础特征图。这一步的目的不是去雨,而是把颜色、亮度、边缘等基础信息整理成更容易处理的中间表达。
第二,核估计模块。在浅层特征上做一次池化或下采样,然后通过一系列卷积和全连接/卷积输出得到每像素对应的核参数。这里输出通道的数量取决于核的表示方式。如果我们用方向角度、长度、宽度三个参数描述一个高斯核,那输出就是三个通道的响应图;如果想把多个方向的雨纹同时刻画,输出可能就是若干个通道的堆叠。
第三,引导去雨模块。这是主网络的堆叠部分,通常采用编码器-解码器结构。在多个下采样层级上,把核估计模块输出的响应图经过简单的卷积映射后,与主网络的特征图进行拼接或者点乘调制,再继续后续的复原计算。最后通过上采样和残差连接,输出干净背景图。
这种结构设计有一个很现实的好处:核估计模块的参数量很小,主网络可以复用很多现成的去雨骨干结构,整体训练开销比从零设计一个大网络低得多。工程上如果想在旧系统里试点核引导思路,改动也可以控制在比较小的范围内。
2.4 训练的典型细节与损失设计
虽然拿不到原论文的训练日志,但这类结构引导网络的训练配置是有很强共性的,照常见实践去理解基本不会跑偏。
数据方面,训练集基本都是在户外清晰图像上程序化合成雨纹得到的图对。合成方式一般有两种:一种是在随机方向叠加半透明的长条高斯补丁来模拟雨丝;另一种是加上雨滴镜头效果,让局部出现不规则模糊和折射。现在的开源去雨数据一般混合多种雨强,从细雨到大雨都有覆盖。
损失函数方面,最常见的组合是 L1 损失加上感知/SSIM 类约束。L1 的优点是稳定、好收敛,对大雨区域不容易出现过度平滑;SSIM 类损失则用来补足结构相似度,防止网络把背景细节也一起抹掉。如果核估计模块是单独训练或加辅助监督的,还会在核响应图上做平滑正则,避免相邻像素的核参数跳变太剧烈,导致去雨结果出现块状伪影。
训练细节上,输入通常裁成 256×256 大小的补丁,优化器用 Adam,初始学习率设在 1e-4 到 3e-4,配合余弦退火或阶梯式下降。批大小看显存,一般 8 到 16 都能接受。核引导结构的训练比纯端到端要稳一些,因为引导信号等效于给网络加了结构先验,降低了搜索空间的无效徘徊。
3. 论文实验部分最值得关注的三个点
3.1 合成数据上的指标对比:PSNR和SSIM能说明什么
任何去雨论文都免不了在合成数据集上晒PSNR和SSIM,这篇应该也不例外。PSNR衡量像素级误差,SSIM衡量局部结构相似度。两者配合基本能反映“去雨干净程度”和“背景保真程度”。
但读实验部分不能只看均值,我通常会再看两个隐藏信息。
第一,在雨强不同、纹理复杂度不同的子集上,分项指标是不是稳定优于其他方法。有些方法在中度雨纹上表现很好,换到大雨、夜间或者细密小雨场景就垮掉,这种分项差异比总分数更有判断价值。
第二,指标提升和视觉提升是否一致。PSNR高并不等于看起来舒服,因为PSNR对全局轻微偏移比较敏感,对局部的纹理造假却不够敏感。如果一篇论文的指标提升明显、但放出的对比图里背景细节有明显涂抹痕迹,那这个方法的“分数”就要打个折扣。这也是我建议读论文时把PSNR/SSIM表和定性对比图放在一起看的原因。
3.2 消融实验为什么去掉核引导就掉点
消融实验是一篇去雨论文最诚实的部分,也是我最先看的部分。对核引导方法来说,最关键的消融是:把核估计分支和引导注入全部拿掉,只留一个主干深度网络,效果会掉多少。
从这类方法的逻辑来推断,掉点几乎是必然的。去掉核引导之后,网络丧失了雨纹方向的先验提示,所有判断都要靠数据驱动自己摸索。这时会有两个典型问题:一是面对训练集里没见过的雨纹角度,网络容易把雨纹残留下来;二是在纹理密集区域,网络为了消除雨纹会把真实的边缘结构误伤掉。
如果这篇论文的消融表能把核引导去掉之后的PSNR下降幅度展示出来,并且配上对应的视觉对比图,那基本可以证明:引导信息不是可有可无的装饰,而是把模型的归纳偏置真正用在了刀刃上。反之,如果消融下来指标几乎没变化,那说明这个核引导模块只是“存在”,并没有真正发挥结构约束作用。
3.3 真实场景的泛化验证:要从哪里找证据
合成数据上的指标再漂亮,也必须在真实拍摄的雨天图上“验货”。真实场景没有Ground Truth,自然没法算PSNR,所以论文通常放真图对比,靠视觉质量说话。
读真实对比图时,我习惯关注三类区域:
- 天空和大面积平滑区:这里最容易残留大面积雨纹,也最容易出现颜色偏蓝、亮度偏暗等色偏问题。
- 树木和密集纹理区:去雨算法在这里常犯两类错误,要么雨纹没去干净,要么把枝叶细节磨成了糊状。
- 不规则反光区:车窗、地面水渍、霓虹灯倒影,这些区域的退化并不符合简单的高斯雨纹假设,核引导方法有时会失效,输出会显得“塑料感”很重。
如果论文在真实场景里能拿出一组光线和场景差异较大的对比图,即便只是肉眼判断,也比只看合成指标有价值得多。
4. 读完论文之后,我对这类方法的几点思考
4.1 核引导方法的边界与适用前提
读完这篇工作后,我最大的感受是:核引导不是万能药,它更像是在“纯数据驱动”和“强手工先验”之间取了一个性价比很高的折中点。
它适合的场景特征很清晰:退化模式比较规整、可以用少数几个参数做近似。雨纹、部分雨滴造成的模糊、甚至某些方向性噪声,都属于这一类。
但它的边界也很明显。如果退化非常复杂,远超出核函数的表达范围,比如雨雾混合、强反光、夜间光污染,单靠几个方向和尺度参数来引导网络就会捉襟见肘。另外,核函数本身的表示能力决定了引导信号的质量,如果选的核形态和真实退化模式根本不匹配,引导可能反而变成误导。
这也解释了一个后续趋势:现在很多方法不再局限于几类固定的核表达,而是让网络在数据驱动下自动发现更灵活的结构先验,再把这种结构先验通过类似引导机制注入主网络。思想内核和这篇论文一脉相承,只是把“核”变得更自由了。
4.2 如果我来复现,从哪几步开始
我这两年复现过不少类似“先验引导”的图像复原网络,基本流程可以沉淀成这样:
第一步,先搭一个干净的编码器-解码器骨干,不接任何引导模块,在去雨数据集上跑通一个基础版本,把训练管线、数据增强、评测脚本全部调通。这一步是为了确认所有后续改动都能落在稳定基线上。
第二步,加入核估计分支,输出方向角、长度、宽度(或直接是多通道的核响应图),用简单的拼接方式在主干网络的浅层注入。先不追求最好效果,只验证一点:加入引导后训练是否稳定、收敛是否比纯主干更快。
第三步,把拼接改成更精细的调制方式,比如在多个尺度上用门控调制。这一步通常效果提升最明显,因为网络在不同感受野下都能参考结构先验,对大雨和密集纹理的处理都会更自然。
第四步,调整损失组合。我会在L1之外加上一个轻量的核响应平滑正则,再根据验证集效果决定要不要加SSIM约束。
整个调试过程里我踩过不少坑,这里顺便提一句:加引导模块后最常遇到的问题不是降点,而是训练初期梯度波动偏大。解决办法很简单,把核估计分支的初始权重视为相对保守的值,或者先冻结主网络只训练核分支几百步,等核响应图大致成形后再联合训练,稳定度会好很多。
4.3 从这篇工作往后看:可学习的物理先验
这篇论文放在今天看,历不历史不好说,但它代表了一个很重要的设计范式:在深度学习框架里,把物理先验或结构先验做成可微模块并嵌入网络,让网络不仅会拟合,还理解了“该往哪拟合”。
后面的很多工作不过是把“核”这个概念的窗口开得更大了。有的把单核扩展成多核集合,让不同尺度、不同方向的雨纹各拿一个核去匹配;有的把核估计过程展开成迭代优化步骤,每次迭代都用上一轮的残差结果来修正核参数;还有的干脆完全抛弃显式的核函数,用自注意力机制动态捕捉局部方向相关性,本质上也是一种隐式的核引导。
对我来说,这篇工作的最大价值不是刷了多少分,而是提供了一个思路:当一个问题足够病态时,与其把全部希望押在更大的网络规模上,不如先认真想想有没有低成本的结构信息可以借力。核引导本质上就是在问一个问题:关于这个任务,我到底知道多少,以及我能不能把知道的这部分知识以一种优雅的方式交给网络。
最后说点实在的。如果你也想跟着这个思路去复现或者做实验,我的建议是别急着抠论文里的每个模块细节,先把引导信号可视化出来,看看它到底有没有对齐雨纹的真实方向和位置。引导对了,结构才成立;引导错了,再强的主网络也救不回来。这比任何花哨的网络改动都更值得花时间。