hjLabs AI Playground
Starting the on-device runtime…
Drop in a folder of your own images, give them your own class names, and this page fits a classifier on them without sending a single byte anywhere. It is deliberately not a from-scratch training run: a frozen, pre-trained encoder turns each image into a vector once, and only a small softmax layer on top of those vectors is fitted — which is why it takes a fraction of a second instead of an afternoon, and why it can re-fit on every single label you add. CLIP’s authors measured what that buys you: a classifier on frozen CLIP features needs a median of about five labelled examples per class to match the zero-shot model trained on 400 million image–text pairs. You get a held-out split, a confusion matrix and a per-class breakdown by default, because the honest failure mode here is a frozen encoder that simply cannot see the difference you care about — and you should be told that rather than left guessing.
teachable machine alternativeimage classifier without codelabel images offlineannotate images in browserlabel studio without a servercustom image classifierfew shot image classificationtrain classifier no uploadclip linear probedinov2 linear probeimage labelling tool freeoffline image annotation
Not the network, no — and it matters that we say so. A frozen encoder (CLIP, DINOv2 or SigLIP) that somebody else trained on millions of images turns each of your pictures into a vector. What gets fitted in your browser is a single linear layer on top of those vectors. The encoder’s weights never change. That is exactly how Google’s Teachable Machine works, and it is the only form of in-browser training that is real: the two big runtimes that offered general browser training have both stopped — ONNX Runtime deleted its training API in version 1.20.0, and TensorFlow.js has had one commit to its main branch in a year.
Fewer than you would expect. The CLIP paper measured that a classifier fitted on frozen CLIP features needs a median of about 5 labelled examples per class to match zero-shot performance, with a mean of roughly 21. Start with 10–20 per class, look at the confusion matrix, and let the least-confident queue tell you what to label next.
Because a classifier on frozen features can only separate what the encoder can already see. Hairline cracks that vanish at 224x224, two nearly identical SKUs, medical or satellite imagery — these sit outside what CLIP and DINOv2 were pre-trained to represent. Run the backbone bake-off: it fits the same head on all three encoders and shows you which one, if any, sees your problem. If they all plateau together, that is your answer, and the honest next step is to export the dataset and fine-tune properly offline.
Three things: classifier.json (the weights, your class names, and the exact encoder they were fitted on), head.onnx (a two-node Gemm + Softmax graph any ONNX runtime can load), and a CSV of the embeddings and labels so you can re-fit in scikit-learn in three lines. The head is meaningless without its encoder — it takes that encoder’s vectors as input, not pixels — so the manifest names the repo id, the precision and the pooling, and the download panel says so out loud.
No, and nobody should tell you otherwise. Images live in the origin private file system and labels in IndexedDB, both of which a browser may evict under disk pressure — and eviction is all-or-nothing for the whole origin, so the dataset, the labels and the cached model weights would go together. Safari additionally clears script-writable storage after seven days without a visit. We ask for persistent storage, which helps, but export is the only durable copy.
No. The model weights are downloaded from Hugging Face to your browser once, and every inference after that runs on your own GPU through WebGPU. Your text, images and audio are never sent anywhere — hjLabs.in has no inference server and no way to see your input.
Small models do. Recent mobile Chrome and Safari expose WebGPU, but memory is the binding limit — stay under roughly 200 MB of weights on Android, and expect iOS to reclaim the tab sooner. The catalog shows every download size up front so you can pick something that fits.