monet_gdt
From one wallpaper image, monet_gdt scores 10 mood words (used to pick fonts), picks a 3-color theme, and scores 29 decorative shapes. It is the on-device model in libmonet apps: one ONNX graph, 5.55 MB, 10-16 ms on one Apple-silicon CPU core.
Version 2026.10.30. Changes: CHANGELOG.md.
Code, training and evaluation: github.com/Telosnex/monet_gdt. Training labels: Telosnex/monet_gdt_labels.
Files
| File | Contents |
|---|---|
monet_gdt.onnx |
the model (8-bit weights), version 2026.10.30 |
monet_gdt_mood.json |
maps raw mood scores to wallpaper percentiles, for picking fonts |
CHANGELOG.md |
changes per version |
monet_gdt.onnx sha256: 552b0d79e674307d916d6442af7f9f7427aa01b2f52a7b6f7e50571acde93691
Usage
import numpy as np, onnxruntime as ort
from huggingface_hub import hf_hub_download
from PIL import Image
path = hf_hub_download('Telosnex/monet_gdt', 'monet_gdt.onnx')
session = ort.InferenceSession(path)
image = np.asarray(Image.open('wallpaper.jpg').convert('RGB'))
scores, feature, colors, shapes = session.run(None, {'image': image})
meta = session.get_modelmeta().custom_metadata_map
words = meta['monet_gdt.mood_words'].split(',')
shape_names = meta['monet_gdt.shapes'].split(',')
print(dict(zip(words, scores[0].round(2))))
print(['#%02x%02x%02x' % tuple(c) for c in colors])
print(shape_names[int(shapes.argmax())])
| Input / output | Shape | Meaning |
|---|---|---|
image |
uint8 [h, w, 3 or 4] | the wallpaper, any size (the graph resizes) |
scores |
float [1, 10] | raw mood scores; word order in the monet_gdt.mood_words metadata |
feature |
float [1, 192] | the image embedding the heads share |
colors |
int64 [3, 3] | primary, secondary, tertiary RGB (0-255) |
shapes |
float [1, 29] | shape scores; names in the monet_gdt.shapes metadata |
Model
- Architecture: PE-Core tiny (Meta), the first 6 transformer blocks at 224 px, with small heads; distilled from a fine-tuned 384 px teacher.
- Training data: about 75K images: CC0 / public-domain Megalith-10m
photos, CC0 photos chosen because they look like wallpapers, and
synthetic images from MONET (generated by Apache-2.0 models). Mood and
shape labels: Jev (jev-1.14.0) answering fixed questions. Color labels:
code, monet_ui 1.0.1's
MonetGdtRule20261030, which chooses colorful colors before large areas.
Results
Measured against the labels on images held out from training. The last column is the labeler asked the same question twice: the practical ceiling.
| Head | Measure | monet_gdt | Labeler repeat |
|---|---|---|---|
| Mood | mean Pearson r, test split | 0.866 | |
| Mood | mean Pearson r, 1,951 real wallpapers never trained on | 0.776 | |
| Shapes | top-1 matches the label | 0.36 | 0.53 |
| Shapes | labeled top shape in the model's top 3 | 0.61 | 0.72 |
Colors, on 1,934 held-out wallpaper-like photos:
| Measure | 2026.10.30 | 2026.10.27 |
|---|---|---|
| ฮE to the rule's triad (lower is better) | 24.6 | 32.3 |
| Jev: a colorful color is missing, with a dull swatch (of 512) | 3 | 43 |
| Jev: a small speck color (of 512) | 12 | 0 |
In blind votes, a first version of the new color head beat 2026.10.27 34 to 8, and 2026.10.30 beat that first version 35 to 15.
Intended use
Theming an app (fonts, colors, decorative shapes) from a wallpaper the user chose, on the user's device.
Out of scope: any decision about people, including judging a person in a photo; content moderation; image classification or search. The mood words describe the look of an image, not its subject.
Limitations
Colors favor colorful areas over large ones. The model sometimes picks a color that covers only a small part of the image.
Synthetic images are saturated and centered; they help on wallpapers but cost everyday photos a little mood accuracy.
License
Apache-2.0: the weights derive from PE-Core (Apache-2.0, Meta); see NOTICE. The training code is MIT, on GitHub.
Model tree for telosnex/monet_gdt
Base model
timm/vit_pe_core_tiny_patch16_384.fb