Tao Generate Image Grounding
NVIDIAOfficialCreated by NVIDIA Corporation
- Skill
- Workflow
- Data and AI
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The tao-generate-image-grounding skill provides a structured workflow for generating phrase-grounded training data. It utilizes a vision-language model (VLM) to perform a two-step process: first, it cleans captions and extracts referring expressions with character spans; second, it predicts pixel-space bounding boxes for those expressions. The pipeline supports various VLM backends, including Gemini and OpenAI-compatible endpoints like NIM or vLLM, and includes built-in checkpointing to allow for efficient, resumable processing of large image datasets.
What it does
- Extracts referring expressions and character spans from image captions.
- Generates pixel-space bounding boxes for identified expressions.
- Supports multiple VLM backends including Gemini and OpenAI-compatible services.
- Provides per-sample checkpointing for resumable, fault-tolerant processing.
- Allows for flexible pipeline execution, enabling step-by-step or full-run processing.
- Outputs structured JSONL annotations suitable for training grounding models.
When to use it
- When you need to create phrase-grounded training datasets from existing image-caption pairs.
- When you want to auto-label images with bounding boxes for object detection or grounding tasks.
- When you need to validate or refine caption-to-image alignment using a VLM.
- When you have a large dataset and require a resumable, automated annotation workflow.
Advantages
- Automates labor-intensive manual annotation tasks using powerful VLM teacher models.
- Highly configurable with support for various self-hosted or cloud-based VLM endpoints.
- Resilient workflow design with built-in checkpointing to prevent data loss during long runs.
- Flexible execution allows for inspecting intermediate results before full-scale processing.
Usage examples
- “Run the image grounding pipeline on my dataset of images and captions.”
- The agent will guide you through setting up the input JSONL, selecting your VLM backend (e.g., Gemini or a local vLLM server), and executing the two-step extraction and grounding process.
- “I need to extract referring expressions from my captions but not ground them yet.”
- The agent will configure the workflow to run only step 0, producing a JSONL file containing cleaned captions and identified expressions with character spans.
- “How do I re-run the grounding step after fixing my configuration?”
- The agent will instruct you to set workflow.force_reprocess to true to ignore existing checkpoints and re-run the pipeline from scratch.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/tao-generate-image-grounding/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip tao-generate-image-grounding.zip -d .agents/skills
Documentation by NVIDIA Corporation
Image Grounding Pipeline
Standalone install? If this session was not initialized by the TAO skill bank plugin, run the
tao-setupskill first (host preflight, credentials, cross-skill discovery).
Turn (image, caption) pairs into per-image grounded annotations: cleaned captions, referring expressions with character spans, and pixel-space bounding boxes for each expression. A single VLM (Gemini or any OpenAI-compatible endpoint) handles both steps.
Purpose
Generate phrase-grounded training data for referring-expression and grounding models. The VLM acts as a "teacher" annotator: Step 0 extracts referring expressions from the caption while looking at the image; Step 1 returns one bbox set per expression for each image.
Pipeline Architecture
Step 0: Expression extraction → VLM cleans caption, extracts referring expressions + char spans
Step 1: Phrase grounding → VLM returns pixel bboxes + scores per expressionSteps are individually selectable via workflow.steps. Each step writes a per-sample checkpoint to step_<N>_*/.ckpt/<sample_id>.json and skips already-processed records on re-run. Set workflow.force_reprocess: true to ignore checkpoints and reprocess from scratch.
Instructions
Initial setup
When a user wants to run this pipeline, walk through these steps:
Input JSONL: Ask for the JSONL path. Each line must be one object like
{"image_path": "...", "caption": "..."}.image_pathcan be absolute or relative.Image root: If any
image_pathvalues are relative, setdata.image_rootto the directory they should resolve from.API access: Ask the user which VLM endpoint they want to use. Present these five options and act on the choice:
Gemini — set
vlm.backend: "gemini"; requireGOOGLE_API_KEY(env var orvlm.gemini.api_key).NIM (e.g.
https://inference-api.nvidia.com/v1) — setvlm.backend: "openai"; collectbase_url,model_name, andapi_key.TAO inference microservice (self-hosted, OpenAI-compatible). Confirm whether the server is already running:
Running — collect
base_url,model_name, and (optionally)api_key; setvlm.backend: "openai".Not running — guide the user through the
skills/applications/tao-run-inference-serviceskill, which stands up a local TAO inference microservice with an OpenAI-compatible API. Before promising a specific model, checkskills/applications/tao-run-inference-service/references/service.yamlforvalid_network_arch_config_basenames. Once the server is up, collectbase_url,model_name, and (optionally)api_key; setvlm.backend: "openai".
vLLM (self-hosted, OpenAI-compatible). Confirm whether the server is already running:
Running — collect
base_url,model_name, and (optionally)api_key; setvlm.backend: "openai".Not running — follow references/vllm_server.md to install and launch a vLLM server, then collect
base_url,model_name, and (optionally)api_key; setvlm.backend: "openai".
Custom (any other OpenAI-compatible endpoint) — set
vlm.backend: "openai"; collectbase_url,model_name, and (optionally)api_key.
If the user has no endpoint and does not want to set one up, stop and help resolve API access first.
Workflow steps: Choose one of:
Full pipeline:
["0", "1"]Expression extraction only:
["0"]Grounding only:
["1"], which requires existing step-0 output atresults_dir/step_0_expression_extraction/annotations.jsonl
Resume vs fresh run: By default, the workflow reuses checkpoints and skips completed records. To reprocess everything, set
image_grounding.workflow.force_reprocess=true.
Running the pipeline
The pipeline runs inside the TAO Toolkit container via the auto_label CLI:
auto_label generate -e /path/to/spec.yaml \
results_dir=/results \
image_grounding.data.input_jsonl=/data/captions.jsonl \
image_grounding.data.image_root=/data/images \
image_grounding.vlm.gemini.api_key=$GOOGLE_API_KEYGenerate a default spec: auto_label default_specs results_dir=/results module_name=auto_label, then set autolabel_type: "image_grounding". All fields support Hydra dot-notation overrides on the command line.
See references/configuration.md for the full YAML structure, all parameters, model/endpoint setup, and error patterns.
Recommended pilot workflow
Run on 5-10 images with both steps
Inspect
step_0_expression_extraction/annotations.jsonl— arecleaned_captionandexpressions[]accurate? Are the right noun phrases captured?Inspect
step_1_grounding/annotations.jsonl— do the bboxes inexpressions[].instances[]look right? Are confidence scores reasonable?If quality is insufficient, switch the VLM to a stronger model (e.g.
gemini-2.5-pro) or raisemedia_resolution/max_output_tokens, then re-run withforce_reprocess=true.Scale to the full dataset once satisfied.
Configuration
Key configuration fields (full reference in references/configuration.md):
| Field | Default | Description |
|---|---|---|
workflow.steps | ["0","1"] | Which pipeline steps to execute ("0" = expressions, "1" = grounding) |
workflow.max_workers | 4 | Parallel threads per step (watch API rate limits) |
workflow.force_reprocess | false | Ignore per-sample checkpoints and reprocess from scratch |
vlm.backend | "gemini" | "gemini" or "openai" (OpenAI-compatible endpoint) |
data.input_jsonl | required | Path to input JSONL with image_path + caption per line |
data.image_root | "" | Optional prefix for resolving relative image_path entries |
Inputs
A single JSONL file at data.input_jsonl. One JSON object per line:
| Field | Required | Description |
|---|---|---|
image_path | yes | Absolute path, or relative path resolved against data.image_root |
caption | yes | Free-text caption for the image |
image_id | no | Stable identifier; auto-derived from the filename if missing |
width, height | no | Image dimensions in pixels; default to 1920×1080 for bbox clamping if missing |
Outputs
All outputs go to results_dir/:
step_0_expression_extraction/annotations.jsonl— per-record output enriched withcleaned_captionandexpressions[](each withtext,expression_id,char_span,noun_chunk, emptyinstances[]).step_1_grounding/annotations.jsonl— same records withexpressions[].instances[]filled in (each instance hasbbox: [x1,y1,x2,y2]in pixel space,scorein[0.0, 1.0], andbbox_id).results_dir/annotations.jsonl— copy of the last step's output for convenience.step_<N>_*/.ckpt/<sample_id>.json— per-sample checkpoints used for resume.
Prerequisites
Container:
nvcr.io/nvidia/tao/tao-toolkit:7.3.0-pyt<!-- versions-key: images.tao_toolkit.pyt -->API access: At least one VLM endpoint (Gemini API key or OpenAI-compatible endpoint capable of image input)
Files
- ATTRIBUTION.mdAdded by AutoGineer954 B
- BENCHMARK.md7.1 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md7.9 KiB
- config/skillspector-baseline.yaml834 B
- evals/evals.json819 B
- references/configuration.md9.3 KiB
- references/skill_info.yaml1.1 KiB
- references/vllm_server.md6.8 KiB
- skill-card.md4.5 KiB
- skill.oms.sig5.4 KiB
references/vllm_server.md
vLLM Server Setup for Vision-Language Models
Use this reference only when the parent SKILL.md points here for the current task. If this file conflicts with current SKILL.md, skill_info.yaml, schemas, or platform/model skills, the current authoritative source wins.
Contents
Prerequisites
Install vLLM
Option A — Docker (default, recommended)
Option B —
pip(host install, advanced)
Pick a VLM checkpoint
Launch the server
Option A — Docker (default, recommended)
Option B —
pipinstall (host launch, advanced)
Verify the endpoint
Wire the server into the pipeline
Common issues
This guide walks the user through standing up a self-hosted vLLM server that exposes an OpenAI-compatible /v1/chat/completions endpoint for vision-language models (VLMs). Once the server is running, point the pipeline at it with vlm.backend: "openai" and the matching base_url / model_name / api_key values.
1. Prerequisites
NVIDIA GPU(s) with enough VRAM for the chosen VLM (≥24 GB for 7-8B-class models, ≥80 GB for 32B+ models; tensor-parallel across multiple GPUs is supported via
--tensor-parallel-size).A recent NVIDIA driver and
nvidia-container-toolkit(for the recommended Docker path).Docker (recommended). Python ≥ 3.10 is only needed for the optional host install path.
For gated HuggingFace repos: a
HF_TOKENwith access to the model.
2. Install vLLM
Default: Docker (Option A). Use it unless you have a specific reason to install on the host — Docker pins a known-good CUDA/PyTorch/vLLM combination and avoids local environment drift. The pip path (Option B) is provided for advanced users who need to patch vLLM, debug locally, or run on a system where Docker is not available.
Option A — Docker (default, recommended)
docker pull vllm/vllm-openai:latestOption B — pip (host install, advanced)
pip install --upgrade "vllm>=0.7.0"3. Pick a VLM checkpoint
vLLM supports many vision models; the pipelines just need an OpenAI-compatible chat-completions endpoint that accepts image inputs. Common picks:
| Model | HuggingFace repo | Notes |
|---|---|---|
| Qwen3-VL-8B-Instruct | Qwen/Qwen3-VL-8B-Instruct | Newer Qwen3 family |
| Qwen3-VL-235B-A22B-Instruct | Qwen/Qwen3-VL-235B-A22B-Instruct | MoE; requires serious hardware |
If the chosen repo is gated, accept its license on the HuggingFace web UI first, then make HF_TOKEN available in your session before launching.
4. Launch the server
Use the launcher that matches the install path. Both commands listen on 0.0.0.0:8000 and serve an OpenAI-compatible API at /v1. Prefer Option A (Docker) unless you installed via pip in Section 2.
Option A — Docker (default, recommended)
set -a; source /path/to/.env; set +a # omit if already exported
docker run --runtime nvidia --gpus all \
-p 8000:8000 \
-e HF_TOKEN \
-v ~/.cache/huggingface:/root/.cache/huggingface \
vllm/vllm-openai:latest \
--model Qwen/Qwen3-VL-8B-Instruct \
--served-model-name Qwen/Qwen3-VL-8B-Instruct \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9 \
--media-io-kwargs '{"video": {"num_frames": -1, "fps": -1}}'Option B — pip install (host launch, advanced)
set -a; source /path/to/.env; set +a # omit if already exported
vllm serve Qwen/Qwen3-VL-8B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--dtype bfloat16 \
--served-model-name Qwen/Qwen3-VL-8B-Instruct \
--tensor-parallel-size 1 \
--max-model-len 32768 \
--gpu-memory-utilization 0.9 \
--media-io-kwargs '{"video": {"num_frames": -1, "fps": -1}}'Key flags:
--served-model-name <NAME>— value to use later forvlm.openai.model_name. Defaults to the full HF repo path if omitted.--tensor-parallel-size <N>— number of GPUs to shard the model across.--max-model-len <N>— context window; image tokens count against this, so leave headroom for multi-image prompts.--limit-mm-per-prompt image=<N>— max images per request. Bump it if a prompt sends multiple images.--gpu-memory-utilization <0..1>— lower (e.g.0.85) if you hit OOM at load time.
The first launch downloads weights to ~/.cache/huggingface; expect several minutes for 7B+ models.
5. Verify the endpoint
Wait for the log line Uvicorn running on http://0.0.0.0:8000, then sanity-check the server.
List served models:
curl http://localhost:8000/v1/modelsSend a minimal vision request:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen3-VL-8B-Instruct",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/640px-Cat03.jpg"}},
{"type": "text", "text": "Describe this image in one sentence."}
]
}],
"max_tokens": 128
}'A non-empty choices[0].message.content in the response confirms the server is ready.
6. Wire the server into the pipeline
Once verified, collect these three values from the running server and pass them to the pipeline spec:
base_url— e.g.http://localhost:8000/v1(no/chat/completionssuffix). If vLLM runs on another host, usehttp://<host_or_ip>:8000/v1and make sure the port is reachable.model_name— must match--served-model-nameexactly.api_key— vLLM ignores it but the OpenAI SDK requires a non-null string; use"EMPTY"if no auth is configured.
YAML snippet:
vlm:
backend: "openai"
openai:
base_url: "http://localhost:8000/v1"
model_name: "Qwen3-VL-8B-Instruct"
api_key: "EMPTY"
temperature: 0.3
max_tokens: 4096
timeout: 300Common issues
| Symptom | Fix |
|---|---|
CUDA out of memory on startup | Lower --max-model-len, drop --gpu-memory-utilization (e.g. 0.85), pick a smaller model, or raise --tensor-parallel-size to spread across more GPUs |
Model architectures ['…'] are not supported | Upgrade vLLM (pip install -U vllm) or use a newer Docker tag — VLM support changes per release |
| 401 / 403 during HuggingFace download | Set HF_TOKEN in the launch env and accept the model's license on the HuggingFace web UI |
| First request hangs for minutes | The model is still warming up — wait for the Uvicorn running log line and a successful GET /v1/models |
image is too large / token overflow | Pre-resize images before sending, or raise --max-model-len |
| Empty / truncated responses | Raise vlm.openai.max_tokens in the pipeline spec; lower temperature for more deterministic output |
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 an API key
The author says: Requires docker + nvidia-container-toolkit + at least one VLM endpoint (Gemini API key or OpenAI-compatible).
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
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-generate-image-grounding · 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-generate-image-grounding.zip