检测出物体只是第一步,真正的理解在于回答谁和谁之间发生了什么。

现在的视觉大模型已经很会"认东西":YOLO 能框出杯子、SAM 能抠出轮廓、Grounding DINO 能听懂"找那个红色的杯子"。但把两个物体放在一起问一句"谁在拿杯子",大多数模型就哑了——它知道左边是"人"、右边是"杯子",却说不出两者之间发生了什么。

这就是视觉关系检测(Visual Relationship Detection, VRD)和场景图生成(Scene Graph Generation, SGG)要解决的问题:不是识别孤立的物体,而是理解物体之间"谁对谁做了什么"。

但这个领域一直很尴尬。学术界的场景图模型,普遍在 50 来个固定谓词上训练和评测("骑在""拿着""在……后面"),关系头还得喂物体类别标签。换一个业务场景、加一个新词,就得重新标注、重新训练。2026 年 9 月,一个叫 RelateAnything 的 53M 小模型把这件事换了个做法:它不看物体类别名,只吃图像和框;谓词词汇在推理时作为字符串列表喂进去,想换就换,不用重训;单卡 GPU 20ms 一帧,能和实时检测器并跑。

核心判断:视觉关系检测长期被三件事"锁死"——没有既自由文本又经过验证的关系语料、架构依赖物体标签所以换不了词、评测指标奖励"和训练语料一致"而不是"和图片一致"。RelateAnything 的破局思路是两个"分离":把区域来源和模型分离(不看物体类别名,SAM / YOLO 谁来都行)、把谓词词汇和模型分离(文本嵌入库,换词就是换矩阵)。配套还开源了 RA-4M 数据集(47.4 万图、430 万关系、10102 个自由文本谓词)和 OV-SGG-Bench 评测基准。

本文看点

  • 视觉关系检测为什么被"锁死"了二十年
  • RelateAnything  的两个"分离"设计
  • 架构拆解:DINOv3 视觉路径 + 文本嵌入库 + 谓词门控
  • 训练的两个关键偏离:PU 监督 + 反义词排斥
  • RA-4M 数据怎么造:VLM 标注 + 几何验证门
  • 评测为什么不能只看标准 recall
  • 工程落地:怎么用、接什么检测器、边界在哪

01 视觉关系检测为什么被"锁死"了

1.1 从"认出物体"到"理解关系"

一张街景里,检测器能告诉你"这里有一个人、一辆自行车、一个停车牌"。但要回答"人正在骑车""停车牌立在自行车旁边",模型输出的就不是单个物体的位置,而是主谓宾三元组(subject–predicate–object):谁对谁做了什么。

这个能力看起来朴素,却直接决定了下游任务能不能真正"看懂画面":具身智能里机器人要知道"手在哪里抓杯子"、自动驾驶里要判断"前车是否正在变道"、视频理解里要识别"人是不是在翻越护栏"。孤立的检测框给不了这些答案。

1.2 三道锁

锁

问题

后果

锁一:没有可用的关系语料

关系标注是视觉领域最贵、最不可靠的标注;现有机器生成语料要么投影到固定类别表,要么不检查标注质量。Visual Genome  里标注员其实写了 36549 个谓词字符串,社区只留了 50 个最常见的

模型只能在几十个谓词上学,长尾关系完全没数据

锁二:架构绑死了标签空间

关系头以物体类别标签为条件,换检测器就要重训;词表被编码成一句 caption,上限约 150 个字符串,推理路径里还得挂着一个语言模型

没法在推理时加一个训练时没见过的新词

锁三:评测奖励"和语料一致"

场景图 recall 在和训练集同一个谓词词表上算;标注里没写的词,就算模型答对了也不算对

扩大词表反而被扣分,模型被迫去学"标注员会怎么写",而不是"图片里真实发生了什么"

论文里有个很扎心的发现:在标准场景图排行榜的指标上,一个不看任何像素、只统计 ground-truth 物体类别共现频率的频率表,居然能超过训练好的模型。这说明传统指标很大程度上在考"背语料",而不是"看图片"。

所以呢?RelateAnything 的出发点不是"再调一个更好的关系头",而是同时拆这三道锁——做一个不挑检测器、不限词表、且用新基准重新衡量的关系模型。下面分别看它怎么拆。

02 RelateAnything 的两个"分离"

2.1 它到底吃什么、吐什么

