Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Visualize datasets in 2D using embeddings with UMAP or t-SNE dimensionality reduction. Use when users want to explore dataset structure, find clusters in images, identify outliers, color samples by class or metadata, or understand data distribution. Requires FiftyOne MCP server with @voxel51/brain plugin installed.
.claude/skills/aiskillstore-fiftyone-embeddings-visualization/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 301% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 193% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 236% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 384% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 375% | 0% |
Visualize your dataset in 2D using deep learning embeddings and dimensionality reduction (UMAP/t-SNE). Explore clusters, find outliers, and color samples by any field.
Use this skill when:
@voxel51/brain plugin installed and enabledALWAYS follow these rules:
pythonset_context(dataset_name="my-dataset")
Brain operators are delegated and require the app:
pythonlaunch_app()
Wait 5-10 seconds for initialization.
python# List all brain operators list_operators(builtin_only=False) # Get schema for specific operator get_operator_schema(operator_uri="@voxel51/brain/compute_visualization")
Embeddings are required for dimensionality reduction:
pythonexecute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "img_sim", "model": "clip-vit-base32-torch", "embeddings": "clip_embeddings", "backend": "sklearn", "metric": "cosine" } )
pythonclose_app()
python# Set context set_context(dataset_name="my-dataset") # Launch app (required for brain operators) launch_app()
python# Check if brain plugin is available list_plugins(enabled=True) # If not installed: download_plugin( url_or_repo="voxel51/fiftyone-plugins", plugin_names=["@voxel51/brain"] ) enable_plugin(plugin_name="@voxel51/brain")
python# List all available operators list_operators(builtin_only=False) # Get schema for compute_visualization get_operator_schema(operator_uri="@voxel51/brain/compute_visualization")
First, check if the dataset already has embeddings by looking at the operator schema:
pythonget_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # Look for existing embeddings fields in the "embeddings" choices # (e.g., "clip_embeddings", "dinov2_embeddings")
If embeddings exist: Skip to Step 5 and use the existing embeddings field.
If no embeddings exist: Compute them:
pythonexecute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "img_viz", "model": "clip-vit-base32-torch", "embeddings": "clip_embeddings", # Field name to store embeddings "backend": "sklearn", "metric": "cosine" } )
Required parameters for compute_similarity:
brain_key - Unique identifier for this brain runmodel - Model from FiftyOne Model Zoo to generate embeddingsembeddings - Field name where embeddings will be storedbackend - Similarity backend (use "sklearn")metric - Distance metric (use "cosine" or "euclidean")Recommended embedding models:
clip-vit-base32-torch - Best for general visual + semantic similaritydinov2-vits14-torch - Best for visual similarity onlyresnet50-imagenet-torch - Classic CNN featuresmobilenet-v2-imagenet-torch - Fast, lightweight optionUse existing embeddings field OR the brain_key from Step 4:
python# Option A: Use existing embeddings field (e.g., clip_embeddings) execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "img_viz", "embeddings": "clip_embeddings", # Use existing field "method": "umap", "num_dims": 2 } ) # Option B: Use brain_key from compute_similarity execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "img_viz", # Same key used in compute_similarity "method": "umap", "num_dims": 2 } )
Dimensionality reduction methods:
umap - (Recommended) Preserves local and global structure, faster. Requires umap-learn package.tsne - Better local structure, slower on large datasets. No extra dependencies.pca - Linear reduction, fastest but less informativeAfter computing visualization, direct the user to open the FiftyOne App at http://localhost:5151/ and:
img_viz) from the dropdownground_truth, predictions)IMPORTANT: Do NOT use set_view(exists=["brain_key"]) - this filters samples and is not needed for visualization. The Embeddings panel automatically shows all samples with computed coordinates.
To filter samples while viewing in the Embeddings panel:
python# Filter to specific class set_view(filters={"ground_truth.label": "dog"}) # Filter by tag set_view(tags=["validated"]) # Clear filter to show all clear_view()
These filters will update the Embeddings panel to show only matching samples.
Outliers appear as isolated points far from clusters:
python# Compute uniqueness scores (higher = more unique/outlier) execute_operator( operator_uri="@voxel51/brain/compute_uniqueness", params={ "brain_key": "img_viz" } ) # View most unique samples (potential outliers) set_view(sort_by="uniqueness", reverse=True, limit=50)
Use the App's Embeddings panel to visually identify clusters, then:
Option A: Lasso selection in App
Option B: Use similarity to find cluster members
python# Sort by similarity to a representative sample execute_operator( operator_uri="@voxel51/brain/sort_by_similarity", params={ "brain_key": "img_viz", "query_id": "sample_id_from_cluster", "k": 100 } )
pythonclose_app()
| Tool | Description | |------|-------------| | set_view(filters={...}) | Filter samples by field values | | set_view(tags=[...]) | Filter samples by tags | | set_view(sort_by="...", reverse=True) | Sort samples by field | | set_view(limit=N) | Limit to N samples | | clear_view() | Clear filters, show all samples |
Use list_operators() to discover and get_operator_schema() to see parameters:
| Operator | Description | |----------|-------------| | @voxel51/brain/compute_similarity | Compute embeddings and similarity index | | @voxel51/brain/compute_visualization | Reduce embeddings to 2D/3D for visualization | | @voxel51/brain/compute_uniqueness | Score samples by uniqueness (outlier detection) | | @voxel51/brain/sort_by_similarity | Sort by similarity to a query sample |
Visualize dataset structure and explore clusters:
pythonset_context(dataset_name="my-dataset") launch_app() # Check for existing embeddings in schema get_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # If embeddings exist (e.g., clip_embeddings), use them directly: execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "exploration", "embeddings": "clip_embeddings", "method": "umap", # or "tsne" if umap-learn not installed "num_dims": 2 } ) # Direct user to App Embeddings panel at http://localhost:5151/ # 1. Click Embeddings panel icon # 2. Select "exploration" from dropdown # 3. Use "Color by" to color by ground_truth or predictions
Identify anomalous or mislabeled samples:
pythonset_context(dataset_name="my-dataset") launch_app() # Check for existing embeddings in schema get_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # If no embeddings exist, compute them: execute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "outliers", "model": "clip-vit-base32-torch", "embeddings": "clip_embeddings", "backend": "sklearn", "metric": "cosine" } ) # Compute uniqueness scores execute_operator( operator_uri="@voxel51/brain/compute_uniqueness", params={"brain_key": "outliers"} ) # Generate visualization (use existing embeddings field or brain_key) execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "outliers", "embeddings": "clip_embeddings", # Use existing field if available "method": "umap", # or "tsne" if umap-learn not installed "num_dims": 2 } ) # Direct user to App at http://localhost:5151/ # 1. Click Embeddings panel icon # 2. Select "outliers" from dropdown # 3. Outliers appear as isolated points far from clusters # 4. Optionally sort by uniqueness field in the App sidebar
See how different classes cluster:
pythonset_context(dataset_name="my-dataset") launch_app() # Check for existing embeddings in schema get_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # If no embeddings exist, compute them: execute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "class_viz", "model": "clip-vit-base32-torch", "embeddings": "clip_embeddings", "backend": "sklearn", "metric": "cosine" } ) # Generate visualization (use existing embeddings field or brain_key) execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "class_viz", "embeddings": "clip_embeddings", # Use existing field if available "method": "umap", # or "tsne" if umap-learn not installed "num_dims": 2 } ) # Direct user to App at http://localhost:5151/ # 1. Click Embeddings panel icon # 2. Select "class_viz" from dropdown # 3. Use "Color by" dropdown to color by ground_truth or predictions # Look for: # - Well-separated clusters = good class distinction # - Overlapping clusters = similar classes or confusion # - Scattered points = high variance within class
Compare ground truth vs predictions in embedding space:
pythonset_context(dataset_name="my-dataset") launch_app() # Check for existing embeddings in schema get_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # If no embeddings exist, compute them: execute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "pred_analysis", "model": "clip-vit-base32-torch", "embeddings": "clip_embeddings", "backend": "sklearn", "metric": "cosine" } ) # Generate visualization (use existing embeddings field or brain_key) execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "pred_analysis", "embeddings": "clip_embeddings", # Use existing field if available "method": "umap", # or "tsne" if umap-learn not installed "num_dims": 2 } ) # Direct user to App at http://localhost:5151/ # 1. Click Embeddings panel icon # 2. Select "pred_analysis" from dropdown # 3. Color by ground_truth - see true class distribution # 4. Color by predictions - see model's view # 5. Look for mismatches to find errors
Use t-SNE for better local structure (no extra dependencies):
pythonset_context(dataset_name="my-dataset") launch_app() # Check for existing embeddings in schema get_operator_schema(operator_uri="@voxel51/brain/compute_visualization") # If no embeddings exist, compute them (DINOv2 for visual similarity): execute_operator( operator_uri="@voxel51/brain/compute_similarity", params={ "brain_key": "tsne_viz", "model": "dinov2-vits14-torch", "embeddings": "dinov2_embeddings", "backend": "sklearn", "metric": "cosine" } ) # Generate t-SNE visualization (no umap-learn dependency needed) execute_operator( operator_uri="@voxel51/brain/compute_visualization", params={ "brain_key": "tsne_viz", "embeddings": "dinov2_embeddings", # Use existing field if available "method": "tsne", "num_dims": 2 } ) # Direct user to App at http://localhost:5151/ # 1. Click Embeddings panel icon # 2. Select "tsne_viz" from dropdown # 3. t-SNE provides better local cluster structure than UMAP
Error: "No executor available"
launch_app() was called and wait 5-10 secondsError: "Brain key not found"
compute_similarity first with a brain_keyError: "Operator not found"
download_plugin() and enable_plugin()Error: "You must install the umap-learn>=0.5 package"
umap-learn packagepip install umap-learnmethod to "tsne" (no extra dependencies)method to "pca" (fastest, no extra dependencies)Visualization is slow
mobilenet-v2-imagenet-torchset_view(limit=1000)Embeddings panel not showing
Points not colored correctly
list_operators() and get_operator_schema() to get current operator names and parametersbrain_keyEmbedding computation time:
Visualization computation time:
Memory requirements:
Copyright 2017-2025, Voxel51, Inc. Apache 2.0 License
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 9,129 | 5,312 | -42% | 1 | 1 | 0% | 1,734 | 4,840 | +179% | 0 | 0 | — |
case-02 | fail→fail | 19,312 | 5,165 | -73% | 1 | 1 | 0% | 3,970 | 4,794 | +21% | 0 | 0 | — |
case-03 | fail→fail | 8,543 | 5,914 | -31% | 1 | 1 | 0% | 1,670 | 4,767 | +185% | 0 | 0 | — |
case-04 | pass→pass | 8,156 | 7,177 | -12% | 1 | 1 | 0% | 1,631 | 5,831 | +258% | 0 | 0 | — |
case-05 | pass→pass | 7,403 | 7,475 | +1% | 1 | 1 | 0% | 1,538 | 5,978 | +289% | 0 | 0 | — |
case-06 | pass→fail | 10,245 | 5,117 | -50% | 1 | 1 | 0% | 1,929 | 4,922 | +155% | 0 | 0 | — |
case-07 | fail→pass | 8,114 | 5,178 | -36% | 1 | 1 | 0% | 1,385 | 5,551 | +301% | 0 | 0 | — |
case-08 | fail→pass | 9,710 | 4,104 | -58% | 1 | 1 | 0% | 1,783 | 5,222 | +193% | 0 | 0 | — |
case-09 | fail→pass | 8,436 | 4,030 | -52% | 1 | 1 | 0% | 1,553 | 5,225 | +236% | 0 | 0 | — |
case-10 | fail→pass | 6,625 | 4,470 | -33% | 1 | 1 | 0% | 1,087 | 5,260 | +384% | 0 | 0 | — |
case-11 | fail→pass | 6,660 | 4,315 | -35% | 1 | 1 | 0% | 1,094 | 5,199 | +375% | 0 | 0 | — |
case-12 | pass→pass | 11,007 | 8,147 | -26% | 1 | 1 | 0% | 1,978 | 5,964 | +202% | 0 | 0 | — |
case-13 | fail→pass | 9,225 | 4,914 | -47% | 1 | 1 | 0% | 1,527 | 5,380 | +252% | 0 | 0 | — |
case-14 | fail→pass | 14,085 | 6,366 | -55% | 1 | 1 | 0% | 2,398 | 5,666 | +136% | 0 | 0 | — |
case-15 | pass→pass | 7,253 | 3,983 | -45% | 1 | 1 | 0% | 1,428 | 5,295 | +271% | 0 | 0 | — |
case-16 | fail→fail | 4,639 | 1,786 | -62% | 1 | 1 | 0% | 808 | 4,720 | +484% | 0 | 0 | — |
case-17 | fail→pass | 7,738 | 5,645 | -27% | 1 | 1 | 0% | 1,297 | 5,488 | +323% | 0 | 0 | — |
case-18 | pass→pass | 8,392 | 3,989 | -52% | 1 | 1 | 0% | 1,482 | 5,252 | +254% | 0 | 0 | — |
case-19 | fail→pass | 12,148 | 5,188 | -57% | 1 | 1 | 0% | 2,165 | 5,409 | +150% | 0 | 0 | — |
case-20 | pass→pass | 10,494 | 3,703 | -65% | 1 | 1 | 0% | 1,825 | 5,200 | +185% | 0 | 0 | — |
case-21 | fail→pass | 7,549 | 5,348 | -29% | 1 | 1 | 0% | 1,117 | 5,090 | +356% | 0 | 0 | — |
case-22 | pass→pass | 6,959 | 4,580 | -34% | 1 | 1 | 0% | 1,225 | 5,386 | +340% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 18 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.