Invertible-Image-Rescaling 代码逐行精读:从 IRNModel 到 ConvDownsampling 的可逆网络实现细节 📅 发布时间:2026/8/23 13:04:56 👁 浏览次数: Invertible-Image-Rescaling 代码逐行精读从 IRNModel 到 ConvDownsampling 的可逆网络实现细节【免费下载链接】Invertible-Image-Rescaling[ECCV 2020, IJCV 2022] Invertible Image Rescaling项目地址: https://gitcode.com/gh_mirrors/in/Invertible-Image-Rescaling在 ECCV 2020 的 Invertible-Image-RescalingIRN项目中可逆图像缩放做到了一个网络同时搞定下采样与上采样前向得到低分辨率图 潜在噪声 z反向拼上 z 就能精确恢复高分辨率图。下面我们从训练入口 IRNModel 一路精读到 ConvDownsampling把可逆网络的每一块拆解清楚。一、整体架构一个网络两个方向整张图可以拆成三段正好对应源码里的三类模块架构组件源码位置作用Haar 变换 / 卷积下采样HaarDownsampling、ConvDownsampling把分辨率降下来通道数乘 4或 scale²InvBlock 可逆块InvBlockExp用 F、G、H 三个子网做可逆变换下采样模块InvRescaleNet把上述操作串成整张网络二、项目结构与入口代码分为 Config / Data / Model / Network 四部分见 codes/README.md训练/测试入口python train.py -opt options/train/train_IRN_x4.yml、python test.py -opt options/test/test_IRN_x4.yml网络定义codes/models/networks.py模型逻辑codes/models/IRN_model.py可逆结构codes/models/modules/Inv_arch.py子网DBNet 稠密块codes/models/modules/Subnet_constructor.py训练配置示例codes/options/train/train_IRN_x4.yml三、IRNModel可逆网络的训练核心IRNModel 继承自 BasicSR 风格的BaseModel是整个可逆图像缩放模型的大脑。3.1 网络构建与调度器在__init__中模型通过networks.define_G(opt)拿到 InvRescaleNet并按配置选择MultiStepLR或带重启的余弦退火学习率优化器为 Adamlr 2e-4。3.2 一次训练迭代发生了什么optimize_parameters是理解 IRN 的关键共三步前向下采样把 HR 图喂给netG(xself.input)输出前 3 个通道当作 LR后scale²-1×3 个通道当作潜在变量 z加噪对 LR 先做 8bit 量化Quantization 模块用round/255模拟真实存储再按概率叠加高斯噪声模拟真实下采样器的输出反向放大把 LR 随机 z 拼成y调用netG(xy, revTrue)重建 HR用 L1 损失监督。总损失为lambda_fit_forw * L_fit拟合参考 LR lambda_ce_forw * ‖z‖²z 应接近 0 均值 lambda_rec_back * L_rec重建 HR。3.3 推理接口downscale(HR)前向取前 3 通道并量化得到 LRupscale(LR, scale)拼上标准高斯 z 后反向传播一次取前 3 通道得到 HR。四、InvBlockExp可逆块的 F/G/H 三剑客可逆图像缩放的最小单元是 InvBlockExp它把特征沿通道切成两半正向: y1 x1 F(x2) s clamp * (sigmoid(H(y1)) * 2 - 1) y2 x2 * exp(s) G(y1) 反向: s clamp * (sigmoid(H(x1)) * 2 - 1) y2 (x2 - G(x1)) / exp(s) y1 x1 - F(y2)每步都只做加法和乘除因此正向与反向可以互相精确抵消jacobian()返回±sum(s)即逐点雅可比行列式的对数供流模型场景使用。F/G/H 由subnet_constructor注入本项目中是 DenseBlock——5 个卷积串联、逐层拼接特征的 DenseNet 风格子网最后一个卷积零初始化保证初始时子网输出为 0变换为恒等。五、ConvDownsampling可卷积下采样的逐行精读当use_ConvDownsampling: True如 train_IRN_x8.yml时define_G 会强制down_firstTrue、down_num1网络开头先用一个 ConvDownsampling 直接降 scale 倍。它比固定 2 倍的 Haar 更通用权重初始化conv_weights torch.eye(scale²)scale2 时改成 Haar 的 ±1/4 四行权重scale3 时第一行取均匀 1/9低通正向先用ReplicationPad2d补齐到 scale 的整数倍再用 reshape permute 把scale×scale邻域拉平类似 pixel-unshuffle与scale²×scale²的分组卷积做通道混合输出通道数变为C*scale²反向直接对权重求矩阵逆torch.inverse(conv_weights)走一遍卷积 pixel-shuffle 即可精确还原——这就是可逆的来源下采样是通道间的线性变换求逆就是上采样。对比之下HaarDownsampling 只固定降 2 倍把不可学习的 Haar 矩阵A/H/V/D 四通道作为深度卷积权重stride2 完成下采样反向用转置卷积精确还原。六、InvRescaleNet把操作串成一张可逆链InvRescaleNet 用一个ModuleList顺序存放所有操作down_firstTrueIRN / x3、x8先放下采样模块再放block_num[0]个 InvBlock否则交替放置 Haar 下采样与 InvBlock逐层降分辨率。forward的精髓只有一行正向按operations顺序执行反向按reversed(operations)逆序执行——每一步自身可逆整条链自然可逆。七、定量与定性效果2× 下采样时IRN 在 Set5 上达到43.99 dB / 0.9871参数仅 1.66M全面超过 CAREDSR 等 50M 级组合4× 时同样以 4.35M 参数取得各数据集最优验证了这套可逆块 可逆下采样设计的表达力。八、快速上手清单安装依赖pip install numpy opencv-python lmdb pyyaml PyTorch/CUDA修改 options/train/train_IRN_x4.yml 中dataroot_GT指向 DIV2K 高清图运行python train.py -opt options/train/train_IRN_x4.yml开始训练换options/test/test_IRN_x4.yml执行python test.py即可评测彩色与压缩扩展版入口分别为 train_IRN-Color.py 和 train_IRN-Compression.py。小结IRN 的可逆图像缩放实现非常克制可逆性由InvBlockExp的加法-缩放结构和ConvDownsampling的可逆矩阵保证IRNModel负责前向拟合 反向重建的双向训练InvRescaleNet只做正向顺序执行、反向逆序执行的调度。读懂 Inv_arch.py 这不到 300 行代码基本就掌握了整个项目的精华。✨【免费下载链接】Invertible-Image-Rescaling[ECCV 2020, IJCV 2022] Invertible Image Rescaling项目地址: https://gitcode.com/gh_mirrors/in/Invertible-Image-Rescaling创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考