PMA Character Swap (Basic)
The 'Character Swap' node that doesn't swap yet — but its control maps are useful
- reference_image
- character_face
- output_image
- pose_preview
- depth_preview
The honest review first
PMA Character Swap (Basic) is pitched as ControlNet-based face swapping: feed it a reference_image (the pose and scene you want to keep) plus a character_face, get back a picture of your character in that pose. That's the pitch. The reality, straight from the source code: the swap part isn't implemented. Right now the node extracts pose and depth maps from your reference image and returns the reference image untouched as its output_image. The code even prints a warning to your ComfyUI console: "This is a placeholder implementation."
I'm telling you this before anything else because it changes how you should use it. As a face-swap node, it's not there. As a one-shot ControlNet preprocessor - pose map, depth map, optional canny - it works, and that's the part worth knowing.
What it does (and what it doesn't)
It's a small node from the COMFYUI-MODELINSTALLER pack (the "PMA Utils" collection by a single hobbyist dev, with essentially no public footprint yet - treat it as an experiment). Inside, it runs OpenPose and depth extractors against reference_image, optionally canny too, and hands you the resulting control maps.
reference_image- the pose/scene you're keeping. This is the only image that actually gets processed.character_face- the face you'd eventually want pasted in. Accepted, stored, and currently ignored.pose_strength(0–2, default 1) /depth_strength(0–2, default 0.7) /canny_strength(0–2, default 0.5) - how much each control map should weigh further down the pipeline.face_strength,seed, and the positive/negative prompt fields exist in the schema but aren't wired up yet.
Outputs: output_image (today that's just your reference image), pose_preview, and depth_preview. Those two previews are the useful part.
Why you'd reach for it
If you're building the classic "put character X into this pose and scene" workflow, you need pose and depth maps of the reference anyway - ControlNet conditions on structure, and this node hands you both maps in one step. From there the normal move is feeding them into ControlNet Apply nodes. For the identity side, the ecosystem's mature answer is IP-Adapter FaceID (generative, ArcFace embedding plus a companion LoRA) layered on top of the ControlNet structure, or a pixel-level post-process swapper like ReActor. Tellingly, the pack's own one-click model downloader stages ControlNet Union SDXL and IP-Adapter FaceID Plus v2 - exactly the stack this node is meant to eventually drive. It's a scaffold with the right parts in the room.
Install
Same as the rest of the pack: ComfyUI Manager → search COMFYUI-MODELINSTALLER, or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/Pis7i/COMFYUI-MODELINSTALLER
Restart ComfyUI and the node appears under PMA Utils/Character.
The real dependency to know about: the pose/depth extractors come from ComfyUI-ControlNet-Aux (Fannovel16's pack), not from this repo. Without it, the node logs an error and returns flat grayscale stand-ins. That's the most common way this node "silently does nothing."
Troubleshooting
- Previews come out gray and flat -
controlnet_auxisn't importable. Install ComfyUI-ControlNet-Aux and restart. output_imagelooks identical to your input - expected, it's a placeholder, not a bug.- Watch the console - the
[CharacterSwap]WARNING lines name exactly what's missing.
If you need a working face swap today, skip this and build the pipeline from native ControlNet + IP-Adapter FaceID nodes (or ReActor). This one is worth having for its control maps and its hints about where the pack is going - not for a finished swap.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| reference_image | IMAGE | — | |
| character_face | IMAGE | — | |
| positive_prompt | STRING | high quality, detailed face, professional photo, 8k | — |
| negative_prompt | STRING | bad face, deformed, ugly, blurry, low quality, bad anatomy | — |
| pose_strength | FLOAT | 1.000–2 | — |
| depth_strength | FLOAT | 0.700–2 | — |
| face_strength | FLOAT | 0.850–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| canny_strengthopt | FLOAT | 0.500–2 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| output_image | IMAGE | — |
| pose_preview | IMAGE | — |
| depth_preview | IMAGE | — |