Unified Face Models

Character files that work on more than one image model. Each one carries FLUX.2 reference images and a trained Krea 2 adapter in the same 107 MB container, so the same face renders on either model without keeping two sets of files in sync.

File Krea 2 adapter trained on Train resolution Apply strength
emmy-s500-v2.char Krea 2 Turbo (krea2_turbo_bf16) 1024 0.5
emmy-s5.char Krea 2 RAW (krea2_raw_bf16) 512 1.0

Same five references and same description in both, so their FLUX.2 side is identical. They differ only in how the Krea 2 adapter was trained, and both are published so the two can be compared on the same face.

Built and trained on the canvas in Inline Studio.

Comparisons

The same character rendered from the same .char, so the differences come from the model and the adapter rather than from the references.

Comparison 1 Comparison 2
Comparison 3 Comparison 4

Why one file holds two things

FLUX.2 klein and Krea 2 accept a character in completely different ways, so a single artifact cannot work for both.

FLUX.2 klein has a reference channel. Reference images become tokens the model attends to at every denoising step, which is why a prompt can address them by position. Feeding it resized copies of the originals is enough, and no training is involved.

Krea 2 has no reference channel. Its image input is ordinary img2img: the picture is encoded once into the starting latent and then denoised away, so there is nothing left for the model to hold on to. The only way to give Krea 2 a persistent identity is a trained LoRA.

A .char stores identity once and compiles a payload per model family:

emmy-s500-v2.char
  manifest.json                        payload index, fingerprints, training record
  refs/000..004.png                    the 5 reference images, immutable
  derived/face_000..004.png            YuNet face crops at 512px
  text/description.md                  the locked description, which is also the trigger
  scoring/centroid_sface.json          128-d SFace identity centroid
  scoring/centroid_dinov2-base.json    768-d DINOv2 subject centroid
  scoring/embeds_*.json                per-reference embeddings
  payloads/flux2-klein/ref_000..004.png    references resized onto FLUX.2's policy
  payloads/krea2-lora/adapter.safetensors  the trained Krea 2 LoRA, 183 MB

The references and the description are the truth. Everything under payloads/ and scoring/ is cache and can be rebuilt from refs/. Adding a third model means adding a payload, not rebuilding the character.

What is in them

Shared by both files:

References 5 images, three at 2048px and two at 640px
Trigger emmy4k woman with, natural unretouched skin, black hairs, fair skin
FLUX.2 payload flux2-klein, 5 compiled references, max 1 MP, dimensions rounded to a multiple of 16
Krea 2 payload krea2-lora, one 183 MB adapter

Krea 2 training

emmy-s500-v2.char, trained on Turbo:

Base krea2_turbo_bf16.safetensors (Krea 2 Turbo)
Steps 500
Rank 16
Resolution 1024
Apply strength 0.5

emmy-s5.char, trained on RAW:

Base krea2_raw_bf16.safetensors (Krea 2 RAW)
Steps 500
Rank / alpha 16 / 16
Learning rate 1e-4, constant, Adam8bit
Resolution 512
Batch size 1
Scope full (attention + feed-forward)
Caption dropout 0.05
Apply strength 1.0

The RAW file came first, and training on RAW was deliberate: Turbo is step-distilled, and an adapter trained on RAW loads onto Turbo afterwards anyway. The Turbo file tests that directly by training on Turbo itself, at 1024 rather than 512, and applying at half strength.

Every training image used the description above as its caption in both runs, so emmy4k is what each adapter binds to.

The 500-step checkpoint beat the 800-step one on the same references. With five images that is 100 passes each, and past roughly that point the adapter starts returning the training frames instead of the person in them.

Using it

Drop the file in models/characters/ and add a Load Character node, then wire it into the character input of a FLUX.2 or Krea 2 node.

Inline Studio picks the payload for whichever model you wired it to. FLUX.2 gets the five references and a prompt line naming their positions. Krea 2 gets the adapter. Either way the description is prepended to your prompt, so type only what changes:

walking on a forest trail, half body shot

Not the description again. It is already there, and repeating it pushes the adapter harder toward the frames it trained on.

For Krea 2, generate with Krea 2 Turbo at 8 steps and guidance 0, whichever file you use. The RAW-trained adapter loads onto Turbo as intended, and the Turbo-trained one was built against it. Each file carries its own apply strength, 1.0 for the RAW one and 0.5 for the Turbo one, so leave the strength alone unless you are deliberately dialling the identity up or down.

Building your own

The full graph that produced this file, from five photos to a .char with both payloads, is published here:

FLUX.2 + Krea 2: multi-model portable consistent characters

Import it into Inline Studio, swap the reference images, and run the graph. It encodes the character, compiles the FLUX.2 references, builds a training dataset from the same references, trains the Krea 2 LoRA, attaches it, and writes the .char.

Related Workflows

License

MIT. The reference images are the character's own; check that you have the rights to any faces you train on before publishing a .char.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support