一、项目背景:为什么要研究视觉语言模型的空间推理?

近年来,视觉语言模型(Vision-Language Model, VLM)在图像理解、图文问答、多模态对话等任务中表现出了很强的能力。很多模型已经能够根据图像回答问题、描述场景、识别物体,甚至完成较复杂的视觉推理任务。

但是,一个值得进一步追问的问题是:

当视觉语言模型回答空间关系问题时,它到底是真的理解了图像中的空间结构,还是只是依赖语言模式和数据偏置进行猜测?

例如,图像中有一个手提包和一张床,文本描述为:

The handbag is right of the bed.

如果模型判断这个描述为真,我们还不能立刻认为它真正理解了“handbag 在 bed 的右边”这一空间关系。因为模型可能只是根据常见语言搭配或局部视觉线索给出了正确答案。

为了进一步诊断模型是否真正具备空间关系理解能力,我们可以构造反事实样本。例如,将空间关系反转:

The handbag is left of the bed.

或者交换主客体:

The bed is left of the handbag.

如果模型能够稳定地区分原始样本和反事实样本,说明它更可能真正理解了空间关系。如果模型在这些结构化变化下表现不稳定,就说明它的空间推理可能存在可靠性问题。

基于这个想法,我开始构建一个小型诊断基准,暂定名为:

SRG-Bench v0.1

它属于整个 SRG-CD 项目的第一阶段。SRG-CD 的全称是:

Structured Counterfactual Diagnosis with Spatial Relation Graphs

中文可以理解为:

基于显式空间关系图的结构化反事实诊断

这个项目的核心目标不是单纯提升模型准确率,而是构建一套可以分析视觉语言模型空间推理可靠性的诊断框架。


二、项目核心思想:从 caption 到空间关系图

传统的视觉语言数据样本通常是这样的形式:

{
  "image": "000000084324.jpg",
  "caption": "The handbag is right of the bed.",
  "label": false
}

这种格式虽然可以用于判断模型回答对错,但它对空间结构本身的表达还不够显式。

我希望把它进一步结构化为:

subject - relation - object

也就是:

handbag - right of - bed

再进一步构建为空间关系图(Spatial Relation Graph, SRG):

node_1: handbag
node_2: bed
edge: handbag --right_of--> bed

这样一来,原本一句自然语言描述就被转换成了一个显式的空间关系结构。这个结构有几个好处:

1. 可以明确知道句子中的主语、空间关系和宾语;
2. 可以生成结构化反事实样本;
3. 可以为后续图像级空间验证提供基础;
4. 可以对模型错误进行更细粒度归因。

因此,SRG-Bench v0.1 的第一阶段目标就是:

VSR 原始数据
↓
筛选核心空间关系样本
↓
解析 subject-relation-object
↓
构建 caption-level Spatial Relation Graph
↓
生成 relation flip / object swap / wrong SRG 反事实样本
↓
输出统一 JSONL 格式数据

当前版本先做 caption-level SRG,也就是基于文本描述构建空间关系图。后续版本会加入目标检测模型,把它升级为 bbox-level SRG,也就是结合图像中物体位置来构建空间关系图。


三、使用的数据集:VSR 空间关系判断数据

本项目第一阶段使用的是 VSR 数据集。VSR 是一个用于检测视觉语言模型空间理解能力的数据集,每条样本通常包含:

图像
文本描述
真假标签

文本描述往往包含两个物体之间的空间关系,例如:

The cup is left of the book.
The dog is under the table.
The handbag is right of the bed.

这些样本非常适合用于构建空间关系诊断基准。因为每条样本天然包含:

subject
relation
object

也就是空间关系图最基本的三元组。

在 SRG-Bench v0.1 中,我主要筛选以下空间关系:

left of
right of
above
below
under
over
inside
outside
near
far from
next to
on top of

这些关系可以进一步分为几类:

horizontal:left of, right of
vertical:above, below, under, over, on top of
containment:inside, outside
distance:near, far from, next to

