Dev.to WebDev 🛠 Dev 👁 0 📖 2 min read

The ordering mistake in every upscaling workflow

The ordering mistake in every upscaling workflow Every upscaling guide starts with the enlargement. That single decision is why so many "restored" files look worse than the originals they came from. I learned it the s

The ordering mistake in every upscaling workflow

The ordering mistake in every upscaling workflow

Every upscaling guide starts with the enlargement. That single decision is why so many "restored" files look worse than the originals they came from.

I learned it the slow way, building a browser upscaler while trying to save footage off a 2016 phone. This is the order that held up under testing.

Why enlarging first is wrong

Compression does not scatter random noise across a frame. It imposes a regular grid of blocks. Random grain belongs to the sensor; blocks belong to the encoder.

An upscaler is a model that reconstructs plausible detail. Give it blocks and it will reconstruct plausible blocks — larger and crisper than the ones you started with. The result reads as sharp until you compare it to the source.

Denoise first. The blocks have to be gone before anything is enlarged.

The rule nobody states: 2x per axis

Before and after: a compressed clip denoised, then upscaled 2x

Past roughly 2× enlargement the model switches from reconstruction to invention. Skin turns waxy. Small text turns into strokes that look like letters and are not. At 2× on a 540p clip you reach 1080p, which is enough for anything watched on a screen.

The marketing numbers — 4K, 8K, 16K — describe output resolution, not recovered information. A 480p source pushed to 4K is a bigger file with the same amount of real detail, plus a lot of invented detail.

Inspect at 100%, on the hair

Never judge at fit-to-window. Fit-to-window downscales the artifacts you just created and hides them.

Zoom to 100% on the hair edge. Hair is the first thing to fail: fuse the strands and the denoise was too strong, separate them and it held. Then read any small text in the frame — text is the fastest tell between reconstruction and invention. Finally check skin, which is the most forgiving and therefore the least useful test.

Contrast belongs after cleaning

Raising contrast on a blocky frame makes the blocks louder. Grade once the surface is clean.

Not everything is recoverable

Out-of-focus footage is gone. The sensor never recorded that detail and no model can know what it would have been — whatever an upscaler returns for a defocused face is a guess dressed as detail. Motion blur from a whip pan is nearly as lost.

A quick test before starting: hold the original at 100%. If there is edge structure, it can probably be sharpened. If there is none, stop.

What the pipeline actually looks like

For clips over 30 seconds, cut at keyframes to avoid re-encoding:

ffmpeg -ss 00:01:12 -to 00:01:38 -i input.mp4 -c copy damage.mp4

Then after processing, concatenate without a second encode:

printf "file '%s'\n" seg-*.mp4 > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

Same four steps regardless of tool: denoise, enlarge ≤2×, inspect at 100%, grade.

I built UpgoLAB, which runs this in a tab — free during launch, no card, no watermark. If you have a source type that breaks the order above, I would rather hear about it than not.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.