本实验旨在通过语义结构化匹配,将训练数据中的单图Caption/VQA升级为多图对比Caption和图文交错(Interleaved)数据,以提升多模态大模型对多图理解与关联推理能力。
整体流程分为以下几个阶段:
单图数据 → 结构化信息提取 → 语义相似度匹配(配对/分组) → 多图Caption/Interleaved生成 → 训练数据集构建
- 结构化语义提取:利用VLM(Qwen2.5-VL-32B-Instruct)为每张图片提取层级语义信息(类型主题、方向领域、语义细类、核心对象、核心概念等)
- 两阶段语义匹配:将语义信息分为"强特征"(类型+领域)和"弱特征"(细类+对象+概念),通过BGE嵌入+FAISS索引实现高效配对
- 多图文本生成:对配对/分组后的图片,使用VLM生成对比性描述或图文交错叙事
- 训练数据替换:将生成的多图数据替换原始单图Caption/VQA,构建新的训练集
对Baseline数据中的每张图片,使用VLM提取JSON格式的层级语义结构:
{
"层级语义信息": {
"类型主题": "历史文化",
"方向领域": "建筑与艺术",
"语义细类": "历史建筑细节展示",
"核心对象": ["建筑顶部结构", "雕塑浮雕"],
"核心概念": ["历史建筑艺术", "文化象征意义"],
"功能或角色": "展示历史建筑的顶部细节",
"可区分关键信息": ["雕塑浮雕内容", "文字铭文"],
"低价值表面信息": ["背景天空颜色", "图片色调"]
}
}代码:struct_extraction/
- 图片配对(Pair):强特征相似度 > 0.9 进行粗筛,弱特征相似度在 [0.4, 0.6] 范围内保证多样性,贪心去重确保一对一配对
- 图片分组(Group):同样的匹配逻辑,但构建3-6张图片的分组
代码:image_pairing/(配对)、interleave/gen_image_pair_struct_group_v2.py(分组)
对配好对的两张图片,使用VLM生成对比性描述,包含:
- 高层次概述(共同点)
- 各自详细描述
- 对比分析(相似性、差异性、互补性)
代码:pair_caption/
对图片组(3-6张),使用VLM生成图文交错叙事:
- 以连贯故事串联多张图片
- 在文本中自然嵌入
<Image_n>占位符 - 避免模板化表达
代码:interleave/
将生成的多图数据替换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
{
"category": "vqa",
"images": [{"id": "68f6108d-...", "path": "/.../brightness_en_4s_02042.jpg", "width": 1024, "height": 768}],
"structs": [{
"id": "68f6108d-...",
"struct": {
"层级语义信息": {
"类型主题": "历史文化",
"方向领域": "建筑与艺术",
"语义细类": "历史建筑细节展示",
"核心对象": ["建筑顶部结构", "雕塑浮雕", "建筑文字铭文"],
"核心概念": ["历史建筑艺术", "文化象征意义", "建筑细节美学"]
}
}
}]
}{
"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": {"层级语义信息": {"类型主题": "历史文化", "方向领域": "历史文化/建筑"}}}
}{
"i": 0,
"j": 270932,
"strong_sim": 0.9095,
"weak_sim": 0.5998,
"self_pair": false,
"caption": "这两张图片共同展示了不同地域和文化背景下的建筑与城市景观,体现了人类历史与建筑艺术的多样性。其中一份内容涉及一座具有古典风格的建筑,其顶部装饰有雕刻精美的浮雕和柱式结构...另一份内容则展示了一座典型的中国古镇景观,以传统中式建筑为主..."
}{
"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": "历史文化 / 建筑与艺术"}
]
}{
"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(知识提取)