ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

空间推理评测新基准:拼图测试揭示VLM几何理解短板

空间推理评测新基准:拼图测试揭示VLM几何理解短板 拼图测试、空间关系重建、旋转向匹配、方位推理——当这类任务被整理成一套标准基准后主流视觉语言模型VLM的很多“隐藏问题”就藏不住了。表面上模型能流畅描述图像内容能准确说出“照片里有一只猫坐在沙发上”但一旦要求它判断“这只猫是在沙发的左边还是右边”“拼图的第 3 块应该放到哪个位置”不少模型就会开始犯错。这类能力在学术上叫空间推理Spatial Reasoning也是当前多模态大模型评测里最容易被低估、却又直接影响落地效果的一环。这次要谈的是一类以拼图为核心载体、专门用于测试大模型空间推理能力的全新基准。它的核心思路并不复杂把整张图片切块、打乱、旋转或者要求模型从多个候选排列中找出正确的复原顺序。看起来只是“拼图游戏”但背后考察的是模型对物体边界、位置关系、排列顺序、旋转角度和遮挡关系的综合理解。相比常规的 VQA视觉问答和 Caption 评测这类基准更难靠“背答案”或者“套用常识”蒙混过关因为题目本身是程序化生成的每个测试样本都是新的模型很难靠记忆作答。这篇文章会系统拆解这类空间推理基准的设计逻辑。内容包括它到底测了什么能力、和传统视觉问答评测的差异、任务类型如何分类、评测指标怎么设计、如何用本地脚本构造拼图样本并对主流 VLM 做批量测评以及从这类基准的失败模式中能反推出哪些模型结构上的短板。如果你正在做多模态大模型的选型、应用开发或评测体系建设这篇文章可以直接拿来当参考框架。1. 核心能力全景先看清楚这套基准在测什么评测维度说明基准类型空间推理评测基准以拼图类任务为核心载体测试对象主流视觉语言模型VLM/ 多模态大模型任务形式拼图重组、旋转匹配、空间关系判断、排列顺序复原、局部位置推理生成方式程序化合成样本从原图自动切块并构造干扰项核心指标位置准确率、旋转匹配率、排序正确率、空间关系准确率区别于传统基准不依赖固定题库每张测试图片可动态生成新问题应用价值模型选型、能力缺陷分析、空间感知模块开发验证适合读者算法工程师、多模态应用开发者、评测体系设计者这类基准和传统评测最大的区别不在于任务难度更高而在于它把“看图说话”和“空间位置理解”彻底分开了。传统的图文评测模型回答“图片里有什么”时只需要把语义标签关联起来比如识别出“沙发”和“猫”就能答对大部分问题。但回到拼图或位置推理任务模型必须知道“猫在图中的哪一块”“这一块旋转了多少度”“把这些块按顺序排回去之后应该是什么样”。这类问题需要的是几何结构理解和坐标级推理而不是简单的语义关联。从目前业界普遍反馈的模型表现来看空间推理恰好是大量 VLM 的共同短板。原因也不难理解现有很多模型训练时更多强调跨模态语义对齐而空间坐标类监督信号不足。许多模型可以非常准确地描述一张图中的人和物但当你问它“A 物体是否在 B 物体的正上方”时回答就开始含糊——不是说错而是经常给出模棱两可、缺乏坐标依据的回答。这正是拼图基准想暴露的问题。2. 为什么选择拼图作为空间推理的测试载体拼图作为测试载体的优势很大程度来自它的可控性和可量化性。与开放式的“描述图片”任务不同拼图任务通常有一个标准答案模型答对了就是答对了答错了就是答错了评价过程几乎没有歧义。2.1 可控性拼图题目可以从一张普通图片程序化生成把图片切成 N×N 的网格随机打乱顺序让模型把它恢复把其中一块单独拿出来并随机旋转一定角度问模型它应该放在哪个位置也可以只给模型两个图块问它判断谁原本在左侧。整个过程没有人工标注成本也没有主观题带来的评分偏差。2.2 对记忆型答案的天然抵抗普通的图像问答很难避免数据泄露和记忆问题。如果训练集里反复出现“一张有三个苹果的图片问题是图中有几个苹果”模型完全可以记住这种模式。但拼图任务几乎没有这样的问题每张新测试图切块后都是一个全新组合位置排列是随机生成的旋转角度也是随机的模型不可能通过背题来得分它只能真正去理解图片的结构。2.3 细粒度的错误分析拼图任务还能提供非常细粒度的错误信号。比如一个模型在 2×2 拼图上表现不错但到 4×4 拼图上准确率快速下降这说明模型处理多物体空间关系的能力有限。再比如模型能复原没有旋转的拼图块但一旦加入旋转角度就开始崩溃这就说明模型对旋转不变性或角度估计能力存在明显短板。这些信息对做模型优化的人来说价值非常高。3. 基准任务的常见分类与设计思路一套完整的空间推理基准不会只设计一种拼图任务。更合理的做法是把空间推理拆解成多个维度然后用不同任务去分别考察。下面是比较典型的任务分类。3.1 图块重排任务这是最接近普通拼图的任务形式。原始图片被切割成 2×2、3×3 或 4×4 的网格打乱后要求模型从若干候选中选择正确的排列顺序。实际操作中模型会以图块编号列表的形式接收输入比如“第 3 块应该在左上角”。模型输出完整的重排结果评测系统通过比较模型输出的排列与原始顺序计算准确率。这个任务重点考察的是模型对局部图像之间空间连续性的感知能力。正确完成重排模型必须理解相邻图块边缘的纹理、颜色、线条是否连得上。按人类经验我们只需要扫一眼左右两块的边缘内容是否连贯就能完成匹配但很多 VLM 在这类基本能力上并不稳定。3.2 旋转匹配任务旋转匹配任务会把某个图像块旋转 0 度、90 度、180 度或 270 度然后让模型判断该图块的原始朝向。也可以反过来同时给模型两张图一张是原图另一张是旋转后的局部图让模型指出后者的旋转角度。这项任务看起来比整体拼图简单但很多模型反而更容易出错。原因是判断一张图片旋转了 90 度还是 270 度需要模型有很强的方向和位置先验能力。像人脸、文字、建筑这类有明显朝向特征的图片模型还能通过语义线索猜测但遇到纹理重复、方向性不强的图片模型就可能完全失去判断依据。旋转匹配任务设计的关键是混合使用有明确语义朝向和无明确语义朝向的图片才能有效区分“靠语义猜”和“真正识别空间朝向”两种能力。3.3 空间关系判断任务空间关系判断以问答形式出现提供一张包含多个物体的图片模型需要回答“物体 A 是否在物体 B 的左上角”“物体 C 与物体 D 哪个更靠近图像中心”“物体 E 的上方是什么”等问题。这类任务要防止模型借助语言先验作答。所以更严谨的基准会刻意把物体位置随机化——同样的物体组合不同样本中会放在图中不同的相对位置。这样才能确保模型不是根据“苹果通常在水果篮里”这类常识来推断位置而是真的在读取坐标信息。3.4 布局复原任务布局复原是上述任务的复杂组合。输入图片由几个独立物体组成模型的任务是输出每个物体所在的具体位置或者在多张候选布局图中选出与文字描述完全匹配的那一张。例如文字描述是“红色的圆形在蓝色三角形的正上方绿色方块在最右侧”模型要从 4 张布局图中选出符合要求的一张。这类任务测试的不只是单个物体的空间认知还包括多物体之间的相对坐标关系合成能力。它很适合用来检验 VLM 是否能真正把文本空间描述与图像视觉布局对应起来而不是只做简单的名词匹配。3.5 基于文字描述的拼图重建最后一种任务设计更有挑战性只给模型一段文字描述例如“图片上部是一辆白色汽车左下方是绿色树木中心偏右有一条小路右下角有一栋红顶房屋”然后让模型从多张候选拼图或布局图中选择与描述一致的那张。这已经不仅是视觉空间推理而是跨模态的空间一致性问题。模型必须把文字描述里的方位词、顺序词、物体相对位置信息在视觉空间上进行完整建模再做匹配。此类任务的得分能直观反映 VLM 在图文双向空间对齐方面的真实水平。4. 如何构建一套可重复执行的评测流程如果你想把这类空间推理测试接入自己的评测流程可以采用下面的通用方案。先明确一点下面代码只用于构建标准测试样本和评测回路具体模型接口需要根据你实际选用的服务调整。4.1 生成拼图测试样本用 Python 和 OpenCV 可以方便地把图片切块并生成标签。import cv2 import random import numpy as np def split_image_into_grid(image_path, grid_size3): 将输入图片切分为 grid_size x grid_size 的图块并返回编号。 编号规则从上到下、从左到右0 开始。 image cv2.imread(image_path) # 让图片能被网格整除否则做边缘裁剪 h, w image.shape[:2] new_h h - (h % grid_size) new_w w - (w % grid_size) image image[:new_h, :new_w] piece_h new_h // grid_size piece_w new_w // grid_size pieces [] positions [] for row in range(grid_size): for col in range(grid_size): piece image[row * piece_h:(row 1) * piece_h, col * piece_w:(col 1) * piece_w] pieces.append(piece) positions.append((row, col)) return pieces, positions def shuffle_pieces(pieces, positions, seed42): 打乱图块顺序并返回乱序编号以及正确答案。 返回shuffled_pieces, ground_truth_order ground_truth_order 中第 i 个元素表示乱序块 i 的原始位置索引。 random.seed(seed) order list(range(len(pieces))) random.shuffle(order) shuffled_pieces [pieces[i] for i in order] ground_truth [positions[i] for i in order] return shuffled_pieces, ground_truth切块完成后评测系统可以导出乱序图块图或在提示文本中引用图块编号。运行时要把图块保存成图片或合成到一张新图里再喂给被测模型。4.2 将测试样本组织为模型输入面向 VLM 的拼图输入通常有两种格式。第一种是“图编号”生成一张包含全部乱序图块的网格图并在每个图块中心标注数字提示模型按“块号-位置”输出第二种是“候选选择”给模型一张原图被切块后的某个局部同时提供多个位置候选让模型选择该局部应该放在哪个格子。第一种格式更接近生成式评测模型输出自由文本评测脚本再去解析。第二种格式接近选择题模型输出 a/b/c/d评测起来更稳定。对于大范围自动评测建议从第二种开始降低解析误差。提示模板示例 图块已经按网格顺序打乱网格位置从上到下、从左到右编号为 0,1,2,3。 请判断下面这张局部图在完整图片中最可能属于哪个网格位置。 只输出一个数字编号。4.3 结果解析与评分模型返回结果后评测脚本需要做标准答案比对。如果模型输出形态不稳定可以先做归一化再从输出中抓取数字编号。import re def parse_model_choice(model_output): 从模型输出中解析出数字编号。 这里做简化处理实际评测需要适配不同模型的输出风格。 if not model_output: return None # 去掉多余空格 text model_output.strip() # 优先查找数字 nums re.findall(r\d, text) if not nums: return None return int(nums[0]) def evaluate_accuracy(predictions, ground_truth): predictions: list[int] ground_truth: list[int] assert len(predictions) len(ground_truth) correct 0 for pred, gt in zip(predictions, ground_truth): if pred gt: correct 1 return correct / len(predictions)这种评分只适合单图块位置判断任务。如果是完整图块重排任务模型需要输出一个排列序列那就应该按“完整排列正确率”和“单块位置正确率”两个层次来计算便于观察模型到底是完全没掌握排列逻辑还是只有少数几块位置判断失误。def evaluate_full_order(pred_order, gt_order): 对完整重排序列计算两类指标。 pred_order/gt_order 均为 list[int]例如 [3,0,1,2] exact_match 1 if pred_order gt_order else 0 single_hits 0 for pred, gt in zip(pred_order, gt_order): if pred gt: single_hits 1 single_block_acc single_hits / len(gt_order) return { exact_match: exact_match, single_block_acc: single_block_acc, }5. 从评测暴露的典型失败模式看 VLM 的结构短板评测基准存在的价值不只是给模型打一个分数更重要的是刻画失败模式。从拼图基准这类任务能得到的信息往往比通用榜单分数更有分析价值。5.1 局部特征匹配能力不足当模型面对 3×3 拼图、9 个图块时一个非常常见的错误是模型能识别出每个图块中的内容类别却无法判断这些图块之间的边缘连续性。一个图块里有一条垂直的红色线条模型能准确说出“这是红色”但无法判断它应该和左边哪一个图块相接。这说明许多 VLM 处理图像时更多依赖全局语义特征局部到局部的边界特征并没有参与显式推理。这也解释了为什么拼图尺寸从 2×2 提升到 4×4 后模型准确率下降幅度往往远超人类。2×2 拼图只有 4 块边缘信息相对容易从语义中恢复但 4×4 拼图需要处理的边界对大量增加如果没有真正的坐标级特征对齐能力成绩就会快速滑坡。5.2 旋转推理依赖语言先验而非几何先验在旋转匹配任务中如果素材是带有文字标识的截图、路牌或电子产品模型通常能答对因为文字方向给了强烈语义提示。但如果换成没有明确上下方向的自然纹理比如岩石、草地、水面波纹模型表现通常会明显变差。这说明模型处理旋转问题时可能更多是在调用“文字应该是正的”“人的眼睛应该在头顶上方”这类语言先验而不是真正建立图像坐标系去完成旋转匹配。5.3 空间描述与视觉落点脱节在基于文字描述的布局复原任务里常见错误更耐人寻味模型理解文字本身没问题也知道图片中每个物体是什么但把“汽车在右边”理解成“汽车在画面中间偏右一点”而人类标注往往要求更明确的位置判定。VLM 的空间表示粒度普遍较粗缺少精确到像素或比例级别的坐标预测量。多数模型只能输出“在左边”“在上面”这类二元方位很难稳定输出“大约在 30% 水平位置”这种粒度。位置精度不足导致模型在大规模空间基准测试中经常与正确答案擦肩而过。5.4 多物体场景下的关系建模能力不足布局复原任务中涉及三个以上物体时模型需要建模的是多个相对关系组成的整体结构而不只是 A 与 B 的一对一关系。如果模型采用类似“逐个物体独立识别再套用文本模板”的简化策略物体之间的左右顺序、上下遮挡关系就容易发生矛盾。典型场景是模型已经正确识别图中有三个人但无法判断最左边的人和中右位置的人谁离镜头更近。多体相对关系建模不足是当前 VLM 在空间推理场景落地的核心卡点之一。6. 实测环境准备在本地搭一套低成本的拼图评测回路如果你想对一个公开 VLM 做空间推理测试不需要一上来就搭完整评测平台。可以先准备几个工具Python 环境、OpenCV、图片素材库、目标模型 API 或已在本地部署好的 VLM 服务。下面是一个快速启动流程。6.1 环境依赖pip install opencv-python pillow requests6.2 准备图片素材评测图片建议优先使用无版权争议、包含明确主体的图片。关键要求是图片内容不要过度依赖文本信息。要避免测试变成“读文字题”应该选择纯视觉结构明显的素材比如自然风景、几何图形组合、生活场景照片等。6.3 用 API 方式批量调用模型下面的代码用“候选匹配”格式演示批量调用流程。每次请求会把一个局部图块与 4 个位置候选一起发给模型让模型输出正确位置。实际调用参数需根据模型服务调整。import base64 import requests import time def encode_image_to_base64(image_path): with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def query_vlm_location(model_url, local_piece_path, candidate_images, prompt_template): 将局部图和候选位置图合成为模型输入。 这里只演示单张局部图的调用结构。 content [] content.append({type: text, text: prompt_template}) def image_item(img_bytes): return { type: image_url, image_url: {url: fdata:image/png;base64,{img_bytes}}, } # 局部图 content.append(image_item(encode_image_to_base64(local_piece_path))) # 候选图按编号附加 for i, candidate_path in enumerate(candidate_images): content.append({ type: text, text: f候选位置 {i}: }) content.append(image_item(encode_image_to_base64(candidate_path))) payload { model: your-model-name, messages: [ {role: user, content: content} ], temperature: 0.0 } response requests.post(model_url, jsonpayload, timeout60) result response.json() return result[choices][0][message][content]这个流程里可以观察几个关键点请求耗时与输入图片数量强相关。候选图越多token 消耗越大响应越慢。显存占用主要取决于模型服务端配置不在客户端体现。温度参数建议设为 0。空间判断题不需要随机性温度过高会让结果不稳定。6.4 批量任务的注意点对同一组测试数据跑多个模型时要注意批次请求之间的频率控制和失败重试。比较稳妥的方式是每次请求前做短延时并将结果实时写入 JSONL 文件。import json results [] for sample in test_samples: output query_vlm_location( model_urlmodel_url, local_piece_pathsample[piece_path], candidate_imagessample[candidate_paths], prompt_templateprompt_template, ) parsed parse_model_choice(output) sample[model_answer] parsed sample[gt_answer] sample[ground_truth] results.append(sample) with open(eval_results.jsonl, a, encodingutf-8) as f: f.write(json.dumps(sample, ensure_asciiFalse) \n) time.sleep(1)7. 资源占用与性能观察指南做拼图类空间推理评测资源观察的重点不在文本生成吞吐而在视觉 token 数量对整体延迟的影响。运行评测时建议用 nvidia-smi 或任务管理器观察服务端显存占用。如果是多个候选图叠加输入视觉 token 数量会成倍增长显存占用也随之上升。特别是把完整拼图网格图发给模型时图片分辨率一旦超过模型默认输入限制服务端可能需要对图片做缩放缩放后再切的“图块”边界信息可能已经被破坏从而影响推理效果。这类基准评测对显存的要求主要取决于被测模型本身而不是评测脚本。本地部署 7B~14B 量级的 VLM量化后通常消费级显卡可以运行但如果不量化加载原尺寸权重显存需求会明显上升。如果是调用云端 API则不需要考虑本地显存。更稳妥的做法是以本机实际部署配置为准进行测试记录。另一个影响性能的关键变量是拼图网格数量。2×2 只需处理 4 个位置4×4 需要处理 16 个位置模型的推理负担随网格数量指数上升。评测设计建议从 2×2 开始逐步升级不要一上来就压 4×4避免因输出过长导致解析失败率过高。8. 常见问题与排查方法问题现象可能原因排查方式解决方案模型返回文本中无法解析出数字编号提示约束不足或模型输出格式漂移打印原始输出内容强化提示约束做结果归一化必要时加 few-shot 示例候选图拼接后模型准确率骤降拼图时缩放破坏了原图边缘细节检查输入图片分辨率是否被压缩按模型支持的最大分辨率发送原图避免提前合并图块批量请求频繁超时视觉 token 过多或服务端负载过高观察单次请求耗时和返回状态码降低批量并发、增加重试、把候选匹配改为文字位置编号输入CPU 推理极慢大模型未走 GPU查看服务端日志与设备信息调整部署参数确认 CUDA/PyTorch 版本与显卡驱动匹配同一题目多次测试结果不稳定采样温度过高检查请求参数将 temperature 调为 0 并固定随机种子图片被裁剪导致拼块不完整网格切分未对齐原图宽高检查切图前是否对宽高做了取整处理先等比缩放图片到可整除尺寸再进行切块拼图类空间推理基准最容易遇到的技术坑是图片缩放。多数 VLM 在预处理阶段会把输入图片缩放到固定分辨率比如 448×448 或 336×336。原图如果是 1200×800服务端缩放后切出来的图块位置信息和细节会出问题。要让评测更公平在发送前按模型输入规范做预裁剪不要依赖服务端自动缩放。如果研究重点是空间位置敏感度尽量使用正方形图片减少长宽比失真的影响。评测前先检查模型服务文档确认支持的最大图片边长为多少。9. 评测基准设计的最佳实践9.1 先做二维任务再进入三维空间推理拼图测试通常从二维空间推理开始比三维场景、深度关系类任务更容易控制和归因。二维拼图表现差的模型不需要直接上三维空间测试因为大概率会失败。评测体系应按“图块重排 - 旋转匹配 - 空间关系判断 - 布局复原 - 三维遮挡 / 深度关系”的难度递增顺序设计。9.2 每个维度至少要有 3 种以上随机生成策略不要只依赖一种随机打乱方式。拼图基准里不同的打乱策略会影响题目难度。例如固定中心块、只旋转角块和全图随机乱序模型成绩可能差异很大。设计时应增加难度的渐进变化从完全不旋转开始再逐步加入 90 度旋转、180 度旋转和非 90 度旋转。非 90 度旋转通常是最难的因为很多 VLM 对非规则角度几乎没有方向感。9.3 把“理解能力”和“表达能力”分开评测模型时经常出现模型其实理解空间关系但表达不出来的情况尤其是小尺寸模型对位置的表达词汇有限。规避方法是在交互设计上尽量使用“选择正确的候选”而不是“描述具体位置”。选择题可以降低表达难度让模型输出固定编号评测结果更接近真实空间理解水平。9.4 每个测试样本都要记录图片来源与作者授权如果你用真实照片做拼图测试涉及人物肖像、他人摄影作品或商业图片都需要取得合法授权。另一个更稳妥的方案是用程序化生成的合成图片来搭建空间推理测试集。合成图片可以自由控制物体类别、位置、颜色和形状能按需求生成大量几乎无限多样的样本。这种方式既规避版权问题也让空间布局的 ground truth 精确可靠。推荐在基准建设初期就采用合成图为主、真实图为辅的策略。10. 这类基准对多模态大模型发展的启示空间推理基准做出来之后直接价值是能快速比较不同 VLM 谁的空间感知能力更强。但更重要的意义在于它给模型训练和架构优化指出了可改进的方向。当前很多 VLM 的视觉编码器承担了过多“语义标注”职责模型内部缺少显式的空间关系建模层。当视觉编码器输出的特征被投影到语言空间后图像变得像一串“视觉词汇”位置信息在这些词汇序列中被弱化了。如果把视觉特征简单当作文本 token 处理模型天然缺少对二维坐标布局的敏感度。拼图基准成绩想要提升比较现实的路径包括在视觉编码阶段加入更细粒度的位置编码或者引入外部空间定位模块为 VLM 增加坐标输出能力。从应用角度讲凡是涉及自动化筛选、布局校验、地图理解、工业质检、机器人拣选、自动驾驶数据标注这些场景都对空间推理有硬性需求。只靠传统 VLM 的二维分类能力可能不够需要有专门的评测基准去筛出适合任务的那款模型。拼图基准恰好提供了一个成本低、标准化程度高、可自动化批量执行的测试方案。如果你正准备给自己的多模态模型做能力摸底建议第一时间测试的不是图文聊天流畅度而是先跑一套空间推理测试。先从小尺寸的 2×2 拼图开始确认模型能正确复原再加入旋转因素观察准确率变化接着放入多个物体并加入干扰项。整个过程不需要太复杂的环境脚本化之后就能批量跑完一批模型得到稳定的横向对比数据。最有价值的第一步是构造几百张包含不同物体数量、不同空间布局的合成拼图样本挑 3 到 5 个主流 VLM 跑一轮。你很快就能发现榜单分数相近的模型在空间推理维度上的差距远比想象中大。这种差距恰恰就是挑选模型时要重点考虑的因素。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进