给定一张图像 I 和一组区域框 B = {b₁, b₂, …, b_N},模型输出带分数的三元组 (i, j, p),其中 p 是推理时以字符串列表形式提供的谓词词汇 V 里的一个词。区域从哪来?从任意检测器或分割器来——YOLO、SAM、Grounding DINO 都行,模型不挑。

视觉路径每帧跑一次,文本路径离线只跑一次,谓词门控把看外观和看几何两个分支的分数按 α 混合。

2.2 分离一:区域来源和模型分离——不看物体类别名

模型在任何阶段都不接收物体类别标签,只接收像素和框坐标。这带来两个直接好处:

•换检测器不用重训:今天用 YOLO 出框,明天换成 SAM 出 mask,模型照跑,因为它从来没"看过"类别名;

•不继承检测器的标签分布:检测器漏检、错检、把词表外的物体标成"unknown",都不会直接污染关系预测——关系是从像素和框的几何关系里学的。

这比大多数论文用的协议更难也更真实:那些论文直接喂 ground-truth 类别,等于把"这个框是人、那个框是自行车"的先验塞给模型,而部署时检测器给的标签是噪声的、词表外的、甚至缺失的。物体类别在 RelateAnything 的训练里只出现在两个损失项里(pair sampler 的相关性损失和物体-文本 grounding 项),从不进网络。

2.3 分离二:谓词词汇和模型分离——换词就是换矩阵

模型里没有谓词分类头。对每一对区域,视觉侧算出一个 pair 嵌入 z,谓词 p 的分数就是 z 与文本嵌入 e_p 的 cosine 相似度。文本侧没有任何学习到的投影——因为一旦拟合一个投影到训练词表,推理时来一个新词就没定义了。

这意味着什么?换词汇 = 替换一个矩阵。把业务里要用的关系词("正在焊接""堆放在托盘上""连接到管道"……)用文本编码器跑一遍,存成嵌入库,替换掉原来的 bank,推理代码一行不用改,模型权重一个字不用动。

对比项

传统场景图模型

RelateAnything

区域来源

绑死一个检测器,喂 ground-truth 类别

任意框/掩码,不看类别名

谓词词表

训练时固定 50 来个,加词要重训

推理时给字符串列表,换词=换嵌入矩阵

推理路径

常挂一个 VLM,~3B 参数

53M,文本离线预计算

速度

秒级

单卡 GPU 20ms/帧,可与实时检测器并跑

2.4 为什么能做到 53M、20ms

•骨干小而专:DINOv3 微调,448×448 输入,从三个深度(−6、−3、−1)读 patch 特征后融合;

•没有大模型在推理路径里:文本编码器蒸馏后冻结,嵌入库离线跑一次,推理时只查表;

•对数量裁过:N 个物体有 N(N−1) 个候选对,模型每帧只保留 128 对进入关系 Transformer;

•框查询不裁剪:per-object 特征用坐标感知的软池化(Fourier 位置编码构成 query,读整个特征图而不是 crop 框内区域),避免反复裁剪带来的额外计算。

所以呢?这两个"分离"是整个设计的灵魂:模型只学"关系长什么样",不记"叫什么关系名",也不挑"谁给的框"。这正是"Relate Anything"这个名字的含义——任意输入、任意词表。

03 架构拆解:三条路径怎么协同

RelateAnything 的架构可以拆成三条路径:视觉路径(每帧跑一次)、文本路径(离线跑一次)、谓词门控(把两者混合成最终分数)。

3.1 视觉路径:从图像到 pair 嵌入

模块

做什么

DINOv3 骨干

448×448 输入,微调后输出 dense patch 特征;从 −6、−3、−1 三个深度读取,每层 layer-norm 后用学习权重融合——浅层补纹理、中层补结构、深层补语义

框查询池化

每个框用 Fourier 位置编码构成 query,以坐标感知的软池化读整个 patch map,而不是 crop 框内区域——既保留全局上下文,又避免反复裁剪

Pair 表示

每对区域拼成五个特征:subject、object、union(并集区域)、contact(接触带)、geometry(相对位置/大小)

Pair 采样

N 个物体有 N(N−1) 个候选对,每帧只保留 128 对进入后续 Transformer

关系 Transformer

保留的 pair 之间互相 self-attention,并共同 attend 到整幅 scene——所以一对的判断能为另一对提供上下文("人骑在自行车上"能帮模型确认"人正坐在车座上")

可变形 scene 读取

从 subject / object / union / contact 四个区域采样点,大多数点留在各自区域内,少量跨区域读取交互信息

3.2 文本路径:离线一次,推理只查表

