You’ve written the same character description ten ways (28-year-old woman with shoulder-length dark hair, brown eyes, small nose, light freckles) and gotten ten different women. None of them are the same person. Same prompt, same model, different face every run.
Fastest fix: text alone cannot describe one specific person. Pick one image you like as a reference, then feed it into every generation through your tool’s identity feature (Midjourney --oref, ChatGPT/gpt-image-2 image upload, Gemini Nano Banana Pro, or IP-Adapter FaceID in ComfyUI), and lock the seed. That alone fixes the large majority of cases. For a character that recurs across a whole project, train a LoRA.
Which bucket are you in?
| Symptom | Most likely cause | Jump to |
|---|---|---|
| Text-only prompt, no reference image attached | Description is too low-bandwidth | Cause 1 + Step 1-2 |
| Reference attached but face still drifts | Seed random, or reference weight too low | Cause 2 + Step 3 |
| Was consistent yesterday, broke today | Tool silently changed default model/version | Cause 3 |
| Face is “close” but never exact | Description names categories, not identifiers | Cause 4 + Step 4 |
| Character appears 30+ times across the project | Need a LoRA / embedding, not per-image tweaks | Cause 5 + Step 5 |
Common causes
Ordered by hit rate, highest first.
1. Text-only description is too low-bandwidth
A 30-word description maps to billions of possible faces. The model picks one that matches loosely, with everything else (jaw shape, eye spacing, mouth width, ear position) randomized per seed.
How to spot it: your prompt has only text and no reference image, LoRA, --oref, or IP-Adapter. Identity will drift, period.
2. Different seed each generation
If you don’t fix the seed, every run starts from different random noise. Even with the same prompt, different noise produces a different face. The seed is the single biggest lever for repeatability.
How to spot it: in your tool’s UI, seed is set to random, -1, or auto.
3. Different model / version / sampler
Switching from SDXL to Flux, or from DPM++ 2M Karras to Euler a, changes the face even at the same seed. Most identity drift between sessions traces to a silently updated tool default. This bites hard right now: Midjourney made V8.1 the default model on June 11, 2026, so any saved --cref workflow from a V6/V7 prompt will behave differently. ChatGPT retired DALL-E 3 on May 12, 2026 and replaced it with gpt-image-2 (ChatGPT Images 2.0), so old DALL-E character tricks no longer apply.
How to spot it: same seed, same prompt, different face. Check whether the tool auto-updated the model, version, or sampler since your last session.
4. Description focuses on adjectives, not identifying features
brown eyes, dark hair, small nose describes 30% of humans. single mole below right eye, slightly crooked front tooth, narrow chin, gold septum ring describes one. The more unique-identifier markers, the more identity locks.
How to spot it: read your description back. Does it identify one person, or a category?
5. No character LoRA / embedding when you need recurring use
For a character that appears 50+ times across a project, hand-tweaking each generation is hopeless. You need a LoRA or embedding trained on 15-30 images of that character.
How to spot it: you’re producing a comic, series, or storybook and the character must stay consistent across many images.
Shortest path to fix
Ordered by leverage. Even just Steps 1 + 2 fixes most cases.
Step 1: Pick one canonical reference image
Generate (or pick) one image of the character you love. This is your “model sheet” — the anchor for every downstream generation.
Best practices for the model sheet:
- Front-facing, neutral expression, three-quarter portrait
- Plain background (so the face dominates the identity signal)
- Distinctive identity markers visible (scar, hairstyle, accessory)
- High resolution (1024x1024 or larger)
Step 2: Feed the reference into every generation
Each platform has its own mechanism. These are current as of June 2026:
# Midjourney (V7 / V8.1, default since June 11 2026)
"a [character] sitting on a bench, [scene] --oref [URL of model sheet] --ow 100"
# --ow (omni weight) ranges 0-1000, default 100. 100-300 = very close match.
# Omni Reference runs on V7; if V8.1 ignores --oref, force --v 7 --oref while
# the improved V8 version finishes training. Old --cref/--cw is V6-only now.
# ChatGPT / gpt-image-2 (DALL-E 3 retired May 12 2026)
- Upload your model sheet in the chat, then prompt "use this exact character".
- Turn on Thinking mode (Plus/Pro/Business) to get up to 8 coherent images
per prompt with the character held consistent across the set.
# Google Gemini (Nano Banana Pro / Gemini 3 Pro Image)
- Attach the model sheet, prompt the new scene. Holds resemblance for up to
5 people and blends up to 14 reference images in one workflow.
# Stable Diffusion / SDXL / Flux via ComfyUI or Forge
- Best identity lock: IP-Adapter FaceID-V2, InstantID, or PuLID (all use
InsightFace face embeddings). InstantID is most accurate but heaviest.
- Plain IP-Adapter Plus Face works for soft influence; weight 0.8-1.0 for
strong identity, lower for loose resemblance.
Step 3: Lock the seed within a session
When generating multiple poses of the same character in one session:
- Midjourney: append
--seed 12345to every prompt - SDXL / Flux UI: set seed to a fixed integer instead of
-1 - ComfyUI: pin the KSampler’s seed and set control_after_generate to
fixed(notrandomize)
Seed alone won’t lock identity across different prompts, but it stabilizes the noise so the per-change drift is smaller.
Step 4: Use identifying markers in the prompt
Bad description (too generic):
28-year-old woman with shoulder-length dark hair, brown eyes, small nose, light freckles
Good description (identity-locking):
28-year-old woman, asymmetric chin-length bob with hair tucked behind left ear,
sharp jawline, single small mole below right eye, narrow nose with slight bump,
warm brown eyes with green flecks, three small ear piercings on the upper left ear
Each unique marker reduces the space of matching faces by roughly an order of magnitude. Three or four markers usually lock identity to the point where a reader recognizes the same person.
Step 5: Train a LoRA for production use
If the character will appear across many images, scenes, or sessions:
# Quick recipe (Kohya_ss / SimpleTuner)
1. Generate 15-30 reference images of the character (varied poses, expressions, outfits)
2. Caption each one with a unique, rare trigger token like "sks_alice"
3. Train: 1500-3000 steps, learning rate 1e-4, batch 1 (SDXL/Flux)
4. Inference: load the LoRA, put the trigger token in the prompt
Don’t want a local setup? Civitai, Replicate, and Astria all offer hosted one-click LoRA training. Budget for an account-tier compute cost; pricing varies, so check current rates before committing a large run.
Step 6: Reuse a character inside one ChatGPT/Gemini chat
For quick storyboarding without a LoRA: in ChatGPT (gpt-image-2) generate the character once, then say “same character, new scene” in later turns of the same chat. Gemini’s Nano Banana Pro does this more reliably and across more characters. Memory is bounded, so identity holds best within a single conversation, not across new chats.
How to confirm it’s fixed
- Generate three images of the character in different poses or scenes (not just re-rolls of the same prompt).
- Crop to the face and put the three side by side.
- Check the fixed markers: same mole position, same nose bump, same ear count. If two of three match on every marker, your setup is locked. If only one matches, raise the reference weight (
--ow, IP-Adapter weight) or add markers from Step 4.
Prevention
- Start every character project by generating and saving one canonical model sheet.
- Build a character spec file: model, version, sampler, seed, reference URL, trigger token (if LoRA), and the list of distinguishing markers.
- For projects with 30+ images of one character, invest in LoRA training upfront — it pays back fast.
- Keep all generated images in a per-character folder, so you always have backup references.
- Re-check your tool’s default model after any update (see Cause 3); a silent version bump is the most common cause of “it broke and I changed nothing.”
FAQ
Why does the face change even when I use the exact same prompt?
A random seed (-1 / auto) starts each run from different noise, so the face changes. Fix the seed (Step 3). If it still drifts between sessions, the tool likely auto-updated its default model or version (Cause 3).
Can DALL-E still do consistent characters in 2026? DALL-E 3 was retired on May 12, 2026. ChatGPT now uses gpt-image-2 (ChatGPT Images 2.0), which is better at this: upload a reference image and turn on Thinking mode to get up to 8 consistent images per prompt.
Why doesn’t --cref work in Midjourney anymore?
--cref was the V6-era character flag. The current method is Omni Reference: --oref [URL] --ow [0-1000]. It runs on V7; if V8.1 ignores it, force --v 7 --oref until the improved V8 version finishes training.
Reference image vs LoRA — which should I use?
Reference image (--oref, IP-Adapter FaceID, gpt-image-2 upload) is instant and good for a handful of images. A LoRA needs 15-30 training images and a training run, but gives the strongest, most repeatable identity across hundreds of generations. Use a reference for one-offs, a LoRA for production.
Which tool is most accurate for a single recurring person? For local control, InstantID or PuLID in ComfyUI (both built on InsightFace) reach very high face accuracy. For zero-setup, Gemini Nano Banana Pro and gpt-image-2 with a reference upload are the strongest hosted options as of June 2026.
Related
- AI image style inconsistent
- AI image style consistency
- AI image prompt basics
- AI consistent character images
Tags: #Image generation #Debug #Troubleshooting #Consistency