Tao Mine Od Images
NVIDIAOfficialCreated by NVIDIA Corporation
- Skill
- Tool integration
- Data and AI
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The tao-mine-od-images skill provides a structured interface for running the TAO Data Services TMM unique-neighbor matching process. It enables users to mine a bijectively-assigned set of unique source images that are most similar to a target set of samples, based on pre-computed embeddings. The skill supports both global allocation and class-stratified mining, allowing for targeted data selection in object detection workflows. It requires input parquets containing filepaths and embeddings, and produces a final list of unique filepaths along with summary statistics.
What it does
- Performs unique-neighbor matching to select source images based on embedding similarity.
- Supports global allocation for general mining tasks.
- Enables class-stratified mining to address rare classes in object detection datasets.
- Generates a final parquet file containing the selected unique source filepaths.
- Provides summary statistics including coverage percentage and per-class breakdowns.
- Offers optional visualization of per-class grids to inspect mining results.
When to use it
- When you need to select a specific number of unique source images that closely match target samples.
- When preparing training data for object detection and needing to balance class representation.
- When you have pre-computed embedding parquets and need to perform similarity-based data mining.
- When you need to exclude specific images from the source pool during the mining process.
Advantages
- Automates the selection of representative data for object detection models.
- Provides flexible allocation policies to handle both general and rare-class scenarios.
- Integrates directly with TAO Data Services for efficient GPU-accelerated processing.
- Includes validation scripts to ensure configuration integrity before execution.
Usage examples
- “Mine 500 unique images from my source pool that are most similar to my target dataset using global allocation.”
- The skill will use the provided source and target embedding parquets to identify the 500 closest unique neighbors and output them to the specified directory.
- “Perform class-stratified mining to improve representation of rare classes like person and bicycle.”
- By setting the allocation_policy to class_stratified and providing the rare_class_list and detection files, the miner will prioritize these classes during the selection process.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/tao-mine-od-images/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip tao-mine-od-images.zip -d .agents/skills
Documentation by NVIDIA Corporation
TAO Mine OD Images (Unique Neighbor Matching)
Use this skill to run TAO Data Services TMM unique-neighbor matching mining for object detection. The skill consumes pre-embedded source and target parquets and writes a directory of outputs including final_unique_files.parquet and summary.json. It does not compute embeddings; upstream steps must produce the source and target embedding parquets first.
The container entrypoint is:
tmm unique_neighbor_matching -e /absolute/path/to/unique_neighbor_matching.yamlInputs
The user can provide either an existing spec or the fields needed to generate one.
Required spec fields:
| Field | Meaning |
|---|---|
source_path | Absolute path to the source embeddings parquet or directory of parquets. |
target_path | Absolute path to the target embeddings parquet or directory of parquets. |
output_dir | Absolute path to the output directory. Writes final_unique_files.parquet, summary.json, and per-iteration parquets. |
desired_unique_count | Total number of unique source files to retrieve. |
Common optional fields:
| Field | Default | Meaning |
|---|---|---|
allocation_policy | global | global or class_stratified. |
distance_metric | euclidean | One of euclidean, cosine, or manhattan. Embeddings are L2-normalized before search. |
candidate_expansion_factor | 5 | Candidate-pool multiplier per iteration. Increase if desired count is not reached. |
source_embedding_column | embedding | Embedding column in source_path. |
target_embedding_column | embedding | Embedding column in target_path. |
source_filepath_column | filepath | Filepath column in source_path; also the column of final_unique_files.parquet. |
target_filepath_column | filepath | Filepath column in target_path. |
exclude_path | null | Parquet with a filepath column; those images are removed from the source pool. |
source_detection_file | null | COCO .json or KITTI label directory for the source. Required for class_stratified. |
target_detection_file | null | COCO .json or KITTI label directory for the target. Required for class_stratified. |
detection_format | null | coco or kitti. Required whenever a detection file is set; never inferred from the path. |
rare_class_list | "" | Comma-separated rare class names, e.g. "person,bicycle". Required for class_stratified. |
save_embeddings | false | Include embeddings in per-iteration parquet outputs. |
visualize | false | Save per-class visualization grids (requires Pillow and matplotlib). |
Both input parquets must contain the filepath and embedding columns. Source and target embeddings must have been produced by the same encoder; mismatched encoders produce garbage output.
The default template is assets/default_unique_neighbor_matching.yaml.
Quick Start
Run from the tao-skill-bank repo root. Resolve the pinned TAO Data Services image from versions.yaml, verify the spec, mount the run root with identical host/container paths, and stream the Docker logs.
Write the spec into the output directory. The run does not retain it, so a mined set otherwise carries no record of the budget, allocation policy or rare-class list that produced it — and those decide which images were selected. Keeping them together makes the selection recoverable from the run alone.
OUTPUT_DIR=/absolute/path/for/this/run # output_dir in the spec
SPEC="$OUTPUT_DIR/unique_neighbor_matching.yaml" # spec lives beside its outputs
RUN_ROOT=/absolute/path/that/contains/specs/data/and/results
GPU_COUNT=1
python3 skills/data/tao-mine-od-images/scripts/verify_unique_neighbor_matching_spec.py \
--spec "$SPEC"
DS_IMAGE="$(scripts/resolve_versions_key.py images.tao_toolkit.data_services)"
docker run --rm --gpus "$GPU_COUNT" --shm-size=8g --network=host \
-v "$RUN_ROOT:$RUN_ROOT" \
-w "$RUN_ROOT" \
"$DS_IMAGE" \
tmm unique_neighbor_matching -e "$SPEC"Do not pass --user $(id -u):$(id -g) to the TAO data-services container; some TAO DS images call getpass.getuser() at startup and fail when the UID is not in /etc/passwd.
Generate A Spec
If the user provides source/target paths and an output directory instead of a
ready spec, copy the template and fill in the nulls. Every tuning value it
already carries is the one this stage wants — change one only deliberately.
cp skills/data/tao-mine-od-images/assets/default_unique_neighbor_matching.yaml "$SPEC"Fill source_path, target_path, output_dir and desired_unique_count, all
as absolute paths, then validate:
python3 skills/data/tao-mine-od-images/scripts/verify_unique_neighbor_matching_spec.py --spec "$SPEC"source_path: /absolute/path/source_embeddings.parquet
target_path: /absolute/path/target_embeddings.parquet
output_dir: /absolute/path/results/mining_output
desired_unique_count: 500
allocation_policy: global # or class_stratified — see below
distance_metric: euclideanFor class-stratified mode set allocation_policy: class_stratified and supply
rare_class_list, source_detection_file, target_detection_file and
detection_format. verify rejects the policy without them: absent those
fields the miner falls back to a global match, which mines the wrong images
rather than failing.
The template is the only place a default value lives, so nothing can disagree
with it. verify reports the budget, policy and metric, since the mined parquet
is a list of filepaths and records nothing about why those files were chosen.
Keep the spec, input parquets, and output directory under RUN_ROOT so the same
paths resolve inside the container.
Preflight
Before launching Docker:
Verify Docker and GPU access:
docker info > /dev/null
nvidia-smi -LResolve and pull the data-services image if needed:
DS_IMAGE="$(scripts/resolve_versions_key.py images.tao_toolkit.data_services)"
docker image inspect "$DS_IMAGE" > /dev/null || docker pull "$DS_IMAGE"Validate the spec:
python3 skills/data/tao-mine-od-images/scripts/verify_unique_neighbor_matching_spec.py \
--spec "$SPEC"Confirm
RUN_ROOTcontains the spec, both input parquets (or directories), and the output directory. MountRUN_ROOTto the same absolute path inside Docker.
Outputs
| Artifact | Location |
|---|---|
| Mined source filepaths | output_dir/final_unique_files.parquet |
| Coverage and allocation stats | output_dir/summary.json |
| Per-iteration intermediates | output_dir/<subset>_iteration_<N>_topn_<K>.parquet |
| Per-class viz grids | output_dir/*.png (only if visualize: true) |
final_unique_files.parquet contains one filepath column. summary.json includes retrieved_unique_count, coverage_pct, and (when detection files are provided) per-class breakdowns for the target and selected source sets.
Troubleshooting
The subtask unique_neighbor_matching requires -e/--experiment_spec_file: rerun with tmm unique_neighbor_matching -e "$SPEC".
Input path not found inside Docker: use a RUN_ROOT mount where host and container paths are identical.
ValueError: detection_format is required: set detection_format: coco or detection_format: kitti whenever source_detection_file or target_detection_file is set.
ValueError: rare_class_list is required when allocation_policy is class_stratified: set rare_class_list and both detection files when using class_stratified.
Low coverage_pct in summary.json: the source pool is smaller than desired_unique_count. Expand the pool or increase candidate_expansion_factor.
No GPU or cuDF/cuML errors: mining requires at least one CUDA GPU. Check nvidia-smi -L, the Docker --gpus flag, and the NVIDIA container toolkit installation.
Files
- ATTRIBUTION.mdAdded by AutoGineer924 B
- BENCHMARK.md6.9 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md8.5 KiB
- assets/default_unique_neighbor_matching.yaml457 B
- config/skillspector-baseline.yaml1.3 KiB
- evals/evals.json893 B
- references/skill_info.yaml897 B
- scripts/verify_unique_neighbor_matching_spec.pyScript7.1 KiB
- skill-card.md4.8 KiB
- skill.oms.sig5.5 KiB
scripts/verify_unique_neighbor_matching_spec.py
#!/usr/bin/env python3
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Validate a TAO Data Services TMM unique-neighbor-matching spec.
Fill `assets/default_unique_neighbor_matching.yaml` — it carries every default
this stage needs — then run this against the result. The template is the only
place a default value lives, so there is nothing that can disagree with it.
Checks the spec against what `tmm unique_neighbor_matching` actually requires:
- `source_path`, `target_path`, `output_dir` and `desired_unique_count` are
present; the paths are absolute and the two parquets exist.
- `allocation_policy` and `distance_metric` are values the miner accepts.
- `detection_format` is set whenever a detection file is, since the miner cannot
infer it.
- `class_stratified` has everything it needs: a `rare_class_list`, both detection
files, and a format. Without them the policy silently degrades to a global
match, which mines the wrong images rather than failing.
It also reports the budget and policy, because the mined parquet is a list of
filepaths and records nothing about why those files were chosen.
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
from typing import Any
import yaml
VALID_METRICS = {"euclidean", "cosine", "manhattan"}
VALID_POLICIES = {"global", "class_stratified"}
VALID_FORMATS = {"coco", "kitti"}
def load_yaml(path: Path) -> dict[str, Any]:
with path.open("r", encoding="utf-8") as fh:
data = yaml.safe_load(fh) or {}
if not isinstance(data, dict):
raise ValueError(f"{path} must contain a YAML mapping.")
return data
def validate_config(config: dict[str, Any]) -> None:
required = ("source_path", "target_path", "output_dir", "desired_unique_count")
missing = [key for key in required if config.get(key) is None]
if missing:
raise ValueError(f"Missing required field(s): {', '.join(missing)}")
for key in ("source_path", "target_path", "output_dir"):
if not isinstance(config[key], str) or not config[key].strip():
raise ValueError(f"{key} must be a non-empty string.")
for key in ("source_path", "target_path"):
p = Path(config[key]).expanduser()
if not p.is_absolute():
raise ValueError(f"{key} must be absolute: {p}")
if not p.exists():
raise FileNotFoundError(f"{key} does not exist: {p}")
out = Path(config["output_dir"]).expanduser()
if not out.is_absolute():
raise ValueError(f"output_dir must be absolute: {out}")
out.mkdir(parents=True, exist_ok=True)
count = config["desired_unique_count"]
if isinstance(count, bool) or not isinstance(count, int) or count < 1:
raise ValueError("desired_unique_count must be an integer of at least 1.")
config["desired_unique_count"] = count
policy = config.get("allocation_policy", "global")
if not isinstance(policy, str) or policy not in VALID_POLICIES:
raise ValueError(f"allocation_policy must be one of {sorted(VALID_POLICIES)}.")
config["allocation_policy"] = policy
metric = config.get("distance_metric", "euclidean")
if not isinstance(metric, str) or metric not in VALID_METRICS:
raise ValueError(f"distance_metric must be one of {sorted(VALID_METRICS)}.")
config["distance_metric"] = metric
det_src = config.get("source_detection_file")
det_tgt = config.get("target_detection_file")
det_fmt = config.get("detection_format")
for key, value in (
("source_detection_file", det_src),
("target_detection_file", det_tgt),
("exclude_path", config.get("exclude_path")),
):
if value is not None and (not isinstance(value, str) or not value.strip()):
raise ValueError(f"{key} must be a non-empty string or null.")
if det_fmt is not None and not isinstance(det_fmt, str):
raise ValueError("detection_format must be a string or null.")
if (det_src or det_tgt) and not det_fmt:
raise ValueError("detection_format (coco or kitti) is required when a detection file is set.")
if det_fmt and det_fmt not in VALID_FORMATS:
raise ValueError(f"detection_format must be one of {sorted(VALID_FORMATS)}.")
if policy == "class_stratified":
if not config.get("rare_class_list"):
raise ValueError("rare_class_list is required when allocation_policy is class_stratified.")
if not det_src or not det_tgt:
raise ValueError("source_detection_file and target_detection_file are required for class_stratified.")
if not det_fmt:
raise ValueError("detection_format is required for class_stratified.")
expansion = config.get("candidate_expansion_factor", 5)
if isinstance(expansion, bool) or not isinstance(expansion, int) or expansion < 1:
raise ValueError("candidate_expansion_factor must be an integer of at least 1.")
for key in (
"source_embedding_column",
"target_embedding_column",
"source_filepath_column",
"target_filepath_column",
):
value = config.get(key, "embedding" if "embedding" in key else "filepath")
if not isinstance(value, str) or not value.strip():
raise ValueError(f"{key} must be a non-empty string.")
rare = config.get("rare_class_list", "")
if not isinstance(rare, str):
raise ValueError("rare_class_list must be a string.")
for key in ("save_embeddings", "visualize"):
value = config.get(key, False)
if not isinstance(value, bool):
raise ValueError(f"{key} must be true or false.")
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("--spec", required=True, help="Path to unique-neighbor-matching YAML.")
return parser.parse_args()
def main() -> int:
try:
spec = Path(parse_args().spec).expanduser().resolve()
config = load_yaml(spec)
validate_config(config)
print(f"OK: unique-neighbor-matching spec is valid: {spec}")
print(f"budget={config['desired_unique_count']} policy={config['allocation_policy']} "
f"metric={config['distance_metric']}"
+ (f" rare={config['rare_class_list']}" if config.get("rare_class_list") else ""))
print(f"Output directory: {config['output_dir']}")
print("Expected artifacts: final_unique_files.parquet, summary.json")
out_dir = Path(str(config["output_dir"])).expanduser().resolve()
if spec.parent != out_dir:
print(f"WARNING: the spec is outside output_dir ({spec.parent} vs {out_dir}). The "
"run does not copy it, so the mined set will carry no record of the budget, "
"allocation policy or rare-class list that selected it. Author it at "
f"{out_dir / spec.name} instead.", file=sys.stderr)
return 0
except Exception as exc: # noqa: BLE001
print(f"ERROR: {exc}", file=sys.stderr)
return 1
if __name__ == "__main__":
raise SystemExit(main())
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Needs a command-line tool, Needs Python
The author says: Requires docker, nvidia-container-toolkit, one or more CUDA GPUs, and the TAO data-services container pinned in versions.yaml.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- References to credential files
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Corporation
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/tao-mine-od-images · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Corporation or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download tao-mine-od-images.zip