DRSformer Rain200H 省钱推理复现笔记

DRSformer Rain200H 省钱推理复现笔记

论文:DRSformer: Efficient Transformer for Image Deraining (CVPR 2023)

仓库:https://github.com/cschenxiang/DRSformer

复现环境:AutoDL · RTX 3090 · PyTorch 2.1.2 + CUDA 12.1

复现日期:2026-10-12

复现模式:零训练 · 仅推理(pretrained weights)

目录

  • 摘要
  • 一、复现目标与边界
    • [1.1 为什么选 Rain200H 作为推理复现目标](#1.1 为什么选 Rain200H 作为推理复现目标)
    • [1.2 边界说明:HQ-RAIN 权重未公开](#1.2 边界说明:HQ-RAIN 权重未公开)
  • 二、材料准备与上传策略
    • [2.1 需要上传的四件材料](#2.1 需要上传的四件材料)
    • [2.2 测试集精简打包:1095 MB → 106 MB](#2.2 测试集精简打包:1095 MB → 106 MB)
    • [2.3 费用控制:无卡模式上传](#2.3 费用控制:无卡模式上传)
  • 三、环境配置与五个必踩坑
  • 四、推理执行
    • [4.1 权重路径写死的处理](#4.1 权重路径写死的处理)
    • [4.2 推理命令与耗时](#4.2 推理命令与耗时)
  • 五、评测口径与实现
    • [5.1 用 Python 替代 Matlab](#5.1 用 Python 替代 Matlab)
    • [5.2 官方口径核实](#5.2 官方口径核实)
  • 六、结果与交叉验证
    • [6.1 实测结果](#6.1 实测结果)
    • [6.2 与官方产物逐张交叉验证](#6.2 与官方产物逐张交叉验证)
    • [6.3 论文 32.17 dB 的口径结论](#6.3 论文 32.17 dB 的口径结论)
  • 七、结论与延伸
    • [7.1 三条结论](#7.1 三条结论)
    • [7.2 对综述论点的实证支撑](#7.2 对综述论点的实证支撑)
    • [7.3 可选延伸](#7.3 可选延伸)
  • [附录 A:完整命令速查](#附录 A:完整命令速查)
  • [附录 B:文件清单与成本](#附录 B:文件清单与成本)
  • [附录 C:术语速查](#附录 C:术语速查)

摘要

AutoDL 零训练复现 DRSformer(CVPR 2023):加载官方权重,对 Rain200H 的 200 对图推理评测,GPU 耗时 96 秒、成本不足 1 元;实测 Y 通道 PSNR 30.87 dB 与作者官方输出 30.868 dB 逐张一致,论文 32.17 dB 系另一测试划分所致。


一、复现目标与边界

1.1 为什么选 Rain200H 作为推理复现目标

官方仓库公开的预训练权重覆盖五个经典基准:Rain200L、Rain200H、DID-Data、DDN-Data、SPA-Data。其中 Rain200H 兼具以下三点优势,最适合作为省钱复现的切入集:

考量维度 Rain200H 情况 说明
训练集规模 1800 对(评测只用 200 对测试图) 测试集体积小,上传快
权重体积 约 129 MB 百度网盘本地下载后上传约 5 分钟
架构依赖 默认 DRSformer_arch.py 无需替换架构文件

反面对照:Rain200L 与 SPA-Data 的权重在训练时未启用 MEFC 模块,必须替换架构文件,多一步操作;DID-Data 测试集 1201 张,耗时最长。

1.2 边界说明:HQ-RAIN 权重未公开

需要明确一条边界:本文笔记所依托的 TPAMI 2025 综述(Towards Unified Deep Image Deraining )提出的 HQ-RAIN 基准,官方并未公开 DRSformer 的对应权重。HQ-RAIN 仓库只提供数据集与评测代码。

因此本次复现的目标限定为经典基准的推理结果重建,不涉及 HQ-RAIN 上的合成域冠军结论。这一限制不影响复现的方法学价值------它验证的是"官方权重 → 官方产物"这条链路是否可被完整重建。


二、材料准备与上传策略

2.1 需要上传的四件材料

文件 大小 用途
DRSformer-main.zip 9.6 MB 源码(含 test.py、架构定义、Matlab 评测脚本)
deraining_Rain200H.pth 129 MB Rain200H 预训练权重
Rain200H_test_only.zip 105.7 MB 精简测试集(200 对)
eval_psnr_ssim.py 4 KB 指标评测脚本(官方 test.py 不算指标)

2.2 测试集精简打包:1095 MB → 106 MB

Rain200H 原始压缩包内 train(955 MB)与 test(106 MB)两部分并存,而推理阶段完全不需要训练集。上传前先在本地重打包,只保留 test 部分,上传体积压缩约 10 倍:

python 复制代码
import zipfile

src = zipfile.ZipFile(r'Rain200H.zip')
dst = zipfile.ZipFile(r'Rain200H_test_only.zip', 'w', zipfile.ZIP_DEFLATED)
for info in src.infolist():
    if info.filename.startswith('Rain200H/test/') and not info.is_dir():
        dst.writestr(info.filename, src.read(info.filename))
dst.close()

测试集内部结构为 Rain200H/test/input/*.png(200 张雨图)与 Rain200H/test/target/*.png(200 张真值),两侧文件名均为 1.png ... 200.png,与仓库默认路径天然对齐,无需重命名。

2.3 费用控制:无卡模式上传

上传期间 GPU 按量计费仍在计费。合理做法是先以无卡模式开机(约 ¥0.1/时)完成上传与解压,再关机切换正常模式跑推理。本机实测:上传 4 个文件约 10--30 分钟,无卡模式与 3090 模式之间的费用差可达数元。


三、环境配置与五个必踩坑

环境配置阶段共遇到五个问题,逐一记录根因与解法:

# 现象 根因 解法
1 pip install 报 Could not find a version ... (from versions: none) 先前执行的 source /etc/network_turbo 残留 http_proxy/https_proxy,代理劫持了国内 PyPI 镜像请求 unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY,或显式指定 -i https://pypi.tuna.tsinghua.edu.cn/simple
2 安装后被依赖解析器警告 numpy 冲突,运行时报 compiled using NumPy 1.x cannot be run in NumPy 2.x scikit-image 连带将 numpy 升级至 2.2.6,而镜像自带 PyTorch 是按 numpy 1.x 编译的 钉回兼容版本:pip install "numpy==1.26.4" "opencv-python-headless==4.10.0.84"
3 torch.cuda.is_available() 返回 False 无卡模式下实例隐藏 GPU,CUDA_VISIBLE_DEVICES 被置空 关机后以正常模式(3090)开机;环境装在系统盘、数据在数据盘,关机不丢
4 推理进度条显示 1/1,只处理了 1 张图 目标目录已存在同名文件,cp -r 把 200 张图复制进了 test/input/input/ 子目录,而 test.py 只扫描顶层 rm -rf test/input && cp -r ../Rain200H/test/input test/input,用 `ls test/input
5 libgomp: Invalid value for environment variable OMP_NUM_THREADS 镜像预设的该环境变量取值非法 export OMP_NUM_THREADS=8(仅消除告警,不影响结果)

第 4 条最值得记录:它不会报错,只会静默地把工作量从 200 张降到 1 张,若只看流程是否跑通而不核对张数,极易带着错误的评测结论离开。


四、推理执行

4.1 权重路径写死的处理

test.py 中的权重路径是硬编码的:

bash 复制代码
mkdir -p pretrained_models
mv deraining_Rain200H.pth pretrained_models/deraining.pth   # 必须改名为 deraining.pth

未改名会直接报 FileNotFoundError: pretrained_models/deraining.pth。

4.2 推理命令与耗时

bash 复制代码
python test.py --task Deraining --input_dir './test/input/' --result_dir './test/output/'

实测结果:

指标 数值
处理张数 200 / 200
耗时 1 分 36 秒
吞吐 2.08 it/s
输出目录 test/output/Deraining/

test.py 只负责把去雨结果写入磁盘,不计算任何指标 ------这是官方仓库的设计,指标需要用 evaluations/ 下的 Matlab 脚本自行评测。

以测试图 1(雪地场景)为例,去雨效果如下图所示:


五、评测口径与实现

5.1 用 Python 替代 Matlab

为免在实例上安装 Matlab,本次用 eval_psnr_ssim.py 实现官方的 Matlab 评测等价逻辑:

  • 按文件名数字编号自动配对(1.png ↔ 1.png),无需人工对齐;
  • 逐张计算 PSNR / SSIM,末尾输出平均值,可选写入 txt 留档;
  • 默认 RGB 通道,--y 开关切换 Y 通道(BT.601)。
bash 复制代码
python eval_psnr_ssim.py --pred test/output/Deraining --gt ../Rain200H/test/target --out metrics_final_rgb.txt

5.2 官方口径核实

通读官方评测脚本 Evalution_Rain200L_Rain200H_SPA-Data/evaluate_PSNR_SSIM.m 后确认三点:

  1. PSNR/SSIM 在 rgb2ycbcr 后的 Y 通道上计算;
  2. 无边界裁剪(不做 border shave);
  3. 按目录顺序配对,与按编号配对等价。

Python 实现与 Matlab 存在约 0.1 dB 量级的差异(主要来自 YCbCr 量化范围),属正常范围。


六、结果与交叉验证

6.1 实测结果

口径 平均 PSNR 平均 SSIM
本文复现输出 · RGB 30.8078 0.9219
本文复现输出 · Y (BT.601) 30.8675 0.9237
作者官方输出 · Y (BT.601) 30.8676 0.9237
论文 Table 1 32.17 0.9330

6.2 与官方产物逐张交叉验证

为判定 32.17 与 30.87 之间约 1.36 dB 的差距成因,下载作者放出的官方视觉结果(Rain200H,200 张)并用同一脚本评测,与本文输出逐张比对:

  • 张数一致 :官方结果同样为 200 张,命名为 1.png ... 200.png;
  • 均值一致:30.8676 与 30.8675,相差 0.0001 dB;
  • 逐张一致:单图数值对齐到小数点后第三位,残差处于 PNG 编解码量化噪声量级。

该结果表明:权重加载、数据流、推理管线、评测口径全部与作者官方行为一致,本文复现为零偏差重建。

6.3 论文 32.17 dB 的口径结论

关键推论是:连作者自己放出的官方输出,在这套 200 对测试集上也只得到 30.87 dB。这说明论文 32.17 dB 并非在这套分发的测试集上测得,而是来自另一测试划分(最可能是 Yang et al. 的标准 100 对划分)或作者内部版本。

在正式引用时,两组数字必须分开标注:

  • 本笔记实测:30.81 dB (RGB) / 30.87 dB (Y),作者提供的 200 对扩展测试集全量;
  • 论文报告:32.17 dB / 0.9330,论文原始测试口径。

已排除的其他假设(附验证方式):

假设 验证方式 结论
前 100 张即标准测试集 分半统计 前半 30.85 / 后半 30.47,不成立
Y 通道口径差异 --y 复测 Y 相对 RGB 仅 +0.06 dB,不足以解释
评测配对错误 检查 unmatched 计数 200 张全部匹配,unmatched: 0

七、结论与延伸

7.1 三条结论

  1. 复现判定标准应当升级 :在官方权重可直接下载的场景下,"与论文数字相差 0.1 dB 以内"并不是唯一标准,与作者官方产物逐张一致是更强的证据;本次复现达到后者(差 0.0001 dB),而前者反而不成立。
  2. 基准口径是复现报告的必要信息:同一权重、同一套测试文件,仅因论文数字所依据的划分不同,就能产生 1.36 dB 的系统性差异。任何复现笔记都应显式声明测试集版本与评测通道。
  3. 成本可控:零训练推理复现单个基准(Rain200H),GPU 占用约 40 分钟,总花费不足 1 元。

7.2 对综述论点的实证支撑

本文的实测结果可视为对"合成域表现 ≠ 真实域泛化"这一主线论点的一个旁证:HQ-RAIN 综述指出,合成域冠军模型在真实域上泛化弱于融合领域知识的 CNN。本次复现补充了另一层观察------即使在合成域内部,基准划分这一"实验设定"本身也会显著影响绝对数值。讨论模型优劣时若不锚定统一的评测口径,跨论文比较将失去意义。

7.3 可选延伸

方向 操作要点
Rain200L / SPA-Data 需替换架构文件:cp "DRSformer_arch_200L+SPA.py" DRSformer_arch.py(这两集训练时未用 MEFC)
DID-Data / DDN-Data 默认架构即可,DID 测试集 1201 张,耗时最长
HQ-RAIN 权重未公开,只能引用综述数字,或自行训练

附录 A:完整命令速查

bash 复制代码
# ---- 环境准备(无卡模式即可) ----
cd /root/autodl-tmp
unzip DRSformer-main.zip && cd DRSformer-main
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python-headless scikit-image natsort tqdm einops
pip install "numpy==1.26.4" "opencv-python-headless==4.10.0.84"

# ---- 摆放权重与数据 ----
mkdir -p pretrained_models
mv ../deraining_Rain200H.pth pretrained_models/deraining.pth
unzip ../Rain200H_test_only.zip -d ..
mkdir -p test && cp -r ../Rain200H/test/input test/input
ls test/input | wc -l          # 必须输出 200

# ---- 推理(切换 3090 正常模式) ----
python test.py --task Deraining --input_dir './test/input/' --result_dir './test/output/'

# ---- 评测 ----
python eval_psnr_ssim.py --pred test/output/Deraining --gt ../Rain200H/test/target --out metrics_final_rgb.txt
python eval_psnr_ssim.py --pred test/output/Deraining --gt ../Rain200H/test/target --y --out metrics_ours_y.txt

# ---- 打包结果并关机 ----
cd test/output && zip -r /root/autodl-tmp/deraining_rain200h_output.zip Deraining && cd ../..
shutdown

附录 B:文件清单与成本

项目 数值
上传材料总量 约 245 MB(4 个文件)
权重文件字节数校验 134,971,977 B(与本地一致)
推理耗时 1 分 36 秒(200 张,RTX 3090)
GPU 总占用 约 40 分钟
总成本 不足 ¥1(无卡模式上传 + 3090 推理)

留档文件:metrics_final_rgb.txt、metrics_ours_y.txt、metrics_official.txt、deraining_rain200h_output.zip。


附录 C:术语速查

术语 含义
DRSformer CVPR 2023 提出的高效图像去雨 Transformer,含 MEFC 模块
MEFC Mixed Efficient Feed-forward / 多尺度特征协作模块,Rain200L 与 SPA 训练时未启用
Rain200H 含重雨(heavy rain)的合成去雨基准,1800 训练对 + 200 测试对
HQ-RAIN TPAMI 2025 综述提出的统一评测基准,运动模糊合成雨纹 + alpha 融合,约 5000 对
PSNR 峰值信噪比,去雨任务主指标,越高越好
SSIM 结构相似度,取值 0,1,越高越好
无卡模式 AutoDL 的 CPU-only 计费模式,约 ¥0.1/时,适合上传与评测
相关推荐
MIXLLRED1 小时前
Batch Normalization 学习笔记:γ、β 与 γ>0 的关键限制
笔记·学习·batch
霖霖7141 小时前
【ESP32笔记】LED操作和呼吸灯实现
笔记·单片机·嵌入式硬件
滕州市燕猫虎计算机科技工作室个体工商户12 小时前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
志尊宝13 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
后季暖14 小时前
电商问数笔记(2)
笔记
xier_ran14 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
星恒随风16 小时前
Linux库的底层原理:ELF文件格式、静态链接、程序加载、虚拟地址空间与GOT/PLT详解
linux·运维·笔记·学习·状态模式
罗西的思考16 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (7)— 混合机制
笔记·学习
ClinicTech17 小时前
婴儿培养箱技术笔记:温控、报警与数据记录的三层架构
笔记