Text-to-Image
English
numpy
machine-learning
deep-learning
generative-ai
text-2-image
image-generation
open-weights
model-weights
ai-art
pixel-art
game-development
gamedev
game-assets
asset-generator
sprite-generator
offline
tiny-model
numpy-runtime
int8-quantization
self-supervised
procedural-data
gpt
english-prompts
awesome-ai
| # 🎨 PXG-Tiny — 5-Minute Tutorial | |
| Turn plain English into 16×16 pixel-art sprites, fully offline. | |
| *By Chowdhury Tarul Ahsan — tarulahsan@gmail.com* | |
| --- | |
| ## 1. Install (30 seconds) | |
| ```bash | |
| # Python 3.9+ — only two libraries, no torch, no GPU | |
| pip install numpy pillow | |
| ``` | |
| Unzip the release anywhere. You get this layout: | |
| ``` | |
| pxg-tiny/ | |
| ├── cli.py ← command-line app | |
| ├── weights/ ← the trained model (~1 MB) | |
| ├── src/pxg_tiny/ ← inference library (pure NumPy) | |
| ├── samples/gallery/ ← sprites made by the final model | |
| └── tests/ ← pytest suite | |
| ``` | |
| ## 2. Your first sprite (10 seconds) | |
| ```bash | |
| python3 cli.py "a golden sword, glowing" -o sword.png | |
| ``` | |
| Done — `sword.png` is a crisp 128×128 sprite (16×16 pixels at 8× zoom, | |
| transparent background). | |
| ## 3. What can I ask for? | |
| **Objects (23 families):** sword · dagger · shield · staff · potion · vial · | |
| chest · coin · gem · key · apple · bread · oak tree · pine tree · bush · | |
| rock · grass/stone/water tile · fireball · house | |
| **Attributes that actually change pixels:** | |
| | Say | Effect | | |
| |---|---| | |
| | `golden / iron / crystal / ruby / emerald / wooden / copper` | recolors the material | | |
| | `upright` / `lying sideways` | rotates key/key/sword orientation | | |
| | `glowing` | adds white specular shine | | |
| | `with moss` / `with berries` / `autumn` | adds the detail | | |
| | `big` / `small` | scales fireballs | | |
| | `slate roof` / `terracotta roof` | house roof color | | |
| Free phrasing is fine — *“one sword of the crystal kind”*, *“a sword made of | |
| pure iron”*, *“cottage with terracotta roof”* all work. | |
| ## 4. Variations & sprite sheets | |
| ```bash | |
| python3 cli.py "an iron chest" --variations 4 --sheet variants.png | |
| ``` | |
| One PNG containing 4 sampled takes on your prompt — perfect for picking a | |
| favorite or filling a tileset row. | |
| ## 5. Ask-first mode (chatbot style) | |
| ```bash | |
| python3 cli.py --ask "can you animate a walking cycle?" | |
| # → refusal: "i only make 16x16 pixel-art sprites ... no photos, 3d, | |
| # animation files, logos or other resolutions." | |
| python3 cli.py --ask "draw a blorp" | |
| # → clarify: "i don't know that object yet. i can draw: sword, dagger, ..." | |
| ``` | |
| The model knows what it doesn't know — it asks instead of hallucinating. | |
| ## 6. Python API | |
| ```python | |
| from pxg_tiny.pipeline import PXGPipeline | |
| pipe = PXGPipeline() # loads ./weights | |
| grid, meta = pipe.generate_pixels("a ruby potion that glows", seed=7) | |
| print(meta) # {'gate': 'accept', 'attempt': 0, ...} | |
| # raw 16x16 palette-index grid if you want the pixels yourself: | |
| # grid[y][x] == 0 → transparent, 1..31 → palette color | |
| msg = PXGPipeline.ask("a 4k photo of a cat") # → refusal message string | |
| ``` | |
| Deterministic: same prompt + same seed ⇒ same sprite, forever, on any machine. | |
| ## 7. Batch generation | |
| ```bash | |
| cat prompts.txt | |
| # golden dagger, upright | |
| # slim vial of the slime kind | |
| python3 cli.py --sheet-from-prompts prompts.txt --outdir sprites/ | |
| ``` | |
| ## 8. Troubleshooting | |
| | Symptom | Meaning | Fix | | |
| |---|---|---| | |
| | `"gate": "clarify"` | object/attribute unknown | pick from the list it gives you | | |
| | `"gate": "refuse"` | out of scope (3D/photo/animation/other sizes) | rephrase as a 16×16 sprite | | |
| | `"gate": "accept_degraded"` | sprite returned but a check stayed red after 8 tries | usually still usable; try another seed | | |
| | wrong material color | rare sampling drift | retry, or bump `--seed` | | |
| *Everything runs 100% locally — no network, no accounts, no API keys.* | |