See us on the Leaderboard β |
Blog post read it here β |
PixelModel v1 πΌοΈ
A neural network where the weights are the image. Now the model is a thumbnail.
π What is this?
model.png is not a picture β it is the model.
Every pixel encodes neural network weights. At inference, the PNG is decoded into weight matrices, the prompt is hashed into an embedding, and a coordinate-conditioned decoder paints an image β at any resolution.
v0 was a 202,752-parameter MLP welded to 32Γ32 output, trained on 6 color swatches. v1 is 8.5Γ smaller (23,747 parameters), renders at any resolution (native 64Γ64), and is trained on ~20K real MS-COCO caption/image pairs.
cherry on top π
The model generates 600 images (cpu) in 5 (five) seconds. Thats 5000 images in 24 seconds on cpu. The model trained on cpu for just 30 minutes.
π v0 β v1
| v0 | v1 | |
|---|---|---|
| Parameters | 202,752 | 23,747 |
model.png |
64Γ3200 px | 160Γ149 px (a thumbnail) |
| Output head | 1 weight row per pixel (196K params, 97% of model) | CPPN decoder on (x, y) β resolution-free |
| Resolution | fixed 32Γ32 | any; native 64Γ64 |
| Prompt embedding | char-sum (order-blind, collision-heavy) | hashed trigrams + words (FNV-1a), still 0 params |
| Biases | none | yes |
| Weight precision | 8-bit (G channel wasted) | 16-bit (R=high byte, G=low byte) |
| Training data | 6 solid-color swatches | ~20K MS-COCO caption/image pairs |
π¨ Weight Encoding
Each pixel stores one weight at 16-bit precision, mapped from [-2, 2]:
- R channel β high byte
- G channel β low byte
- B channel β reserved
Round-trip quantization error β 3Γ10β»β΅ per weight.
π§ Architecture
prompt string
β hashed char-trigram + word embedding (64-dim, deterministic, 0 params)
β T1 (80Γ64)+b β tanh
β T2 (64Γ80)+b β tanh = latent z (64)
for every pixel (x, y):
concat(z, fourier features of (x, y)) β 18 coord dims, freqs 1/2/4/8
β D1 (80Γ82)+b β tanh
β D2 (80Γ80)+b β tanh
β D3 (3Γ80)+b β sigmoid = RGB
Because pixels are decoded from coordinates, parameter count is independent of
resolution β --res 256 works with the same 23,747 weights.
All weights live inside model.png (160Γ149 px).
π¦ Standard weights (safetensors)
model.png is the canonical model β training writes to it directly. For
tooling that expects standard weight files, the same 10 tensors are exported as
model.safetensors (23,747 parameters total):
python convert_to_safetensors.py # model.png -> model.safetensors
Parameter count is verifiable without running code: config.json
(total_parameters: 23747, full per-layer breakdown) and the safetensors
header metadata (total_parameters, param_breakdown, has_bias,
text_encoder_parameters: 0, vae_parameters: 0).
π Benchmark results
Measured per the Tiny-T2I-Leaderboard protocol β see eval.md for full method and EVAL_REPRODUCTION.md to re-run:
| Metric | v0 | v1 | Tooling |
|---|---|---|---|
| FID β | 566.84 (n=40) | 439.46 (n=5000) | torchmetrics.image.fid.FrechetInceptionDistance |
| CLIP Score β | 18.60 (n=40) | 20.02 (n=5000) | torchmetrics.multimodal.CLIPScore, openai/clip-vit-base-patch32 |
| Native resolution | 32Γ32 | 64Γ64 |
Real set: MS-COCO val2014 pairs from sayakpaul/coco-30-val-2014 (256Γ256
center-crop). Training images are hash-checked to be disjoint from the eval
images.
Expectation management: a 23K-parameter model does not draw recognizable objects. It learns caption-conditioned color, layout, and texture statistics of COCO photos β the outputs are blurry impressions, not pictures. The point is the size:quality ratio and the PNG-as-model gimmick, executed honestly.
βοΈ Usage
# training data (COCO subset)
python fetch_coco_subset.py --out ../pm-work
# train (writes model.png every epoch)
python train.py --data ../pm-work/coco_train.npz --epochs 50
# inference from model.png (canonical)
python main.py "a red double decker bus" --out bus.png
# inference from model.safetensors (standalone, needs only this one file + torch)
python convert_to_safetensors.py
python INFERENCE.py "a red double decker bus" --out bus.png
# any resolution from the same 23,747 weights
python main.py "a beach with palm trees" --res 256 --scale 1
# benchmark eval
python eval/run_eval.py --work ../pm-work --model model.png --n 5000
main.py and INFERENCE.py produce identical output for the same prompt and
resolution.
π Files
model.png β THE MODEL (160Γ149 px)
model.safetensors β same weights, standard format + param metadata
config.json β architecture + parameter-count metadata
main.py β inference, loads model.png
INFERENCE.py β inference, loads model.safetensors (standalone)
convert_to_safetensors.py β model.png -> model.safetensors
train.py β training
model.py β architecture + PNG weight codec
fetch_coco_subset.py β builds train/eval data from COCO
eval/run_eval.py β FID + CLIP Score via torchmetrics
eval.md β benchmark results + method
EVAL_REPRODUCTION.md β step-by-step reproduction guide
Still a toy. Slightly less useless. The model is literally a thumbnail.
Bench Labs Β· Simple, Reliable, Open sourced
- Downloads last month
- -
Spaces using bench-labs/pixelmodel-v1 2
Collections including bench-labs/pixelmodel-v1
Evaluation results
- fid on fidself-reported439.460
- clip on clipself-reported0.200