MMagic 中的 BasicVSR:视频超分辨率核心组件解析与完整实战指南
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
本文基于 MMagic 仓库中 configs/basicvsr/README.md 及其配套配置、源码编写,系统讲解 CVPR 2021 论文 BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond 在 MMagic 中的实现、配置与训练/测试流程。
文章导读
BasicVSR 是视频超分辨率(Video Super-Resolution, VSR)领域的经典基线模型,它用简洁的流水线串联起 Propagation(传播)、Alignment(对齐)、Aggregation(聚合)、Upsampling(上采样)四大基本功能,在速度与重建质量上同时取得显著提升。本文将以 MMagic 仓库中的 BasicVSR 实现为蓝本,带你从论文核心思想出发,逐层拆解 BasicVSRNet 网络结构源码、读懂 训练配置文件、掌握 REDS4 与 Vimeo-90K 数据集上的训练/测试命令,并理解 SPyNet 光流对齐、双向传播与 Charbonnier 损失等关键工程细节。读完本文,你将能够独立复现 BasicVSR 的完整训练与评测流程,并以此为基线进一步探索 IconVSR 等扩展方案。
BasicVSR 核心思想:四大基本组件
视频超分辨率与图像超分辨率最大的不同在于需要额外利用时间维度的信息,因此其方法往往比图像方法包含更多组件,复杂设计屡见不鲜。BasicVSR 的出发点正是“解开这些纠缠”,围绕四个基本功能重新审视 VSR 最本质的组件:
- Propagation(传播):沿时间方向传递特征,让信息在相邻帧之间流动;
- Alignment(对齐):利用光流将相邻帧的特征对齐到当前帧,缓解运动带来的错位;
- Aggregation(聚合):将来自不同时间位置的信息融合起来;
- Upsampling(上采样):将低分辨率特征恢复为高分辨率输出。
通过复用已有组件并辅以极小的重新设计,BasicVSR 在速度和重建质量上相较许多当时的 SOTA 算法都取得了可观的改进。论文还通过系统性分析解释了增益来源,并进一步展示了 BasicVSR 的可扩展性——通过信息回填机制(information-refill)与耦合传播方案(coupled propagation)加强信息聚合,得到了其扩展版本 IconVSR。BasicVSR 与 IconVSR 由此成为后续 VSR 研究强有力的基线。
源码级拆解:BasicVSRNet 网络结构
在 MMagic 中,BasicVSR 的网络实现位于 mmagic/models/editors/basicvsr/basicvsr_net.py,核心类为通过 @MODELS.register_module() 注册的 BasicVSRNet。该类目前仅支持 4 倍(x4)上采样,其构造函数接收三个关键参数:
| 参数 | 默认值 | 含义 |
|---|---|---|
mid_channels | 64 | 中间特征图的通道数 |
num_blocks | 30 | 每条传播分支中残差块的数量 |
spynet_pretrained | None | SPyNet 光流网络的预训练权重路径 |
网络内部由三大部分组成:
1. SPyNet:光流对齐网络
BasicVSRNet 内部实例化了 SPyNet(pretrained=spynet_pretrained) 用于特征对齐。与 tof.py 中使用的 SPyNet 版本相比,BasicVSR 内的版本有两个差异:使用了更多 SPyNetBasicModule,且不使用 Batch Normalization。
SPyNet 采用空间金字塔结构:输入图像先被归一化(使用 ImageNet 的 mean/std,见源码中注册的 mean=[0.485, 0.456, 0.406]、std=[0.229, 0.224, 0.225] 缓冲区),随后通过 5 层平均池化逐级下采样构建金字塔。光流从最粗的层级开始估计,每层将上一层的流结果双线性上采样后叠加残差进行细化。每个 SPyNetBasicModule 由 5 个 7×7 卷积组成(通道数 8→32→64→32→16→2,前 4 层带 ReLU 激活),输入为拼接的 [参考图(3), 邻居图(3), 初始光流(2)] 共 8 通道,输出为细化后的 2 通道光流。
在 compute_flow 中(见 basicvsr_net.py),网络对相邻帧对 (lrs[:, :-1], lrs[:, 1:]) 估计后向光流,再对反向帧对估计前向光流。值得注意的优化是:当输入为镜像扩展序列(mirror-extended)时,前向光流等于后向光流的翻转,因此可以跳过前向光流计算以节省开销。
2. 双向传播分支:ResidualBlocksWithInputConv
BasicVSRNet 包含两个对称的传播分支,分别对应后向传播(backward-time,从末帧到首帧)与前向传播(forward-time,从首帧到末帧):
self.backward_resblocks = ResidualBlocksWithInputConv(mid_channels + 3, mid_channels, num_blocks)
self.forward_resblocks = ResidualBlocksWithInputConv(mid_channels + 3, mid_channels, num_blocks)
ResidualBlocksWithInputConv 先用一个 3×3 卷积把输入通道(LR 帧的 3 通道 + 传播特征的 mid_channels 通道)对齐到 mid_channels,再接上 LeakyReLU(negative_slope=0.1) 和 num_blocks 个无 BN 的残差块(ResidualBlockNoBN,由 make_layer 串联)。
3. 融合与上采样
两条分支的输出特征拼接后(mid_channels * 2 通道)依次经过:
fusion:1×1 卷积降回mid_channels通道;- 两级
PixelShufflePack像素重排上采样(每级 2 倍,合计 4 倍); conv_hr(3×3 卷积到 64 通道)与conv_last(3×3 卷积到 3 通道)重建 HR 帧;- 关键细节:
img_upsample用双线性插值将当前 LR 帧直接放大 4 倍作为base,最终输出out += base——即网络学习的是残差增量,这一设计能显著稳定训练并加速收敛。
从源码看,forward 的完整流程为:检查输入是否镜像扩展 → 计算光流 → 后向传播逐帧累积特征 → 前向传播逐帧融合并上采样(见 basicvsr_net.py)。此外,当输入尺寸小于 64×64 时,网络会打印警告,提示该结构是为大于 64×64 的输入设计的。
模型封装:BasicVSR(BaseEditModel)
在 MMagic 中,网络结构 BasicVSRNet 由编辑模型类 BasicVSR 封装(见 mmagic/models/editors/basicvsr/basicvsr.py),它继承自 BaseEditModel,并实现了几个关键机制:
- SPyNet 冻结训练(fix_iter):训练初期固定光流网络的参数。
BasicVSR.__init__从train_cfg读取fix_iter(默认 0),并注册一个step_counter缓冲计数训练步数。在forward_train中,当step_counter < fix_iter时,所有名称含spynet或edvr的参数被置为requires_grad=False;当step_counter == fix_iter时再全部解冻。这也是配置文件中train_cfg=dict(fix_iter=5000)与optim_wrapper中paramwise_cfg设置 SPyNet 学习率倍率(lr_mult=0.125)的原因所在。 - 镜像扩展检测:
check_if_mirror_extended通过判断输入序列前半与后半是否互为翻转来检测镜像扩展输入;推理时若 GT 是单帧图像,则输出序列会按t//2取中间帧(带镜像扩展时取前后两段对应位置帧的平均,见 basicvsr.py)。 - 空间-时间集成(Ensemble):支持可选的
SpatialTemporalEnsemble,通过ensemble配置项启用,用于测试时提升精度。
单元测试 tests/test_models/test_editors/test_basicvsr/test_basicvsr.py 验证了上述行为:前 1 步(fix_iter=1)训练后 SPyNet 权重 requires_grad 为 False,第 2 步后恢复为 True;同时验证了 val_step 在序列 GT 与单帧 GT 两种情况下输出形状分别为 (5, 3, 64, 64) 与 (3, 64, 64)。
配置文件逐项解析
REDS4 训练配置(basicvsr_2xb4_reds4.py)
完整配置见 configs/basicvsr/basicvsr_2xb4_reds4.py,它继承 _base_/default_runtime.py 与 _base_/datasets/basicvsr_test_config.py。核心配置项如下:
model = dict(
type='BasicVSR',
generator=dict(
type='BasicVSRNet',
mid_channels=64,
num_blocks=30,
spynet_pretrained='https://download.openmmlab.com/mmediting/restorers/'
'basicvsr/spynet_20210409-c6c1bd09.pth'),
pixel_loss=dict(type='CharbonnierLoss', loss_weight=1.0, reduction='mean'),
train_cfg=dict(fix_iter=5000),
data_preprocessor=dict(
type='DataPreprocessor',
mean=[0., 0., 0.],
std=[255., 255., 255.],
))
关键点解读:
- 损失函数:使用
CharbonnierLoss,loss_weight=1.0、reduction='mean'。Charbonnier 损失是 L1 损失的平滑变体,对离群点更鲁棒,是视频超分任务的主流选择。 - 数据预处理:
mean=[0,0,0]、std=[255,255,255]意味着输入被归一化到 [0,1] 区间。 - 训练数据管线:
GenerateSegmentIndices(随机切取连续帧段,interval_list=[1])→ 加载 LR/GT 图像 →PairedRandomCrop(GT patch 256×256,对应 LR patch 64×64,因为 scale=4)→ 水平/垂直 Flip(各 0.5 概率)→RandomTransposeHW(0.5 概率转置)→PackInputs。 - 数据集:
BasicFramesDataset,data_root='data/REDS',data_prefix=dict(img='train_sharp_bicubic/X4', gt='train_sharp'),即 LR 来自双三次下采样 4 倍的train_sharp_bicubic/X4,GT 为train_sharp;ann_file='meta_info_reds4_train.txt',训练时num_input_frames=15,验证时num_input_frames=100且fixed_seq_len=100。 - 优化器:Adam,
lr=2e-4,betas=(0.9, 0.99);通过paramwise_cfg将 SPyNet 的学习率降为 0.125 倍(即 2.5e-5)。 - 学习率调度:
CosineRestartLR,periods=[300000]、restart_weights=[1]、eta_min=1e-7,单周期余弦退火。 - 训练循环:
IterBasedTrainLoop,max_iters=300_000,每 5000 次迭代验证一次;find_unused_parameters = True。
Vimeo-90K 变体配置
- basicvsr_2xb4_vimeo90k-bd.py 以 reds4 配置为
_base_,主要差异:- 数据管线中加入了
MirrorSequence(将 7 帧序列镜像扩展为 13 帧,提升双向传播的边界帧质量); - 数据集为 Vimeo-90K(
data_prefix=dict(img='BDx4', gt='GT'),num_input_frames=7、fixed_seq_len=7,通过load_frames_list指定im1.png~im7.png); - 验证集换为 Vid4(
data_prefix=dict(img='BDx4', gt='GT')),评估指标使用PSNR/SSIM且convert_to='Y'(在 Y 通道上评估)。
- 数据管线中加入了
- basicvsr_2xb4_vimeo90k-bi.py 则仅将
data_prefix的img从BDx4改为BIx4,其余完全继承 vimeo90k-bd 配置。由此可以看出 BIx4(双三次下采样)与 BDx4(模糊+下采样)是两种不同的降质模型,对应不同的退化假设。
测试基准与评估设置
configs/base/datasets/basicvsr_test_config.py 中集中定义了 REDS4、Vimeo-90K-T、UDM10、Vid4 六组测试 dataloader 与 evaluator,并指定 test_cfg = dict(type='MultiTestLoop')、test_dataloader/test_evaluator 列表,实现了单次命令在多个基准上的统一评测。评估前缀(如 REDS4-BIx4-RGB、Vimeo-90K-T-BDx4-Y)清晰标识了每个指标所属的数据集、降质方式与通道。
实验结果一览
以下结果来自 configs/basicvsr/README.md 与 metafile.yml,其中 REDS4 在 RGB 三通道上评估,其余数据集在 Y 通道上评估,指标为 PSNR / SSIM。所有模型均使用 2 张 Tesla V100-PCIE-32GB 训练。
| 模型配置 | 数据集 | PSNR (RGB) | SSIM (RGB) | PSNR (Y) | SSIM (Y) |
|---|---|---|---|---|---|
| basicvsr_2xb4_reds4 | REDS4 (BIx4) | 31.4170 | 0.8909 | - | - |
| basicvsr_2xb4_reds4 | UDM10 (BDx4) | - | - | 33.4478 | 0.9306 |
| basicvsr_2xb4_reds4 | Vimeo-90K-T (BIx4) | - | - | 36.2848 | 0.9395 |
| basicvsr_2xb4_reds4 | Vimeo-90K-T (BDx4) | - | - | 34.4700 | 0.9286 |
| basicvsr_2xb4_reds4 | Vid4 (BIx4) | - | - | 27.2694 | 0.8318 |
| basicvsr_2xb4_reds4 | Vid4 (BDx4) | - | - | 24.4541 | 0.7455 |
| basicvsr_2xb4_vimeo90k-bi | REDS4 (BIx4) | 30.3128 | 0.8660 | - | - |
| basicvsr_2xb4_vimeo90k-bi | UDM10 (BDx4) | - | - | 34.5554 | 0.9451 |
| basicvsr_2xb4_vimeo90k-bi | Vimeo-90K-T (BIx4) | - | - | 37.2026 | 0.9434 |
| basicvsr_2xb4_vimeo90k-bi | Vimeo-90K-T (BDx4) | - | - | 34.8097 | 0.9316 |
| basicvsr_2xb4_vimeo90k-bi | Vid4 (BIx4) | - | - | 27.2755 | 0.8248 |
| basicvsr_2xb4_vimeo90k-bi | Vid4 (BDx4) | - | - | 25.0517 | 0.7636 |
| basicvsr_2xb4_vimeo90k-bd | REDS4 (BIx4) | 29.0376 | 0.8481 | - | - |
| basicvsr_2xb4_vimeo90k-bd | UDM10 (BDx4) | - | - | 39.9953 | 0.9695 |
| basicvsr_2xb4_vimeo90k-bd | Vimeo-90K-T (BIx4) | - | - | 34.6427 | 0.9335 |
| basicvsr_2xb4_vimeo90k-bd | Vimeo-90K-T (BDx4) | - | - | 37.5501 | 0.9499 |
| basicvsr_2xb4_vimeo90k-bd | Vid4 (BIx4) | - | - | 26.2708 | 0.8022 |
| basicvsr_2xb4_vimeo90k-bd | Vid4 (BDx4) | - | - | 27.9791 | 0.8556 |
可以观察到:在匹配的降质类型(BDx4 训练对应 BDx4 测试)上,各模型取得最优成绩,印证了降质匹配对 VSR 性能的关键影响;basicvsr_vimeo90k_bd 在 UDM10 与 Vid4 的 BDx4 基准上优势明显,说明在模糊降质数据上训练能更好地泛化到同类退化场景。预训练 SPyNet 权重文件名(spynet_20210409-c6c1bd09.pth)与各模型的官方权重、训练日志均可通过配置中标注的官方下载地址获取。
快速开始:训练与测试
训练
在 MMagic 中,可以使用以下命令在 CPU 或单卡/多卡 GPU 上训练 BasicVSR(命令与 configs/basicvsr/README.md 一致):
# CPU 训练
CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/basicvsr/basicvsr_2xb4_reds4.py
# 单卡 GPU 训练
python tools/train.py configs/basicvsr/basicvsr_2xb4_reds4.py
# 多卡 GPU 训练(8 卡)
./tools/dist_train.sh configs/basicvsr/basicvsr_2xb4_reds4.py 8
训练日志、checkpoint 将输出到配置中 work_dir 指定的 ./work_dirs/basicvsr_2xb4_reds4 目录。更完整的训练流程说明可参考 MMagic 的 train_test.md 中 “Train a model in MMagic” 一节。
测试
测试命令同样支持 CPU/单卡/多卡三种方式,第二个参数为预训练权重地址:
# CPU 测试
CUDA_VISIBLE_DEVICES=-1 python tools/test.py configs/basicvsr/basicvsr_2xb4_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth
# 单卡 GPU 测试
python tools/test.py configs/basicvsr/basicvsr_2xb4_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth
# 多卡 GPU 测试
./tools/dist_test.sh configs/basicvsr/basicvsr_2xb4_reds4.py https://download.openmmlab.com/mmediting/restorers/basicvsr/basicvsr_reds4_20120409-0e599677.pth 8
由于 basicvsr_2xb4_reds4.py 继承了 basicvsr_test_config.py 中的多基准测试设置,tools/test.py 会自动在 REDS4、Vimeo-90K-T、UDM10、Vid4 六个测试子集上依次评测并输出带前缀的 PSNR/SSIM 指标。预训练模型的测试流程详见 train_test.md 中 “Test a pre-trained model in MMagic” 一节。
从 BasicVSR 到 IconVSR
论文指出,BasicVSR 的简洁流水线具有很强的可扩展性。通过引入 信息回填机制(在每个传播阶段补充原始 LR 帧的信息,缓解传播过程中信息的衰减)和 耦合传播方案(将双向传播的特征耦合,增强信息聚合能力),可以得到扩展版本 IconVSR,在多个基准上进一步提升精度。在 MMagic 仓库中,IconVSR 的配置位于 configs/iconvsr,其网络实现同样复用了 BasicVSR 模型封装(源码注释明确说明“this model is used for IconVSR”),共享 SPyNet 冻结训练、镜像扩展检测等机制。对研究者而言,BasicVSR 是验证新组件(对齐、传播、聚合策略)的理想基线;对工程实践者而言,它在速度和精度上的平衡使其成为视频超分任务可靠的默认选择。
引用
若在研究中使用了 BasicVSR,请引用以下论文(来自 configs/basicvsr/README.md):
@InProceedings{chan2021basicvsr,
author = {Chan, Kelvin CK and Wang, Xintao and Yu, Ke and Dong, Chao and Loy, Chen Change},
title = {BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond},
booktitle = {Proceedings of the IEEE conference on computer vision and pattern recognition},
year = {2021}
}
参考资源速查
- 模型 README:configs/basicvsr/README.md
- 模型元数据:configs/basicvsr/metafile.yml
- REDS4 训练配置:configs/basicvsr/basicvsr_2xb4_reds4.py
- Vimeo-90K 训练配置:basicvsr_2xb4_vimeo90k-bd.py 与 basicvsr_2xb4_vimeo90k-bi.py
- 测试基准配置:configs/base/datasets/basicvsr_test_config.py
- 网络实现:mmagic/models/editors/basicvsr/basicvsr_net.py
- 模型封装:mmagic/models/editors/basicvsr/basicvsr.py
- 单元测试:tests/test_models/test_editors/test_basicvsr/test_basicvsr.py
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
更多推荐
所有评论(0)