ZenID Combine Face
The 'predict your baby' node, and what it actually does under the hood
- control_net
- model
- positive
- negative
- image_1
- image_2
- MODEL
- positive
- negative
You've probably seen this one on Bilibili or Douyin before you ever touched ComfyUI: two photos in, one face out, billed as "predict what your child will look like" or "what if these two had a kid." ZenID Combine Face is the node behind those videos, and the honest version of its pitch is: it doesn't read genetics, it averages two face embeddings and lets you steer which parent wins. Which is a great party trick, and a real teaching tool for how InstantID-style identity injection works.
What it's doing
The math is almost embarrassingly simple once you know where to look. Both input images go through InsightFace's antelopev2 detector to become 512-dimensional ArcFace embeddings - the same biometric vectors that power the whole no-training identity family (IP-Adapter FaceID, PuLID, ReActor all sit on this backbone). Then the node interpolates them:
face_embed = face_embed_2 * (1 - balance) + face_embed_1 * balance
That balance slider is the entire product. At 0 you get person 2's identity, at 1 you get person 1's, at 0.5 a true fifty-fifty blend. The result is fed through the InstantID image adapter, which patches cross-attention on your model so denoising follows the averaged embedding. For the spatial half, the node draws a synthetic keypoint template (a canonical landmark layout) as the ControlNet hint rather than borrowing a real face's geometry - sensible, since a hypothetical child has no real pose to borrow.
There's a fun detail in the source worth respecting: a helper function computes a zeroed-out embedding from the seed derived from the real one, which is how the unconditional path is built. It's the same recipe the FaceSwap node uses, so if you've run ApplyZenID, this will feel familiar - just with two faces and a balance knob instead of an inpaint latent.
The inputs that matter
The node takes your own text conditioning (a big difference from ApplyZenID): model, positive, negative from your checkpoint and CLIPTextEncode, plus control_net from a ControlNetLoader on the InstantID ControlNetModel. Then:
image_1/image_2- the two faces. Both need a detectable, reasonably front-facing face or it throws.balance(0.5 default) - the one you'll actually be tweaking. This is "does the kid favor mom or dad."weight(0.8 default, up to 5) - how strongly the blended identity drives the result. Start at 0.8 and push up only if the likeness washes out.instantid_file- dropdown of files inComfyUI/models/instantid/.insightface- CPU, CUDA, ROCM, or CoreML. The source defaults the provider string the same way as the swap node.
Outputs are the patched MODEL plus positive/negative - there's no latent, because you bring your own via EmptyLatentImage. The bundled ZenID_combineFace.json workflow is Checkpoint → two CLIPTextEncode → this node → KSampler → VAEDecode, and it runs as-is once models are downloaded.
Installing it
Same pack as the FaceSwap node, so the install is identical. ComfyUI Manager can find "ComfyUI_ZenID", or:
cd ComfyUI/custom_nodes
git clone https://github.com/vuongminh1907/ComfyUI_ZenID
pip install -r ComfyUI_ZenID/requirements.txt
python ComfyUI_ZenID/downloadmodel.py
That script fetches the InstantID ip-adapter.bin, the InstantID ControlNetModel, and the antelopev2 InsightFace weights into your ComfyUI/models/ folders. All local, no API.
Troubleshooting and honest expectations
- Keep expectations calibrated. The "baby" you get is a vector average of two adults, not a genetics engine - it won't predict a real child, just a plausible blend. The novelty is the point; don't oversell it to clients.
- Face only. Like every tool in this family, it captures the face, not the person. If you need body type, clothing, or personality, that's what a LoRA is for - which is exactly why InstantID's 2024 "are LoRAs dead?" moment was answered with a no.
- SDXL-only. InstantID never made it to Flux, so use an SDXL, Illustrious, or Pony checkpoint. The Flux path the README mentions lives in a separate pack.
- Licensing. InstantID's checkpoints are research-only and InsightFace's models are non-commercial. Fine for personal fun, not for selling the results.
- "No face detected." Small, blurry, or heavily angled references get rejected outright. Cleaner input beats higher
weightevery time.
If both inputs detect cleanly and your checkpoint is SDXL, this is a surprisingly reliable one-node novelty - and it's the friendliest possible introduction to what ArcFace embeddings actually are.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| control_net | CONTROL_NET | — | |
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| image_1 | IMAGE | — | |
| image_2 | IMAGE | — | |
| instantid_file | COMBO | 0 options: | |
| insightface | COMBO | 4 options: CPU, CUDA, ROCM, CoreML | |
| balance | FLOAT | 0.500–1 | — |
| weight | FLOAT | 0.800–5 | — |
| start_at | FLOAT | 0.0000–1 | — |
| end_at | FLOAT | 1.0000–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |