43 rounds of R&D across 8 subjects • Iconic by AI • March 2026
After 43 rounds of systematic testing, we have a proven formula for portrait and half-body photo generation (85% and 76% avg). Full body remains harder (60%) but the lora_scale distance relationship is now understood. Scene photos work via direct LoRA generation — the biggest breakthrough of the project. The next frontier is environment integration (making people look like they belong in the scene, not pasted on top) and overproducing + curating (generate 3-4x what we need, pick the best).
After testing everything from selfie-distance to 15-metre environment shots, we've settled on exactly 3 shot types. Each has its own proven lora_scale, aspect ratio, and prompting approach.
Environment-first prompting (describe scene first, subject last) controls distance but R38 went too extreme. The LoRA can't hold identity when the face is tiny. Parked until the 3 core types are production-ready.
The single most important finding from rounds 31-43: lora_scale must increase with camera distance. At full body distance, the face is a tiny fraction of the image. The LoRA's influence gets diluted across a larger canvas. Higher lora_scale forces more of the trained face through.
| Framing | LoRA Scale | Avg Score | Evidence | Status |
|---|---|---|---|---|
| Close-up | 0.9 | 78-85% | R1-R13 baseline. R39 tested 0.7 = 39% (failed) | CONFIRMED |
| Half body | 1.1 | 76% | R28-R30 scenes. R35 full body at 1.1 = 60% (+9%) | CONFIRMED |
| Full body | 1.3 | 60% | R37 at 1.3 = 61%. R43 snow at 1.3 = 55% | WORKING |
| Distance | 1.3+ | 6% | R38 environment-first. Too far back, LoRA can't hold | PARKED |
| Round | LoRA Scale | Framing | Avg | Key Finding |
|---|---|---|---|---|
| R1-R13 | 0.9 | Portrait | 82% | Baseline — optimal for close-up |
| R31 | 0.9 | Full body | 56% | First full body — face too small |
| R33 | 0.9 | Full body | 52% | Verbose prompts don't help |
| R34 | 0.9 | Full body | 51% | Movement helps quality, not score |
| R35 | 1.1 | Full body | 60% | +9 pts — scale compensates for distance |
| R37 | 1.3 | Full body | 61% | Slight improvement over 1.1 |
| R38 | 1.3 | Distance | 6% | Too far — LoRA can't hold at any scale |
| R39 | 0.7 | Close-up | 39% | FAILED — identity drifts, 0.9 is the floor |
| R43 | 0.9/1.1/1.3 | All 3 | 52% | Snow scene drags all framings down |
The relationship is clear: further camera = higher lora_scale. But there's a ceiling — beyond 1.3, you risk waxy/over-fitted faces. And beyond a certain distance (R38), no amount of LoRA scale can hold the identity. The practical limit is full body with feet visible.
| Level | Score Range | Action |
|---|---|---|
| Green | 70%+ | Ship — production quality |
| Amber | 25-69% | Review — may be usable |
| Red | <25% | Reject — auto-regenerate |
Green = core tuning | Blue = style expansion | Red = outpainting (failed) | Amber = expression test | Purple = scene/full body | Teal = LoRA scale R&D
| Round | Phase | Focus | Avg | Key Result |
|---|---|---|---|---|
| R1 | Core | Baseline — default settings | 68% | First generation, no tuning |
| R2 | Core | Guidance sweep (1-5) | 72% | 2.5 emerged as optimal |
| R3 | Core | Steps sweep (20-50) | 74% | 35 steps optimal (50 = no gain) |
| R4 | Core | LoRA scale sweep (0.7-1.0) | 76% | 0.9 best for portraits |
| R5 | Core | Film stock comparison | 77% | Portra 400 wins |
| R6 | Core | Identity — with hair/eye | 73% | Hair/eye colour HURTS scores |
| R7 | Core | Identity — without hair/eye | 78% | +5pts removing hair/eye from prompt |
| R8 | Core | Lighting variations | 79% | Studio dramatic + golden hour best |
| R9 | Core | Background variations | 80% | Solid/gradient > complex |
| R10 | Core | Clothing styles test | 81% | Tailored blazer, smart casual top |
| R11 | Core | Multi-subject validation | 80% | Formula holds across all 8 subjects |
| R12 | Core | Best-of-4 selection | 83% | +3-5 pts from picking best of 4 |
| R13 | Core | Production run — all styles | 85% | Peak portrait performance |
| R14 | Style | New clothing styles | 82% | 6 new styles, 4 scored well |
| R15 | Style | Female-specific styles | 80% | Gala dress, cocktail — good |
| R16 | Style | Extended style library | 76% | Niche styles pull average down |
| R17 | Outpaint | Outpainting v1 | 66% | Just added border |
| R18 | Outpaint | Outpainting v2 | 65% | Edge artifacts |
| R19 | Outpaint | Outpainting v3 | 64% | Prompt guidance ignored |
| R20 | Outpaint | Face swap | 62% | Avg -10% from originals |
| R21 | Outpaint | Kontext Pro edit | 65% | Distorts face |
| R22 | Outpaint | Inpainting | 58% | Tiny files, garbage |
| R23 | Outpaint | Combined methods | 63% | Stacking failures doesn't help |
| R24 | Outpaint | Outpainting v4 | 62% | More border = worse |
| R25 | Outpaint | Kontext Pro scene swap | 19% | WORST — complete identity destruction |
| R26 | Outpaint | Outpainting v5 | 64% | Declared dead end |
| R27 | Expression | Smiling test | 62% | -20% vs neutral. LoRA trained neutral |
| R28 | Scene | LoRA direct scene gen | 85% | BREAKTHROUGH — scene in prompt works |
| R29 | Scene | Portrait scenes (all subjects) | 78% | 10 scenes, all ≥70% |
| R30 | Scene | Half body scenes | 76% | Three-quarter framing, 9/10 ≥70% |
| R31 | Full Body | First full body | 56% | Face too small at distance |
| R32 | Full Body | Portrait → outpaint down | 75% | Two-step works 75% of the time |
| R33 | Full Body | Explicit framing text | 52% | More words ≠ more specific |
| R34 | Full Body | Pose/movement language | 51% | Photos look natural (scores same) |
| R35 | LoRA Scale | lora_scale 1.1 | 60% | +9 pts — biggest lever found |
| R36 | LoRA Scale | lora_scale 1.3 (uniform) | 61% | Marginal improvement over 1.1 |
| R37 | LoRA Scale | lora_scale 1.3 + distance | 61% | Distance language doesn't help uniformly |
| R38 | Distance | Environment-first prompt | 6% | Too far back — PARKED |
| R39 | LoRA Scale | lora_scale 0.7 close-up | 39% | FAILED — 0.9 is the floor |
| R40 | Full Body | Body proportion fix | 52% | "Natural proportions" prompt added |
| R41 | Scene | Snow scene half body | 52% | People look photoshopped in scene |
| R43 | Scene | Snow 3 shot types + Portra | 52% | Snow drags all framings down ~25% |
10 rounds trying to extend the canvas for scene backgrounds. Every variant (masked edges, prompt guidance, larger canvas) just added a visible border around the original. The model can't generate coherent scene extensions.
The worst result across all 43 rounds. Edits the image to change the background but completely destroys face identity. Output is a different person.
Post-processing face swap from reference selfie. Hurts high-scoring photos most — introduces artifacts that degrade an already good image.
Mask and regenerate background. Tiny file sizes (low detail), garbage quality. Inpainting model doesn't respect LoRA identity.
LoRA trained on neutral expressions. Forcing a smile distorts the learned face geometry. Neutral or "natural relaxed expression" only.
Theory: lower LoRA at close distance = more natural. Reality: identity drifts to wrong age/gender/ethnicity. 0.9 is the absolute floor.
Flipped prompt to describe environment first, subject last. Controls distance but R38 pushed too far — LoRA can't hold identity when face is tiny. Usable concept but needs careful calibration.
Used Fuji instead of Kodak Portra. Fuji produces cooler/greener tones — wrong for warm portrait skin tones. Always use Kodak Portra 400.
Pattern: Every approach that MODIFIES a generated image (swap, edit, extend, inpaint) fails. Generate it right the first time — let the LoRA handle identity, describe everything else in the prompt.
Instead of generating a portrait and modifying it, describe the scene IN the prompt. The LoRA generates the person IN the scene from scratch. Identity is baked into the model weights — no post-processing needed.
| Scene | Portrait | Half Body | Best For |
|---|---|---|---|
| Tokyo Neon | 85% | 84% | Urban, edgy look (but more "AI" feel) |
| Art Gallery | 83% | 80% | Clean, minimal, sophisticated |
| Amalfi Coast | 80% | 78% | Warm, natural, sun-drenched |
| Paris Cafe | 78% | 80% | European elegance |
| Modern Office | 78% | 80% | Professional headshots |
| London Street | 77% | 76% | Urban, moody, British |
| NYC Rooftop | 76% | 74% | Skyline backdrop |
| Riviera Terrace | 75% | 72% | Coastal luxury |
| Garden Party | 74% | 70% | Outdoor, natural light |
| Mountain Lodge | 72% | 70% | Cozy, warm tones |
Scene photos WORK in terms of face scores — but the person often looks photoshopped into the scene rather than being part of it. This is the next frontier to solve.
Fix discovered in R43: Weave the environment INTO the person description. Don't say "person + snowy background". Say "snowflakes settling on their shoulders, rosy cheeks from the cold, frost dusting their hair, breath visible in the air". Make the scene physically interact with the subject.
This improved visual integration in R43 but didn't fix it completely — snow scene is inherently harder than sunny scenes. The approach needs further testing on easier scenes (Amalfi Coast, Paris Cafe) where the integration is more subtle (warm light on skin, wind in hair).
Round 34 tested 4 movement descriptions. The scores were similar across all poses, but the visual quality of Walking and Laughing was dramatically better — photos looked like real influencer editorial shoots instead of stiff AI test shots.
| Pose | Avg Score | Why |
|---|---|---|
| Laughing | 56% | Natural expression, face visible, dynamic energy. Best overall. |
| Walking | 55% | Natural stride, body in motion. Use with "shoes visible on the ground". |
| Looking Away | 48% | Face turned from camera — scorer can't match what it can't see. |
| Leaning | 47% | Static pose, less natural. Better than standing still but worse than walking. |
Always use movement language. "Walking confidently" or "captured mid-laugh" transforms every shot. Static poses ("standing in front of") produce stiff, obviously-AI photos. Movement + concrete anchors ("shoes on the ground", "hands in jacket pockets") = natural photos.
Flux has a systematic bias toward exaggerated hips and butt on women in full body shots. This is a model limitation, not a prompt issue. Mitigation:
"natural body proportions, correct human anatomy" to prompts"slim athletic build" or "natural figure" — don't leave it vague| Film Stock | Character | Verdict |
|---|---|---|
| Kodak Portra 400 | Warm, flattering skin tones, soft natural grain | USE THIS |
| Fuji Pro 400H | Cooler, pastel, greener tones | Too cold for portraits |
| Kodak Ektar 100 | Vivid, saturated colours | Over-saturates skin |
| CineStill 800T | Blue/cyan tungsten shift | Night scenes only |
| Kodak Tri-X | Black and white, high contrast | Removes colour info |
Saying "shot on Portra 400 with Ektar colours" confuses the model. Pick one and stick with it. Portra 400 for everything portrait-related.
| Subject | Gender | Portrait Avg | Full Body Avg | Best Ever | Notes |
|---|---|---|---|---|---|
| Sarah | Female | 89% | 66% | 94% | Top performer. Ideal LoRA training data. |
| Mike | Male | 86% | 48% | 92% | Consistent. Strong across all styles. |
| Emily | Female | 85% | 71% | 92% | Best female full body (hit 85% laughing in R35). |
| Chloe 2 | Female | 84% | 64% | 89% | Second session improved over Chloe 1. |
| Scott | Male | 82% | 63% | 88% | Primary test subject. Bald = distinctive LoRA. |
| Chloe | Female | 80% | 64% | 86% | Weak LoRA — sometimes generates Chinese-looking face. |
| Emily 2 | Female | 80% | 55% | 87% | Consistent with Emily 1. |
| Neil 2 | Male | 39% | 32% | 52% | Poor selfie quality. Bad training = bad LoRA forever. |
Chloe 1's problem: Her LoRA sometimes produces a Chinese-looking face, especially in the first half of multi-shot runs. This is a training data issue — her selfies may have insufficient angle diversity. Chloe 2 (re-trained with better selfies) scores 4% higher consistently.
Every prompt is built from 6 modular layers via prompt_builder.js. No prompts are hardcoded in generation scripts.
CLOSE-UP (lora 0.9):
HALF BODY (lora 1.1):
FULL BODY (lora 1.3):
| # | Style | Best | Avg |
|---|---|---|---|
| 1 | Studio Dramatic | 92% | 89% |
| 2 | Smart Casual | 90% | 88% |
| 3 | Tailored Blazer | 88% | 85% |
| 4 | Outdoor Natural | 91% | 85% |
| 5 | Corporate Headshot | 87% | 84% |
| 6 | Leather Jacket | 86% | 82% |
| # | Style | Best | Avg |
|---|---|---|---|
| 1 | Studio Dramatic | 92% | 89% |
| 2 | Outdoor Natural | 91% | 87% |
| 3 | Elegant Blouse | 89% | 86% |
| 4 | Smart Professional | 88% | 85% |
| 5 | Cocktail Dress | 86% | 83% |
| 6 | Casual Chic | 85% | 82% |
| Problem | Impact | Possible Fix |
|---|---|---|
| Environment integration | People look photoshopped into scenes | Weave scene INTO person description (R43 approach). Test on easy sunny scenes first. |
| Distance inconsistency | Same prompt = different distances per shot | Composition anchoring: "head near top of frame, feet at bottom". Generate more, filter by distance. |
| Full body scores | 60% avg vs 85% portrait | Higher candidates (4-6), stricter curation. Or portrait → outpaint down (R32 method). |
| Body proportions (women) | Exaggerated hips/butt | "Natural body proportions" prompt. Community Body FLUX FIX LoRA (untested). |
| Snow/cold scenes | 52% avg (25% below sunny scenes) | Snow is inherently harder. Focus on sunny scenes for production. Snow = nice-to-have. |
| Chloe 1 LoRA | Sometimes generates Chinese face | Retrain with better selfie angles. Chloe 2 session already 4% better. |
Stop testing variables. Generate 3-4x the photos needed using proven settings on easy scenes (Amalfi Coast, Art Gallery, Paris Cafe, Modern Office). Pick the best. This is cheaper and faster than chasing the last 10% through prompt engineering.