📷InstantID Generation
The node that actually puts a face into your image
- face_image
- pipe
- insightface
- pose_image_optional
- IMAGE
This is the payoff node - everything else in this pack (the loaders, the styler) exists to feed this one. Hand it a photo of a face and it generates a new image where that face shows up, in whatever scene and style your prompt describes, with no LoRA training and no dataset. Just one reference photo.
How it works
InstantID's real trick isn't the face embedding alone - plenty of tools do that. It's that this node also runs IdentityNet, a ControlNet-shaped module conditioned on five facial landmarks, alongside the identity embedding. The embedding tells the model what the face looks like; IdentityNet constrains where its features sit - eyes, nose, mouth position - so the likeness holds up across different poses and styles instead of collapsing into "vaguely the right person, wrong structure." That's the piece plain IP-Adapter FaceID lacks, and it's why this single node needs both a pipe (the assembled SDXL + adapter + controlnet model) and an insightface model wired in - it's running the identity injection and the spatial conditioning at once.
The inputs and outputs that matter
face_image is your reference photo - this is what gets embedded for identity. pipe comes from the model-loader chain (base model → InstantID adapter attached). insightface comes from InsightFace Loader (Zho), not the plain one. positive and negative are your prompts, which you can type directly or feed from ID Prompt_Styler.
Three sliders do the real tuning work. ip_adapter_scale (default 0.8, 0–1) controls how strongly the identity embedding pulls the output toward your reference face. controlnet_conditioning_scale (default 0.8, 0–1) controls how strongly IdentityNet enforces facial structure. guidance_scale (default 5, 0–10) is your regular CFG - the InstantID paper's own default is also 5, so this one's worth leaving alone unless you have a reason not to. steps defaults to 50 here (the original InstantID demo runs closer to 30; more steps won't hurt, just costs time). enhance_face_region (default on) crops in tighter on the face region during conditioning - leave it on unless you have a specific reason to turn it off.
One easy-to-miss input: pose_image_optional. It's not a general OpenPose replacement - the README is explicit that it only steers pose around the face, not the whole body. If you feed it a full-body reference expecting body-pose control, you'll be disappointed; that's not what this slot does.
Output is a plain IMAGE - no conditioning object, just the finished picture.
Installing it
Search ComfyUI Manager for ComfyUI-InstantID, or cd ComfyUI/custom_nodes && git clone https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID.git, cd in, pip install -r requirements.txt, restart. This node alone won't run - you need the whole chain built first: ID ControlNet Loader → ID Base Model Loader (hub or local) → Ipadapter_instantid Loader → this node, plus InsightFace Loader (Zho) feeding insightface directly.
Common issues
Results look "burned" - oversaturated, crunchy, artifact-y. This is a known InstantID behavior, not a bug in your setup. Drop ip_adapter_scale first, and keep guidance_scale near the 5 default rather than pushing SDXL's usual 7-ish - InstantID is more CFG-sensitive than a plain SDXL run.
Face is recognizable but the structure feels off, or the pose barely follows your reference. Push controlnet_conditioning_scale up before touching anything else - that's IdentityNet's dial, and the community's practical sweet spot for InstantID's overall strength runs noticeably higher than the node's own defaults, more like 1.0–1.3 territory once you're tuning both scales together.
Likeness is close but not exact. That's the honest ceiling here - InstantID gets you recognizably close and stops. For pixel-perfect matching, pair it with a post-process face swap on top; don't expect this node alone to get there.
Commercial use. The InsightFace weights this node's identity signal depends on are non-commercial research models - that restriction covers anything you generate with this node, regardless of the wrapper's own license.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| face_image | IMAGE | — | |
| pipe | MODEL | — | |
| insightface | INSIGHTFACEMODEL | — | |
| positive | STRING | — | |
| negative | STRING | — | |
| ip_adapter_scale | FLOAT | 0.800–1 | — |
| controlnet_conditioning_scale | FLOAT | 0.800–1 | — |
| steps | INT | 501–100 | — |
| guidance_scale | FLOAT | 5.000–10 | — |
| enhance_face_region | BOOLEAN | true | — |
| seed | INT | 00–18446744073709550000 | — |
| pose_image_optionalopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |