Nodes/FM_nodes/ConvIR Motion DeBlur
ComfyUI Node

ConvIR Motion DeBlur

Deblur motion blur without a diffusion rewrite

By FuouM·Created 2 years ago·Updated about a year ago· 9
ConvIR Motion DeBlur
  • src_img
  • res_img
model_namegopro

Motion blur is the fastest way to ruin a photo you can't retake, and the usual ComfyUI fix - run it through a generative upscaler - is heavy artillery. Slow, non-deterministic, and while it "fixes" the frame it quietly rewrites the face. ConvIR Motion DeBlur is the opposite: one forward pass through a plain convolutional network, same size in and out, shake gone, identity untouched. It's the node you keep around for shaky phone photos and old handheld footage, not for glamour shots.

What it actually is

ConvIR is short for Revitalizing Convolutional Network for Image Restoration (Cui et al., published in IEEE TPAMI, successor to the IRNeXt line). The pitch of that paper is that classic encoder-decoder restoration nets waste most of their compute shuffling redundant features between stages - ConvIR prunes that redundancy and squeezes the rest through multi-scale attention. In this wrapper you get a U-shaped encoder-decoder with feature aggregation between scales. It's a fraction of the size of an SDXL-based upscaler and it does exactly one job: predict a clean frame from a blurred one. The output comes back the same resolution you fed in, so you can chain it in front of whatever upscaler you actually trust.

The two inputs that matter

Only two, and only one of them is interesting:

  • src_img - any IMAGE tensor. It works on a batch, which means you can feed it a video's frames and it'll chew through them one by one (with a ComfyUI progress bar).
  • model_name - gopro (the default) or rsblur. GoPro covers classic camera-shake / motion blur from a moving camera. rsblur is trained on rolling-shutter artifacts - the skew and wobble you get panning a phone or shooting from a moving car. GoPro is the safe first try; switch to rsblur if your source is panning video and the result still smears.

The one output, res_img, is the deblurred IMAGE. Wire it to a Save Image, or straight into an upscaler for the full "rescue an old photo" pipeline.

Installing it

FM_nodes is the pack, installed like any other:

cd ComfyUI/custom_nodes
git clone https://github.com/FuouM/FM_nodes

or search FM_nodes in ComfyUI Manager and hit Install, then restart ComfyUI. Requirements are negligible - just torch and einops, both things ComfyUI already drags in. There's no API key and no auth anywhere in this pack.

The part that trips everyone up: the model is not auto-downloaded. Grab convir_gopro.pkl (and convir_rsblur.pkl if you want it) from the ConvIR repo's Google Drive and drop it at custom_nodes/FM_nodes/models/convir/modeblur/. Note it's the modeblur folder, not models/convir/ root - the code looks for models/convir/modeblur/convir_<name>.pkl. Queue the node and get a file-not-found, that's what happened.

Where people get burned

A few notes from actually running it. The node hardcodes the large size variant internally, so it's the heaviest ConvIR model doing the work - fine on a modern card, slow on a laptop iGPU, and if you batch a whole video expect it to take a while (it's a per-frame loop). Images smaller than ~225px on a side get upscaled first and everything is padded to multiples of 32, then cropped back, so edge behavior is clean. And unlike a diffusion pass, this is deterministic - same frame in, same frame out, every time. That's a feature when you're restoring video and don't want flicker.

It's not magic: bad motion blur with heavy compression will come back looking de-blurred but a bit plastic. That's the trade for not rewriting the subject. For the rest of the time, it just works.

CategoryFM_nodes/ConvIR

Inputs (2)

NameTypeDefaultDescription
src_imgIMAGE
model_nameCOMBOgopro2 options: gopro, rsblur

Outputs (1)

NameTypeDescription
res_imgIMAGE