谓词词汇是任意字符串列表("following""parked on""behind""正在焊接"……)。文本编码器把每个字符串编码成一个向量 e_p,存成嵌入库。关键设计:文本侧没有任何学习到的投影层——因为一旦拟合一个投影到训练词表,推理时来一个新词就未定义了。这就是为什么换词只是"替换矩阵"。

3.3 谓词门控:外观和几何各打各的分

视觉路径对每对区域产出两个嵌入:

•z_sem(外观主导):从物体外观和交互动作判断的关系特征,适合"穿着""拿着""骑着"这类关系;

•z_spa(几何主导):从框的相对位置和接触关系判断的特征,适合"在……上面""在……左边""在……后面"这类关系。

对每个谓词 p,门控系数 α_p 仅从谓词字符串本身读出,不接受任何监督——"above"这个词天然意味着几何关系主导,"holding"天然意味着外观交互主导,模型从词意里自己读出来。最终分数是两个分支的 cosine 相似度按 α_p 混合,再加上一个 pair logit,过 sigmoid。

为什么这么设计:传统模型把所有关系混在一个头里,"在上面"靠位置、"拿着"靠动作,互相干扰。拆成外观/几何两路再按词门控,等于告诉模型——"above 你就去看框的相对位置,holding 你就去看手和物体的接触"。

所以呢?这套架构的每一个设计都服务于两个分离:不看标签(框查询只吃坐标)、不限词表(文本嵌入库无投影)、推理轻量(文本离线、pair 数量裁到 128)。理解了这三点,就理解了 RelateAnything 为什么能做到 53M、20ms。

04 训练的两个关键偏离:词表放大一万倍后会发生什么

传统场景图模型在 50 来个谓词上训练,损失函数和数据标注方式都是按这个规模设计的。一旦把谓词数量拉到 19103 个,游戏规则就变了——论文指出,必须做两个偏离标准做法的改动。

4.1 偏离一:把监督当成"正例-未标注"(PU),而不是"正例-负例"

在小词表里,一对物体被标注了"riding",那么"standing next to"通常就是错的,直接当负例惩罚没毛病。但在上万谓词的规模下,一对被标注"riding"的人自行车,它同时也"未标注地"成立"坐在上面""骑乘""在……上"等一堆同义词——标注员不可能把所有成立的谓词都写下来。

如果还用标准分类损失把未标注谓词当负例,模型会被教着压制正确答案。RelateAnything 的做法:

做法

说明

正例 = 同义词组

标注谓词的同义词组整体作为正例,而不是只有那一个字符串

负例按概率折扣

对每个"未标注谓词",估计它其实也成立的概率(从语料中多标注的对上拟合),按这个概率折扣它在 InfoNCE 里的负例权重

batch-local   InfoNCE

在一个 batch 内做对比学习,正例拉近、折扣后的负例推远

这其实是在承认一个事实:在开放词表下,"没标注"不等于"不成立"。继续用闭集分类的假设训练,模型会越训越窄。

4.2 偏离二:修正文本编码器的"反义词缺陷"

第二个问题出在文本侧。直接拿对比学习的文本编码器(CLIP 那一脉)来编码谓词,会发现一个致命问题:

对比文本编码器把above 和 below这种反义词嵌入到 cosine 相似度约0.95的位置——它们在文本空间里几乎重合。这给任何回归到这些方向的模型设了硬上界:你根本不可能从视觉上区分"在上面"和"在下面",因为文本空间里这两个词就挨在一起。

RelateAnything 的做法是蒸馏一个 student 文本编码器,在目标里加一个"反义词排斥项":

•反义词对推开:above/below、left/right、behind/in front of 这类逆对,在文本嵌入空间里要分开;

•同义词组保持:riding/riding on/astride 这类同义表达,仍然聚在一起;

•蒸馏后冻结,作为离线嵌入库的生成器。

4.3 为什么这两个偏离是"必须"而不是"可选"

问题

不做会怎样

论文的解法

未标注谓词也可能成立

模型被教着压制正确答案,输出越来越保守,只敢说最常见的几个关系

PU 监督 + 同义词组正例 + 概率折扣负例

反义词在文本空间重合

模型无法区分方向关系,above/below 得分差不多

蒸馏文本编码器 + 反义词排斥项

所以呢?词表从 50 扩到 19103,不是把训练数据多标注几遍就行——监督假设和文本空间都得跟着改。这两处改动是整个模型能在开放词表上工作的前提,比换 backbone、调 head 都关键。

