Nodes/ComfyUI_SVFR/SVFR_Sampler
ComfyUI Node

SVFR_Sampler

The node that actually fixes faces in old video (and where it eats your VRAM)

By smthemex·Created 2 years ago·Updated 2 months ago· 104
SVFR_Sampler
  • image
  • model
  • mask
  • images
seed77
width512
height512
decode_chunk_size16
n_sample_frames16
steps50
noise_aug_strength0.00
overlap3
min_appearance_guidance_scale2.0
max_appearance_guidance_scale2.0
i2i_noise_strength1.0
infer_mode
save_videofalse
crop_face_regiontrue

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:

  1. Reference pass. It takes your frames (resized to width×height, optionally cropped to the face region via YOLO if crop_face_region is 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.
  2. 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_scale pair, interpolated across frames) controls how hard it holds onto that look, and overlap controls 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 an IMAGE batch (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 is bfr; 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 inpainting is in your mode and there's no mask. 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_region on/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, reduce width/height to 512, and cut n_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.

CategorySVFR

Inputs (17)

NameTypeDefaultDescription
imageIMAGE
modelMODEL_SVFR
seedINT770–2147483647
widthINT512128–2048
heightINT512128–2048
decode_chunk_sizeINT164–128
n_sample_framesINT168–100
stepsINT501–4096
noise_aug_strengthFLOAT0.000–1
overlapINT31–64
min_appearance_guidance_scaleFLOAT2.00.1–10
max_appearance_guidance_scaleFLOAT2.00.1–10
i2i_noise_strengthFLOAT1.00.1–1
infer_modeCOMBO5 options: bfr, colorization, inpainting, bfr_color, bfr_color_inpaint
save_videoBOOLEANfalse
crop_face_regionBOOLEANtrue
maskoptMASK

Outputs (1)

NameTypeDescription
imagesIMAGE