Spaces:
Paused
Paused
| # PRD β Klein LoRA Studio | |
| > A "signature look" restyle studio built on FLUX.2 [klein] 4B. Upload a photo, | |
| > apply a curated style, and see base vs **your own trained LoRA** side by side β | |
| > so the aesthetic is consistent, recognizable, and genuinely *yours*, not a | |
| > prompt anyone could copy. | |
| | Field | Value | | |
| | --- | --- | | |
| | **Hackathon** | [Build Small](https://huggingface.co/build-small-hackathon) (Hugging Face Γ Gradio) | | |
| | **Track** | π‘ Backyard AI (practical) β also reads as π Thousand Token Wood depending on framing | | |
| | **Partner kit** | Black Forest Labs β FLUX.2 [klein] | | |
| | **Model** | `black-forest-labs/FLUX.2-klein-4B` (4B, Apache 2.0) + a custom style LoRA trained on `FLUX.2-klein-base-4B` | | |
| | **Badges targeted** | π Tiny Titan (β€4B), π¨ Off Brand (custom UI), π¬ Best Demo, π§© Bonus Quest Champion | | |
| | **Deadline** | **June 15, 2026 Β· 23:59 UTC** | | |
| | **Starter** | Forked from `stephenbtl/klein-build-small-starter` (this repo) | | |
| --- | |
| ## 1. Summary | |
| Klein LoRA Studio turns the starter's generic "Image β Image" tab into a focused | |
| **personal restyle studio**. The user picks a *named look* (e.g. "Cottagecore | |
| Kitchen", "Mid-century Living Room", "Riso Print"), drops in a photo, and gets a | |
| side-by-side **before β after**. The differentiator from a plain prompt box is | |
| that the app's signature look is delivered by a **LoRA we train** on ~20β40 | |
| reference images, so every output is consistent and the style is locked to *this* | |
| app β exactly the π― fine-tuning angle the partner kit is built around. | |
| This is the LoRA-forward sibling of the other two concept branches. It leans on | |
| the starter's existing `lora_compare` machinery (base β LoRA at the same seed) | |
| and elevates it from a developer comparison tool into a polished consumer app. | |
| ## 2. The problem & user | |
| **User:** someone non-technical with a pile of photos and a specific aesthetic in | |
| mind β "what would my living room look like in Scandinavian?", "restyle my whole | |
| garden set as cottagecore", "make these portraits look like my illustration | |
| style." Plain text-to-image can't keep a *consistent* look across a set, and | |
| prompt-engineering a style is fiddly and copyable. | |
| **Insight (from `STARTER_IDEAS.md` #3 + `PROMPTING.md`):** narrow beats broad. | |
| Hide the prompt engineering behind named presets, make the output *consistent* | |
| (that is what a LoRA buys you), and always show a before/after β it demos far | |
| better than a single image. | |
| ## 3. Why it fits "Build Small" (rule β how we satisfy it) | |
| | Rule / badge | How this app delivers it | | |
| | --- | --- | | |
| | **REQ-01 β€ 32B** | klein 4B is 4B params. The LoRA adds negligible params. β | | |
| | **REQ-02 Gradio Space in org** | Forked Gradio Space; deploy into the Build Small HF org. β | | |
| | **REQ-03 Demo video** | Before/after restyle of a real room + the "apply look across a set" flow. | | |
| | **REQ-04 Social post** | One post, linked from README. | | |
| | **REQ-05 ZeroGPU β€10 apps/user** | Single Space, ZeroGPU (`zero-a10g`). β | | |
| | **REQ-06 README tags + write-up** | See Β§9 for the exact YAML block. | | |
| | π **Tiny Titan (β€4B)** | Whole experience runs on klein **4B** β qualifies for the β€4B badge. | | |
| | π¨ **Off Brand** | Replace the 6-tab dev UI with a single-purpose two-pane "studio" layout. | | |
| | π¬ **Best Demo** | Side-by-side restyle is inherently demo-friendly. | | |
| ## 4. Scope | |
| ### MVP (must ship by deadline) | |
| 1. **One-screen studio UI** (not the starter's 6 tabs): input photo on the left, | |
| restyled result on the right, a row of **named look presets** underneath. | |
| 2. **Preset = curated edit prompt + the signature LoRA** applied at a fixed | |
| scale. User clicks a look; no prompt writing required. | |
| 3. **Before β after** display (original and result side by side), with a "swap" | |
| or slider if time allows. | |
| 4. **The signature style LoRA** trained and loaded by default (see Β§6). Ship at | |
| least **one** strong trained look; presets beyond it can be curated edit | |
| prompts layered on the same LoRA. | |
| ### Stretch | |
| - **"Save this look β apply to a set":** batch-restyle several uploads so a whole | |
| photo set is consistent (the thing a plain prompt can't give them). | |
| - **Strength slider** (LoRA scale 0.0β1.5, reuse `l_scale`) exposed as "subtle β | |
| strong." | |
| - **2Γ2 variation grid** (4 seeds) so the user picks their favourite. | |
| ### Out of scope | |
| - Training inside the Space (training is offline via AI Toolkit β see Β§6). | |
| - Text-to-image from scratch (this app is restyle-first; keep a hidden T2I path | |
| only for preset previews if useful). | |
| ## 5. Technical design (grounded in the starter `app.py`) | |
| The starter already contains everything we need; this is mostly **subtraction and | |
| re-skinning**, not new ML code. | |
| - **Pipeline:** `Flux2KleinPipeline.from_pretrained("black-forest-labs/FLUX.2-klein-4B", torch_dtype=torch.bfloat16)`, built on CPU at module scope and moved to CUDA inside the `@GPU` call β keep the starter's ZeroGPU pattern verbatim (`import spaces` *before* torch; `get_pipe()` moves to cuda). | |
| - **Restyle call:** reuse `img2img()` / `lora_compare()` logic. Editing footgun: | |
| always call `pipe(prompt=β¦, image=β¦)` **by keyword** β `image` is the first | |
| positional arg. | |
| - **Sizing:** keep `klein_size(w, h)` β snaps to multiples of 16 under klein's | |
| 4096-patch ceiling; resize input with `Image.LANCZOS`. | |
| - **Steps / guidance:** distilled 4B β `num_inference_steps=4`. The LoRA is | |
| trained on **base** (50 steps) but loads on distilled for fast demos with mild | |
| drift (per `TRAIN_A_LORA.md`). For the cleanest result, optionally switch a | |
| "High quality" toggle to `FLUX.2-klein-base-4B` at 50 steps, guidance 4.0. | |
| - **LoRA loading:** reuse `_apply_lora()` / `_unload_lora()`: | |
| `pipe.load_lora_weights(path, adapter_name="user")` then | |
| `pipe.set_adapters(["user"], adapter_weights=[scale])`. Always unload in a | |
| `finally` so the shared pipe stays clean. | |
| - **Presets data structure:** a `LOOKS = {name: {"prompt": <edit prompt>, "lora_scale": <float>}}` dict, mirroring the starter's `HUB_LORAS` pattern. | |
| - **Deps:** unchanged `requirements.txt` (diffusers main for `Flux2KleinPipeline`, `peft` for `load_lora_weights`, `spaces` for ZeroGPU). | |
| ### Files to change | |
| | File | Change | | |
| | --- | --- | | |
| | `app.py` | Replace tabbed UI with the single studio layout; add `LOOKS`; load signature LoRA at startup; wire preset clicks β `img2img`+LoRA. Keep the ZeroGPU + `klein_size` helpers. | | |
| | `README.md` | New frontmatter (title/short_description/tags), submission write-up, demo + social links (Β§9). | | |
| | `configs/my_lora_klein_4b.yaml` | Set `trigger_word`, `name`, dataset path for the signature look (Β§6). | | |
| | `examples/` | Add 2β3 before/after pairs for the chosen look (used in the demo + gr.Examples). | | |
| ## 6. The signature LoRA (the differentiator) | |
| Train **one** style LoRA that becomes the app's identity (e.g. a clean editorial | |
| illustration look, or a specific interior aesthetic). Following `TRAIN_A_LORA.md`: | |
| - **Base model:** `FLUX.2-klein-base-4B` (Apache 2.0). Distilled won't fine-tune. | |
| - **Data:** 15β40 images sharing one look, β₯1024px, one `.txt` caption each. | |
| **Caption content, not style.** Start every caption with a coined trigger | |
| (`ZK_LOOK`). | |
| - **Config:** `configs/my_lora_klein_4b.yaml` β change the 3 `<<< CHANGE >>>` | |
| lines + sample prompts. **Keep `arch: "flux2_klein_4b"`** (omitting it crashes | |
| ai-toolkit, issue #691). | |
| - **Train:** AI Toolkit on RunPod RTX 4090 (~$0.50, ~30β40 min, ~1800 steps). | |
| **Watch the sample images, not the loss** β pick the best checkpoint (~step | |
| 750β1500), not the last. | |
| - **Use:** download the `.safetensors`, commit it (or load from the Hub), and | |
| apply it as the default adapter in the studio. | |
| ## 7. Demo & social plan (REQ-03 / REQ-04) | |
| - **Demo video (2β4 min):** open the studio, restyle a real living-room photo | |
| through 2β3 looks, then the "apply look to a whole set" flow showing | |
| consistency. Sell it β "no humility" (per the field guide trail map). | |
| - **Social post:** before/after grid + one-line pitch + Space link; link the post | |
| back from the README. | |
| ## 8. Risks & mitigations | |
| | Risk | Mitigation | | |
| | --- | --- | | |
| | ZeroGPU cold-start / 60s budget | Build pipeline on CPU at module scope (starter already does this); keep distilled 4-step path as default. | | |
| | LoRA drift on distilled | Offer a "High quality" base-4B/50-step toggle; train at sensible strength. | | |
| | Style leaks into captions β weak LoRA | Caption content only; skim `.txt` for style words (they leak ~25%). | | |
| | Subject not preserved in restyle | Use edit prompts that describe *the change*, not the whole scene (`PROMPTING.md`). | | |
| | Deadline today | MVP = studio UI + one trained look + before/after. Everything else is stretch. | | |
| ## 9. Submission checklist (REQ-01 β REQ-06) | |
| - [ ] **REQ-01** Every model β€32B β klein 4B + LoRA. β (also β€4B β Tiny Titan) | |
| - [ ] **REQ-02** Gradio Space uploaded into the Build Small HF org. | |
| - [ ] **REQ-03** Demo video recorded and linked. | |
| - [ ] **REQ-04** One social post, linked from README. | |
| - [ ] **REQ-05** β€10 ZeroGPU apps for this user. | |
| - [ ] **REQ-06** README YAML tagged + idea/tech write-up. | |
| **README frontmatter to apply at submission (REQ-06):** | |
| ```yaml | |
| title: Klein LoRA Studio | |
| short_description: Restyle photos with your own trained klein 4B signature look | |
| sdk: gradio | |
| app_file: app.py | |
| license: apache-2.0 | |
| suggested_hardware: zero-a10g | |
| models: | |
| - black-forest-labs/FLUX.2-klein-4B | |
| - black-forest-labs/FLUX.2-klein-base-4B | |
| tags: | |
| - build-small-hackathon | |
| - backyard-ai # track | |
| - tiny-titan # β€4B badge | |
| - off-brand # custom UI badge | |
| - best-demo # badge | |
| - flux | |
| - image-to-image | |
| - lora | |
| ``` | |
| ## 10. Definition of done | |
| - The Space loads on ZeroGPU with no token/gating and restyles an uploaded photo | |
| through at least one named look powered by the signature LoRA. | |
| - Before β after is visible in one screen. | |
| - README has the track + badge tags, a short idea/tech write-up, and links to the | |
| demo video and social post. | |
| - Submitted into the Build Small org before 23:59 UTC. | |