05 RA-4M:47.4 万图、430 万关系的自由文本语料是怎么造的

要训一个见过 19103 个谓词的模型,得先有这么多关系的标注。人工标不现实,社区现有的自动语料又不可靠——于是作者自己造了一个,叫 RA-4M。

VLM 看着带编号的框输出三元组,几何验证门把明显矛盾的关系拦下来。

5.1 为什么不能直接让 VLM 看图说话

最直接的想法是:把图喂给一个 VLM,让它输出"谁和谁什么关系"。但这里有个大坑——VLM 会幻觉物体。它可能一本正经地描述一个图上根本不存在的杯子,或者把两个框张冠李戴。关系标注里, grounding(哪个框)错了,整条三元组就全错。

5.2 RA-4M 的造数流程

步骤

做法

为什么这么做

1. 给框编号

用现成检测器在图上出框,在每个框角上画一个编号标记(①②③…)

把"哪个框"作为 VLM 的输入,而不是让它从输出里反推——grounding 不再是它要猜的东西

2. VLM 输出三元组

VLM 看着带编号的图,直接输出"1 riding   2""3 behind 4"这种编号关系文本

输出里的数字天然对应框,不会张冠李戴

3. 确定性几何门

每条提议关系过一个几何检查:框的位置/大小明显矛盾的(比如"1 在 2 里面"但 1 的框完全在 2 外面)直接拒绝;几何判断不了的("1 拿着 2")保留但计数

用硬规则把 VLM 明显的空间错误拦下来,又不因为规则太严而丢掉外观类关系

4. 统计与训练配比

在相同图像、相同框上对比,密度是被替换语料的 1.7×,谓词词汇量是 107×

证明这套流程又密又宽

5.3 最终规模

指标

数值

图像数

47.4 万张

关系三元组数

430 万条

自由文本谓词数

10102 个

训练谓词总量

19103 个(含同义扩展)

这套造数思路对做垂直行业数据很有参考价值:把检测结果显式地"喂"给标注模型(编号框),再用确定性规则做一道硬过滤,比端到端让 VLM 自由发挥可靠得多——VLM 负责理解语义关系,几何门负责物理常识兜底。

所以呢?RelateAnything 不只是放了一个模型,它把训练模型所需的语料也一起开源了。RA-4M 是目前少见的"既自由文本、又经过几何验证"的关系语料,做垂直场景(工业巡检、仓储、医疗影像)时,可以直接复用这套"编号框 + VLM + 几何门"的流程造自己的数据。

06 评测:为什么标准场景图 recall 会"骗人"

前面提到,RelateAnything 同时开源了一个新基准 OV-SGG-Bench。作者花了相当篇幅论证:不换评测方式,前两个改进(开放词表、无标签输入)根本测不出来。

传统模型被锁在 50 个谓词的小圈里,RelateAnything 在上万谓词上自由连接。

6.1 标准 recall 的三个硬伤

硬伤

具体表现

本质是先验匹配分

词表和训练集一样,一个不看像素、只统计 ground-truth 物体类别共现频率的频率表,在排行榜指标上居然超过训练好的模型;一个模型学了"标注员会写什么对",其实是学了标注员,不是图片

两个打分惯例放大问题

matcher 不约束地把检测分配给 GT;detector 工作点不报告,却能让 recall 波动超过论文之间的差距

数据集泄漏

训练集和测试集共享谓词词表,模型见过的词表越大越吃亏,因为它用了标注里没写的词就算错

6.2 OV-SGG-Bench 怎么改

•跨数据集:六个轴全部跨数据集打分,基准集不贡献任何训练图像——测的是泛化,不是背语料;

•人审负例:两个轴对人工裁定的负例打分,自信的假阳性和漏检代价相同——防止模型靠"少说少错"刷分;

•六轴联合聚合:因为每个轴都能被单独的捷径满足(语料匹配、一律保守、塌缩到高频谓词、调 detector 工作点),六个轴一起报告,聚合方式惩罚不平衡——不许靠偏科赢。

6.3 结果一览

对比对象

结果

同规模最强开放词汇方法

三个跨数据集基准 + 一个零样本基准上,mean recall 是对方的 2.3–3.5 倍;换成真实检测器供区域,优势保持

基于 3B VLM 的场景图模型

两个指标、三个基准全部领先,参数量不到对方的 2%;只在两者都通过自由文本 matcher 打分时,micro recall 略落后

in-domain vs 跨数据集

