VLM理解(一)——视觉文本信息的标注与数据集制作过程

先来认识一下数据集结构及其制作过程。

https://github.com/PJLab-ADG/LeapAD/issues/3
https://github.com/OpenDriveLab/DriveLM
https://github.com/opendilab/LMDrive/issues/124

以上三篇中,DriveLM对于数据集的处理是最为清晰的,所以也按照它的格式来介绍视觉驾驶模型的标注。

特点

在这里插入图片描述

首先这个数据集涵盖了感知、预测和规划的三个部分,同时通过语言来推理未来可能发生的事件(用what if这样的语句)

在这里插入图片描述
最后一个特点是从场景级到帧级的QA对,一个场景包含了很多帧。

数据集制作

nuscenes数据集和carla的有所不同,对于nuscenes,主要包含三个步骤:
在这里插入图片描述
第一步,关键帧选择,选择的标准是对车辆运动状态的变化较大的作为关键帧。这里没有明说,但我觉得这个工作应该是人来完成的。
第二步,关键对象选择,从选择的关键帧中选出关键的目标,标准是要能够影响本车的动作的。
第三步,QA对设计。对于这些关键对象,自动生成一些关于感知预测和规划的问题。其格式:

v1_0_train_nus.json
├── scene_token:{
│   ├── "scene_description": "本车沿着当前道路行驶,准备在一系列连续右转后进入主路。",
│   ├── "key_frames":{
│   │   ├── "frame_token_1":{
│   │   │   ├── "key_object_infos":{"<c1,CAM_FRONT,258.3,442.5>": {"Category": "车辆", "Status": "行驶中", "Visual_description": "白色轿车", "2d_bbox": [x_min, y_min, x_max, y_max]}, ...},
│   │   │   ├── "QA":{
│   │   │   │   ├── "perception":[
│   │   │   │   │   ├── {"Q": "当前场景中有哪些重要物体?", "A": "重要物体包括 <c1,CAM_FRONT,258.3,442.5>, <c2,CAM_FRONT,1113.3,505.0>, ...", "C": None, "con_up": None, "con_down": None, "cluster": None, "layer": None},
│   │   │   │   │   ├── {"Q": "xxx", "A": "xxx", "C": None, "con_up": None, "con_down": None, "cluster": None, "layer": None}, ...
│   │   │   │   ├── ],
│   │   │   │   ├── "prediction":[
│   │   │   │   │   ├── {"Q": "<c1,CAM_FRONT,258.3,442.5> 的未来状态是什么?", "A": "轻微向左偏移以进行操控。", "C": None, "con_up": None, "con_down": None, "cluster": None, "layer": None}, ...
│   │   │   │   ├── ],
│   │   │   │   ├── "planning":[
│   │   │   │   │   ├── {"Q": "在这种情况下,本车可以采取哪些安全行动?", "A": "轻踩刹车停车,右转,左转。", "C": None, "con_up": None, "con_down": None, "cluster": None, "layer": None}, ...
│   │   │   │   ├── ],
│   │   │   │   ├── "behavior":[
│   │   │   │   │   ├── {"Q": "预测本车的行为。", "A": "本车正在直行。本车行驶速度较慢。", "C": None, "con_up": None, "con_down": None, "cluster": None, "layer": None}
│   │   │   │   ├── ]
│   │   │   ├── },
│   │   │   ├── "image_paths":{
│   │   │   │   ├── "CAM_FRONT": "xxx",
│   │   │   │   ├── "CAM_FRONT_LEFT": "xxx",
│   │   │   │   ├── "CAM_FRONT_RIGHT": "xxx",
│   │   │   │   ├── "CAM_BACK": "xxx",
│   │   │   │   ├── "CAM_BACK_LEFT": "xxx",
│   │   │   │   ├── "CAM_BACK_RIGHT": "xxx",
│   │   │   ├── }
│   │   ├── },
│   │   ├── "frame_token_2":{
│   │   │   ├── "key_object_infos":{"<c1,CAM_BACK,612.5,490.6>": {"Category": "交通元素", "Status": "无", "Visual_description": "停车标志", "2d_bbox": [x_min, y_min, x_max, y_max]}, ...},
│   │   │   ├── "QA":{
│   │   │   │   ├── "perception":[...],
│   │   │   │   ├── "prediction":[...],
│   │   │   │   ├── "planning":[...],
│   │   │   │   ├── "behavior":[...]
│   │   │   ├── },
│   │   │   ├── "image_paths":{...}
│   │   ├── }
│   ├── }
├── }
  • scene_token与nuScenes数据集一致 scene_description是对约20秒视频片段中自车行为的总结
  • key_frames下每个关键帧通过frame_token标识(对应nuScenes的token)
  • key_object_infos映射c标签与物体信息,包含类别、状态、视觉描述和2D框
  • QA按任务分类存储问答对,每个字典包含问题(Q)、答案(A)等字段,上下文相关键值当前为None

