tao-mine-aoi-images
NVIDIA/skills
Incorpora os arquivos Parquet das imagens-alvo e das imagens-fonte e, em seguida, extrai as imagens-fonte mais próximas para aumento de dados em fluxos de trabalho de VCN AOI.
...Expandir tudoHabilidade de mineração e incorporação do DEFT
Você é o operador do fluxo de trabalho DEFT de “incorporação e mineração” para a AOI do VCN. Sua função é pegar um arquivo Parquet de imagens-alvo fracas (a saída da análise de lacunas ou do roteamento) e um conjunto de imagens de origem, para então produzir um arquivo Parquet desduplicado de imagens de origem extraídas que se pareçam com as imagens-alvo — prontas para serem utilizadas na próxima rodada de treinamento.
O fluxo de trabalho é fixo e determinístico: incorpore os alvos, incorpore o conjunto de imagens de origem e, em seguida, extraia os vizinhos mais próximos. O arquivo Parquet de saída de cada etapa serve como entrada para a próxima etapa. Não há busca iterativa, nem etapa de agrupamento, nem seleção com intervenção humana — a profundidade vem da escolha do codificador certo e do topn certo, não de uma investigação em várias fases.
A habilidade como um todo é um invólucro simples em torno de três chamadas diretas de `docker run` contra a imagem `tao_toolkit.data_services ` declarada no ` versions.yaml ` (resolvida em tempo de execução — consulte Configuração). O ponto de entrada do contêiner aceita ` ` — passando `image_embeddings -e para embedding e ` tmm nearest_neighbors -e para mineração. O sinalizador -e aponta para um arquivo YAML que fornece valores padrão para o esquema da subtarefa; tudo o que vem depois é uma substituição direta do Hydra (chave=valor) que substitui seletivamente campos da especificação a cada execução. (Não há a palavra-chave “dataset” dentro do contêiner — esse é o prefixo “pillar” do lançador TAO e foi omitido aqui.) Baixe a imagem uma vez se ela não estiver em cache: docker pull "$DS_IMAGE" (após resolver $DS_IMAGE conforme a configuração).
As chaves do esquema podem ser renomeadas entre versões do data-services (a skill RCA mudou de `inference_csv` para ` inference_results_dir` e de `output_dir` para `results_dir`). Em caso de dúvida, analise o esquema real uma vez por imagem: docker run --rm "$DS_IMAGE" embedding image_embeddings --cfg=job e ... tmm nearest_neighbors --cfg=job.
Entradas
- Parquet de destino — a saída da análise de lacunas, normalmente
mining_gaps.parquetdotao-route-visual-changenet-samples(ougaps.parquetdotao-analyze-gaps-visual-changenet, caso o roteamento tenha sido ignorado). Coluna obrigatória:filepath. Sea coluna labeltambém estiver presente, a filtragem com reconhecimento de rótulos durante a mineração estará disponível; caso contrário, a tarefa de mineração ignorará silenciosamente o filtro. - Conjunto de origem — um arquivo Parquet com imagens candidatas a serem exploradas, contendo uma coluna
filepath. Se o usuário tiver apenas um CSV, converta-o para um Parquet com as mesmas colunas antes da Etapa 2. Para a filtragem com reconhecimento de rótulos, o conjunto também deve conter uma colunalabel. - Arquivo de especificação de incorporação — um YAML contendo
model,model_path,batch_sizee (somente quandomodel_pathfor um TAO.pth/.ckpt)model_config_path. Reutilizado nas Etapas 1 e 2;input_parquet/output_parquetsão fornecidos a cada execução como substituições do Hydra. A mesma especificação DEVE orientar ambas as etapas de embedding — embeddings de codificadores diferentes não são comparáveis, e codificadores incompatíveis são a causa mais comum de relatos do tipo “as imagens extraídas parecem não ter relação”. - Arquivo de especificações de mineração — um YAML contendo
topn,knn_metric,filter_by_labele (raramente alterados)source_embed_column_name/target_embed_column_name.source_parquet/target_parquet/output_parquetsão substituições do Hydra em tempo de execução. As incorporações SigLIP e CLIP devem usarknn_metric: cosine. Quandofilter_by_label: true, mas algum dos arquivos Parquet de incorporação não possui uma colunade rótulo, o contêiner registra um aviso e prossegue sem filtrar.
Configuração
Resolva a URI específica de `tao_toolkit.data_services ` no arquivo ` versions.yaml ` uma única vez no início da execução; em seguida, verifique se o Docker, o kit de ferramentas de contêineres da NVIDIA e uma GPU estão disponíveis antes de prosseguir. É necessária uma GPU tanto para a passagem direta do codificador quanto para a pesquisa k-NN do cuML/cuDF; ambas as etapas falham sem o CUDA.
# Resolver tao_toolkit.data_services → URI concreta nvcr.io/... a partir do arquivo versions.yaml
DS_IMAGE=$(python3 -c "import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'/versions.yaml'))['images']['tao_toolkit']['data_services'])")
echo "DS_IMAGE=$DS_IMAGE"
docker info > /dev/null && echo "OK: docker"
nvidia-smi > /dev/null && echo "OK: GPU"
docker image inspect "$DS_IMAGE" > /dev/null \
|| docker pull "$DS_IMAGE"
Todos os caminhos do host que o contêiner lê ou grava devem ser montados por bind. A abordagem mais previsível monta a raiz do espaço de trabalho com caminhos idênticos dentro e fora do contêiner e, em seguida, reutiliza um alias $DOCKER para as três invocações:
WORKSPACE=
DOCKER="docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE"
Não passe --user $(id -u):$(id -g) — isso aciona um KeyError de getpwuid() durante a importação dos transformadores antes mesmo de qualquer trabalho começar. O contêiner é executado como root; o comando chown reverte para o UID do host posteriormente.
Crie os dois arquivos de especificação uma vez por iteração, colocando-os na pasta $WORKSPACE para que o argumento -e seja resolvido em ambos os lados da montagem; os valores específicos de cada execução ficam fora da especificação e são passados como substituições do Hydra. Se o conjunto de dados de origem for um CSV, converta-o para o formato Parquet antecipadamente (preservando o caminho do arquivo e o rótulo, se houver). O arquivo embedding_spec.yaml padrão usa model: SigLIP, model_path: google/siglip-base-patch16-224, batch_size: 64; o arquivo mining_spec.yaml padrão usa topn: 5, knn_metric: cosine, filter_by_label: "false" (entre aspas — o esquema o interpreta como uma string).
Consulte references/setup.md para obter as notas completas sobre o ambiente, o tratamento de TAO_SKILL_BANK_PATH, a justificativa para o mapeamento de caminhos, a solução alternativa para chown no getpwuid, o trecho de código para conversão de CSV para Parquet e os blocos de criação de arquivos de especificação na íntegra.
Método
Três comandos, nessa ordem. O arquivo Parquet de saída de cada comando serve como entrada para o próximo comando. Execute-os como Bash simples; o alias $DOCKER da configuração cuida do contêiner, da GPU e das montagens. Cada invocação segue o mesmo formato: -e para os padrões integrados, seguido de algumas substituições do Hydra para os caminhos específicos da execução.
Etapa 1 — Incorporar as imagens de destino
$DOCKER embedding image_embeddings \
-e \
input_parquet= \
output_parquet=
Lê a saída da análise de lacunas/roteamento e grava um arquivo Parquet com o caminho do arquivo, a incorporação e quaisquer colunas de metadados extras (por exemplo, label, siamese_score, weakness) transportadas literalmente da entrada. Imprima o esquema de saída (pd.read_parquet(...).columns) no stdout para que o gancho de verificação de script possa confirmar se a coluna de embedding existe.
Se for necessário sobrescrever model / model_path / batch_size para uma execução sem editar a especificação, acrescente-os como sobrescritas do Hydra (por exemplo, model_path=...).
Etapa 2 — Incorporar o conjunto de dados de origem
$DOCKER embedding image_embeddings \
-e \
input_parquet= \
output_parquet=
O formato do comando é o mesmo da Etapa 1, aplicado ao conjunto de dados de origem. Use o mesmo arquivo embedding_spec.yaml da Etapa 1 e não altere as configurações de model / model_path / batch_size de forma diferente aqui — configurações de codificador incompatíveis entre as duas etapas geram embeddings não comparáveis.
Etapa 3 — Identificação dos vizinhos mais próximos
$DOCKER tmm nearest_neighbors \
-e \
source_parquet= \
target_parquet= \
output_parquet=
Para cada embedding de destino, localiza os topn embeddings de origem mais próximos de acordo com a métrica escolhida, elimina duplicatas entre os destinos e grava um arquivo Parquet de coluna única (caminho do arquivo) contendo os caminhos de origem únicos extraídos. O contêiner também gera um arquivo mining_summary.txt ao lado do arquivo Parquet de saída com: contagem de consultas, contagem de vizinhos, duplicatas removidas e (quando a filtragem por rótulo está ativada) contagem de pares mantidos versus descartados. Ajuste `topn`, `knn_metric` ou `filter_by_label` por meio da substituição inline do Hydra durante a varredura (por exemplo, `topn=10`) — não é necessário reescrever a especificação.
Quando filter_by_label=true, mas um dos arquivos Parquet de incorporação não contém a coluna de rótulo, o contêiner registra um aviso e prossegue sem filtrar. Se a saída extraída parecer maior do que o esperado ou contiver pares entre rótulos, verifique o log do Docker em busca desse aviso antes de presumir que a tarefa foi executada corretamente.
Consulte references/reference-invocation.md para obter a receita completa mínima do tipo “copiar e editar” (resolve $DS_IMAGE, escreve ambas as especificações, executa todas as três etapas, altera a propriedade dos arquivos de saída e imprime as contagens de linhas) para ser executada como um único bloco Bash transmitido.
Saídas e relatório
Grave tudo em uma pasta com carimbo de data e hora no diretório da experiência / iteração. Obtenha o carimbo de data e hora real executando ` date +%Y-%m-%d_%H%M%S ` no Bash — NÃO codifique manualmente nem adivinhe. Se o usuário especificar um caminho de saída personalizado, use-o diretamente, mas mantenha o mesmo layout interno. O gancho de empacotamento adiciona automaticamente mining_config/ e claude_session.jsonl quando o Mining_Report.md é gravado.
O arquivo Parquet extraído é o artefato consumido pelo treinamento a jusante. Os dois arquivos Parquet de embedding são intermediários, mas vale a pena mantê-los — eles são reutilizáveis em várias execuções de mineração com o mesmo conjunto de dados de origem e são o único lugar a ser consultado quando um relatório que “parece não estar relacionado” precisa de depuração no nível do codificador.
Consulte references/outputs-and-reporting.md para ver o layout completo do diretório de saída e o modelo literal do Mining_Report.md (Veredicto, Entradas, Consistência do Codificador, Execução da Mineração, Discriminação por Rótulo, Validade da Saída, Ações Recomendadas; mantenha-o entre 600 e 1.200 palavras).
Armadilhas comuns
A falha mais frequente é a incompatibilidade entre os codificadores nas duas etapas de incorporação — a causa mais comum de resultados de mineração inválidos; ambas as etapas devem utilizar o mesmo arquivo embedding_spec.yaml. Outras armadilhas recorrentes: passar --user (o erro KeyError getpwuid ), pular uma etapa de incorporação, uma coluna de rótulo ausente que silencia a ação do filter_by_label=true, arquivos de especificação fora do $WORKSPACE, sentinelas ??? não resolvidas , pontos de verificação do TAO sem model_config_path, conjuntos de dados de origem em CSV alimentados diretamente, incompatibilidades entre caminhos do host/contêiner, ausência de GPU, uma tag de imagem não baixada ou :latest e topn × N_targets ≫ tamanho da fonte (esperado — relate a contagem real extraída).
Consulte references/troubleshooting.md para obter a lista completa de armadilhas com os erros exatos, causas e soluções.
Ordem de execução
- Resolva
DS_IMAGEa partir doarquivo versions.yaml(images.tao_toolkit.data_services) e, em seguida, executedocker info,nvidia-smiedocker image inspect "$DS_IMAGE"(baixando se estiver faltando) uma vez para confirmar o ambiente. Aborte com uma mensagem clara se houver alguma falha. - Execute `
date +%Y-%m-%d_%H%M%S` para obter o carimbo de data/hora; crie ``./mining_results/` e ` / - Grave os arquivos
`embedding_spec.yaml` e`mining_spec.yaml`no diretório com o carimbo de data/hora, preenchendo a escolha do codificador e os parâmetros de mineração. Mantenha-os em`$WORKSPACE` para que o caminho`-e`seja resolvido dentro do contêiner. - Se o conjunto de dados de origem for um CSV, converta-o primeiro para Parquet (preservando
o caminho do arquivoeo rótulo). - Execute a Etapa 1 (incorporar destinos) por meio de
`docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…`.Imprima a contagem de linhas e colunas do arquivo Parquet de saída no stdout. - Execute a Etapa 2 (incorporar o conjunto de dados de origem) com o mesmo arquivo
embedding_spec.yamlda Etapa 1. Imprima o número de linhas e colunas do Parquet de saída. - Execute a Etapa 3 (mineração de vizinhos mais próximos) por meio de
`docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…`.Confirme seo arquivo`mining_summary.txt`foi gravado ao lado do`mined.parquet`. - Calcule a divisão por rótulo (Seção 5) unindo o arquivo Parquet de embeddings de destino com a saída extraída no caminho do arquivo, caso ambos contenham
rótulos. - Grave
o Mining_Report.mdpor último — gravá-lo aciona o gancho de empacotamento, que copia os logs da sessão e a configuração da skill junto com ele.
---
name: tao-mine-aoi-images
description: Embeds target and source image parquets, then mines nearest-neighbour source images for augmentation in VCN AOI workflows.
license: Apache-2.0
---
# DEFT Mining and Embedding Skill
You are the operator of the DEFT embed-then-mine workflow for VCN AOI. Your job is to take a parquet of weak target images (the gap-analysis or routing output) and a source pool, then produce a deduplicated parquet of mined source images that look similar to the targets — ready to feed into the next training round.
The workflow is fixed and deterministic: **embed the targets, embed the source pool, then mine nearest neighbours.** Each step's output parquet is the next step's input. There is no iterative search, no clustering pass, no human-in-the-loop selection — depth comes from picking the right encoder and the right `topn`, not from a multi-phase investigation.
The whole skill is a thin wrapper around three direct `docker run` invocations against the `tao_toolkit.data_services` image declared in `versions.yaml` (resolved at runtime — see Setup). The container's entrypoint takes `<category> <action> -e <spec.yaml> [hydra overrides...]` — pass `embedding image_embeddings -e <embedding_spec.yaml> …` for embedding and `tmm nearest_neighbors -e <mining_spec.yaml> …` for mining. The `-e` flag points at a YAML that supplies default values for the subtask's schema; anything afterward is a bare Hydra override (`key=value`) that selectively overrides spec fields per run. (There is no `dataset` keyword inside the container — that's the TAO launcher's pillar prefix and is dropped here.) Pull the image once if it isn't cached: `docker pull "$DS_IMAGE"` (after resolving `$DS_IMAGE` per Setup).
Schema keys can rename between data-services releases (the RCA skill saw `inference_csv` → `inference_results_dir`, `output_dir` → `results_dir`). When in doubt, introspect the actual schema once per image: `docker run --rm "$DS_IMAGE" embedding image_embeddings --cfg=job` and `... tmm nearest_neighbors --cfg=job`.
---
## Inputs
1. **Target parquet** — the gap-analysis output, typically `mining_gaps.parquet` from `tao-route-visual-changenet-samples` (or `gaps.parquet` from `tao-analyze-gaps-visual-changenet` if routing was skipped). Required column: `filepath`. If `label` is also present, label-aware filtering during mining is available; otherwise the mining task silently no-ops the filter.
2. **Source pool** — a parquet of candidate images to mine against, with a `filepath` column. If the user only has a CSV, convert it to a parquet **with the same columns** before Step 2. For label-aware filtering, the pool must also carry a `label` column.
3. **Embedding spec file** — a YAML containing `model`, `model_path`, `batch_size`, and (only when `model_path` is a TAO `.pth`/`.ckpt`) `model_config_path`. Reused across Steps 1 and 2; `input_parquet`/`output_parquet` are supplied per run as Hydra overrides. The **same** spec MUST drive both embedding steps — embeddings from different encoders are not comparable, and mismatched encoders are the most common cause of "the mined images look unrelated" reports.
4. **Mining spec file** — a YAML containing `topn`, `knn_metric`, `filter_by_label`, and (rarely changed) `source_embed_column_name`/`target_embed_column_name`. `source_parquet`/`target_parquet`/`output_parquet` are Hydra overrides at run time. SigLIP and CLIP embeddings should use `knn_metric: cosine`. When `filter_by_label: true` but either embedding parquet lacks a `label` column, the container logs a warning and proceeds **without** filtering.
---
## Setup
Resolve the concrete `tao_toolkit.data_services` URI from `versions.yaml` once at the top of the run, then confirm Docker, the NVIDIA container toolkit, and a GPU are present before doing anything else. A GPU is required for both the encoder forward pass and the cuML/cuDF k-NN search; both steps fail without CUDA.
```bash
# Resolve tao_toolkit.data_services → concrete nvcr.io/... URI from versions.yaml
DS_IMAGE=$(python3 -c "import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'/versions.yaml'))['images']['tao_toolkit']['data_services'])")
echo "DS_IMAGE=$DS_IMAGE"
docker info > /dev/null && echo "OK: docker"
nvidia-smi > /dev/null && echo "OK: GPU"
docker image inspect "$DS_IMAGE" > /dev/null \
|| docker pull "$DS_IMAGE"
```
Every host path the container reads or writes must be bind-mounted. The most predictable approach mounts the workspace root with **identical paths** inside and outside the container, then reuses one `$DOCKER` alias for the three invocations:
```bash
WORKSPACE=<absolute path that contains all parquets, outputs, and the source-pool images>
DOCKER="docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE"
```
Do **not** pass `--user $(id -u):$(id -g)` — it triggers a `getpwuid()` `KeyError` during the `transformers` import before any work starts. The container runs as root; chown outputs back to the host UID afterward.
Author the two spec files once per iteration, placing them under `$WORKSPACE` so the `-e` argument resolves on both sides of the mount; per-run values stay out of the spec and are passed as Hydra overrides. If the source pool is a CSV, convert it to parquet up front (preserving `filepath`, and `label` if present). The default `embedding_spec.yaml` uses `model: SigLIP`, `model_path: google/siglip-base-patch16-224`, `batch_size: 64`; the default `mining_spec.yaml` uses `topn: 5`, `knn_metric: cosine`, `filter_by_label: "false"` (quoted — the schema reads it as a string).
See `references/setup.md` for the full environment notes, `TAO_SKILL_BANK_PATH` handling, the path-mounting rationale, the `getpwuid` chown workaround, the CSV-to-parquet snippet, and the verbatim spec-file authoring blocks.
---
## Method
Three commands, in order. Each command's output parquet is the next command's input. Run them as plain Bash; the `$DOCKER` alias from Setup handles the container, GPU, and mounts. Every invocation follows the same shape: `-e <spec>` for the baked-in defaults, then a handful of Hydra overrides for the run-specific paths.
### Step 1 — Embed the target images
```bash
$DOCKER embedding image_embeddings \
-e <embedding_spec.yaml> \
input_parquet=<target_parquet> \
output_parquet=<target_embeddings_parquet>
```
Reads the gap-analysis / routing output and writes a parquet with `filepath`, `embedding`, and any extra metadata columns (e.g. `label`, `siamese_score`, `weakness`) carried forward verbatim from the input. Print the output schema (`pd.read_parquet(...).columns`) to stdout so the script-check hook can confirm the embedding column exists.
If you need to override `model` / `model_path` / `batch_size` for one run without editing the spec, append them as Hydra overrides (e.g. `model_path=...`).
### Step 2 — Embed the source pool
```bash
$DOCKER embedding image_embeddings \
-e <embedding_spec.yaml> \
input_parquet=<source_pool_parquet> \
output_parquet=<source_embeddings_parquet>
```
Same command shape as Step 1, applied to the source pool. Use the **identical** `embedding_spec.yaml` as Step 1, and do not override `model` / `model_path` / `batch_size` differently here — mismatched encoder configs across the two steps produce non-comparable embeddings.
### Step 3 — Mine nearest neighbours
```bash
$DOCKER tmm nearest_neighbors \
-e <mining_spec.yaml> \
source_parquet=<source_embeddings_parquet> \
target_parquet=<target_embeddings_parquet> \
output_parquet=<mined_parquet>
```
For each target embedding, finds the `topn` closest source embeddings under the chosen metric, deduplicates across targets, and writes a single-column (`filepath`) parquet of unique mined source paths. The container also drops a `mining_summary.txt` next to the output parquet with: query count, neighbour count, duplicates removed, and (when label filtering is on) kept-vs-dropped pair counts. Tweak `topn`, `knn_metric`, or `filter_by_label` via inline Hydra override when sweeping (e.g. `topn=10`) — no need to rewrite the spec.
When `filter_by_label=true` but one of the embedding parquets is missing the `label` column, the container logs a warning and proceeds without filtering. If the mined output looks larger than expected or contains cross-label pairs, scan the docker log for that warning before assuming the task did the right thing.
See `references/reference-invocation.md` for the minimal paste-and-edit end-to-end recipe (resolves `$DS_IMAGE`, writes both specs, runs all three steps, chowns outputs, and prints row counts) to run as a single streamed Bash block.
---
## Outputs and report
Write everything into a timestamped folder under the experiment / iteration directory. Get the real timestamp by running `date +%Y-%m-%d_%H%M%S` in Bash — do NOT hardcode or guess. If the user specifies a custom output path, use it directly but maintain the same internal layout. The packaging hook adds `mining_config/` and `claude_session.jsonl` automatically when `Mining_Report.md` is written.
The mined parquet is the artifact downstream training consumes. The two embedding parquets are intermediate but worth retaining — reusable across multiple mining runs against the same source pool, and the only place to look when a "looks unrelated" report needs encoder-level debugging.
See `references/outputs-and-reporting.md` for the full output-directory layout and the verbatim `Mining_Report.md` template (Verdict, Inputs, Encoder Consistency, Mining Run, Per-Label Breakdown, Output Sanity, Recommended Actions; keep it 600–1200 words).
---
## Common pitfalls
The most frequent failure is **mismatched encoders between the two embedding steps** — the single most common cause of garbage mining output; both steps must consume the same `embedding_spec.yaml`. Other recurring traps: passing `--user` (the `getpwuid` `KeyError`), skipping an embedding step, a missing `label` column silently no-oping `filter_by_label=true`, spec files outside `$WORKSPACE`, unresolved `???` sentinels, TAO checkpoints without `model_config_path`, CSV source pools fed in directly, host/container path mismatches, no GPU, an unpulled or `:latest` image tag, and `topn × N_targets ≫ source size` (expected — report the actual mined count).
See `references/troubleshooting.md` for the full pitfall list with the exact errors, causes, and fixes.
---
## Execution Order
1. Resolve `DS_IMAGE` from `versions.yaml` (`images.tao_toolkit.data_services`), then run `docker info`, `nvidia-smi`, and `docker image inspect "$DS_IMAGE"` (pulling if missing) once to confirm the environment. Abort with a clear message if any fail.
2. Run `date +%Y-%m-%d_%H%M%S` to get the timestamp; create `<output_dir>/mining_results/<timestamp>/`.
3. Write `embedding_spec.yaml` and `mining_spec.yaml` into the timestamped dir, filling in the encoder choice and mining knobs. Keep these under `$WORKSPACE` so the `-e` path resolves inside the container.
4. If the source pool is a CSV, convert to parquet first (preserve `filepath` and `label`).
5. Run Step 1 (embed targets) via `docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…`. Print the output parquet's row count and columns to stdout.
6. Run Step 2 (embed source pool) with the **identical** `embedding_spec.yaml` as Step 1. Print output row count and columns.
7. Run Step 3 (mine nearest neighbours) via `docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…`. Confirm `mining_summary.txt` was written next to `mined.parquet`.
8. Compute the per-label breakdown (Section 5) by joining the target embeddings parquet with the mined output on filepath, if both carry `label`.
9. Write `Mining_Report.md` last — writing it triggers the packaging hook, which copies session logs and skill config alongside.
Todos os arquivos
14 arquivosInstalar tao-mine-aoi-images
Baixe e descompacte os arquivos das habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/NVIDIA/skills/tree/main/skills/tao-mine-aoi-images # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
