Skip to content

Latest commit

 

History

History
203 lines (161 loc) · 7.84 KB

File metadata and controls

203 lines (161 loc) · 7.84 KB

多图Caption与Interleaved数据构造

概述

本实验旨在通过语义结构化匹配,将训练数据中的单图Caption/VQA升级为多图对比Caption和图文交错(Interleaved)数据,以提升多模态大模型对多图理解与关联推理能力。

核心原理

整体流程分为以下几个阶段:

单图数据 → 结构化信息提取 → 语义相似度匹配(配对/分组) → 多图Caption/Interleaved生成 → 训练数据集构建

关键思路

  1. 结构化语义提取:利用VLM(Qwen2.5-VL-32B-Instruct)为每张图片提取层级语义信息(类型主题、方向领域、语义细类、核心对象、核心概念等)
  2. 两阶段语义匹配:将语义信息分为"强特征"(类型+领域)和"弱特征"(细类+对象+概念),通过BGE嵌入+FAISS索引实现高效配对
  3. 多图文本生成:对配对/分组后的图片,使用VLM生成对比性描述或图文交错叙事
  4. 训练数据替换:将生成的多图数据替换原始单图Caption/VQA,构建新的训练集

流程详解

阶段1:结构化信息提取

对Baseline数据中的每张图片,使用VLM提取JSON格式的层级语义结构:

{
  "层级语义信息": {
    "类型主题": "历史文化",
    "方向领域": "建筑与艺术",
    "语义细类": "历史建筑细节展示",
    "核心对象": ["建筑顶部结构", "雕塑浮雕"],
    "核心概念": ["历史建筑艺术", "文化象征意义"],
    "功能或角色": "展示历史建筑的顶部细节",
    "可区分关键信息": ["雕塑浮雕内容", "文字铭文"],
    "低价值表面信息": ["背景天空颜色", "图片色调"]
  }
}

代码struct_extraction/

阶段2:语义配对/分组

  • 图片配对(Pair):强特征相似度 > 0.9 进行粗筛,弱特征相似度在 [0.4, 0.6] 范围内保证多样性,贪心去重确保一对一配对
  • 图片分组(Group):同样的匹配逻辑,但构建3-6张图片的分组

代码image_pairing/(配对)、interleave/gen_image_pair_struct_group_v2.py(分组)

阶段3:多图Caption生成

对配好对的两张图片,使用VLM生成对比性描述,包含:

  • 高层次概述(共同点)
  • 各自详细描述
  • 对比分析(相似性、差异性、互补性)

代码pair_caption/

阶段4:Interleaved生成

对图片组(3-6张),使用VLM生成图文交错叙事:

  • 以连贯故事串联多张图片
  • 在文本中自然嵌入 <Image_n> 占位符
  • 避免模板化表达

代码interleave/

阶段5:训练数据集构建

将生成的多图数据替换Baseline训练集中的单图Caption/VQA数据,支持两种策略:

  • 替换全部Caption和VQA
  • 仅替换Caption,保留原始VQA不变

代码pair_only_caption/

辅助:知识密度评估

使用LLM从文本中提取事实性知识点和抽象信息,对比不同数据类型的信息密度。

代码knowledge_density/

目录结构

multi_image_caption/
├── README.md                          # 本文档
├── struct_extraction/                 # 阶段1:结构化信息提取
│   ├── test_gen_struct_v2_lang.py     # 主脚本:调用VLM提取结构化信息
│   └── test_gen_struct_prompt.py      # 提示词模板(v4-v7,中英文)
├── image_pairing/                     # 阶段2:语义配对
│   └── gen_image_pair_struct.py       # BGE嵌入 + FAISS匹配 + 贪心配对
├── pair_caption/                      # 阶段3:图片对Caption生成
│   ├── test_gen_pair_caption_v2_lang.py   # 主脚本:生成对比Caption
│   ├── test_gen_pair_caption_prompt.py    # 提示词模板
│   └── build_train_dataset_v2.py          # 构建训练数据集
├── interleave/                        # 阶段4:Interleaved生成
│   ├── gen_image_pair_struct_group_v2.py  # 图片分组(3-6张)
│   ├── test_gen_interleave_v3.py          # 主脚本:生成交错文本
│   ├── test_gen_interleave_prompt.py      # 提示词模板
│   └── build_train_dataset_v4.py          # 构建训练数据集
├── pair_only_caption/                 # 阶段5:仅替换Caption
│   ├── split.py                       # 拆分拼接数据为单条
│   ├── vqa_ori_caption.py             # 保留VQA,替换Caption
│   ├── check_split.py                 # 数据验证
│   └── build_train_dataset.py         # 构建训练数据集
├── knowledge_density/                 # 辅助:知识密度评估
│   ├── extract_knowledge_v3_llm.py    # 提取知识点
│   └── knowledge_compute.py           # 统计知识密度
└── samples/                           # 各阶段输出样例
    ├── struct_sample.json
    ├── pair_sample.json
    ├── pair_caption_sample.json
    ├── group_sample.json
    └── interleave_sample.json

