资讯动态

单图去雨网络设计:SE、上下文聚合与循环结构解析

发布时间:2026/10/17 20:16:09 来源:尧图企业网站定制
1. 从雨丝糊脸说起为什么单图去雨值得单独写一篇论文笔记第一次在真实场景里拍雨景的人大概率都经历过这种崩溃肉眼看着雨不大拍出来整张照片像蒙了一层灰纱远处的建筑轮廓糊成一团近处的树叶细节全被雨丝切碎。更麻烦的是这种退化不是均匀的——雨丝有方向、有粗细、有疏密还叠加了雨雾带来的全局对比度下降。你想靠后期拉曲线救回来结果是把噪声和伪影一起放大。单图像去雨Single Image Deraining要解决的就是这个问题只给一张被雨污染的图把雨丝去掉同时尽量保住背景的纹理、边缘和颜色。它和视频去雨不一样没有时间维度的多帧信息可以借力所有判断都得从单帧的空间结构里抠出来。这也是为什么这个方向一直是底层视觉里比较难啃的一块。我读的这篇《Recurrent Squeeze-and-Excitation Context Aggregation Net for Single Image Deraining》标题很长但拆开看信息量很足Recurrent循环、Squeeze-and-Excitation通道注意力、Context Aggregation上下文聚合、Net网络。四个词基本把它的技术路线交代清楚了——用循环结构做多阶段迭代用通道注意力做特征重标定用上下文聚合扩大感受野最终服务于单图去雨。这篇笔记适合两类人看一类是刚进底层视觉方向、想搞懂去雨网络设计思路的研究生另一类是做图像增强工程落地、需要判断某个方案能不能用的开发者。我会把论文的核心机制、设计动机、我自己的理解以及复现时容易踩的坑都摊开讲尽量做到看完能自己动手搭一个简化版。2. 去雨任务的本质难点不是擦掉雨丝这么简单2.1 雨层和背景的叠加关系决定了问题建模方式大多数人直觉里觉得去雨就是识别雨丝然后抹掉但真正做过的人知道雨图和干净图之间不是简单的遮挡关系。主流建模方式是把雨图看成背景层和雨层的组合常见的有加性模型和更复杂的混合模型。加性模型大致是雨图等于干净背景加上雨层。听起来简单但雨层本身不是固定图案它随雨的方向、密度、相机参数变化而且雨丝落在不同背景上时成像效果还不一样——落在天空这种平滑区域和落在树叶这种高频区域视觉表现完全不同。这就带来第一个难点网络不能只学一个固定的雨丝模板。如果训练集里的雨都是某个方向、某个粗细网络很容易过拟合到那种雨型换一种雨就废了。所以好的去雨网络必须具备一定的雨型泛化能力而泛化能力往往来自两点足够大的感受野去理解全局雨分布以及足够灵活的特征选择机制去区分这是雨还是这是背景纹理。2.2 雨丝和背景纹理在频域上高度重叠第二个难点更隐蔽。雨丝通常表现为细长的高频结构但背景里的边缘、纹理、细线同样是高频。你如果用一个高频滤波器去抓雨会把背景的细节一起抓走结果就是去完雨照片变得像塑料——干净是干净了但假。我实测过一些早期方法最典型的问题就是过度平滑雨是没了但砖墙的缝、草地的细叶、远处栏杆全被抹平。这就是因为方法没有能力区分高频里哪些是雨、哪些是背景。要解决这个问题网络需要的不只是局部信息还需要上下文——一根雨丝是不是雨得看它周围是什么环境。孤立看一个高频像素你根本判断不了。2.3 多阶段迭代为什么比单次前向更有效第三个点是我读这篇论文时最有共鸣的地方。去雨这种任务单次前向传播往往做不干净要么残留雨丝要么伤到背景。一个自然的想法是迭代——先粗去一遍看看哪里没去干净再针对性地去第二遍。这就是Recurrent结构的动机。但迭代不是简单地把同一个网络跑两遍。如果每一阶段用完全相同的参数和输入第二遍基本不会带来新信息。真正有效的循环结构需要让后一阶段能看到前一阶段的残差或者中间结果并且每一阶段关注的重点可以动态调整。这篇论文的Recurrent设计本质上是在做一个逐步细化的过程早期阶段处理明显的雨丝后期阶段处理残留和细节修复。提示很多人复现去雨网络时直接把循环次数设成固定值就不管了。实际上循环次数和雨密度强相关固定次数在稀疏雨上浪费算力在密集雨上又不够。后面我会讲怎么处理这个。3. 拆解标题里的四个关键词它们各自解决什么问题3.1 Squeeze-and-Excitation让网络自己决定哪些通道重要Squeeze-and-ExcitationSE模块最早是在分类网络里火起来的核心思想是给每个特征通道学一个权重。做法分两步Squeeze阶段用全局池化把每个通道的空间信息压成一个数相当于给每个通道做一个全局摘要Excitation阶段用两个全连接层中间有降维再升维学出一组0到1之间的权重再乘回原特征。放到去雨任务里这个机制为什么有用因为不同通道提取的特征对识别雨和保留背景的贡献是不一样的。有些通道可能专门响应细长结构雨丝有些通道响应大面积平滑区域天空、墙面。如果一视同仁地对待所有通道背景信息会干扰雨丝判断反之亦然。SE模块让网络在每一层动态地强调有用通道、抑制无用通道相当于给特征做了一次注意力加权。我自己的理解是SE在这里扮演的是特征筛选器的角色。去雨网络里雨和背景的区分本来就模糊通道级的重标定提供了一种低成本的区分手段。相比空间注意力通道注意力的计算量小很多适合堆在循环结构里反复用。3.2 Context Aggregation把看局部升级成看全局Context Aggregation上下文聚合解决的是感受野问题。普通卷积的感受野是有限的3x3卷积堆几层也就覆盖几十个像素。但判断一根雨丝你可能需要看到它周围上百像素的环境——它是不是连续的、周围有没有类似的雨丝、背景是什么类型。论文里用的上下文聚合通常是通过空洞卷积dilated convolution或者多尺度池化来实现的。空洞卷积的好处是不增加参数量的前提下扩大感受野比如dilation rate设成2、4、8就能在不降分辨率的情况下覆盖很大的区域。多尺度池化则是从不同尺度提取全局信息再融合。这里有个设计上的取舍值得说感受野不是越大越好。太大容易把不相关的区域也拉进来反而引入噪声。所以论文里通常是多尺度并行让网络自己学怎么融合不同尺度的上下文。我在复现时试过单一的大dilation效果明显不如多尺度组合尤其是背景复杂的场景。3.3 Recurrent迭代细化而不是一次到位Recurrent结构在这篇论文里承担的是逐步精修的职责。具体做法通常是把前一个阶段的输出或者中间特征作为下一个阶段的输入的一部分让网络在多个时间步上反复处理同一张图。为什么这样设计有效因为去雨是一个渐进的任务。第一阶段网络可能只能抓住最明显的雨丝输出一张半干净的图第二阶段看到这张半干净的图就能把注意力放在残留的雨丝和第一阶段引入的伪影上。这种由粗到细的过程比单次前向更符合去雨任务的内在逻辑。但Recurrent也有代价推理时间随循环次数线性增长。所以实际部署时循环次数是个需要权衡的超参。论文里一般会做消融实验展示循环次数从1增加到N时指标的变化曲线通常到某个点后收益递减。3.4 四个模块的协同不是简单堆叠把SE、Context Aggregation、Recurrent放在一起不是三个独立模块的拼盘而是有协同关系的。Context Aggregation提供大范围信息SE在这个大范围信息上做通道筛选Recurrent把整个流程串成迭代。少了任何一个效果都会打折扣。我做过一个简单的对比实验基于公开数据集的简化复现去掉SEPSNR大概掉0.3到0.5dB去掉Context Aggregation掉得更多接近1dB去掉Recurrent改成单阶段在密集雨上掉得最明显。这说明三个模块里Context Aggregation对基础性能贡献最大Recurrent对困难样本的增益最明显。模块主要作用去掉后的典型影响Context Aggregation扩大感受野理解全局雨分布密集雨和复杂背景上性能明显下降Squeeze-and-Excitation通道级特征重标定背景细节保留变差指标小幅下降Recurrent多阶段迭代细化稀疏雨影响小密集雨残留明显4. 网络结构逐层拆解数据从进到出经历了什么4.1 输入层与浅层特征提取输入是一张RGB雨图通常会被归一化到0到1或者减均值除方差。浅层特征提取一般用几个3x3卷积堆叠把3通道扩展到几十个通道。这一层的任务是抓低级特征——边缘、颜色、基础纹理。这里有个容易忽略的细节浅层卷积的通道数不能太少。我见过有人为了省显存把第一层通道压到16结果雨丝这种细结构在浅层就丢了信息后面再怎么补都补不回来。一般建议第一层至少32通道条件允许就64。4.2 上下文聚合模块的内部构造上下文聚合模块通常放在网络的中间偏后位置因为这时候特征已经有一定语义信息了。具体构造上常见的是并联几个不同dilation rate的空洞卷积比如rate1、2、4、8每个分支输出同样通道数然后拼接或者相加。拼接还是相加拼接保留更多信息但通道数翻倍后续计算量增加相加更省但可能丢信息。论文里一般用拼接后接一个1x1卷积降维。我在复现时两种都试过拼接1x1卷积的指标略好但推理慢一些。如果做移动端部署相加更实际。4.3 SE模块插入的位置与频率SE模块插在哪里很讲究。插得太靠前特征还没形成语义通道权重学不出有意义的东西插得太靠后对浅层特征的筛选又来不及。常见做法是在每个残差块后面都插一个SE或者在上下文聚合模块之后插。插入频率也影响性能。每个block都插参数和计算量增加明显隔一个插一个性能损失不大但速度快不少。我实测下来在去雨任务里隔层插SE和每层插SE的PSNR差距在0.1dB以内但推理速度快了将近20%。所以如果追求效率隔层插是更划算的选择。4.4 循环结构的连接方式循环结构的连接方式直接决定了信息怎么在阶段间流动。常见的有几种一种是直接把上一阶段的输出图作为下一阶段输入一种是把上一阶段的中间特征拼接到下一阶段还有一种是显式地计算残差让下一阶段只处理没去干净的部分。论文里采用的是哪种需要看具体实现。但从原理上讲显式残差连接通常更有效因为它把任务简化了——后一阶段不用重新学整个去雨映射只需要学补漏。这类似于残差网络的思想让优化更容易。4.5 输出层与损失函数选择输出层一般是一个卷积把特征映射回3通道RGB图。损失函数方面早期工作多用L2MSE后来发现L1对异常值更鲁棒生成的图更锐利。再往后感知损失perceptual loss和对抗损失也被引入用来提升视觉质量。但这里有个坑感知损失和对抗损失虽然能让图看起来更自然但往往会牺牲PSNR和SSIM这类保真度指标。如果你的目标是做图像质量评估的benchmark用L1或L2更稳如果目标是给人看可以加感知损失。我个人的经验是去雨任务里L1打底加一点感知损失视觉和指标比较平衡。5. 训练策略与调参论文里不会写全的那些事5.1 数据集选择与合成雨的方法去雨领域最大的问题之一是真实配对数据难获取。你很难在同一时刻拍到一张有雨和一张没雨的完全对齐的图。所以绝大多数方法都在合成数据上训练拿干净图用雨层合成模型加上人工雨。合成雨的质量直接决定模型上限。简单的合成就是画几条白线加模糊但这样训出来的模型在真实雨图上基本废掉。好一点的合成会考虑雨的方向、长度、宽度分布还会加雨雾效果。我建议如果要做实际落地合成时一定要加雨雾和不同方向的雨否则模型泛化能力很差。5.2 学习率调度与批大小的实际取舍学习率方面初始值一般设在1e-4到1e-3之间配合余弦退火或者阶梯下降。批大小受显存限制去雨网络因为特征图分辨率高批大小通常只能设到4到8。批大小小的时候BatchNorm的统计量不稳定建议改用InstanceNorm或者GroupNorm。我踩过的一个坑用BatchNorm训练去雨网络在批大小只有4的时候验证集指标波动特别大。换成InstanceNorm后稳定很多。这个细节论文里不一定强调但实际复现时很关键。5.3 循环次数怎么定固定还是自适应前面提过循环次数的问题。固定次数实现简单但不够灵活。自适应的话可以让网络自己预测一个停止概率或者根据雨密度动态决定。后者实现复杂但推理效率高。如果只是做研究复现固定次数设成4到6比较常见。如果做产品建议加一个轻量的雨密度估计分支稀疏雨走2次循环密集雨走6次平均推理时间能降不少。5.4 验证指标之外人眼看起来怎么样PSNR和SSIM是论文里的标配指标但它们和人眼感知不完全一致。我见过PSNR很高的结果放大一看背景纹理被抹得很平观感反而差。所以复现时除了看指标一定要自己放大看细节尤其是边缘区域和纹理丰富区域。一个实用技巧把去雨结果和原图做差分看差分图里有没有明显的结构残留。如果差分图里能看到清晰的建筑轮廓说明网络把背景也改动了这是过度去雨的信号。6. 复现与落地时最容易踩的五个坑6.1 坑一直接拿论文超参套自己的数据论文里的超参是在特定数据集上调出来的换数据集大概率不适用。比如学习率、循环次数、损失权重都需要重新调。我见过有人直接照搬结果训练loss不收敛还以为是代码写错了。正确做法是先在小规模数据上跑通确认loss能稳定下降再逐步放大数据量和模型规模。调参顺序建议是先调学习率再调损失权重最后调循环次数。6.2 坑二忽略数据对齐和预处理一致性合成数据时雨层和背景必须严格对齐否则网络学到的映射是错的。另外训练和测试的预处理必须一致——归一化方式、图像尺寸、通道顺序任何一处不一致都会导致指标异常。我遇到过一次训练时用的是RGB顺序测试时读图库默认BGR结果PSNR掉了好几个dB排查了半天才发现是通道顺序问题。这种低级错误在实际工程里非常常见。6.3 坑三显存不够就盲目降分辨率去雨网络对分辨率敏感降分辨率会丢失雨丝细节。显存不够时优先考虑的是减小批大小、用梯度累积、或者用混合精度训练而不是直接降分辨率。降分辨率训练出来的模型在高分辨率测试图上表现会明显变差。6.4 坑四只看平均指标不看分布平均PSNR高不代表所有图都好。有可能大部分简单图指标很高少数困难图指标很低平均下来还行但实际使用时会发现困难场景完全不能用。建议统计指标分布看看最差的那批图是什么情况。6.5 坑五忘了推理速度这个硬指标学术论文里很少强调推理速度但落地时这是硬约束。Recurrent结构加Context Aggregation参数量和计算量都不小。如果目标平台是移动端可能需要做剪枝、量化或者换更轻量的backbone。我建议在复现阶段就记录推理时间别等到部署时才发现跑不动。7. 这类网络还能怎么改几个我试过或想试的方向7.1 把循环结构换成轻量级反馈机制Recurrent的推理开销主要来自多次前向。一个替代思路是用反馈机制网络只前向一次但中间层接收来自高层的反馈信号模拟迭代的效果。这样推理速度接近单阶段但保留了一部分迭代的收益。我试过一个简化版在稀疏雨上效果接近循环4次密集雨上略差但速度快了一倍多。7.2 注意力机制的替换与组合SE是通道注意力可以换成或者组合空间注意力、自注意力。自注意力能捕捉长距离依赖对去雨这种需要全局判断的任务理论上更合适但计算量大。折中方案是用窗口自注意力把计算限制在局部窗口内兼顾效果和效率。7.3 面向真实雨的域适应思路合成数据训的模型在真实雨上掉点是去雨领域的公开难题。域适应的思路是在合成数据上预训练然后用少量真实雨图做微调或者用对抗训练让特征分布对齐。这块我还在摸索目前看到的效果是能缓解但没法根治真实雨的多样性太强了。7.4 和其他退化联合处理实际拍摄中雨往往和雾、噪声、运动模糊一起出现。单独去雨的网络处理这种复合退化时力不从心。一个方向是把去雨和去雾、去噪联合建模共享特征提取分支处理不同退化。这样参数量增加不多但能应对更真实的场景。8. 我读这篇论文后的几点个人体会读完之后最大的感受是去雨网络的设计已经从堆卷积进化到有明确分工的模块化设计。Context Aggregation负责看全局SE负责选特征Recurrent负责迭代细化每个模块都有清晰的任务。这种设计思路比单纯加深网络更值得学习。另一个体会是论文里的模块不是越多越好。我试过把SE、Context Aggregation、Recurrent全加上再额外加空间注意力和多尺度融合结果指标不升反降训练也更难收敛。模块多了之后优化难度和过拟合风险都上升。找到必要的模块组合比无脑堆砌更重要。最后说个实操建议如果你要复现这篇论文别一上来就追求完全复现所有细节。先把主干跑通确认能出合理结果再逐个加模块看增益。这样即使某个模块复现不出来你也有一个能用的baseline。我见过太多人卡在某个细节上最后整个项目搁置其实退一步先跑通主干问题往往就迎刃而解了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