| --- |
| title: NumZoo |
| emoji: π¦ |
| colorFrom: purple |
| colorTo: pink |
| sdk: gradio |
| sdk_version: "6.17.3" |
| app_file: app.py |
| pinned: false |
| license: apache-2.0 |
| tags: |
| - flux |
| - text-to-image |
| - kids |
| - education |
| - math |
| - track:backyard |
| - sponsor:modal |
| - achievement:offgrid |
| - achievement:welltuned |
| - achievement:offbrand |
| - achievement:fieldnotes |
| --- |
| |
| # π¦ NumZoo |
|
|
| A mental math app for kids β answer questions, earn cute AI-generated animal images as rewards! |
|
|
| > π **Built for the [π€ Hugging Face "Small Models, Big Adventures" hackathon](https://huggingface.co/build-small-hackathon).** |
| > A small (4B) image model, fine-tuned with a custom LoRA, turned into a delightful kids' reward loop. |
|
|
| ## How it works |
|
|
| 1. Enter your name |
| 2. Pick your favourite animals πΎ and places π (used to personalise reward images) |
| 3. Answer math questions β every **3 correct answers** earns a reward image |
| 4. Level up: **Additions β Subtractions β Multiplications β Mix** |
|
|
| ### See it in action |
|
|
| βΆοΈ **[Demo video (Loom)](https://www.loom.com/share/c565cba49f2c4ad1bfb428e38ff4b629)** Β· π£ **[Launch post](https://x.com/goooums/status/2066500943676399814)** |
|
|
| | 1 Β· Pick animals & places | 2 Β· Solve math | 3 Β· Earn cute reward | |
| | :----------------------------: | :------------------------: | :----------------------------: | |
| |  |  |  | |
|
|
| ## Levels |
|
|
| | Level | Operation | Goal | |
| | ----- | ----------------- | --------- | |
| | 1 | β Additions | 5 correct | |
| | 2 | β Subtractions | 5 correct | |
| | 3 | βοΈ Multiplications | 5 correct | |
| | 4 | π² Mix | Endless | |
|
|
| ## Image model |
|
|
| Rewards are generated with **FLUX.2-klein-4B** (4B params, Apache 2.0) via π€ Diffusers, |
| plus a **custom NumZoo style LoRA** (below). Images start generating in the background as |
| soon as the quiz begins, so a reward is usually ready the moment it's earned. |
|
|
| ## β¨ Custom AI art: the NumZoo LoRA |
|
|
| Out of the box, FLUX.2-klein renders the same prompt in wildly different styles β often |
| photorealistic β which doesn't fit a soft, cozy kids' app. So we fine-tuned a **style |
| LoRA** that pins every reward to the same kawaii children's-book look. |
|
|
| **Before β after** (same prompt: *"a cute baby panda on a snowy mountain top"*): |
|
|
| | Base FLUX.2-klein-4B | + NumZoo LoRA | |
| | :------------------------------: | :----------------------------: | |
| |  |  | |
| | photorealistic, inconsistent | cozy, on-brand, every time | |
|
|
| More rewards from the LoRA: |
|
|
| | | | | |
| | :---------------------------: | :-------------------------------: | :-----------------------: | |
| |  |  |  | |
|
|
| ### How we made it |
| 1. **Dataset** β 54 cozy scenes generated with **Qwen-Image** (12 animals Γ 10 places, |
| incl. multi-animal/multi-place combos), captioned `NUMZOO. <content>` with the style |
| left *undescribed* so the trigger word carries it. See |
| [`scripts/generate_dataset.py`](scripts/generate_dataset.py) and |
| [`training/`](training/) for the images + captions. |
| 2. **Training** β LoRA (rank 32, 1500 steps) on `FLUX.2-klein-base-4B` via |
| [ostris/ai-toolkit](https://github.com/ostris/ai-toolkit), running on a **[Modal](https://modal.com) A100** (~45 min, serverless GPU). |
| Reproducible setup in [`training/lora_trainer/`](training/lora_trainer/). |
| 3. **Inference** β the LoRA loads on the distilled 4-step klein in `image_generator.py`; |
| the app simply prepends the `NUMZOO` trigger to every prompt. |
|
|
| **Published LoRA:** π€ [goumsss/numzoo-flux2-klein-lora](https://huggingface.co/goumsss/numzoo-flux2-klein-lora) |
|
|
| ## Run locally |
|
|
| > Requires Python on Apple Silicon (arm64). Recommended: [Miniforge](https://github.com/conda-forge/miniforge). |
|
|
| ```bash |
| # 1. Install dependencies |
| ~/miniforge3/bin/pip install -r requirements.txt |
| |
| # 2. Accept FLUX.2-klein-4B license on HuggingFace |
| # β https://huggingface.co/black-forest-labs/FLUX.2-klein-4B |
| # Then log in: |
| hf auth login |
| |
| # 3. Run |
| ~/miniforge3/bin/python3 app.py |
| # Opens at http://localhost:7860 |
| # First run downloads ~23GB of model weights (cached after that) |
| ``` |
|
|
| > On standard Python/pip (non-Apple Silicon): |
| > ```bash |
| > pip install -r requirements.txt |
| > python app.py |
| > ``` |
|
|