图像指代表达式生成Skill tao-generate-referring-expressions

该技能用于从带有KITTI边界框标签的图像生成指代表达式(referring expressions)和接地标注(grounding annotations)。它通过一个视觉语言模型(VLM)执行四步流程:区域描述、场景标题、分组接地表达式生成及可选的双重检查验证,最终输出统一格式的annotations.jsonl,适用于自动驾驶或场景理解数据集构建。关键词:图像生成、指代表达式、KITTI标签、边界框、区域描述、场景标题、接地表达式、自动标注、VLM、视觉语言模型、数据标注。

自动驾驶感知模型 0 次安装 0 次浏览 更新于 9/6/2026
名称 tao-generate-referring-expressions
描述 “四步图像指代表达式流程:将图像与KITTI边界框标签转换为区域描述、场景标题、基于指代的表达式,并可选地通过VLM蒸馏进行验证。当用户希望从带有KITTI标签的图像生成指代表达式标注、构建区域描述、生成与边界框相关的分组短语、运行指代表达式的双重检查验证、自动标注交通/场景图像以用于指代数据集,或运行image_referring_expression流程时使用。触发词包括’referring expression’、‘region description’、‘KITTI labels’、‘spatial relationship annotation’、‘auto-label image referring expression’、‘image_referring_expression’。”
开源协议 Apache-2.0 compatibility: 需要docker + nvidia-container-toolkit + 至少一个VLM端点(Gemini API密钥或OpenAI兼容端点)。 metadata:
作者 NVIDIA Corporation
版本 “0.1.0” tags: - 图像 - 指代表达式 - kitti - 边界框 - 自动标注 - vlm allowed-tools: 读取 Bash 写入

图像指代表达式流程

独立安装? 如果此会话未由TAO技能库插件初始化,请先运行tao-setup技能(主机预检、凭据、跨技能发现)。

使用带有KITTI格式边界框标签的图像生成指代表达式和接地标注。单个VLM(Gemini或任何OpenAI兼容端点)运行四个步骤:每对象区域描述、整体图像标题、与边界框相关的分组接地表达式,以及可选的双重检查验证步骤。

目的

(图像, KITTI标签)对转换为统一的annotations.jsonl,包含丰富的、基于接地(grounded)的指代表达式。VLM充当“教师”标注器:步骤0-1看到图像;步骤2将步骤0的输出分组为带边界框列表的分组短语;步骤3(可选)重新检查这些边界框与图像,并纠正不匹配。

流程架构

步骤0: 区域表达式  ──┐
                      ├──▶  步骤2: 接地表达式  ──▶  [步骤3: 双重检查]
步骤1: 图像标题  ──────┘                                                   (可选)
  • 步骤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

指令

初始设置

当用户希望运行此流程时,请执行以下步骤:

  1. 图像:询问data.image_dir,即包含.jpg, .jpeg.png图像的目录。

  2. KITTI标签:询问data.kitti_label_dir,即每个图像对应一个.txt标签文件的目录。每个标签行必须使用KITTI格式:<type> <truncated> <occluded> <alpha> <bbox_left> <bbox_top> <bbox_right> <bbox_bottom> ...。少于8个字段的行会被静默跳过。即使仅运行步骤1也需设置此项,因为步骤0和2需要它。

  3. 从现有标注恢复:如果用户已有先前运行生成统一的annotations.jsonl,则设置data.input_annotations_jsonl为该文件,而不是从data.image_dirdata.kitti_label_dir播种。

  4. API访问:询问用户希望使用哪个VLM端点。提供以下五个选项并根据选择操作:

    1. Gemini — 设置vlm.backend: "gemini";需要GOOGLE_API_KEY(环境变量或vlm.gemini.api_key)。
    2. NIM(例如https://inference-api.nvidia.com/v1)— 设置vlm.backend: "openai";收集base_url, model_nameapi_key
    3. 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"
    4. 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"
    5. 自定义(任何其他OpenAI兼容端点)— 设置vlm.backend: "openai";收集base_url, model_name和(可选)api_key

    如果用户没有端点且不想设置,则停止并首先帮助解决API访问问题。

  5. 工作流步骤:选择以下之一:

    • 完整流程:["0", "1", "2", "3"]
    • 无标题生成:["0", "2", "3"],此时步骤2使用仅图像上下文
    • 无验证:["0", "1", "2"]
    • 自定义子集:任何支持的步骤子集
  6. 输出格式:选择以下之一:

    • jsonl:仅统一模式
    • legacy:仅字节兼容的.txt.stepN文件
    • both:同时写入两种格式,是下游工具链的默认设置

运行流程

流程在TAO工具包容器内通过auto_label CLI运行:

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

推荐的试点工作流

  1. 在5-10张图像上运行所有四个步骤。
  2. 检查step_0_region_expr/annotations.jsonl — 对象类型、颜色和区分性短语是否准确?
  3. 检查step_2_grounding_expr/annotations.jsonl — 对象分组是否合理,边界框坐标是否与描述的分组匹配?
  4. 检查step_3_double_check/annotations.jsonl — 不匹配的边界框是否被移除或收紧?是否引入了(罕见的)新错误?
  5. 如果质量不足,请切换到更强的VLM模型(例如gemini-2.5-pro或更大的Qwen3-VL端点),提高media_resolution / max_output_tokens,然后使用workflow.force_reprocess=true重新运行。
  6. 满意后扩展到完整数据集。

配置

关键配置字段(完整参考见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播种)

输入

播种流程的两种方式:

  1. 图像目录 + KITTI标签(默认)。设置data.image_dirdata.kitti_label_dir。编排器遍历图像目录,读取匹配的<stem>.txtKITTI文件,解析边界框(字段0和4-7),通过PIL读取每个图像的width/height,并将seed_annotations.jsonl写入results_dir/
  2. 预播种的注释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形状相同,但边界框被移除/更新。
  • 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.1.0-pyt <!-- versions-key: images.tao_toolkit.pyt -->
  • API访问:至少一个VLM端点(Gemini API密钥或支持图像输入的OpenAI兼容端点)
  • PIL / Pillow:在播种期间读取图像尺寸所需(TAO容器中已存在)