Everyone benchmarks upscalers on a single still frame. That is the easy part. Run the
same model across 300 consecutive frames and the output starts to boil: edges crawl,
texture shimmers, and grain that was static in the source starts dancing.
Why per-frame inference fails
A neural upscaler is a function f(frame) -> bigger frame. Applied frame by frame, it
has no idea that frame 41 and frame 42 depict the same wall. Small differences in the
model's prediction — a slightly different interpretation of a shadow — become visible
as flicker precisely because the rest of the image is stable.
The fix is either:
- Optical-flow guided warping — propagate the previous frame's high-res result forward along motion vectors, then only infer the residual.
- Temporal conditioning — feed the model several adjacent frames so it predicts a consistent sequence rather than independent stills.
Both are expensive. This is also why consumer upscalers cap video length: the cost per
second is an order of magnitude above stills.
What to do about it as a user
- Prefer shorter clips. Temporal artefacts accumulate over long sequences.
- Denoise before upscaling. Noise is the single biggest driver of frame-to-frame inconsistency — if the model interprets random grain differently each frame, you get shimmer that no amount of temporal smoothing can fix afterwards.
- Compare output playing, never paused. A paused frame hides exactly the defect you are trying to evaluate.
I have been testing this with UpgoLAB, which does video upscaling
server-side in the browser — free during its launch period, no install. The practical
limit it hits is exactly this cost curve, not image quality.
The takeaway
If you are evaluating an upscaler on stills alone, you are evaluating the easy 20% of the
problem. Motion is where the engineering actually lives.

Top comments (0)