这样设计后,后续不仅可以统计整体准确率,还可以分别分析模型在哪一类空间关系上更容易出错。


四、项目开发环境与工作流

为了让项目具有可复现性,我采用了比较标准的科研项目工作流:

本地电脑:编写和管理代码
GitHub:进行版本控制
AutoDL:提供远程 GPU 和 Linux 实验环境
VS Code Remote SSH:进行远程开发

整体流程可以概括为:

本地编写代码
↓
提交到 GitHub
↓
AutoDL 拉取代码
↓
配置 Python 环境
↓
运行数据处理脚本
↓
生成 SRG-Bench v0.1
↓
下载关键结果进行备份和分析

这种方式的好处是:

1. 代码有版本管理,不容易丢失;
2. 实验环境与本地电脑解耦;
3. 后续接入大模型或视觉检测模型更加方便;
4. 项目结构更接近真实科研开发流程。

在 AutoDL 上,我使用的是 RTX 4090 实例。当前阶段主要做数据处理,对 GPU 需求不高,但后续接入 GroundingDINO、OWL-ViT、Qwen-VL、InternVL 等模型时,远程 GPU 环境会非常有用。


五、项目目录结构设计

SRG-CD 第一版项目结构如下:

SRG-CD/
├── data/
│   ├── raw/
│   │   └── vsr/
│   │       └── images/
│   ├── processed/
│   └── srg_bench_v01/
│
├── scripts/
│   ├── 00_create_project.py
│   ├── 01_filter_vsr.py
│   ├── 02_parse_sro.py
│   ├── 03_generate_counterfactuals.py
│   └── 04_analyze_srg_bench.py
│
├── srg/
│   ├── __init__.py
│   ├── relations.py
│   ├── sro_parser.py
│   └── counterfactual.py
│
├── evaluation/
│   └── __init__.py
│
├── vlm/
│   └── __init__.py
│
├── results/
│   ├── tables/
│   ├── figures/
│   └── cases/
│
├── report/
├── requirements.txt
└── README.md

其中核心模块包括:

srg/relations.py

用于管理空间关系类别、关系归一化、反向关系和关系分组。

srg/sro_parser.py

用于从 caption 中解析 subject-relation-object 三元组。

srg/counterfactual.py

用于构建空间关系图,并生成 relation flip、object swap、wrong SRG 等反事实样本。

scripts/01_filter_vsr.py

用于从 VSR 数据集中筛选核心空间关系样本。

scripts/02_parse_sro.py

用于批量解析 SRO 三元组。

scripts/03_generate_counterfactuals.py

用于生成最终的 SRG-Bench v0.1 JSONL 文件。

这种目录结构把数据、脚本、核心逻辑、结果和报告分开,方便后续扩展。


六、核心模块一:空间关系定义

srg/relations.py 中,我定义了项目当前支持的空间关系:

SUPPORTED_RELATIONS = {
    "left of",
    "right of",
    "above",
    "below",
    "under",
    "over",
    "inside",
    "outside",
    "near",
    "far from",
    "next to",
    "on top of",
    "beneath",
}

同时定义了反向关系,例如:

INVERSE_RELATIONS = {
    "left of": "right of",
    "right of": "left of",
    "above": "below",
    "below": "above",
    "under": "over",
    "over": "under",
    "inside": "outside",
    "outside": "inside",
    "near": "far from",
    "far from": "near",
}

这个设计非常重要,因为后续生成反事实样本时,需要知道一个空间关系的反向关系是什么。

例如:

A left of B

其反向关系是:

A right of B

如果交换主客体,则:

A left of B

等价于:

B right of A

因此,空间关系定义模块是整个 SRG 构建和反事实生成的基础。


七、核心模块二:SRO 三元组解析

srg/sro_parser.py 中,我实现了从 caption 中解析三元组的逻辑。

例如输入:

The handbag is right of the bed.

输出:

{
  "subject": "handbag",
  "relation": "right of",
  "object": "bed"
}

这个过程主要包括:

1. 将 caption 转小写;
2. 去除多余空格和标点;
3. 在句子中匹配支持的空间关系;
4. 关系左侧作为 subject;
5. 关系右侧作为 object;
6. 清理冠词和 be 动词。

例如:

The handbag is right of the bed.

首先匹配到关系:

right of

然后左侧:

The handbag is

清理后得到:

handbag

右侧:

the bed

清理后得到:

bed

最终得到:

handbag - right of - bed

第一版采用规则解析,而不是直接使用大模型解析。这样做的好处是:

1. 可复现;
2. 速度快;
3. 依赖少;
4. 方便定位错误;
5. 适合构建第一版 benchmark。

八、核心模块三:构建空间关系图

解析出 SRO 三元组后,就可以构建 caption-level SRG。

例如:

handbag - right of - bed

对应的图结构为:

{
  "nodes": [
    {
      "id": "subject",
      "name": "handbag",
      "role": "subject"
    },
    {
      "id": "object",
      "name": "bed",
      "role": "object"
    }
  ],
  "edges": [
    {
      "source": "subject",
      "target": "object",
      "relation": "right_of",
      "evidence_type": "caption_level",
      "confidence": 1.0
    }
  ]
}

这里的 nodes 表示图中的物体节点,edges 表示物体之间的空间关系边。

当前版本中的 evidence_type 是:

caption_level

意思是这个空间关系图来自文本描述,而不是图像检测结果。

后续版本中,当接入 GroundingDINO 或 OWL-ViT 后,可以进一步构建:

bbox_level SRG

也就是基于图像中 subject 和 object 的检测框来计算空间关系。


九、核心模块四:结构化反事实生成

SRG-Bench v0.1 的关键不是简单保存原始样本,而是生成结构化反事实样本。

当前版本主要生成三类反事实:

relation_flip
object_swap
wrong_srg

1. relation_flip

关系反转。

原句:

The handbag is right of the bed.

反事实:

The handbag is left of the bed.

它保持 subject 和 object 不变,只改变 relation。

2. object_swap

主客体交换。

原句:

The handbag is right of the bed.

主客体交换后:

The bed is left of the handbag.

这种反事实非常重要,因为它可以检查模型是否理解空间关系的方向性。

3. wrong_srg

错误空间关系图。

例如原始关系是:

handbag --right_of--> bed

错误 SRG 可以构造为:

handbag --left_of--> bed

这种样本用于检测模型是否能够识别空间关系图与原始文本或图像之间的冲突。

这三类反事实共同构成了 SRG-CD 的诊断基础。


十、运行第一步:筛选 VSR 样本

在 AutoDL 环境中,首先运行:

PYTHONPATH=. python scripts/01_filter_vsr.py --use_hf --split train

运行结果为:

Raw samples: 7680
Filtered samples: 2556
Sampled samples: 1564
Saved to: data/processed/vsr_filtered.jsonl
Stats saved to: results/tables/relation_distribution.csv

这一步完成了几件事:

1. 加载 VSR train split;
2. 筛选出当前项目支持的空间关系;
3. 按 relation 和 label 做相对均衡采样;
4. 输出筛选后的 JSONL 文件;
5. 生成关系分布统计表。

输出文件包括:

data/processed/vsr_filtered.jsonl
results/tables/relation_distribution.csv

其中 vsr_filtered.jsonl 是后续 SRO 解析的输入。


十一、运行第二步:解析 SRO 三元组

接下来运行:

PYTHONPATH=. python scripts/02_parse_sro.py

输出结果为:

Input records: 1564
Parsed records: 1408
Parse errors: 156
Saved parsed records to: data/processed/vsr_sro_parsed.jsonl
Saved error records to: data/processed/vsr_sro_parse_errors.jsonl

这说明,在 1564 条筛选样本中,有 1408 条成功解析出 subject-relation-object。

解析失败的 156 条被保存到:

data/processed/vsr_sro_parse_errors.jsonl

这个文件并不是无用文件,而是后续改进规则解析器的重要依据。通过分析解析失败样本,可以继续扩展关系词、句式模板和清洗规则。


十二、运行第三步:生成 SRG-Bench v0.1

然后运行:

PYTHONPATH=. python scripts/03_generate_counterfactuals.py

输出结果为:

Input records: 1408
Output records: 1408
Skipped records: 0
Saved SRG-Bench v0.1 to: data/srg_bench_v01/srg_bench_v01.jsonl

这说明 1408 条成功解析的样本全部被转换为了 SRG-Bench v0.1 记录。

最终文件为:

data/srg_bench_v01/srg_bench_v01.jsonl

每条样本包含:

id
source
split
image
image_path
caption
label
subject
relation
object
relation_group
normalized_relation
srg
counterfactuals
quality_flags
metadata

例如一条样本中可能包含:

{
  "caption": "The handbag is right of the bed.",
  "label": false,
  "subject": "handbag",
  "relation": "right of",
  "object": "bed",
  "relation_group": "horizontal",
  "normalized_relation": "right_of"
}

同时还会包含空间关系图和反事实信息。


十三、当前版本的数据格式

SRG-Bench v0.1 的核心结构可以概括为:

{
  "id": "vsr_train_002220",
  "source": "VSR",
  "split": "train",
  "image": "000000084324.jpg",
  "image_path": "data/raw/vsr/images/000000084324.jpg",
  "caption": "The handbag is right of the bed.",
  "label": false,

  "subject": "handbag",
  "relation": "right of",
  "object": "bed",
  "relation_group": "horizontal",
  "normalized_relation": "right_of",

  "srg": {
    "nodes": [
      {
        "id": "subject",
        "name": "handbag",
        "role": "subject"
      },
      {
        "id": "object",
        "name": "bed",
        "role": "object"
      }
    ],
    "edges": [
      {
        "source": "subject",
        "target": "object",
        "relation": "right_of",
        "evidence_type": "caption_level",
        "confidence": 1.0
      }
    ]
  },

  "counterfactuals": {
    "relation_flip": {
      "caption": "The handbag is left of the bed.",
      "relation": "left of",
      "normalized_relation": "left_of",
      "expected_label": true,
      "type": "relation_flip"
    },
    "object_swap": {
      "caption": "The bed is left of the handbag.",
      "subject": "bed",
      "relation": "left of",
      "object": "handbag",
      "normalized_relation": "left_of",
      "expected_label": false,
      "type": "object_swap"
    },
    "wrong_srg": {
      "edge": ["subject", "left_of", "object"],
      "relation": "left of",
      "normalized_relation": "left_of",
      "conflict_with_caption": true
    }
  },

  "quality_flags": {
    "sro_parsed": true,
    "relation_supported": true,
    "needs_manual_check": false
  }
}

这个格式比原始 VSR 样本更适合做诊断分析,因为它不仅保留了原始文本和标签,还显式表示了空间结构和反事实结构。


十四、当前阶段生成的文件

第一阶段最终生成了以下关键文件:

data/processed/vsr_filtered.jsonl
data/processed/vsr_sro_parsed.jsonl
data/processed/vsr_sro_parse_errors.jsonl
data/srg_bench_v01/srg_bench_v01.jsonl
results/tables/relation_distribution.csv

它们的含义如下:

vsr_filtered.jsonl

从 VSR 中筛选出的目标空间关系样本。

vsr_sro_parsed.jsonl

成功解析出 subject-relation-object 的样本。

vsr_sro_parse_errors.jsonl

解析失败的样本,用于后续规则优化和人工检查。

srg_bench_v01.jsonl

最终构建出的 SRG-Bench v0.1 数据集。

relation_distribution.csv

不同空间关系的样本数量统计表。


十五、当前阶段的意义

到目前为止,项目完成了从原始 VSR 数据到 SRG-Bench v0.1 的完整转换。

这一阶段的意义在于:

1. 将普通图文判断样本转换成了显式空间关系结构;
2. 建立了可复现的数据处理流水线;
3. 构建了 subject-relation-object 三元组;
4. 构建了 caption-level Spatial Relation Graph;
5. 自动生成了三类结构化反事实样本;
6. 为后续视觉证据级诊断打下基础。

