SVFR_Sampler
The node that actually fixes faces in old video (and where it eats your VRAM)
- image
- model
- mask
- images
Here's the honest pitch for this node: you have a low-res, blurry, color-faded video of a face - a 90s camcorder clip, a security still, a family recording - and you want it restored, not stylized. The old hack was running a per-frame face fixer like Reactor and hoping the identity didn't drift between frames. It drifts; that's exactly why a community thread on this pack noted you "really need a video model that can do temporal consistency." SVFR is that video model, and SVFR_Sampler is where it all happens. It takes a batch of frames plus the loaded MODEL_SVFR from SVFR_LoadModel and runs a full SVD-based diffusion pass over the video - upscaling, restoring, colorizing, or inpainting faces while keeping them consistent from frame to frame.
What actually happens inside
The sampler is a two-phase pipeline, and the two phases are why it works as well as it does:
- Reference pass. It takes your frames (resized to
width×height, optionally cropped to the face region via YOLO ifcrop_face_regionis on), generates a short first clip, then pulls the generated reference frame and runs it through ArcFace to extract a face identity embedding - the "this is who we're restoring" fingerprint. - Full pass. The whole video is denoised conditioned on that embedding, so every frame is guided toward the same identity. Appearance guidance (the
min/max_appearance_guidance_scalepair, interpolated across frames) controls how hard it holds onto that look, andoverlapcontrols how consecutive frame chunks blend during long-video stitching.
The infer_mode drop-down sets what the model actually does: bfr (blind face restoration - the default purpose), colorization, inpainting, or the combos bfr_color and bfr_color_inpaint. This is the most important choice you'll make. For inpainting (and the triple combo) you must wire a mask into the optional mask input - SVFR_Sampler refuses to run without one.
The inputs a beginner actually sets
There are a lot of knobs; most have sane defaults. These are the ones that matter:
image- your video as anIMAGEbatch (load it with VHS or load each frame separately and concat). Needs 8+ frames; the node hard-errors below that.infer_mode- pick the task. Default isbfr; inpainting needs the mask.width/height- output resolution, 64-step increments, 512 default. Bump past 512 and you'll pay for it in VRAM.n_sample_frames- frames per generation chunk (16 default, up to 100). Higher = more temporal context, more memory.steps- 50 default, which for an SVD-sized model is slow; you can often drop toward 25–30 for iteration.seed,save_video(writes an mp4 to ComfyUI's output folder),crop_face_region(default on).
The rest - noise_aug_strength (SVD-style conditioning noise on the reference, 0 default), decode_chunk_size (how many frames the VAE decodes at once - drop it when you OOM), overlap, the guidance scales, i2i_noise_strength (1.0 = full denoise) - leave alone until you're chasing a specific artifact.
Output is images, an IMAGE batch of the restored frames; feed it to a video encoder (or let save_video handle it).
Install
Same pack as the loader:
cd ComfyUI/custom_nodes
git clone https://github.com/smthemex/ComfyUI_SVFR
pip install -r requirements.txt
(Or ComfyUI Manager → "ComfyUI_SVFR".) Restart, then model files - see the SVFR_LoadModel article for the full list: four SVFR weights in models/SVFR/, an SVD checkpoint in models/checkpoints/, and the SVD VAE in models/vae/.
Common issues
- "input video has not much frames below 8 frame" - your batch has fewer than 8 frames. Feed it a longer clip; this is a real limit, not a bug.
- Inpainting without a mask - the sampler refuses if
inpaintingis in your mode and there's nomask. Route a mask through SVFR_img2mask, not a default ComfyUI placeholder - the node explicitly rejects the stock 64×64 mask. - "Face alignment failed in the generated reference image" - the first-pass reference had no detectable face, so identity extraction failed. Usually the clip is too dark, too small, or the face is heavily occluded; try
crop_face_regionon/off and a brighter input. - VRAM / slow runs. The shared workflows recommend 16GB+, and the sampler clears the cache after each run for a reason - an SVD-sized pipeline plus a long video is the classic OOM setup. Drop
decode_chunk_size, reducewidth/heightto 512, and cutn_sample_frames. People have reported it running on 8GB, but "running" is doing a lot of work in that sentence.
This is a heavy, opinionated node that assumes you know what face restoration is. But for its niche - making an old face video watchable without identity flicker - there isn't a good ComfyUI-native alternative, and when it works, the result genuinely looks like the same person across every frame.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | MODEL_SVFR | — | |
| seed | INT | 770–2147483647 | — |
| width | INT | 512128–2048 | — |
| height | INT | 512128–2048 | — |
| decode_chunk_size | INT | 164–128 | — |
| n_sample_frames | INT | 168–100 | — |
| steps | INT | 501–4096 | — |
| noise_aug_strength | FLOAT | 0.000–1 | — |
| overlap | INT | 31–64 | — |
| min_appearance_guidance_scale | FLOAT | 2.00.1–10 | — |
| max_appearance_guidance_scale | FLOAT | 2.00.1–10 | — |
| i2i_noise_strength | FLOAT | 1.00.1–1 | — |
| infer_mode | COMBO | 5 options: bfr, colorization, inpainting, bfr_color, bfr_color_inpaint | |
| save_video | BOOLEAN | false | — |
| crop_face_region | BOOLEAN | true | — |
| maskopt | MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |