Paper · 2020-12-03 · cs.CV
BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond
Keeps video super-resolution simple: bidirectional recurrent propagation, optical-flow warping of features, residual blocks and pixel-shuffle upsampling. IconVSR adds keyframe information-refill and coupled propagation. Author-reported: BasicVSR gets 31.42 dB PSNR on REDS4 (BI, x4) with 6.3M parameters and 63 ms, against EDVR's 31.09 dB with 20.6M and 378 ms.
Image super-resolutionRecurrent neural network (RNN)Residual learningvideo-super-resolutionbidirectional-propagationoptical-flowrecurrent-networkimage-restoration
arXivPDFCodeMarkdown11 min read
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Video is a stack of frames, and the same scene shows up in many of them, though each frame is slightly shifted by motion. BasicVSR takes a low-resolution video and produces a sharper, larger version. It uses information from the whole clip, not a short window of frames: it sweeps through time once forward and once backward, carrying a running memory along each sweep, so the first and last frames both get to use the rest of the video.
Before the memory is combined with the current frame, it is shifted to line up with that frame using estimated motion. The shifting happens on internal feature maps rather than on raw pixels. The authors argue that this plain design, with few extra parts, is enough to beat more elaborate models while running faster.
A second model, IconVSR, adds two small extras. It refreshes the memory from a few selected frames, and it lets the two sweeps share what they have seen.
TL;DR
- A simple baseline for video super-resolution (VSR), built from four parts: bidirectional propagation, flow-based feature alignment, feature concatenation and pixel-shuffle upsampling §3.1.
- Author-reported: BasicVSR beats EDVR on REDS4 (BI), UDM10 and Vid4 (BD), but EDVR stays higher on Vimeo-90K-T and on Vid4 (BI) tab. 2.
- Author-reported runtime: 63 ms for BasicVSR against 378 ms for EDVR, at an LR size of 180×320; the GPU used for timing is not stated tab. 2.
- IconVSR adds information-refill and coupled propagation, for up to +0.31 dB over BasicVSR at 8.7M parameters §3.2 tab. 2.
- The official repository does not contain the model code (see Paper vs code).
Problem
Video SR has to combine information from neighbouring frames, but those frames are misaligned because of motion. The authors note that many published methods are complex: sliding-window designs use deformable alignment and attention (EDVR), and recurrent designs stack several projection modules (RBPN). The extra parts raise runtime and model size, and dissimilar designs make reimplementation and fair comparison hard §1 fig. 1.
Two propagation choices fail in known ways:
- Local windows discard distant frames. When the authors split test sequences into K independent segments, PSNR drops as the segments shrink, and the drop is largest at the segment ends §3.1 fig. 3.
- Unidirectional recurrence starves early frames. The first frame sees only itself, so early frames score lower. The authors measure a consistent drop of about 0.5 dB when only part of the sequence is used §3.1 fig. 4.
The authors also assume that long sequences are realistic inputs, which is the premise of the design §4.
Method
BasicVSR has four parts, one per functionality: propagation, alignment, aggregation and upsampling §3.1 fig. 2 tab. 1. The table below summarises how each method in the paper's comparison fills them.
| Method | Framework | Propagation | Alignment | Aggregation | Upsampling |
|---|---|---|---|---|---|
| EDVR | Sliding-window | Local | Yes (DCN) | Concatenate + TSA | Pixel-shuffle |
| MuCAN | Sliding-window | Local | Yes (correlation) | Concatenate | Pixel-shuffle |
| TDAN | Sliding-window | Local | Yes (DCN) | Concatenate | Pixel-shuffle |
| BRCN | Recurrent | Bidirectional | No | Concatenate | Pixel-shuffle |
| FRVSR | Recurrent | Unidirectional | Yes (flow) | Concatenate | Pixel-shuffle |
| RSDN | Recurrent | Unidirectional | No | Concatenate | Pixel-shuffle |
| BasicVSR | Recurrent | Bidirectional | Yes (flow) | Concatenate | Pixel-shuffle |
| IconVSR | Recurrent | Bidirectional (coupled) | Yes (flow) | Concatenate + Refill | Pixel-shuffle |
Source: tab. 1.
Propagation (bidirectional). Two recurrent branches run in opposite time directions and do not exchange information. The backward state at frame i is computed from frame i and the backward state of frame i+1. The forward state at frame i is computed from frame i and the forward state of frame i-1 §3.1:
h_i^b = F_b(x_i, x_{i+1}, h_{i+1}^b), \qquad h_i^f = F_f(x_i, x_{i-1}, h_{i-1}^f) eq. 1
Alignment (flow-based, on features). For each branch, the flow between frame i and its sweep neighbour is estimated from the LR frames. The neighbour's state is warped with that flow, and residual blocks refine the result §3.1:
s_i^{b,f} = S(x_i, x_{i\pm1}), \qquad \bar{h}_i^{b,f} = W(h_{i\pm1}^{b,f}, s_i^{b,f}), \qquad h_i^{b,f} = R_{b,f}(x_i, \bar{h}_i^{b,f}) eq. 2
Here S is the flow estimator, W is the spatial warp, and R is a stack of residual blocks. Warping features rather than images is the authors' central alignment choice: image warping lost 0.17 dB in their test, and removing alignment entirely lost 1.19 dB §3.1.
Aggregation and upsampling. The two final states are combined and passed to an upsampler made of convolutions and pixel-shuffle layers §3.1:
y_i = U(h_i^f, h_i^b) eq. 3
The paper's own summary is that concatenation and pixel-shuffle are the commonly used choices and were sufficient here §3.1.
# BasicVSR forward pass [§3.1] [eq. 1-3] [fig. 2]
# Input: lr_frames (T, 3, H, W)
# Output: hr_frames (T, 3, 4H, 4W)
def basicvsr(lr_frames):
# Backward sweep, last frame to first [eq. 1]
backward_states = run_branch(lr_frames, direction=-1)
# Forward sweep, first frame to last [eq. 1]
forward_states = run_branch(lr_frames, direction=+1)
hr_frames = []
for i in range(T):
# Upsample the two states of frame i [eq. 3]
hr_frames.append(upsample(forward_states[i], backward_states[i]))
return hr_frames
def run_branch(lr_frames, direction):
# Zero state at the start of the sweep [fig. 4]
state = zeros(C, H, W) # C = 64 channels [app. A]
states = [None] * T
for i in sweep_order(T, direction):
# Flow to the sweep neighbour, undefined at the sequence end
# (see Pitfalls) [eq. 2]
flow = flow_net(lr_frames[i], lr_frames[i + direction])
# Move the carried state onto frame i [eq. 2]
aligned = warp(state, flow)
# 30 residual blocks refine the aligned state [app. A] [eq. 2]
state = residual_blocks(lr_frames[i], aligned)
states[i] = state
return statesIconVSR: information-refill. Keyframes are chosen every five frames in all experiments app. A. At a keyframe, a separate extractor reads three consecutive LR frames and its output is fused with the aligned state by one convolution. Non-keyframes skip this step. The fused feature then goes through the residual blocks §3.2 fig. 5:
e_i = E(x_{i-1}, x_i, x_{i+1}), \qquad \hat{h}_i^{b,f} = \begin{cases} C(e_i, \bar{h}_i^{b,f}) & i \in I_{key} \\ \bar{h}_i^{b,f} & \text{otherwise} \end{cases} eq. 4
h_i^{b,f} = R_{b,f}(x_i, \hat{h}_i^{b,f}) eq. 5
In the paper, E is EDVR-M, a lightweight EDVR app. A. Unlike interval-based methods that process each keyframe interval on its own, the intervals in IconVSR stay connected through the propagation branches §3.2.
IconVSR: coupled propagation. The backward state of frame i is also fed to the forward branch at frame i. The output then uses only the forward state §3.2:
h_i^b = F_b(x_i, x_{i+1}, h_{i+1}^b), \qquad h_i^f = F_f(x_i, x_{i-1}, h_i^b, h_{i-1}^f), \qquad y_i = U(h_i^f) eq. 6
The authors say this adds no computational cost, because only the branch connections change §3.2.
# IconVSR changes to BasicVSR [§3.2] [eq. 4-6] [fig. 5]
# Keyframes: every 5th frame [app. A]
def icon_forward_step(i, state, backward_state, lr_frames):
# Align the previous forward state to frame i [eq. 2]
flow = flow_net(lr_frames[i], lr_frames[i - 1])
aligned = warp(state, flow)
# Information-refill, keyframes only [eq. 4]
if i in keyframes:
extra = extractor(lr_frames[i - 1], lr_frames[i], lr_frames[i + 1])
aligned = fuse_conv(extra, aligned)
# Coupled input from the backward branch; where it enters the
# residual blocks is not stated [eq. 5] [eq. 6]
return residual_blocks(lr_frames[i], aligned, backward_state)Hyperparameters
Values are as stated in the paper unless marked as from code. "Not stated" means the paper and its appendix do not give the value.
| Name | Value | Where | Notes |
|---|---|---|---|
| Upscaling factor | 4× | §4 | |
| Degradations | BI and BD | §4 app. A | Models are trained and tested with both app. A |
| BI downsampling | MATLAB imresize | app. A | |
| BD blur | Gaussian, σ = 1.6 | app. A | Kernel size and boundary handling not stated; code uses size 12 and replicate padding BD_degradation.m |
| BD subsampling | Every 4 pixels | app. A | Code starts at offset 2 BD_degradation.m |
| Flow estimator S | SPyNet, pretrained | §4 app. A | Fine-tuned with the main network |
| Residual blocks per branch | 30 | app. A | |
| Feature channels | 64 | app. A | |
| Feature extractor (IconVSR) | EDVR-M | §3.2 app. A | Applied at keyframes only |
| Keyframe interval | 5 | app. A | Fixed in all experiments |
| Optimizer | Adam | §4 app. A | β, ε not stated |
| LR schedule | Cosine annealing | §4 app. A | Minimum LR and restarts not stated |
| Initial LR, feature extractor | 1×10⁻⁴ | §4 | |
| Initial LR, flow estimator | 2.5×10⁻⁵ | §4 | |
| Initial LR, all other modules | 2×10⁻⁴ | §4 | |
| Iterations | 300K | §4 | |
| Frozen warm-up | Flow and extractor frozen for the first 5,000 iterations | §4 | |
| Batch size | 8 | §4 | |
| Input patch | 64×64 LR | §4 | |
| Training sequence length | 15 frames (REDS); 14 frames (Vimeo-90K) | app. A | Vimeo sequences are extended by time-flipping app. A |
| Inference input | Whole video sequence | app. A | |
| Loss | Charbonnier, ε = 1×10⁻⁸ | app. A eq. 7 | |
| Hardware | 2× NVIDIA Tesla V100 | app. A | Training time not stated |
| Framework | PyTorch | app. A |
Charbonnier loss, from the appendix app. A:
\mathcal{L} = \frac{1}{N} \sum_{i=0}^{N} \rho(y_i - z_i), \qquad \rho(x) = \sqrt{x^2 + \epsilon^2} eq. 7
Here z_i is the ground-truth HR frame and N is the number of pixels.
Data splits §4 app. A:
- Training: REDS, minus the test and validation clips; Vimeo-90K.
- Test: REDS4 (clips 000, 011, 015, 020 of the REDS training set), Vid4, UDM10 and Vimeo-90K-T.
- Validation: REDSval4 (clips 000, 001, 006, 017 of the REDS validation set).
Model complexity tab. 4 app. A:
| Component | BasicVSR | IconVSR |
|---|---|---|
| Flow estimator | 1.4M | 1.4M |
| Main network | 4.9M | 4.9M |
| Feature extractor | - | 2.4M |
| Total | 6.3M | 8.7M |
The paper's parameter counts include the flow estimator, so the comparison with other methods is said to be fair §4.
Results
Author-reported. Setup: 4× SR, trained on REDS and Vimeo-90K, tested on REDS4, Vid4, UDM10 and Vimeo-90K-T with BI and BD degradations. Metrics are PSNR/SSIM, computed on the Y channel except REDS4, which uses RGB. The runtime is measured at an LR size of 180×320 tab. 2 §4. The paper compares against 14 models.
Full quantitative comparison tab. 2. Format: PSNR/SSIM. Blank cells in the paper are "-".
| Method | Params (M) | Runtime (ms) | REDS4 BI | Vimeo-90K-T BI | Vid4 BI | UDM10 BD | Vimeo-90K-T BD | Vid4 BD |
|---|---|---|---|---|---|---|---|---|
| Bicubic | - | - | 26.14/0.7292 | 31.32/0.8684 | 23.78/0.6347 | 28.47/0.8253 | 31.30/0.8687 | 21.80/0.5246 |
| VESPCN | - | - | - | - | 25.35/0.7557 | - | - | - |
| SPMC | - | - | - | - | 25.88/0.7752 | - | - | - |
| TOFlow | - | - | 27.98/0.7990 | 33.08/0.9054 | 25.89/0.7651 | 36.26/0.9438 | 34.62/0.9212 | - |
| FRVSR | 5.1 | 137 | - | - | - | 37.09/0.9522 | 35.64/0.9319 | 26.69/0.8103 |
| DUF | 5.8 | 974 | 28.63/0.8251 | - | - | 38.48/0.9605 | 36.87/0.9447 | 27.38/0.8329 |
| RBPN | 12.2 | 1507 | 30.09/0.8590 | 37.07/0.9435 | 27.12/0.8180 | 38.66/0.9596 | 37.20/0.9458 | - |
| EDVR-M | 3.3 | 118 | 30.53/0.8699 | 37.09/0.9446 | 27.10/0.8186 | 39.40/0.9663 | 37.33/0.9484 | 27.45/0.8406 |
| EDVR | 20.6 | 378 | 31.09/0.8800 | 37.61/0.9489 | 27.35/0.8264 | 39.89/0.9686 | 37.81/0.9523 | 27.85/0.8503 |
| PFNL | 3.0 | 295 | 29.63/0.8502 | 36.14/0.9363 | 26.73/0.8029 | 38.74/0.9627 | - | 27.16/0.8355 |
| MuCAN | - | - | 30.88/0.8750 | 37.32/0.9465 | - | - | - | - |
| TGA | 5.8 | - | - | - | - | - | 37.59/0.9516 | 27.63/0.8423 |
| RLSP | 4.2 | 49 | - | - | - | 38.48/0.9606 | 36.49/0.9403 | 27.48/0.8388 |
| RSDN | 6.2 | 94 | - | - | - | 39.35/0.9653 | 37.23/0.9471 | 27.92/0.8505 |
| RRN | 3.4 | 45 | - | - | - | 38.96/0.9644 | - | 27.69/0.8488 |
| BasicVSR | 6.3 | 63 | 31.42/0.8909 | 37.18/0.9450 | 27.24/0.8251 | 39.96/0.9694 | 37.53/0.9498 | 27.96/0.8553 |
| IconVSR | 8.7 | 70 | 31.67/0.8948 | 37.47/0.9476 | 27.39/0.8279 | 40.03/0.9694 | 37.84/0.9524 | 28.04/0.8570 |
The paper marks best results in red and second-best in blue. Those marks are lost in the table above.
Headline comparisons, as stated in the text and checked against tab. 2:
- BasicVSR vs RSDN: +0.61 dB on UDM10 (BD) at a similar parameter count (6.3M vs 6.2M) §4.
- BasicVSR vs EDVR: +0.33 dB on REDS4 (BI), with 6.3M vs 20.6M parameters and 63 ms vs 378 ms §4 tab. 2.
- Speed: "up to 24×" is the ratio of RBPN's runtime to BasicVSR's in tab. 2 (1507 ms vs 63 ms) §1.
- IconVSR vs BasicVSR: up to +0.31 dB (Vimeo-90K-T BD); the paper's gains are largest on Vimeo-90K-T and REDS4 §4 tab. 2.
Ablation of IconVSR components, PSNR on REDS4 / REDSval4 tab. 3 §5.1:
| Setting | Info-Refill | Coupled-Prop | PSNR |
|---|---|---|---|
| BasicVSR | no | no | 31.42 / 30.17 |
| IconVSR without refill | no | yes | 31.60 / 30.38 |
| IconVSR | yes | yes | 31.67 / 30.45 |
The paper says the two components add up to 0.28 dB over BasicVSR tab. 3. Without any keyframes, IconVSR behaves as a plain recurrent network and reaches 30.38 dB on REDSval4, which is 0.21 dB above BasicVSR §5.2.
Keyframe count at test time: fig. 10 plots PSNR on REDSval4 against the number of keyframes N for 100-frame clips with evenly spaced keyframes. The authors report that PSNR rises with N. The exact values are only in the figure.
Qualitative results are in fig. 6 (REDS4), fig. 7 (Vimeo-90K-T) and app. B (more datasets, plus an IconVSR ablation). The paper describes them in words: the outputs have sharper edges, and only BasicVSR and IconVSR recover some square and strip patterns §4.
Paper vs code
Repository: https://github.com/ckkelvinchan/BasicVSR-IconVSR, at commit
15dda03d77127ca54f08c53e30aff42b61c0a0fb, Apache-2.0. The owner is the first
author's account, and the project page the paper's authors maintain links to it.
- The paper states that code "will be made publicly available" app. A. At
this commit the repository holds only
README.md,LICENSEandBD_degradation.m. It has no model, training, loss, or configuration code, so no architecture or training hyperparameter can be checked against code. - The README points to OpenMMLab's MMEditing for BasicVSR and IconVSR. That is a third-party project, so we do not use it here and did not check it.
- The one code file, the BD degradation script, matches the paper's stated σ and subsampling. It adds a kernel size of 12, replicate boundary padding and a sampling offset of 2 pixels BD_degradation.m. None of these is stated in the paper.
Search log: the paper has no code link in its text or arXiv metadata. The project page links the same repository. The GitHub search for "BasicVSR_IconVSR" returned that repository first, owned by the first author.
Pitfalls
- Sequence ends are undefined. Eq. 1 uses x_{T+1} for the backward branch and x_0 for the forward branch, and eq. 4 uses x_{i+1} at the last keyframe. The paper says the bidirectional model uses zero feature initialisation fig. 4, but not how the flow, or the frames beyond the ends, are handled.
- Warp details are not stated. Interpolation method, flow sign convention, and the spatial resolution of the carried state are not given. The state is presumably at LR resolution, but the paper does not say so.
- Input channels are not stated. It is not clear which tensors are concatenated before the residual blocks R and before the upsampler U, nor how many convolutions U has or what upscaling each pixel-shuffle step applies.
- Output residual unclear. The paper does not say whether U predicts a residual on top of a bicubic-upsampled input or the HR frame directly.
- Coupled input placement. Eq. 6 feeds h_i^b into F_f, but does not say which layer of the forward branch receives it.
- Loss notation. In eq. 7, N is both the pixel count and the upper index of the frame sum. The pixel value range (0–1 or 0–255) is not stated, and ε = 10⁻⁸ scales with it.
- Vimeo-90K length. The compiled appendix says sequences are extended to 14 frames by time-flipping. A commented-out paragraph in the LaTeX source describes mirroring 7-frame clips, but it is not in the paper. The exact construction is therefore ambiguous.
- Mixed claims. The text says BasicVSR outperforms prior methods "including REDS4, UDM10, and Vid4". tab. 2 shows EDVR ahead on Vid4 (BI), 27.35 vs 27.24. Check the degradation column before quoting.
- Runtime is limited. The runtime is taken at a single LR size, 180×320, and the GPU is not named. The "24×" headline compares against RBPN, not against the fastest baseline.
- Keyframe mismatch. IconVSR is trained with a fixed interval of 5. The paper says fewer keyframes can be used at inference §5.2, but reports the quality effect only as a plot fig. 10.
- Whole-video inference. Test inputs are whole sequences app. A. Memory use for long videos is not reported.
- Results are author-reported. REDS4 is scored in RGB, the rest on Y. Numbers from other papers must use the same protocol before they are compared.
- Missing pieces. The Adam β and ε, the minimum learning rate of the cosine schedule and the weight initialisation are not stated.
Lineage
- Builds on: SPyNet for optical flow app. A; EDVR-M as the IconVSR feature extractor app. A; residual blocks and pixel-shuffle upsampling, as stated in §3.1.
- Compared against: the 14 methods in tab. 2 (VESPCN, SPMC, TOFlow, FRVSR, DUF, RBPN, EDVR-M, EDVR, MuCAN, PFNL, RLSP, TGA, RSDN, RRN).
- Superseded by: not known from wiki content.
Source and license
Adapted from “BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond” by Kelvin C. K. Chan, Xintao Wang, Ke Yu, Chao Dong, Chen Change Loy (arXiv:2012.02181), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/ckkelvinchan/BasicVSR-IconVSR at commit 15dda03d7712 (Apache-2.0). Any quoted code is shown under that license.