就应该比较明显了,关键帧,关键目标到QA问答,总体标注过程就比较清晰了。提供了数据集的下载链接,包含nuscenes的图片和DriveLM的json格式的文件。

nuScenes subset imagesDriveLM-nuScenes version-1.0
Google DriveGoogle Drive
Baidu NetdiskBaidu Netdisk
HuggingFaceHuggingFace

最后是carla中的数据集格式,
在这里插入图片描述
这个就是比较自动的标注方式了,不过有个限制,那就是要用他们的carla export来采集数据,然后在去处理关键帧并且自动嵌入QA对。切换到DriveLM的carla branch中:
在这里插入图片描述
这里所涉及的py文件如上carla_vqa_generator.py和carla_vqa_generator_main.py是用来生成QA对的。然后download_pdm_lite_carla_lb2.py用来下载pdm_lite这个驾驶员。extract_keyframes.py解压关键帧,graph_utils.py是相关处理图像的工具。

构建视觉-语言模型VLM数据集是推动多模态研究和应用的关键步骤。个高质量的数据集可以显著提升模型在下游任务中的性能,如图像描述生成、视觉问答、图文检索等。以下是构建和制作VLM数据集的详细步骤和注意事项: ### 数据收集 1. **图像数据获取**:图像可以从公开数据集(如COCO、ImageNet)、社交媒体平台(如Flickr、Instagram)或特定领域的图像库中获取。为了保证模型的泛化能力,图像应涵盖多样化的场景、物体、光照条件和视角。 2. **文本数据获取**:图像对应的文本描述可以通过人工标注、众包平台(如Amazon Mechanical Turk)或自动生成(如基于已有图像描述模型)获得。文本内容应包括对象、动作、场景、属性等信息。 ### 数据标注 1. **图像描述**:为每张图像提供个或多个详细的文本描述。这些描述应涵盖图像中的主要对象、场景和动作。例如,对于张包含猫和狗的图像,描述可以是“只猫和只狗躺在沙发上”。 2. **问答对**:为视觉问答任务准备数据时,需要为每张图像生成多个问题和对应的答案。这些问题可以涉及图像中的对象、颜色、数量、位置等信息。 3. **图文匹配标签**:在构建用于图文检索任务的数据集时,需要明确标注哪些文本描述图像相关,哪些不相关。 ### 数据预处理 1. **图像预处理**:将图像统调整为固定尺寸,进行归化处理,并去除低质量或模糊的图像。可以使用图像增强技术(如旋转、裁剪、亮度调整)来增加数据多样性。 2. **文本预处理**:对文本进行清洗,去除特殊字符、停用词,并进行分词和词干化处理。对于非英语文本,可能需要使用语言特定的预处理工具。 ### 数据标注质量控制 1. **多标注致性**:为了确保标注质量,可以邀请多个标注者对同张图像进行描述或问答对生成,并计算致性指标(如Kappa系数)来评估标注质量。 2. **自动评估**:使用文本生成模型(如BLEU、ROUGE、METEOR)对生成的文本描述进行评估,确保其图像内容的致性。 ### 数据集划分发布 1. **训练集、验证集和测试集划分**:通常按照7:2:1的比例划分数据集,确保各部分的数据分布致。验证集用于模型调参,测试集用于最终性能评估。 2. **数据集发布**:将数据集打包为标准格式(如JSON、HDF5),并提供详细的文档说明数据结构、标注规范和使用示例。可以考虑在学术会议或期刊上发布数据集论文,以提高数据集的影响力。 ### 示例代码:数据集构建流程 以下是个简单的Python代码示例,展示如何组织图像和文本数据: ```python import os import json # 定义数据集路径 image_dir = "path/to/images" text_dir = "path/to/text" # 获取图像和文本文件列表 image_files = sorted([f for f in os.listdir(image_dir) if f.endswith(".jpg")]) text_files = sorted([f for f in os.listdir(text_dir) if f.endswith(".txt")]) # 确保图像和文本文件数量致 assert len(image_files) == len(text_files), "图像和文本文件数量不致" # 构建数据集字典 dataset = [] for img_file, txt_file in zip(image_files, text_files): with open(os.path.join(text_dir, txt_file), "r") as f: caption = f.read().strip() dataset.append({ "image_path": os.path.join(image_dir, img_file), "caption": caption }) # 保存为JSON文件 with open("vlm_dataset.json", "w") as f: json.dump(dataset, f, indent=4) ``` ### 数据集构建的挑战优化方向 1. **数据偏差**:由于图像和文本的获取方式可能存在偏差,导致数据集中某些类别或场景的样本过多或过少。可以通过数据增强或重新采样来缓解这问题。 2. **多语言支持**:为了构建支持多语言的VLM数据集,需要收集和标注不同语言的文本描述。可以利用机器翻译工具将已有文本翻译成其他语言,但需注意翻译的准确性和自然性。 3. **跨模态对齐**:确保图像和文本之间的语义对齐是构建高质量VLM数据集的关键。可以通过引入额外的对齐损失函数或使用预训练的跨模态匹配模型来优化数据集的对齐质量[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值