Save Face Model π ReActor
Bank a face as a reusable file
- image
- face_model
ReActor Save Face Model (class ReActorSaveFaceModel) is the node that turns a face into a file you can reuse forever. Point it at an image (or an existing face model), name it, and it extracts the InsightFace identity embedding and writes a .safetensors file to ComfyUI/models/reactor/faces. From then on you load that face with Load Face Model instead of dragging the same reference photo into every workflow. It landed in ReActor 0.4.0 and it's the quiet backbone of any serious face-swap setup - build your library once, stop re-detecting faces from photos on every run.
The saved file is tiny. It's not an image; it's the ArcFace vector - a compact numeric description of the face's geometry, the same thing the swapper actually consumes. That's why the README calls these "super lightweight face models." They're portable, versionable, and give you a stable identity input, which a photo-plus-live-detection path can quietly fail to do run to run.
How it works
Save Face Model is an output node - it's a terminal in your graph, it produces a file rather than a value to wire onward. You give it one of two things to save: an image (it detects a face in the image and extracts the embedding) or a ready-made face_model (it just writes that to disk). Both inputs are optional; connect whichever fits your workflow. If you somehow connect both, the image takes priority. The most common pattern is to run it off the FACE_MODEL output of a main swap node, so the exact face ReActor just built gets banked for reuse.
The inputs and outputs that matter
face_model_name- the filename it saves under (defaultdefault, which you should absolutely change, because the next save clobbers it). This becomes the label you'll pick in Load Face Model, so name it after the person.select_face_index- which face to grab when the source has more than one, 0-based, largest-first by default.0is the biggest face in frame; bump it to pull a specific person out of a group.image/face_model(both optional) - the two ways to feed it. An image makes a fresh model from a photo; aface_modelre-saves one you already have (handy for saving a blended model built elsewhere).
save_mode is the write toggle (on by default). There are no outputs - the result is a file on disk, not a socket. To use it, refresh the page and pick it in Load Face Model.
How to install it
Comes with the ReActor pack. ComfyUI Manager: search ReActor, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Gourieff/comfyui-reactor-node
then run install.bat / install.py and restart. Nothing extra to download for this node - it writes files, it doesn't need models beyond the InsightFace detection stack the pack already installs.
Common issues & troubleshooting
I saved a face but it's not showing up in Load Face Model. ComfyUI scans ComfyUI/models/reactor/faces only on page load. Refresh the browser and it appears. The README recommends running ComfyUI Manager so that refresh doesn't cost you an unsaved workflow.
It overwrote my previous face. You left face_model_name on default (or reused a name). Each save writes to that exact filename with no versioning. Give every face a unique, descriptive name.
The saved face isn't a great likeness. One mediocre photo makes a mediocre model. For real accuracy, don't save from a single image - use Build Blended Face Model to average several clean shots of the person, then save that. More angles and better lighting in equals a stronger embedding out.
"No face detected" when saving from an image. The face is too small, too turned, or too occluded for the detector. Feed a clearer, more front-facing crop, or save from a FACE_MODEL the swap node already produced instead of from a raw photo.
Menu won't load at all. That's the pack's InsightFace dependency failing to build - the classic Visual Studio / C++ toolchain headache. Use the prebuilt Insightface wheel the README links for your Python version. And the usual reminder: these embeddings come from InsightFace's non-commercial weights, so what you build with them is personal/research use, not for sale.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| save_mode | BOOLEAN | true | β |
| face_model_name | STRING | default | β |
| select_face_index | INT | 0 | β |
| imageopt | IMAGE | β | |
| face_modelopt | FACE_MODEL | β |
Outputs (0)
No outputs