Nodes/ComfyUI Roop Custom Nodes/Roop Face Swap + Enhancer
ComfyUI Node

Roop Face Swap + Enhancer

The Roop swap with a polish pass — when the plain swap looks soft

By glitchinthemetrix16·Created about a year ago·Updated about a year ago· 1
Roop Face Swap + Enhancer
  • source_image
  • target_image
  • swapped_image
roop_dir/content/roop
output_nameroop_output.png
many_facesfalse

The plain RoopFaceSwap node gives you a working swap, and then you look at it and go "…hmm." That soft, smeary, slightly-off face is the 128x128 inswapper doing its thing. This node is the same swap with a face enhancer run on top - it takes the swapped result and pushes it through an enhancement model to sharpen features, smooth the seam, and generally make the result look less like a deepfake sticker.

Functionally it's RoopFaceSwap's twin: same inputs, same output, same wrapper mechanism. The only difference is in the roop command, which adds a second frame processor:

python run.py -s source.png -t target.png -o output.png \
  --execution-provider cuda --frame-processor face_swapper face_enhancer

When you actually want it

Reach for this one when:

  • The plain swap leaves the face looking blurred or "painted on" - the common case on lower-resolution targets.
  • Your target image has strong lighting or shadows and the swap seam is obvious.
  • You're producing something meant to survive a second look.

It's also the safer default if you're not sure - an enhanced swap rarely looks worse, just occasionally different.

The trade-offs

The enhancer is a real cost, not a free upgrade. It roughly doubles the work per image, so on a busy T4 the node noticeably slows down. And enhancement models have a personality: they can make faces look waxy, plastic, or over-smooth, especially on anime or heavily stylized targets. In the worst cases the enhancer also nudges the identity a little, so if the likeness matters more than the polish, skip it.

My take: for photoreal targets with any detail worth keeping, the enhancer is usually worth the wait. For anime, stylized renders, or any face that's already clean, you're often better off with the plain node and a good upscaler afterward.

Inputs and output

Identical to the basic node - source_image, target_image, roop_dir, output_name, and many_faces. Same meaning: source is the face you want, target is the image being modified, many_faces handles multiple faces in the target, and roop_dir must point at a real roop checkout (the /content/roop default is a Colab path). Output is swapped_image (IMAGE), read back from a PNG on disk, so it drops into Save Image like anything else.

Install and gotchas

Same pack, same install, same roop dependency - clone the repo into custom_nodes, point roop_dir at a roop checkout, and make sure the first-run model download finishes. Everything that bites the basic node bites this one: the bare python subprocess, the hard-coded CUDA requirement, and roop's NSFW filter, which can quietly produce a black image instead of an error. Check the ComfyUI console for [Warning] Roop did not produce output if you get black where a face should be.

One thing to know before you blame the enhancer: no enhancement fixes a bad swap. If the source face is tiny, angled, or badly lit, you'll just get a crisper version of a mediocre swap. Start with a clean, front-facing source image and treat the enhancer as the finish, not the fix.

CategoryRoop/Enhanced

Inputs (5)

NameTypeDefaultDescription
source_imageIMAGE
target_imageIMAGE
roop_dirSTRING/content/roop
output_nameSTRINGroop_output.png
many_facesBOOLEANfalse

Outputs (1)

NameTypeDescription
swapped_imageIMAGE