in-domain 测量会把跨数据集的真实收益夸大约 5 倍——这解释了为什么传统论文里的"提升"到了实际场景里常常消失

最值得工程团队记住的一条:不要用"训练集同源词表"上的 recall 来判断一个开放词汇模型好不好用。那组数字测的是模型对标注习惯的熟悉程度,不是它在你业务场景里的真实表现。

所以呢?RelateAnything 三个产物——模型、RA-4M 语料、OV-SGG-Bench——是配套的:模型解锁了输入自由度,语料提供了训练燃料,新基准让解锁的效果可被测量。缺一个,另外两个的价值都打折扣。

07 工程落地:怎么接、接什么、边界在哪

7.1 典型推理 pipeline

步骤

做什么

1. 出框

用任意检测器 / 分割器在当前帧上出框:YOLO、SAM、Grounding DINO、自研检测器都行,RelateAnything  不挑

2. 预编码词表

把业务要用的关系词列表(如"holding""connected   to""left of""正在焊接")用蒸馏文本编码器离线编码,存成嵌入矩阵——这步只做一次

3. 关系推理

图像 + 框送入 RelateAnything,输出 (i, j, p,   score) 列表,i/j 是框下标、p 是谓词、score 是置信度

4. 后处理

按阈值过滤、按 score 排序、去重(同义词合并),送入下游决策或可视化

7.2 词表怎么定

•从业务问题反推,不要从通用词典里抄。你要回答什么问题,就列什么词。一个场景 20–50 个谓词通常够用;

•方向关系必须成对出现:above/below、left/right、behind/in front of——论文专门修了反义词在文本空间重合的问题,漏了一对,模型就分不清方向;

•区分两类关系:外观交互类(holding / wearing / riding / operating)和空间几何类(on / in / next to / above),前者靠 z_sem、后者靠 z_spa;

•同义词只留一个代表词:riding / astride / riding on 在训练时是同义词组,推理时选一个即可,别全塞进词表稀释分数。

7.3 适合落地的场景

场景

典型关系问题

具身智能 / 机器人

手在哪里抓工具?零件放在托盘的什么位置?机械臂和工件的接触状态?

工业巡检

管道和阀门的相对位置?仪表是否被遮挡?设备之间是否有连接?

自动驾驶

前车是否在变道?行人是否在本车行驶路径上?障碍物和车道线的关系?

视频 / 行为理解

人是不是在翻越护栏?工人是否正在操作机器?物体被搬运的方向?

零售 / 仓储

商品在货架上的位置?人与货架的交互?货物和托盘的堆叠关系?

7.4 必须看清的能力边界

•不做检测:框必须由外部检测器给。检测器漏检一个物体,它和别人的关系也会跟着漏;

•不做类别识别:模型不知道"这是人还是杯子",它只知道 A 和 B 之间有什么关系——物体叫什么,由你的检测器决定;

•每帧 128 对:物体非常多的场景(如密集货架),要控制检测框数量或分区域处理;

•速度参考是 A40:论文里的 20ms/帧是单张 A40,端侧 / 嵌入式平台需自行实测;

•细粒度动作需要垂直数据:"正在焊接"和"正在检查"这种业务级细动作,通用预训练未必够准,可以复用 RA-4M 的"编号框 + VLM + 几何门"流程造垂直数据微调;

•单帧关系,不做时序:模型输出的是当前帧的关系,跨帧跟踪、动作演化要自己加跟踪模块。

7.5 一个最小可行验证流程

  1. 用 YOLOv8 / YOLO11 或 SAM 在你的业务场景出 50 张图的框;
  1. 列 20 个业务最关心的关系词(含反义词对);
  1. 跑一次推理,人工看结果对不对;
  1. 错得多的词,检查是不是漏了反义词、是不是同义词混了;
  1. 方向对了但精度不够,再考虑用 RA-4M 流程造垂直数据微调。

写在最后

过去十年,视觉关系检测一直在"小词表、闭集、依赖标签"的小圈子里打转。RelateAnything 真正值得关注的,不是它把 recall 刷高了多少,而是它把这个领域的三个隐含假设一起掀了:物体类别不必喂、谓词词表不必固定、评测不必和训练集同源。

对工程团队来说,这个模型的意义在于——它把"理解物体之间的关系"从一个需要重新标注、重新训练的大工程,变成了一个可以接上现有检测器、换一份词表就能跑的组件。在具身智能、工业巡检、自动驾驶这些真正需要"看懂场景里谁和谁发生了什么"的方向上,这种自由度比几个点的 mAP 更值钱。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