Embedding map
Overview
Clusters the images of a dataset by their embeddings, names each cluster with a vision-language model, and lays the result out as an interactive 2D map. It answers “what does this dataset actually contain?” without anyone looking through it image by image.
Clustering runs on DINOv3 by default, which groups images by how they look. Pick CLIP, PE-Core, or SigLIP 2 to group them by meaning instead. Two modes, chosen by whether Group by tag is set:
- Dataset map (default) — clusters every image and lays the whole dataset out on one map, so scenes that look alike sit close together.
- Rare subtypes — clusters separately inside every value of an image-level tag (for example, a crop’s class) and flags only the small clusters: a handful of images that look like each other and unlike the rest of their group. They are highlighted on the map itself.
The badge counts the clusters on the image map, or the rare subtypes found across all groups. The Open map button opens the map, and images you select on it are added to a dataset.
Prerequisites
How it works
Splits the images by the value of Group by tag when it is set, dropping images without the tag and values under 30 images. Otherwise the whole dataset is one group.
FAQ
How many clusters does it pick on its own?
With Clusters empty, the count with the best silhouette score between 3 and 15 is chosen, and the upper end shrinks to a tenth of the image count on small datasets. Very small datasets get 8, or fewer when there are fewer images. A count you set is capped at the number of images.
What happens to images that are not indexed yet?
They are left off the map, and the log says how many. When none of the dataset’s images is indexed, the run fails and asks for AI index embeddings to run first.
Why is my rare-subtypes map empty?
Only tag values with at least 30 images are clustered. When no value reaches that, the log says so and the map has no points.
What does a rerun change?
Every run writes a new map and re-fits the layout. A selection drawn on the old map is refused, so reopen the map and select again. Images already added to the anomalies dataset stay there, and later selections keep adding to the same dataset.
What happens when the dataset is empty?
The flow stops and the node keeps the previous map, its badge, and its anomalies dataset.
Can I skip the naming model?
Yes. Turn off Name clusters and every cluster gets a numbered name instead, with no call to the vision-language model.
Inputs
Dataset whose images are clustered. Must already be indexed by an AI Index Embeddings node with the model selected below enabled. Key: DATASET.
Which indexed embedding family the map clusters on. DINOv3 (visual-only) is the default because it groups images by how they look, the semantic models (CLIP, PE-Core, SigLIP 2) group more by meaning/content. Key: EMBEDDING_MODEL.
Options:
- CLIP (
clip) - PE-Core (
pecore) - SigLIP 2 (
siglip2) - DINOv3 (
dinov3)
Number of groups the images are split into. Leave empty to let the node pick a count that fits the data. Minimum: 2. Maximum: 200. Step: 1. Key: CLUSTERS.
Image-level tag that splits the dataset before clustering, so every value of it is clustered on its own and the map calls out rare subtypes - small clusters that stand apart from the rest of their group. Leave empty for a single map of the whole dataset. Key: GROUP_BY_TAG.
Size a cluster must stay under to count as a rare subtype, as a fraction of an average cluster in its own tag group. Only used when “Group by tag” is set. Minimum: 0.05. Maximum: 1. Step: 0.05. Key: RARE_FACTOR.
Vision-language model used to name each cluster from its representative images. Key: LLM_MODEL.
Options:
- Moondream 2 (
moondream2)
Dataset that images selected on the interactive map are added to. Leave empty to have the first selection create one, which later selections keep adding to. Key: DST_ANOMALIES_DATASET.
Ask the vision-language model to name every cluster. Turn off to skip the naming call and use the numbered fallback name instead, for a faster run with no VLM cost. Key: NAME_CLUSTERS.
Outputs
Point-cloud data behind the interactive map (image and object projections). Shown as an artifact. Key: MAP_ASSET.
Signed URL to the map’s preview image, for the node’s canvas widget. Hidden from the flow editor. Key: MAP_PREVIEW_URL.
Number of clusters in the map, or rare subtypes found across all groups. Shown on the node as a badge. Key: CLUSTERS_COUNT.
Dataset the images selected on the map accumulate into. Shown as an artifact. Key: ANOMALIES_DATASET.
Widgets
The canvas shows a small preview of the map, coloured by cluster, and Open map opens the interactive map.
On the map, Images and Objects switch between the image map and a separate map of annotated objects. The object map exists only when the index holds object embeddings for the dataset’s images. It is clustered the same way, on its own layout. Automatic outliers selects the points by outlier score, and you can also draw a selection or pick points one by one. Add to dataset adds the selected images, with their annotations from the input dataset, to the Anomalies dataset: the one set on the node, or else a dataset the first selection creates and later ones keep adding to.
Runtime
The node runs in its own GPU image. The embeddings are read from the index, so no embedding model runs here. Moondream 2 runs on the GPU to name clusters. The outlier score is each point’s rank by the distance to its 15th nearest neighbour, computed on the embeddings rather than on the 2D layout.
JSON config
Machine-readable node interface for automation and advanced usage.