视频去雨网络的模块缝合路线 · 实践笔记
主题:深度学习视频去雨(Video Deraining)的模块缝合改进方案
方法框架:五步缝合链路(跑通基线 → 选模块 → 定拓扑 → 对齐维度 → 回归验证)
参考基线:PReNet / Restormer(单帧)、视频去雨框架(NTURain / RainSyn 系列)
前置阅读:《深度学习模块缝合方法论 · 人物蒸馏笔记》(本号 2026-10-01)
整理日期:2026-10-02
目录
- 摘要
- 一、问题定位:视频去雨的两大难点
- [1.1 雨纹是稀疏高频退化](#1.1 雨纹是稀疏高频退化)
- [1.2 时序一致性难以保证](#1.2 时序一致性难以保证)
- 二、五步缝合链路总览
- 三、模块选型对照表
- 四、缝合拓扑设计与代码骨架
- [4.1 频空双分支------并联](#4.1 频空双分支——并联)
- [4.2 时序对齐模块------串行](#4.2 时序对齐模块——串行)
- [4.3 语义先验------包含式注入](#4.3 语义先验——包含式注入)
- 五、维度对齐:视频任务最大的坑
- 六、消融与验证设计
- [6.1 数据集与指标](#6.1 数据集与指标)
- [6.2 消融表设计(论文核心表)](#6.2 消融表设计(论文核心表))
- [6.3 讲故事的卖点](#6.3 讲故事的卖点)
- 七、三阶段落地路线
- [附录 A:术语速查](#附录 A:术语速查)
- [附录 B:自查清单](#附录 B:自查清单)
摘要
本文给出视频去雨的模块缝合路线:针对高频雨纹与时序一致性难点,按五步链路(跑通基线---选模块---定拓扑---对齐维度---回归验证)推进;模块选型覆盖频域分支、光流对齐、时序注意力与 Mamba;拓扑遵循频空并联、注意力串行、先验注入三法则;文末给出三阶段路线与消融方案。
一、问题定位:视频去雨的两大难点
模块缝合的第一步不是写代码,而是搞清楚"缝什么、缝哪里"。视频去雨区别于一般复原任务,难点有二:
1.1 雨纹是稀疏高频退化
雨丝、雨滴附着在图像高频细节上,与背景纹理频谱重叠------直接滤高频会把边缘一起洗掉,不过滤则雨纹残留。这决定了单一空域卷积难以分离,需要频域视角。
1.2 时序一致性难以保证
逐帧独立去雨会引入帧间闪烁(同一像素在相邻帧恢复结果跳变),而直接做 3D 卷积/全局注意力开销随序列长度平方增长。这决定了需要显式的帧间对齐 + 低开销时序建模。
一句话:视频去雨是"稀疏高频退化"与"时序一致性"的复合问题,天然适合多分支并联 + 时序模块串行的组合式改进。
二、五步缝合链路总览
沿用本号上一篇笔记提炼的链路,映射到视频去雨任务:
① 跑通基线 在 NTURain / RainSynLight25 上复现 PSNR/SSIM,不改一行代码
↓
② 选模块 按第一节的两大难点,从成熟模块库中选型(见第三节对照表)
↓
③ 定拓扑 决定并联 / 串行 / 包含注入,写最小可运行骨架(见第四节)
↓
④ 对齐维度 视频 5D 张量的 reshape 与帧间 warp 对齐(见第五节)
↓
⑤ 回归验证 一次只缝一个模块做消融,报 PSNR/SSIM + 下游任务收益(见第六节)
三、模块选型对照表
按"基线短板 → 可缝模块"组织,参考来源含 2025--2026 视频去雨 SOTA 工作(VDMamba,CVPR 2025 Oral;S3VD,arXiv 2609.21322):
| 基线常见短板 | 可缝模块 | 缝合位置 | 参考来源 |
|---|---|---|---|
| 雨纹残留、细节丢失 | 频域分支(小波 / FFT 卷积) | 与空域主干并联,cat 后 1×1 卷积融合 | 频域复原系列 |
| 帧间闪烁、雨滴误留 | 光流对齐 / 可变形卷积(DCN)帧间 warp,后接时序注意力 | 时序分支入口,对齐后再融合 | 视频复原通用 |
| 长序列建模慢(效率导向) | Mamba 状态空间块替换 3D 自注意力(线性复杂度) | 替换原有 attention 层 | VDMamba、S3VD |
| 目标结构被"洗掉" | 冻结 DINOv2 语义先验 + 交叉注意力注入 | 多尺度特征处并联注入 | S3VD 的 MSSF 模块 |
| 雨纹稀疏性利用不足 | 可微统计滤波(median / min-max 的可学习近似) | 输入端预处理分支 | VDMamba 的 DSF |
选型纪律:一次只缝一个,且能明确说出它对应表中哪一行短板;说不出的模块不缝。
四、缝合拓扑设计与代码骨架
三条拓扑法则,各自附最小骨架(PyTorch):
4.1 频空双分支------并联
频域分支管雨纹分离,空域分支管结构保持,输出拼接融合:
python
class DualBranch(nn.Module):
"""频域 + 空域并联,适配 (B*T, C, H, W) 输入"""
def __init__(self, ch):
super().__init__()
self.spatial = nn.Sequential(
nn.Conv2d(ch, ch, 3, padding=1), nn.GELU(),
nn.Conv2d(ch, ch, 3, padding=1))
self.freq = nn.Sequential( # 小波/FFT 分支示意
nn.Conv2d(ch, ch, 1), nn.GELU(),
nn.Conv2d(ch, ch, 1))
self.fuse = nn.Conv2d(ch * 2, ch, 1)
def forward(self, x): # x: (B*T, C, H, W)
return self.fuse(torch.cat(
[self.spatial(x), self.freq(x)], dim=1)) + x # 残差保底
4.2 时序对齐模块------串行
先对齐再建模,插在空间特征之后:
python
class TemporalAlign(nn.Module):
"""光流/DCN 对齐 + 时序注意力,输入 (B, T, C, H, W)"""
def __init__(self, ch):
super().__init__()
self.flow = FlowEstimator(ch) # 或 DCNv2 可变形对齐
self.tatt = TemporalAttention(ch) # 沿 T 维做注意力
def forward(self, x):
ref = x[:, x.shape[1] // 2] # 参考帧
aligned = [warp(x[:, i], self.flow(x[:, i], ref))
for i in range(x.shape[1])]
return self.tatt(torch.stack(aligned, dim=1))
4.3 语义先验------包含式注入
冻结的 DINOv2 特征作为外部先验,经交叉注意力进入主干(S3VD 思路),只训练注入层:
python
class SemanticInjection(nn.Module):
"""q=主干特征, kv=冻结 DINOv2 先验"""
def __init__(self, ch, prior_ch):
super().__init__()
self.cross = nn.MultiheadAttention(ch, 4, batch_first=True)
self.proj = nn.Linear(prior_ch, ch)
def forward(self, feat, prior):
return self.cross(feat.flatten(2).transpose(1, 2),
self.proj(prior).flatten(2).transpose(1, 2),
value=self.proj(prior).flatten(2).transpose(1, 2))
五、维度对齐:视频任务最大的坑
视频是 5D 张量 (B, T, C, H, W),三种模块各吃不同形状:
| 模块类型 | 需要的形状 | 变换 |
|---|---|---|
| 空间卷积 / 频域分支 | (B*T, C, H, W) |
x.flatten(0, 1) |
| 时序注意力 / Mamba | (B, C, T, H*W) 或 (B, H*W, T, C) |
permute + flatten |
| 光流 warp | 成对的 (B, C, H, W) |
逐帧取参考帧对 |
三条纪律:
- 每个缝合点打印一次
.shape,写进消融日志; - warp 之后用
flow.abs().mean()或对齐误差图检查对齐质量,对齐失败比没对齐更糟; - 融合分支若通道数不一致,先 1×1 卷积对齐再 cat,不要靠隐式广播。
六、消融与验证设计
6.1 数据集与指标
| 数据集 | 特点 | 指标 |
|---|---|---|
| NTURain | 真实+合成混合,常用基线 | PSNR / SSIM |
| RainSynLight25 / Complex25 | 合成,难度分层 | PSNR / SSIM |
| RVDT(VDMamba 提出) | 真实场景 + 检测标注 | YOLO mAP / MOTA |
6.2 消融表设计(论文核心表)
| 配置 | 频域分支 | 时序对齐 | 语义注入 | PSNR | SSIM |
|---|---|---|---|---|---|
| 基线 | --- | --- | --- | x.xx | x.xx |
| +频空并联 | ✓ | --- | --- | ||
| +时序对齐 | ✓ | ✓ | --- | ||
| 完整 | ✓ | ✓ | ✓ |
6.3 讲故事的卖点
学 VDMamba 的包装方式:不只报复原指标,还报下游收益------去雨作为预处理使 YOLO 检测 mAP、多目标跟踪 MOTA 提升多少,把"缝合"落到应用价值上。
七、三阶段落地路线
- 第一阶段(低风险涨点):基线 + 频空双分支并联,先拿到第一个稳定增益;
- 第二阶段(时序补强):加入光流/DCN 对齐 + 时序注意力,解决帧间闪烁;
- 第三阶段(追热点):Mamba 化(线性复杂度长时序建模)或语义先验注入,对标 2025--2026 SOTA。
每阶段一次只动一处,消融表逐步填行;任何一步 PSNR 下降超过 0.1 dB 就回滚,优先保稳定。
边界提醒:S3VD、VDMamba 等模块源自已发表论文,直接搬运需在论文中明确引用;您的创新点应落在组合方式(缝在哪、怎么融合、损失如何配置、针对什么短板)上,而非模块本身。
附录 A:术语速查
| 术语 | 释义 |
|---|---|
| 视频去雨 | 从雨中视频序列恢复清晰背景,兼顾单帧质量与帧间一致性 |
| 频域分支 | 在小波/FFT 域处理特征的支路,利于分离高频雨纹 |
| DCN | 可变形卷积,卷积核采样点可学习,用于帧间非刚性对齐 |
| Mamba / SSM | 状态空间模型,序列建模复杂度线性,3D 注意力的高效替代 |
| 消融实验 | 逐项增删模块以验证各部分贡献的对照实验 |
| warp | 按光流场把相邻帧像素搬移到参考帧坐标系的操作 |
附录 B:自查清单
- 基线指标是否已在至少两个数据集上复现?
- 每个要缝的模块是否都能对应一条明确的基线短板?
- 拓扑选择(并联/串行/注入)是否显式写下理由?
- 每个 5D→4D 变换处是否打印过 shape?
- warp 对齐质量是否检查过对齐误差?
- 消融是否一次只加一个模块?
- 是否补充了下游任务(检测/跟踪)收益实验?
- 引用的公开模块是否已在文中标注来源?