输出数据样例

结构化信息样例(struct)

{
  "category": "vqa",
  "images": [{"id": "68f6108d-...", "path": "/.../brightness_en_4s_02042.jpg", "width": 1024, "height": 768}],
  "structs": [{
    "id": "68f6108d-...",
    "struct": {
      "层级语义信息": {
        "类型主题": "历史文化",
        "方向领域": "建筑与艺术",
        "语义细类": "历史建筑细节展示",
        "核心对象": ["建筑顶部结构", "雕塑浮雕", "建筑文字铭文"],
        "核心概念": ["历史建筑艺术", "文化象征意义", "建筑细节美学"]
      }
    }
  }]
}

配对样例(pairs)

{
  "i": 0,
  "j": 270932,
  "strong_sim": 0.9095,
  "weak_sim": 0.5998,
  "matched_by": "semantic_bucket",
  "self_pair": false,
  "meta_a": {"image_path": "/.../brightness_en_4s_02042.jpg", "struct": {"层级语义信息": {"类型主题": "历史文化", "方向领域": "建筑与艺术"}}},
  "meta_b": {"image_path": "/.../3ba9a454-e367-454d-b10a-46970c925cb7.jpg", "struct": {"层级语义信息": {"类型主题": "历史文化", "方向领域": "历史文化/建筑"}}}
}

图片对Caption样例(pair_caption)

{
  "i": 0,
  "j": 270932,
  "strong_sim": 0.9095,
  "weak_sim": 0.5998,
  "self_pair": false,
  "caption": "这两张图片共同展示了不同地域和文化背景下的建筑与城市景观,体现了人类历史与建筑艺术的多样性。其中一份内容涉及一座具有古典风格的建筑,其顶部装饰有雕刻精美的浮雕和柱式结构...另一份内容则展示了一座典型的中国古镇景观,以传统中式建筑为主..."
}

图片分组样例(group)

{
  "group": [0, 96206, 254289, 52211, 222894, 288876],
  "size": 6,
  "target_size": 6,
  "is_singleton": false,
  "meta": [
    {"image_path": "/.../brightness_en_4s_02042.jpg", "lang": "英文", "strong_field_text": "历史文化 / 建筑与艺术"},
    {"image_path": "/.../laion_image.jpg", "lang": "英文", "strong_field_text": "历史文化 / 建筑与艺术"}
  ]
}

Interleaved样例

{
  "group": [0, 96206, 254289, 52211, 222894, 288876],
  "size": 6,
  "is_singleton": false,
  "interleave": "在一个充满历史与文化底蕴的欧洲小镇,游客们纷至沓来,探索这片古老的土地。清晨,阳光洒满整个广场,游客们开始了一天的旅程。\n\n首先,他们来到了一座宏伟的建筑前,这座建筑的顶端是标志性的圆顶,圆顶之下是雕刻精美的三角形浮雕 <Image_1>。这座建筑是著名的万神殿...\n\n随后,游客们漫步至广场的一角,发现了一件精美的石雕长椅 <Image_2>..."
}

依赖

  • Python 3.8+
  • vllm(用于VLM推理)
  • sentence-transformers(BGE嵌入模型)
  • faiss-cpu / faiss-gpu(向量检索)
  • Qwen2.5-VL-32B-Instruct(结构提取与Caption生成)
  • Qwen2.5-32B-Instruct(知识提取)