视频去雨网络的模块缝合路线 · 实践笔记

视频去雨网络的模块缝合路线 · 实践笔记

主题:深度学习视频去雨(Video Deraining)的模块缝合改进方案

方法框架:五步缝合链路(跑通基线 → 选模块 → 定拓扑 → 对齐维度 → 回归验证)

参考基线:PReNet / Restormer(单帧)、视频去雨框架(NTURain / RainSyn 系列)

前置阅读:《深度学习模块缝合方法论 · 人物蒸馏笔记》(本号 2026-10-01)

整理日期:2026-10-02

目录


摘要

本文给出视频去雨的模块缝合路线:针对高频雨纹与时序一致性难点,按五步链路(跑通基线---选模块---定拓扑---对齐维度---回归验证)推进;模块选型覆盖频域分支、光流对齐、时序注意力与 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) 逐帧取参考帧对

三条纪律:

  1. 每个缝合点打印一次 .shape,写进消融日志;
  2. warp 之后用 flow.abs().mean() 或对齐误差图检查对齐质量,对齐失败比没对齐更糟;
  3. 融合分支若通道数不一致,先 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 提升多少,把"缝合"落到应用价值上。


七、三阶段落地路线

  1. 第一阶段(低风险涨点):基线 + 频空双分支并联,先拿到第一个稳定增益;
  2. 第二阶段(时序补强):加入光流/DCN 对齐 + 时序注意力,解决帧间闪烁;
  3. 第三阶段(追热点):Mamba 化(线性复杂度长时序建模)或语义先验注入,对标 2025--2026 SOTA。

每阶段一次只动一处,消融表逐步填行;任何一步 PSNR 下降超过 0.1 dB 就回滚,优先保稳定。

边界提醒:S3VD、VDMamba 等模块源自已发表论文,直接搬运需在论文中明确引用;您的创新点应落在组合方式(缝在哪、怎么融合、损失如何配置、针对什么短板)上,而非模块本身。


附录 A:术语速查

术语 释义
视频去雨 从雨中视频序列恢复清晰背景,兼顾单帧质量与帧间一致性
频域分支 在小波/FFT 域处理特征的支路,利于分离高频雨纹
DCN 可变形卷积,卷积核采样点可学习,用于帧间非刚性对齐
Mamba / SSM 状态空间模型,序列建模复杂度线性,3D 注意力的高效替代
消融实验 逐项增删模块以验证各部分贡献的对照实验
warp 按光流场把相邻帧像素搬移到参考帧坐标系的操作

附录 B:自查清单

  • 基线指标是否已在至少两个数据集上复现?
  • 每个要缝的模块是否都能对应一条明确的基线短板?
  • 拓扑选择(并联/串行/注入)是否显式写下理由?
  • 每个 5D→4D 变换处是否打印过 shape?
  • warp 对齐质量是否检查过对齐误差?
  • 消融是否一次只加一个模块?
  • 是否补充了下游任务(检测/跟踪)收益实验?
  • 引用的公开模块是否已在文中标注来源?
相关推荐
Brookty1 小时前
双向分流FIN标记、TCB服务逻辑与TCP断开连接流程介绍
网络·tcp
inferno1 小时前
SVN学习笔记(一)
笔记·学习·svn
高山有多高1 小时前
【Linux笔记】线程同步与互斥
linux·笔记
艾莉丝努力练剑1 小时前
【QT】系统相关:多线程QThread基础
开发语言·网络·c++·qt·学习·大模型
奕鼎竜瑆2 小时前
GPT-6 Luna Batch API 调用实践笔记
笔记·gpt·batch
妄汐霜2 小时前
SSE,RocketMQ,MQTT不同之处
笔记·学习·rocketmq
東隅已逝,桑榆非晚2 小时前
c++模板进阶
开发语言·c++·笔记·学习
easyeye1232 小时前
降维打击~使用视频大模型去除路人工作流
音视频
企业数字化笔记2 小时前
视频视觉任务怎样选择媒体处理技术?FFmpeg、OpenCV、GStreamer 的职责与适用场景
ffmpeg·音视频·媒体