Generated banner for Tao Mine Od Images
Generated logo for Tao Mine Od Images

Tao Mine Od Images

NVIDIAOfficialCreated by NVIDIA Corporation

  • Skill
  • Tool integration
  • Data and AI
  • Apache-2.0
  • Medium risk
  • Has scripts

From the author

Run TAO Data Services TMM unique-neighbor matching mining from embedding parquet files for object detection workflows. Use when an object detection workflow needs to mine a bijectively-assigned set of unique source images closest to target samples. Use global allocation when mining without class constraints. Use class_stratified when rare classes are specified.
— the description by NVIDIA Corporation

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/tao-mine-od-images/download
  2. Unzip 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.yaml

Inputs

The user can provide either an existing spec or the fields needed to generate one.

Required spec fields:

FieldMeaning
source_pathAbsolute path to the source embeddings parquet or directory of parquets.
target_pathAbsolute path to the target embeddings parquet or directory of parquets.
output_dirAbsolute path to the output directory. Writes final_unique_files.parquet, summary.json, and per-iteration parquets.
desired_unique_countTotal number of unique source files to retrieve.

Common optional fields:

FieldDefaultMeaning
allocation_policyglobalglobal or class_stratified.
distance_metriceuclideanOne of euclidean, cosine, or manhattan. Embeddings are L2-normalized before search.
candidate_expansion_factor5Candidate-pool multiplier per iteration. Increase if desired count is not reached.
source_embedding_columnembeddingEmbedding column in source_path.
target_embedding_columnembeddingEmbedding column in target_path.
source_filepath_columnfilepathFilepath column in source_path; also the column of final_unique_files.parquet.
target_filepath_columnfilepathFilepath column in target_path.
exclude_pathnullParquet with a filepath column; those images are removed from the source pool.
source_detection_filenullCOCO .json or KITTI label directory for the source. Required for class_stratified.
target_detection_filenullCOCO .json or KITTI label directory for the target. Required for class_stratified.
detection_formatnullcoco 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_embeddingsfalseInclude embeddings in per-iteration parquet outputs.
visualizefalseSave 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: euclidean

For 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:

  1. Verify Docker and GPU access:

docker info > /dev/null
nvidia-smi -L
  1. Resolve 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"
  1. Validate the spec:

python3 skills/data/tao-mine-od-images/scripts/verify_unique_neighbor_matching_spec.py \
  --spec "$SPEC"
  1. Confirm RUN_ROOT contains the spec, both input parquets (or directories), and the output directory. Mount RUN_ROOT to the same absolute path inside Docker.

Outputs

ArtifactLocation
Mined source filepathsoutput_dir/final_unique_files.parquet
Coverage and allocation statsoutput_dir/summary.json
Per-iteration intermediatesoutput_dir/<subset>_iteration_<N>_topn_<K>.parquet
Per-class viz gridsoutput_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

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