关于 tao-generate-referring-expressions
tao-generate-referring-expressions 是用于从图像和 KITTI 边界框标签生成指代表达与定位标注的 TAO 技能,面向图像数据集标注工作流。它通过 VLM 执行区域描述、图像概述、分组定位表达,并可选地复核边界框。
主要功能
- 01从图像和 KITTI 标签生成标注
- 02生成对象区域描述与场景概述
- 03按对象分组生成定位表达
- 04可选复核并修正边界框
- 05输出 JSONL 或兼容旧格式
适用场景
- 01为 KITTI 格式图像数据生成定位标注
- 02从已有 annotations.jsonl 继续处理
- 03复核分组表达对应的边界框
- 04生成供下游工具使用的旧格式文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nvidia/ skills --skill tao-generate-referring-expressions安装后在 Claude Code 中输入/tao-generate-referring-expressions确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
BENCHMARK.mdskill-card.mdskill.oms.sigconfig/skillspector-baseline.yamlevals/evals.jsonreferences/configuration.mdskill_info.yamlvllm_server.md详细介绍
图像指代表达处理流程
单独安装? 如果此会话并非由 TAO skill bank 插件初始化,请先运行
tao-setup技能(主机预检、凭据、跨技能发现)。
根据带有 KITTI 格式边界框标签的图像,生成指代表达和定位标注。单个 VLM(Gemini 或任何兼容 OpenAI 的端点)会运行四个步骤:逐对象区域描述、整体图像标题、与边界框关联的分组定位表达,以及可选的二次核验步骤。
目的
将 (image, KITTI labels) 对转换为统一的 annotations.jsonl,其中包含丰富且有依据的指代表达。VLM 充当“教师”标注器:步骤 0–1 查看图像;步骤 2 将步骤 0 的输出分组为带有边界框列表的分组短语;步骤 3(可选)针对图像重新检查这些边界框并修正不匹配之处。
流程架构
Step 0: Region expression ──┐
├──▶ Step 2: Grounding expression ──▶ [Step 3: Double check]
Step 1: Image caption ──────┘ (optional)
- 步骤 0(region_expr) — VLM 为每个 KITTI 边界框生成一个简短且有区分度的短语(
bbox_2d、type、color、description)。 - 步骤 1(image_caption) — VLM 生成一个不依赖位置描述的整体场景标题。
- 步骤 2(grounding_expr) — VLM 将步骤 0 的对象分组为分组短语,并为每组返回一个边界框列表;还可选择使用步骤 1 的标题作为额外上下文。
- 步骤 3(double_check) — VLM 针对图像重新检查步骤 2 的每个边界框;移除匹配不佳的框,并收紧略有偏差的框。
步骤 0 和步骤 1 在单个线程池中并行运行(它们仅依赖种子记录)。每个步骤都会将结果写入自己的 step_<N>_*/annotations.jsonl;重新运行时会跳过已处理的图像,除非 workflow.force_reprocess: true。
说明
初始设置
当用户想运行此流水线时,请引导他们完成以下步骤:
-
图像:询问
data.image_dir,即包含.jpg、.jpeg或.png图像的目录。 -
KITTI 标签:询问
data.kitti_label_dir,即每张图像对应一个.txt标签文件的目录。每行标签必须使用 KITTI 格式:<type> <truncated> <occluded> <alpha> <bbox_left> <bbox_top> <bbox_right> <bbox_bottom> ...。少于 8 个字段的行会被静默跳过。即使只运行 Step 1,也要设置此项,因为 Step 0 和 Step 2 需要它。 -
从现有标注恢复:如果用户已有之前运行生成的统一
annotations.jsonl,请将data.input_annotations_jsonl设置为该文件,而不是从data.image_dir和data.kitti_label_dir开始。 -
API 访问权限:询问用户想使用哪个 VLM 端点。列出以下五个选项,并根据用户的选择进行操作:
- Gemini — 设置
vlm.backend: "gemini";需要GOOGLE_API_KEY(环境变量或vlm.gemini.api_key)。 - NIM(例如
https://inference-api.nvidia.com/v1)— 设置vlm.backend: "openai";收集base_url、model_name和api_key。 - TAO 推理微服务(可自托管,兼容 OpenAI)。确认服务是否已在运行:
- 正在运行 — 收集
base_url、model_name和(可选)api_key;设置vlm.backend: "openai"。 - 未在运行 — 引导用户完成
skills/applications/tao-run-inference-service技能,该技能会启动一个本地 TAO 推理微服务,并提供兼容 OpenAI 的 API。在承诺使用特定模型之前,请检查skills/applications/tao-run-inference-service/references/service.yaml中的valid_network_arch_config_basenames。服务启动后,收集base_url、model_name和(可选)api_key;设置vlm.backend: "openai"。
- 正在运行 — 收集
- vLLM(可自托管,兼容 OpenAI)。确认服务是否已在运行:
- 正在运行 — 收集
base_url、model_name和(可选)api_key;设置vlm.backend: "openai"。 - 未在运行 — 按照 references/vllm_server.md 安装并启动 vLLM 服务,然后收集
base_url、model_name和(可选)api_key;设置vlm.backend: "openai"。
- 正在运行 — 收集
- 自定义(其他任何兼容 OpenAI 的端点)— 设置
vlm.backend: "openai";收集base_url、model_name和(可选)api_key。
如果用户没有端点,也不想设置端点,请先停止并帮助解决 API 访问问题。
- Gemini — 设置
-
工作流步骤:选择以下一项:
- 完整流水线:
["0", "1", "2", "3"] - 不生成描述:
["0", "2", "3"],其中 Step 2 会回退为仅使用图像上下文 - 不进行验证:
["0", "1", "2"] - 自定义子集:选择任意受支持的步骤子集
- 完整流水线:
-
输出格式:选择以下一项:
jsonl:仅使用统一架构legacy:仅生成字节兼容的.txt.stepN文件both:生成两种格式,且为下游工具的默认选项
运行流水线
流水线通过 auto_label CLI 在 TAO Toolkit 容器中运行:
auto_label generate -e /path/to/spec.yaml \
results_dir=/results \
image_referring_expression.data.image_dir=/data/images \
image_referring_expression.data.kitti_label_dir=/data/labels \
image_referring_expression.vlm.gemini.api_key=$GOOGLE_API_KEY
生成默认规范:auto_label default_specs results_dir=/results module_name=auto_label,然后设置 autolabel_type: "image_referring_expression"。所有字段都支持在命令行中使用 Hydra 点号表示法进行覆盖。
完整的 YAML 结构、所有参数、模型和端点设置以及错误模式,请参阅 references/configuration.md。
建议的试运行流程
- 使用全部四个步骤处理 5-10 张图像。
- 检查
step_0_region_expr/annotations.jsonl——对象类型、颜色和区分性短语是否准确? - 检查
step_2_grounding_expr/annotations.jsonl——对象分组是否合理,bbox 坐标是否与所描述的分组相符? - 检查
step_3_double_check/annotations.jsonl——是否已移除或收紧不匹配的 bbox?是否引入了任何新错误(较少见)? - 如果质量不够理想,请将 VLM 切换到更强的模型(例如
gemini-2.5-pro或更大的 Qwen3-VL 端点),提高media_resolution/max_output_tokens,然后使用workflow.force_reprocess=true重新运行。 - 满意后,再扩展到完整数据集。
配置
主要配置字段(完整参考见 references/configuration.md):
| 字段 | 默认值 | 描述 |
|---|---|---|
workflow.steps | ["0","1","2","3"] | 要执行的步骤(0=region_expr,1=image_caption,2=grounding_expr,3=double_check) |
workflow.max_workers | 4 | 每个步骤的并行线程数(注意 API 速率限制) |
workflow.force_reprocess | false | 忽略各步骤缓存的输出并从头重新处理 |
workflow.output_format | "jsonl"(默认规范中设为 "both") | "jsonl"、"legacy" 或 "both" |
vlm.backend | "gemini" | "gemini" 或 "openai"(兼容 OpenAI 的端点) |
data.image_dir | 必填 | 输入图像目录(.jpg / .jpeg / .png) |
data.kitti_label_dir | 必填(恢复运行时除外) | KITTI 格式 .txt 标签文件目录 |
data.input_annotations_jsonl | "" | 可选的预置 annotations.jsonl(跳过 KITTI 数据初始化) |
输入
为流水线提供初始数据有两种方式:
- 图像目录 + KITTI 标签(默认)。设置
data.image_dir和data.kitti_label_dir。编排器会遍历图像目录,读取匹配的<stem>.txtKITTI 文件,解析 bbox(字段 0 + 4-7),通过 PIL 读取每张图像的width/height,并将seed_annotations.jsonl写入results_dir/。 - 预置的 annotations JSONL(恢复运行 / 预计算区域)。将
data.input_annotations_jsonl设为一个文件,每行包含一个{"image_id", "image_path", "width", "height", "kitti_bboxes": [...]}对象。
输出
所有输出都写入 results_dir/:
seed_annotations.jsonl——每张图像的初始记录(除非已提供input_annotations_jsonl)。step_0_region_expr/annotations.jsonl——添加regions[](每项包含bbox/bbox_2d、type、color、description)。step_1_image_caption/annotations.jsonl——添加caption(字符串)。step_2_grounding_expr/annotations.jsonl——添加expressions[](每项为{text, instances: [{bbox: [x1,y1,x2,y2]}]})。step_3_double_check/annotations.jsonl——结构与步骤 2 相同,bbox 已移除或更新。results_dir/annotations.jsonl——最近完成步骤输出的副本。- 当
workflow.output_format为"legacy"或"both"时,每个步骤还会为原始 2d-data-engine 工具写入字节兼容的step_<N>_*/labels/<stem>.txt.stepN文件。
前提条件
- 容器:
nvcr.io/nvidia/tao/tao-toolkit:7.3.0-pyt - API 访问权限:至少一个 VLM 端点(Gemini API 密钥或支持图像输入的 OpenAI 兼容端点)
- PIL / Pillow:在初始化数据时读取图像尺寸所必需(TAO 容器中已包含)