Roop Face Swap + Enhancer
The Roop swap with a polish pass — when the plain swap looks soft
- source_image
- target_image
- swapped_image
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.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| source_image | IMAGE | — | |
| target_image | IMAGE | — | |
| roop_dir | STRING | /content/roop | — |
| output_name | STRING | roop_output.png | — |
| many_faces | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| swapped_image | IMAGE | — |