Scene Graph
场景图是对对象、属性和关系的可视化表示,可用于推理、图像搜索和机器人技术。
场景图是对视觉场景的结构化表示,其中节点表示对象,属性描述对象的特征,带标签的边则描述对象之间的关系。它将图像转化为相互关联的事实:出现了哪些对象、对象是什么样的,以及对象如何互动。在计算机视觉中,这种结构支持对场景进行推理,而不仅仅是识别单个对象。
Justin Johnson、Ranjay Krishna及其同事在2015年关于使用场景图进行图像检索的研究中提出了现代的、以图像为基础的表述方式。他们的表示包含诸如一个男人和一艘船这样的对象、船的白色属性,以及“男人站在船上”这一关系,因此搜索时可以同时指定关系和对象类别。
对象、属性和关系#
每个节点标识一个对象实例。即使两匹马的类别标签相同,同一张图像中的两匹马也会有各自独立的标识。边界框用于定位每个实例,实现定位:将符号对象与其对应的图像区域关联起来。属性将颜色或材质等特征附加到该实例上。关系通过一个谓词连接两个实例,谓词是描述它们之间联系的标签。最终形成的主语–谓语–宾语三元组表达一条关系事实。
Ranjay Krishna及其合作者开发的Visual Genome 数据集包含108,077张带有结构化视觉标注的图像。场景图是知识图谱针对特定图像的形式。场景图中的语义关系允许对象之间存在多条连接,也允许出现不连通的部分,因此图像场景图不需要有根节点。
Visual Genome Python 驱动程序的场景图示例包含“马戴着缰绳”和“窗户在门旁边”等关系。使用NetworkX可以将这些标注表示为有向图,安装命令为 pip install networkx:
import networkx as nx
graph = nx.MultiDiGraph()
graph.add_node("horse", label="horse")
graph.add_node("bridle", label="bridle")
graph.add_node("window", label="window")
graph.add_node("door", label="door")
graph.add_edge("horse", "bridle", predicate="is wearing")
graph.add_edge("window", "door", predicate="is next to")
for subject, obj, relation in graph.edges(data=True):
print(f"{subject} -> {relation['predicate']} -> {obj}")输出展示了两个可查询的关系事实,每个谓词都附加在对应的有向边上。
场景图生成的工作原理#
场景图生成(SGG)根据视觉输入预测这种表示。典型的处理流程结合了目标检测、特征提取和关系分类。对象特征描述单个区域;成对特征则描述候选交互。MotifNet 等上下文模型会利用周围对象来帮助预测关系。图神经网络也可以在相连的对象之间交换信息,生成能够编码关系上下文的嵌入。
Ultralytics YOLO YOLO26通过检测输出为此流程提供对象实例,包括边界框、类别标签和置信度分数。下游关系模型会利用这些实例预测“穿着”或“站在……上”等边。
视觉推理和机器人技术中的应用#
明确的关系有助于完成需要理解对象之间如何组合的任务:
- 视觉问答:GQA 使用基于 Visual Genome 构建的场景图来生成问题和功能性推理程序。遍历对象关系有助于进行视觉推理,包括根据对象的属性和联系识别对象。
- 机器人技术:Kimera 根据视觉惯性输入构建动态 3D 场景图。其分层表示将对象、人员、房间和建筑物联系起来,支持语义建图和分层路径规划。空间坐标和时间信息将这种表示扩展到单张图像之外。
- 图像生成:Justin Johnson、Agrim Gupta 和 Li Fei-Fei 提出的根据场景图生成图像系统会将图转换为对象布局,预测边界框和分割掩码,并根据布局生成图像。该图同时指定场景内容及其关系。
评估与关系错误#
场景图评估通常分为三项任务。谓词分类提供对象边界框和标签,并评估预测出的关系。场景图分类提供边界框,并要求模型预测对象和关系标签。场景图检测要求根据图像生成完整的图。这样的划分可以识别错误是源于定位、对象识别还是关系预测。
关系出现频率会造成数据集偏差:常见谓词主导预测,而罕见但信息丰富的关系则容易被遗漏。Recall@K衡量排名最高的 K 个预测中找回的标注关系所占比例。Mean Recall@K按谓词类别分别计算召回率,再对这些值取平均,使罕见谓词与常见谓词在类别层面具有相同权重。