也就是说,项目已经从一个抽象想法变成了一个可以运行、可以复现、可以继续扩展的数据资产。

当前版本可以称为:

Caption-level SRG-Bench v0.1

它关注的是:如何从文本描述中提取空间结构,并用结构化反事实方式构造诊断样本。


十六、下一步:从 Caption-SRG 升级到 BBox-SRG

当前版本还没有真正利用图像内容本身。虽然每条样本包含 image 字段,但 SRG 主要来自 caption。

下一步需要引入视觉证据,将项目升级为:

BBox-level SRG

也就是:

subject / object 文本
↓
开放词汇检测模型定位图像中的 subject 和 object
↓
获得 subject_bbox 和 object_bbox
↓
计算两个 bbox 的中心点
↓
根据 dx / dy 判断图像中的空间关系
↓
构建 bbox-level Spatial Relation Graph
↓
与 caption-level SRG 进行一致性比较

这一步可以接入的模型包括:

GroundingDINO
OWL-ViT

例如,给定:

subject = handbag
object = bed

检测模型需要在图像中分别定位 handbag 和 bed,得到:

"subject_bbox": [x1, y1, x2, y2],
"object_bbox": [x1, y1, x2, y2]

然后计算中心点:

subject_center = [(x1+x2)/2, (y1+y2)/2]
object_center = [(x1+x2)/2, (y1+y2)/2]

如果:

subject_center_x > object_center_x

则可以认为 subject 在 object 的右侧。

这样就可以从图像证据中得到一个视觉空间关系,再与 caption 中的空间关系进行对比。


十七、后续研究可以怎么做?

在完成 BBox-SRG 后,项目可以继续扩展到视觉语言模型诊断阶段。

例如,对于每条样本,可以构造以下输入:

原始图像 + 原始 caption
原始图像 + relation_flip caption
原始图像 + object_swap caption
原始图像 + wrong SRG 描述

然后测试不同 VLM 的输出稳定性。

可以设计几个诊断指标:

1. 原始样本准确率;
2. relation flip 敏感性;
3. object swap 一致性;
4. SRG 冲突检测率;
5. 不同 relation_group 的错误分布;
6. caption-level SRG 与 bbox-level SRG 的一致性。

这些指标可以帮助回答:

1. 模型是否真正理解 left/right 这种方向性关系?
2. 模型是否容易混淆 above/below 这种垂直关系?
3. 模型是否能识别主客体交换后的语义变化?
4. 模型是否依赖视觉证据,而不是只看文本模式?
5. 哪类空间关系对 VLM 来说最困难?

这也是 SRG-CD 项目真正想解决的问题。


十八、总结

这次完成的是 SRG-CD 项目的第一阶段:构建 SRG-Bench v0.1。

整个流程可以概括为:

VSR 数据集
↓
筛选核心空间关系样本
↓
解析 subject-relation-object
↓
构建 caption-level SRG
↓
生成结构化反事实
↓
输出 SRG-Bench v0.1

目前得到的核心结果是:

Raw samples: 7680
Filtered samples: 2556
Sampled samples: 1564
Parsed records: 1408
Parse errors: 156
Final SRG-Bench v0.1 records: 1408

这个阶段虽然还没有直接评测大模型,但它完成了一个很关键的基础工作:把原始图文空间关系判断数据,转换成了显式、结构化、可诊断的空间关系图数据。

后续项目将继续向两个方向推进:

1. 引入 GroundingDINO / OWL-ViT,构建 bbox-level SRG;
2. 接入 Qwen-VL、InternVL 等视觉语言模型,进行结构化反事实诊断。

从研究角度看,这个项目的价值不在于简单做一个数据处理脚本,而在于尝试建立一种更清晰的诊断范式:

用显式空间关系图表示图像-文本中的空间结构,再通过结构化反事实样本分析视觉语言模型的空间推理可靠性。

这也是 SRG-CD 项目后续继续深入的核心方向。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