多模态感知驱动的 Caption 生成、自动起止打标与意图识别
更新时间:2026-07-21
概述
用于对操作视频进行多模态感知标注,包括目标检测、相机标定、人体姿态估计、3D 框提升和自然语言 Caption 生成。为下游训练数据集提供丰富的空间理解和语义描述。
- 输入:清洗后的高质量视频片段(manifest.json)
- 输出:包含 YOLO 检测框、相机参数、人体姿态、3D BBox 和自然语言 Caption 的标注文件(JSONL)
- 业务价值:自动化的多模态标注替代人工标注,为视觉-语言-动作模型提供对齐的训练数据
处理流程
Plain Text
1视频片段 → S1 场景切分 → S2 首帧提取 → S3 YOLO检测(GPU) → S4 相机标定(GPU) → S5 姿态估计(GPU) → S6 3D框提升 → S7 Caption生成(GPU) → S8 输出
算子映射
| 步骤 | 算子 | GPU | 说明 |
|---|---|---|---|
| S1 | SplitScene |
否 | 按场景切分视频为独立 clip |
| S2 | FirstFrame |
否 | 提取每个 clip 的首帧用于感知分析 |
| S3 | YOLO |
是 | YOLOv11x 目标检测,输出 2D BBox |
| S4 | CameraCalib |
是 | MoGe 单目深度估计 + 相机内参标定 |
| S5 | Pose |
是 | DWPose 全身姿态估计(关键点) |
| S6 | LiftBBox |
否 | 结合深度和标定将 2D 框提升为 3D BBox |
| S7 | Caption |
是 | QwenVL 视频理解生成操作意图描述 |
| S8 | Writeout |
否 | 字段规整,合并输出最终标注文件 |
数据流向
Plain Text
1input_file (manifest.json)
2 → S1 → tmp_dir/s1_split_scene.jsonl
3 → S2 → tmp_dir/s2_first_frame.jsonl
4 → S3 → tmp_dir/s3_yolo.jsonl
5 → S4 → tmp_dir/s4_calib.jsonl
6 → S5 → tmp_dir/s5_pose.jsonl
7 → S6 → tmp_dir/s6_lift_bbox.jsonl
8 → S7 → tmp_dir/s7_caption.jsonl
9 → S8 → output_file (labeled.jsonl)
前置条件
| 资源 | 说明 |
|---|---|
| AIHC 队列 | 需要有可用的计算队列(queue_id) |
| PFS 存储 | 用于存放中间数据和最终输出(pfs_id) |
| BOS Bucket | 用于挂载算子脚本、模型和输入数据,默认 aihc-rdw-bj/aihc-daft |
| GPU 资源 | S3/S4/S5/S7 需要 GPU(默认各 1 卡) |
| 镜像 | ccr-registry.baidubce.com/aihc/aihc-daft-gpu:0.5.2.1-cu121-py3.11-ubuntu22.04 |
| 模型 | YOLO11x、MoGe-2-ViTL、DWPose、QwenVL(BOS 挂载 /opt/aihc/model 下) |
全局参数说明
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
image |
string | 是 | ccr-registry.baidubce.com/aihc/aihc-daft-gpu:0.5.2.1-cu121-py3.11-ubuntu22.04 |
镜像地址(含 tag),不填则使用默认值 |
queue_id |
string | 是 | — | AIHC 队列 ID |
priority |
string | 否 | high |
任务优先级 |
pfs_id |
string | 是 | — | PFS 存储 ID |
pfs_source_path |
string | 否 | / |
PFS sourcePath |
pfs_mount_path |
string | 否 | /mnt/pfs |
PFS 挂载点 |
bos_source_path |
string | 否 | aihc-rdw-bj/aihc-daft |
BOS sourcePath |
bos_mount_path |
string | 否 | /opt/aihc |
BOS 挂载点 |
model_dir |
string | 否 | /opt/aihc/model |
模型根目录 |
input_file |
string | 是 | /opt/aihc/data/embodied_pipelines/input_data/p3/manifest.json |
输入文件绝对路径 |
output_file |
string | 是 | — | 最终输出文件路径(PFS 上) |
tmp_dir |
string | 是 | — | 中间数据目录(8 个 step 共用) |
no_split |
string | 否 | false |
是否跳过场景切分(true/false) |
gpu_concurrency |
int | 否 | 1 |
GPU 算子并发数 |
perception_gpu_frac |
string | 否 | 0.3 |
感知算子 GPU 显存占比 |
head_cpu |
int | 否 | 4 |
Head 节点 CPU 数 |
head_memory |
int | 否 | 8 |
Head 节点内存(GB) |
shared_memory |
int | 否 | 8 |
sharedMemory 大小(GB) |
worker_replicas |
int | 否 | 1 |
Worker 副本数 |
worker_cpu |
int | 否 | 6 |
Worker 节点 CPU 数 |
worker_memory |
int | 否 | 12 |
Worker 节点内存(GB) |
worker_gpu |
int | 否 | 1 |
Worker 节点 GPU 数(GPU 步骤使用) |
caption_prompt |
string | 否 | 请用一句话描述视频中人手正在执行的操作意图。 |
Caption 提示词 |
qwenvl_model_name |
string | 否 | Qwen2.5-VL-7B-Instruct |
QwenVL 模型名称 |
qwenvl_tensor_parallel |
int | 否 | 1 |
张量并行 GPU 数(7B=1, 32B=2, 72B=4) |
qwenvl_dtype |
string | 否 | auto |
推理精度(auto/bfloat16/float16/float32) |
qwenvl_quantization |
string | 否 | 空 | 权重量化方式(awq/awq_marlin/空=自动探测) |
qwenvl_gpu_mem |
string | 否 | 0.8 |
QwenVL GPU 显存占比 |
qwenvl_max_model_len |
int | 否 | 8192 |
QwenVL 最大模型长度 |
qwenvl_enforce_eager |
string | 否 | false |
是否强制 eager 模式 |
qwenvl_max_pixels |
int | 否 | 602112 |
QwenVL 最大像素数 |
qwenvl_fps |
string | 否 | 2.0 |
QwenVL 采样帧率 |
步骤详解
S1 场景切分(Split Scene)
将输入视频按场景边界切分为独立 clip。支持跳过(no_split=true)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
no_split |
string | false |
是否跳过切分 |
- 输入:manifest.json
- 输出:
tmp_dir/s1_split_scene.jsonl
S2 首帧提取(First Frame)
提取每个 clip 的首帧图像,供后续感知算子使用(YOLO、相机标定等基于静态帧分析)。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_format |
string | jpg |
输出图片格式 |
- 输入:
tmp_dir/s1_split_scene.jsonl - 输出:
tmp_dir/s2_first_frame.jsonl(含首帧图片路径)
S3 YOLO 目标检测(YOLO) GPU
使用 YOLOv11x 对首帧进行目标检测,输出 2D 检测框和类别信息。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
yolo_model |
string | /opt/aihc/model/yolo11x.pt |
YOLO 模型路径 |
- 输入:
tmp_dir/s2_first_frame.jsonl - 输出:
tmp_dir/s3_yolo.jsonl(含 2D BBox + 类别) - 资源需求:GPU(
baidu.com/rtx_rpbzzz6_96g_cgpu)
S5 全身姿态估计(Pose) GPU
使用 DWPose 进行全身姿态估计,输出人体/手部关键点坐标。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
dwpose_dir |
string | /opt/aihc/model/dwpose |
DWPose 模型目录 |
- 输入:
tmp_dir/s4_calib.jsonl - 输出:
tmp_dir/s5_pose.jsonl(含人体关键点坐标) - 资源需求:GPU(
baidu.com/rtx_rpbzzz6_96g_cgpu)
S6 2D→3D 框提升(Lift BBox)
结合 S4 的深度图和相机内参,将 S3 的 2D 检测框提升为 3D BBox。纯 CPU 计算。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| (无独有参数) | — | — | — |
- 输入:
tmp_dir/s5_pose.jsonl - 输出:
tmp_dir/s6_lift_bbox.jsonl(含 3D BBox)
S7 Caption 生成(QwenVL Caption) GPU
使用 QwenVL 视频理解模型对操作视频生成自然语言描述(操作意图)。支持多种模型规模和量化配置。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
caption_prompt |
string | 请用一句话描述视频中人手正在执行的操作意图。 |
提示词 |
qwenvl_model_name |
string | Qwen2.5-VL-7B-Instruct |
模型名称 |
qwenvl_tensor_parallel |
int | 1 |
张量并行数(按模型规模设定) |
qwenvl_gpu_mem |
string | 0.8 |
显存占比 |
- 输入:
tmp_dir/s6_lift_bbox.jsonl - 输出:
tmp_dir/s7_caption.jsonl(含自然语言 caption) - 资源需求:GPU(
baidu.com/rtx_rpbzzz6_96g_cgpu)
S8 字段规整输出(Writeout)
将所有中间步骤产出的标注信息(检测框、标定、姿态、3D 框、Caption)合并规整,输出最终标注文件。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| (无独有参数) | — | — | — |
- 输入:
tmp_dir/s7_caption.jsonl - 输出:
output_file(最终标注产物)
任务拓扑
Plain Text
1+-----------+ +------------+ +--------+ +-----------+ +--------+ +----------+ +---------+ +----------+
2| S1 Split | --> | S2 1stFrame| --> | S3 YOLO| --> | S4 Calib | --> | S5 Pose| --> | S6 Lift | --> |S7 Caption| --> | S8 Write |
3| (CPU) | | (CPU) | | (GPU) | | (GPU) | | (GPU) | | (CPU) | | (GPU) | | (CPU) |
4+-----------+ +------------+ +--------+ +-----------+ +--------+ +----------+ +---------+ +----------+
8 个步骤严格串行执行。S3、S4、S5、S7 需要 GPU 资源,其余为 CPU 计算。
使用建议
- 首次使用建议设置
no_split=true跳过切分快速验证 - GPU 步骤是瓶颈,可通过增加
worker_replicas和gpu_concurrency提升吞吐 perception_gpu_frac=0.3意味着感知算子(S3-S5)各占约 30% 显存,适合小模型共存场景-
QwenVL 模型选择建议:
- 7B(1 卡):速度快,适合大批量标注
- 32B(2 卡):质量与速度平衡
- 72B(4 卡):最高质量,适合小批量精标
qwenvl_quantization设为awq可减少显存占用但略降精度- 如显存不足,可降低
qwenvl_max_pixels或开启qwenvl_enforce_eager=true
评价此篇文章
