资讯动态

ICME23 知识蒸馏复现 · SLDNet阶段性沉淀

发布时间:2026/10/14 1:19:39 来源:尧图企业网站定制
ICME23 知识蒸馏复现 · 阶段性沉淀项目ICME 2023《Collaborative Spatial-Temporal Distillation for Efficient Video Deraining》数据NTURain合成测试集 8 序列 真实雨 7 序列阶段链路打通并验证训练按成本考量主动中止于 epoch 1日期2026-10-12 ~ 2026-10-13环境AutoDL RTX 309014 vCPU / 24 GB 显存 Windows 本地一、一句话结论这份官方代码不是下载权重即可推理的成品SLDNet 去雨权重从未公开必须自训但训练是自监督的、只需单序列链路已在 3090 上验证跑通1 epoch / 21 分钟完整复现成本约35 小时 / ¥45–70本轮按性价比主动停止。二、两条关键事实纠正2.1 SLDNet 去雨权重不存在推翻早先判断原判断实际情况证据VDMamba README 的 Google Drive1D3OpTigv…是 SLDNet 预训练权重是可视化对比结果图不是模型该链接位于 VDMamba README 的# Visual Results表格中与 MSCSC / S2VD / MFGAN / MPEVNet 并列同页第 22–24 行才写明预训练权重在checkpoints文件夹指 VDMamba 自身SLDNet 官方仓库提供去雨权重只提供 FlowNet2 权重 数据去雨网络要自己训官方 README 的 Installation 仅列 FlowNet2 与 NTURain紧接着即Train: sh train_video_rain.sh全仓库无checkpoints/、无模型发布补充ICME23 论文说明.md 提到的权重路径/mnt/hdd/iku/SLDNet_code是作者内网机器非公开分发渠道。结论所谓教师模型必须自行训练得到。2.2 训练不需要 GT自监督SLDNet 全称 Self-Learned Deraining NetworkCVPR 2020——训练过程完全不需要干净图像官方训练列表lists/video_rain_removal_train.txt仅一行b1_Rain8 字节→ 单序列训练这正是官方只要求下载 b1_Rain 的原因数据加载只读data_NTU/train/b1_Rain/*.jpg损失全部为 warp 一致性与掩膜约束overall_loss loss_fn(frame_pred, frame_target)其中frame_target就是当前带雨帧本身。三、为什么必须先训练才能推理3.1 客观限制推理需要被去雨网络的权重而该权重不存在见 2.1→ 物理上不存在直接推理这条路径。3.2 为什么先跑 1 个 epoch 探针在投入 35 小时前用 21 分钟验证四件二值事项不跑无法知道验证项结果三个 CUDA 扩展的纯 PyTorch 替换数值是否正确✅ FlowNet2 端到端前向通过162.52 M 参数与论文一致FlowNet2 权重能否加载✅ missing keys 0unexpected keys 0数据管线是否通✅ 256 帧正确接线并查出训练集被截断到 20 帧的隐患存盘 / 续训机制是否工作✅model_epoch_1.pth666 MBopts.pth自动落盘探针的实际价值避免盲目投入 35 小时。事后看它确实拦下了训练集只有 20 帧这一静默错误若未发现等于用 8% 的数据训完全程。流程教训给分阶段方案时应提前量化每一步的时间成本例“1 epoch 21 分钟”让对方尽早介入决策。四、技术核心三个 CUDA 扩展的纯 PyTorch 替换4.1 为什么必须替换三个自定义算子channelnorm/correlation/resample2d在现代 PyTorch 上编译必然失败三重叠加硬伤后果build.py用torch.utils.ffi.create_extension该 API 在PyTorch 1.0 即被移除make.sh写死-archsm_35CUDA 11 起已移除该架构nvcc 报Unsupported gpu architecture.c绑定层#include THC/THC.hTHC 头文件在 PyTorch 1.11 被移除→不要走 nvcc 编译路线会耗费整天且失败。4.2 替换实现逐行对照.cu内核语义算子原始内核语义纯 PyTorch 等价ChannelNormoutput[b,0,y,x] sqrt(Σ_c x²)。注意内核忽略norm_deg参数恒为 2 次范数sqrt((x*x).sum(dim1, keepdimTrue))Resample2dxf x flow[0]yf y flow[1]双线性插值 下标 clamp 到[0, W-1]grid_sample(modebilinear, align_cornersTrue, padding_modeborder)其中g 2*pixel/(size-1) - 1Correlation零填充pad_size后out[b,tc,oy,ox] (1/(k²·C))·Σ_c P1[…, oy·s1mdkr, ox·s1mdkr]·P2[…tj·s2, …ti·s2]dradmd//s2dsize2·drad1outceil((H2·pad−2·(krmd))/s1)corr_type_multiply传入内核但从未使用双层循环切片 (p1*sub).sum(dim1)无需 unfoldFlowNetC 实际配置pad20, k1, md20, s11, s22→ 输出441 通道空间尺寸与输入相同。4.3 验证方式两层本地数值对拍managed venv 装 CPU 版 torch用 numpy 朴素实现复刻内核5 项对拍含 FlowNetC 真实配置maxdiff ≤ 4.4e-16机器精度AutoDL 端到端FlowNet2 构建 162.52 M 参数与论文一致、加载权重零缺失零多余、前向 64×64 输出 shape 正确。这三个算子无任何可学习参数替换后state_dict完全兼容不影响权重加载。五、工程坑位清单全部已解决#坑现象处理1networks/__init__.py第 2 行from .vgg import *仓库无vgg.py→ModuleNotFoundError注释该行2train_video_rain.py第 30 行硬编码os.environ[CUDA_VISIBLE_DEVICES] 1单卡实例报 device ordinal 错误注释改用export CUDA_VISIBLE_DEVICES03第 195 / 202–204 行初始化 VGGnetworks.Vgg16在缺失的 vgg.py 里opt.vgg_path是作者本机路径注释这 4 行——经核实训练循环内从不调用 VGG无需下载 vgg16 权重4option.py覆盖命令行参数第 101–110 行opts.data_dir opt.data_dir等硬编码命令行传-data_dir/-model_name/-checkpoint_dir/-crop_size一律无效不传这些参数直接改option.py其默认值恰与测试脚本路径对齐5训练脚本硬编码data_dir data_NTU/加载data_NTU/train/videoSPAC 数据是平铺的Dataset_Testing_Synthetic/{a1_Rain, a1_GT, …}重组为data_NTU/train/、data_NTU/test/、data_NTU/GT/三处软链6旧残留目录data_NTU/train/b1_Rain仅 20 帧接线逻辑目录非空即保留→ 训练只用 8% 数据改为帧数与源不一致即 relinkprep_step6b_fix_split.sh专门修此问题7utils.py第 15 行反向 importnetworksutils ↔ networks 循环导入导入顺序须为先utils后networks冒烟脚本已对齐官方顺序8训练脚本 importtensorboardX未安装pip install tensorboardX9裸装torchvision会连带升降 torch破坏1.10.0cu113必须--no-deps且按 torch 版本钉1.10.0 → 0.11.1numpy 需210服务器装opencv-pythonlibGL.so.1报错用opencv-python-headless两个省事的发现消除冗余工作option.py默认checkpoint_dir./checkpoints/P401_video_rain_self/model_namederain_self与test_video_rain.sh要求天然一致utils.save_model会自动写出opts.pth第 234–237 行正是测试脚本第 62–65 行要读的文件 →无需手工造占位。六、实测性能与成本指标实测值单 epoch500 iterbatch 8crop 6421 分钟单 iter 墙钟约 2.5 s数据加载与 GPU 计算并行日志分别计时各约 2.5 s 属正常GPU 利用率 / 显存100 % / 8.7 GB24 GB 显存仅用三分之一CPU14 核threads8100 epoch 推算约35 小时≈ ¥45–7030 epoch 推算约10.5 小时≈ ¥14–21诊断修正记录曾判断数据加载占一半、是瓶颈、调threads可省三成——错误。GPU 100% 说明算力已吃满日志中 2.5 s 2.5 s 是并行发生的两条腿墙钟由较慢者决定。当前配置已接近该卡吞吐上限调参空间有限。可选的加速方向未采用batch 8→16显存有富余crop 64→128但论文原始配置就是 64改动会偏离复现口径。建议不改为宜——这是复现任务配置应与论文一致才有对标意义。七、资产清单AutoDL 实例/root/autodl-tmp/路径内容CVPR-2020-Self-Rain-Removal/SLDNet_code/已 clone 打完补丁 三个扩展已替换的代码├pretrained_models/FlowNet2_checkpoint.pth.tar软链指向根目录的 620 MB 权重├checkpoints/P401_video_rain_self/derain_self/model_epoch_1.pth666 MB已验证的训练产物续训起点├checkpoints/.../opts.pth959 字节测试脚本必读├data_NTU/{train,test,GT}/三处软链各 256 帧└Dataset_Testing_Synthetic/、Dataset_Testing_RealRain/NTURain 解压后的原始数据prep_step2 ~ step7系列脚本见下本地H:\zj\SLDNet Knowledge-Distillation\2023 SLDNet会议论文 Collaborative_Spatial-Temporal_Distillation_for_Efficient_Video_Deraining.pdfDistilling the Knowledge in a Neural Network.pdfHinton 2015 经典蒸馏原论文FlowNet2_checkpoint.pth.tar650,102,505 字节 / 620 MBKnowledge-Distillation-main.zipICME23 代码NTURain Partly/SPAC 版含 rar spacCNN663 MBsynthetic_NTURain/synthetic_NTURain.zipSTVDNet 版248 MB额外含真实雨 7 序列extracted/ICME23 代码解压结果脚本H:\zj\SLDNet Knowledge-Distillation\与工作区脚本作用prep_step2.shclone 仓库含 GitHub 镜像兜底 修 vgg bugprep_step3_data.sh数据定位 / 帧数校验 / 软链 / 生成列表prep_step4_fix_ext.sh三个 CUDA 扩展替换为纯 PyTorch 冒烟测试prep_step5_deps.sh只装缺失依赖保护现有 torch 重跑冒烟prep_step6_train_sldnet.sh训练probe测速 /full全量自动打三处补丁prep_step6b_fix_split.sh修训练集截断 cv2 解码自检 跑探针prep_step7_eval.sh推理 8 序列 PSNR/SSIM 评分含带雨基线对照八、数据说明NTURain 来源与认证三种获取渠道按推荐顺序SPAC 官方github.com/hotndy/SPAC-SupplementaryMaterials—— 用git clone --depth 1 --filterblob:none --sparse稀疏检出Dataset_Testing_Synthetic再unrar解压Linux 上用 7z 解这套 rar 会误报 “Sub items Errors”须用真 unrarRainMamba 打包版Google Drive1Yt_0k_OVrBkC1n_F8SeOz_9V160o9UOc同表有 OneDrive 版STVDNet 百度盘https://pan.baidu.com/s/1ltVpPKvdzeh_h-wbubG29A码sg4n国内直连额外含真实雨测试集。认证结论已闭环验证本机synthetic_NTURain.zip275,859,537 字节经三重验证 正宗官方测试集大小与本地同名副本一致且非整数 MiB无截断特征八序列帧数168 / 116 / 125 / 298 / 256 / 250 / 219 / 250与 SPAC 官方逐序列一致GT 与 Rain 数量相等与 SPAC rar 解出的副本diff -rq全量逐字节比对16 个序列目录所有 .jpg 完全一致唯一差异是 SPAC 版多出 WindowsThumbs.db。补充spacCNN 每序列少 4 帧是该基线方法的固有特征非数据损坏。目录结构约定用途路径规模训练单序列data_NTU/train/b1_Rain256 帧测试8 序列data_NTU/test/seq_Rain1634 帧真值data_NTU/GT/seq_GT1634 帧真实雨备查Dataset_Testing_RealRain/ra1–ra4 / rb1–rb3 共 7 序列训练集Dataset_Training_Synthetict1–t8尚未下载——L2 蒸馏需要SLDNet 自监督训练不需要。九、结果判据与后续路线9.1 L1 复现的判据训练日志loss 持续下降、无 NaN、Batch n/500能推进到 500/500训练后b1 的 PSNR 从带雨基线本机实测27.45 dB / SSIM 0.8995提升到34 dB 上下论文参考值CVPR 2020 SLDNetNTURain 8 序列平均PSNR 34.89 / SSIM 0.954。9.2 若继续训练cd/root/autodl-tmp/CVPR-2020-Self-Rain-Removal/SLDNet_codesed-i-Es|^opt\.epoch_max[[:space:]]*.*|opt.epoch_max 30|option.pynohuppython3-utrain_video_rain.py-crop_size64/root/autodl-tmp/train_sldnet_30ep.log21会自动从 epoch 1 续训打印 Resuming model from epoch 1。训完执行bash /root/autodl-tmp/prep_step7_eval.sh自动选最新 epoch 权重。9.3 L2 蒸馏真正的蒸馏训练仍需补齐三项当前不必投入训练集Dataset_Training_Syntheticgit sparse-checkout add即可自写ConvLSTM_sin约 20 行照ConvLSTM加时间正弦编码教师改造版权重ICME23 用的 64 通道 / 7 帧版本。9.4 概念澄清L1 ≠ L2L1本次教师纯推理 / 自训—— 无反向传播、无参数更新、无损失函数、用不到训练集L2真正的蒸馏训练—— 学生先在 GT 上独立训到收敛再用教师特征微调监督信号是特征图对齐3 个 ConvLSTM 桥而非分类蒸馏的软标签 温度。十、可复用方法论老代码 新 PyTorch 先查扩展编译可行性。凡是torch.utils.ffi/THC/THC.h/-archsm_35三者任一出现直接放弃编译路线改纯 PyTorch 重写算子——扒.cu源码逐行对拍numpy 朴素实现做基准比调试 nvcc 报错快一个数量级。下载大文件先看大小是否整数 MiB。恰为整数 MiB如 340,787,200 325 MiB是传输截断的典型特征单个大 tar.gz 走网页下载极易中断应改传原始小文件或分卷split -b 200M或走 scp。在投入长时任务前先跑最小探针但必须提前量化并告知其时间成本让决策者早期介入。权重文件用torch.load先看 keys 再决定。可避免下载数百 MB 冗余权重如本次 FlowNet2 是否重复下载的判断也能第一时间发现链接其实是结果图而非权重这类误判。多行命令在网页终端会被截断—— 一律给单行串联的纯 ASCII 命令或直接给.sh脚本让其在 JupyterLab 上传后bash xxx.sh。附常用命令速查# 训练续训30 epochcd/root/autodl-tmp/CVPR-2020-Self-Rain-Removal/SLDNet_codesed-i-Es|^opt\.epoch_max[[:space:]]*.*|opt.epoch_max 30|option.pynohuppython3-utrain_video_rain.py-crop_size64/root/autodl-tmp/train_sldnet_30ep.log21# 看进度tail-n20/root/autodl-tmp/train_sldnet_30ep.loggrep-ERect Loss/root/autodl-tmp/train_sldnet_30ep.log|tail-n30# 查看已存权重ls-lhcheckpoints/P401_video_rain_self/derain_self/# 推理 对分8 序列bash/root/autodl-tmp/prep_step7_eval.sh

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

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

免费获取报价 →
↑