当前位置: 首页 > news >正文

SCOPE:语义认知驱动的前沿潜力探索与具身视觉导航实践

0. 简介

具身视觉导航的难点不在于“看见一个目标”这么简单,而在于智能体进入陌生室内环境后,只能从局部视角逐步获得信息,却要持续判断下一步应该去哪里、哪些已见物体值得记忆、哪些未见区域可能与目标有关。AAAI 2026 论文《Expand Your SCOPE: Semantic Cognition over Potential-Based Exploration for Embodied Visual Navigation》提出的 SCOPE,核心价值正是把传统导航中常被当作几何边界的 frontier,提升为一种可以被视觉语言模型理解和评分的语义线索。换句话说,SCOPE 不再把“未知区域边界”仅视为地图上还没走到的空白,而是把它看作通向后续观测、后续房间和后续目标证据的入口。SCOPE 论文页面:https://ojs.aaai.org/index.php/AAAI/article/view/38929, SCOPE 开源代码:https://github.com/mrwangyou/SCOPE

1. 问题背景

具身视觉导航通常假设智能体拥有 RGB-D 传感器、位姿估计和基本移动能力,但没有目标场景的完整先验地图。它在每个时间步接收当前观测,更新局部地图或场景记忆,再决定下一步动作。这个过程可以抽象为a t = π θ ( q , s t , K t ) a^t=\pi_\theta(q,s^t,\mathcal{K}^t)at=πθ(q,st,Kt),其中q qq是任务目标,s t s^tst是智能体当前状态,K t \mathcal{K}^tKt是到当前时刻为止积累的观察和记忆。这个公式看似简单,但真正困难之处在于K t \mathcal{K}^tKt永远是不完整的,智能体必须在不完整证据上做长程规划。

在 GOAT-Bench 这样的多模态导航基准中,目标可能是物体类别、语言描述,也可能是参考图像中的某个具体实例。类别目标只要求找到“椅子”这类对象,语言描述会要求找到“红色靠背椅”这类更精细的目标,图像目标则进一步要求匹配具体实例。这三类目标对记忆和探索的要求不同:类别导航更依赖语义共现,图像导航更依赖视觉细节,描述导航则需要同时考虑类别、属性和空间上下文。SCOPE 的论文选择在 GOAT-Bench 和 A-EQA 上验证,正是因为这两类任务能同时考察导航、语义理解、长程探索和回答可靠性。

现有零样本方法的共同思路是借助大模型和记忆结构降低训练依赖。例如 ConceptGraph 使用开放词汇感知和 3D 场景图组织物体级记忆,3D-Mem 则把已探索区域和 frontier 快照纳入统一的 VLM 决策输入。这类方法比纯几何探索更强,但仍然存在一个关键问题:它们往往更擅长描述“已经看到什么”,却不够擅长评估“还没看到的地方是否值得去”。在真实环境中,门口、走廊、拐角和房间边界并不是普通空白区域,它们决定了接下来能看到哪些新内容,也决定了路线是否会从局部房间扩展到更有价值的区域。

SCOPE 的基本判断是:frontier 本身就包含信息。一个朝向厨房门口的 frontier,和一个朝向白墙死角的 frontier,在几何上都可能是未探索边界,但在语义上显然不是同等价值。若任务是寻找杯子、微波炉或冰箱,厨房相关线索会显著提高探索优先级;若任务是寻找床头灯,则卧室门口、床、衣柜等线索会更重要。SCOPE 因此把 frontier 从“地图边界”转换成“潜在语义证据”,再把这种证据写入可更新、可衰减、可惩罚重复访问的潜力图中。

2. SCOPE 的核心思想

SCOPE 的方法可以概括为三层:第一层是 frontier-level potential estimation,即对每个前沿快照进行 VLM 评分;第二层是 potential graph,即把前沿评分扩散到空间网格中,形成随时间更新的探索记忆;第三层是 self-reconsideration,即当 VLM 想直接选择某个已见快照作为答案时,再让模型重新检查该选择是否真的满足目标。三者分别对应“看哪里值得去”“如何长期记住这种价值”“如何避免过早相信自己”。

论文中将每个 frontier 的潜力写成p i t = [ p i , s e m t , p i , e x p l o r e t , p i , g o a l t ] = f V L M ( F i t , q ) \mathbf{p}_i^t=[p_{i,\mathrm{sem}}^t,p_{i,\mathrm{explore}}^t,p_{i,\mathrm{goal}}^t]=f_{\mathrm{VLM}}(\mathcal{F}_i^t,q)pit=[pi,semt,pi,exploret,pi,goalt]=fVLM(Fit,q),也就是用 VLM 根据 frontier 图像和任务目标输出三个维度:语义丰富度、可探索性和目标相关性。随后再聚合为P i t = A g g r e g a t e ( p i t ) P_i^t=\mathrm{Aggregate}(\mathbf{p}_i^t)Pit=Aggregate(pit),用于表示该 frontier 的总体探索价值。这一设计的关键不是让 VLM 直接控制低层动作,而是让 VLM 提供结构化的语义评估,再交给图结构和导航器消化。

在代码中,这种思想并没有被写成一个庞大的端到端模型,而是被拆成多个很清楚的工程模块。src/tsdf_planner.py负责从 TSDF 体素地图中发现 frontier 并生成朝向 frontier 的图像;src/potential_estimation_gpt_goal.py负责把 frontier 图像和任务目标打包成 OpenAI API 请求;src/potential_graph.py负责解析 VLM 输出并更新空间潜力图;src/eval_utils_gpt_goatbench.pysrc/query_vlm_goatbench.py负责把快照、frontier 图像、潜力分数和自我重审一起放进决策链路。

从图2可以看出,SCOPE 并不是要替代导航系统中的所有模块。底层地图仍然依赖 TSDF 和 frontier 检测,物体记忆仍然依赖检测、分割、CLIP 特征和快照聚类,VLM 仍然承担语义推理任务。SCOPE 的贡献在于把这些模块之间的信息流重新组织:frontier 不再只是候选导航点,而是先被转化为可解释的潜力信号;潜力信号不再只是一次性分数,而是被写入时空图中;快照选择也不再一旦产生就直接执行,而会经过目标一致性检查。

3. 从代码看 frontier 是如何产生的

SCOPE 的 frontier 仍然从几何地图中来。本地代码中,src/tsdf_planner.py定义了Frontier数据结构,它保存了frontier 在体素网格中的位置、方向、区域掩码、图像路径和用于 VLM 输入的图像特征。这里的feature名字容易误解,它不是深度学习 embedding,而是在更新 frontier 时裁剪、缩放后的 RGB 图像数组,后续会被编码成 base64 并发送给 VLM。这个设计很朴素,但非常重要,因为 SCOPE 的潜力估计必须直接看到 frontier 对应的视觉证据。

# 摘录自 SCOPE/src/tsdf_planner.py@dataclassclassFrontier:"""Frontier class for frontier-based exploration."""position:np.ndarray orientation:np.ndarray region:np.ndarray frontier_id:intimage:str=Nonetarget_detected:bool=Falsefeature:torch.Tensor=None

frontier 检测的具体流程可以分为几步:先根据当前 TSDF探索体素计算未探索区域,再用邻域卷积找出处在可通行岛屿和未探索空间交界处的候选点,随后用 DBSCAN 聚类 frontier 区域,并根据角度范围、区域面积和历史 frontier 的 IoU 关系做过滤与合并。这样得到的 frontier 不是单个像素点,而是一个面向未知区域的边界簇。代码随后会让智能体“转头看向”该 frontier,保存对应观察图像,并把缩放后的图像写入frontier.feature

# 摘录自 SCOPE/src/tsdf_planner.pyprocessed_rgb=resize_image(frontier_obs,prompt_img_size[0],prompt_img_size[1])frontier.image=f"{cnt_step}_{i}.png"frontier.feature=processed_rgb

这段代码说明了 SCOPE 与传统 frontier exploration 的差异。传统方法通常只关心 frontier 的位置、面积和可达性,最多根据距离或信息增益排序;SCOPE 则认为每个 frontier 的“朝向图像”本身就是决策证据。假设两个 frontier 距离相近,一个图像中能看到门框、走廊和家具边缘,另一个图像只有近距离墙面,那么即使两者在几何上都连接未知区域,它们对后续探索的意义也不同。SCOPE 将这种差异交给 VLM 识别,再把识别结果沉淀到 potential graph 中。

4. 前沿级潜力估计:让 VLM 对未知入口做结构化判断

src/potential_estimation_gpt_goal.py是 SCOPE 最直接体现论文思想的文件。它将 frontier 图像、问题文本和可选目标图像组织成多模态消息,要求模型严格输出四项字段:SEMANTIC_RICHNESSEXPLORABILITYGOAL_RELEVANCEPOTENTIAL_SCORE。这种格式化输出让后续代码可以稳定解析模型回答,而不是只得到一段自然语言理由。也就是说,VLM 在这里不是单纯聊天,而是被当作一个带解释的语义评分器。

# 摘录自 SCOPE/src/potential_estimation_gpt_goal.py"**SEMANTIC_RICHNESS:** [Low/Medium/High]\n""**EXPLORABILITY:** [Low/Medium/High]\n""**GOAL_RELEVANCE:** [Low/Medium/High]\n""**POTENTIAL_SCORE:** [X.X] (where X.X is a number from 1.0 to 5.0)\n""**EXPLANATION:** [Your reasoning in 2-3 sentences]\n\n"

这四项指标各自解决不同问题。语义丰富度关注图像中是否有足够多的物体、结构和场景线索;可探索性关注它是否通往新房间、门、走廊或楼梯;目标相关性关注这些线索与任务目标之间是否存在合理联系;总体潜力分数则把前三者合成一个 1 到 5 的可比较数值。对导航系统来说,这比直接问“下一步去哪”更稳健,因为它把开放式推理拆成可解析的中间变量,让后续规划器仍保留控制权。

本地实现中调用的模型是gpt-4o-2024-11-20,参数与论文附录列出的设置一致,包括max_tokens=4096top_p=0.95frequency_penalty=0presence_penalty=0。代码还对 RateLimit、连接错误、超时和 BadRequest 做了分支处理,并在潜力估计失败时返回None,由潜力图模块使用默认中性分数兜底。这一点在工程复现中很关键,因为导航评估会反复调用 VLM,任何一次 API 抖动都不应该让整个 episode 直接崩溃。

# 摘录自 SCOPE/src/potential_estimation_gpt_goal.pycompletion=client.chat.completions.create(model="gpt-4o-2024-11-20",messages=message_text,temperature=0.7,max_tokens=4096,top_p=0.95,frequency_penalty=0,presence_penalty=0,)returncompletion.choices[0].message.content

需要注意的是,论文中的潜力估计看起来像一个干净的数学模块,但工程实现里还包含许多“让系统真的跑起来”的细节。例如任务可能是图像目标,因此format_content()会读取目标图像并一并发送;frontier 图像来自 numpy 数组,需要转成 PNG 再 base64 编码;如果目标图像不存在,prompt 中会显式写入Goal image: Not provided。这些处理保证了同一套接口可以兼容类别、描述和图像目标,而不是为每种任务写一套完全不同的 VLM 调用。

5. 潜力图:把一次性 VLM 分数转化为可更新的空间记忆

如果只对每个 frontier 打一次分,然后把分数塞给决策模型,系统仍然容易短视。原因是 frontier 会随智能体移动而变化,同一个区域可能在多个时间步从不同角度被观察到,局部高分也应该影响附近空间的探索价值。SCOPE 因此设计了 potential graph,把环境离散成二维网格,每个节点保存潜力分数、访问次数、更新时间、frontier 影响次数、语义丰富度、可探索性和目标相关性。它不是对象图,也不是拓扑图,而是一个覆盖可导航区域的探索价值场。

# 摘录自 SCOPE/src/potential_graph.py@dataclassclassPotentialNode:position:np.ndarray voxel_position:np.ndarray potential_score:float=0.0visit_count:int=0last_updated:int=0frontier_count:int=0exploration_value:float=0.0semantic_richness:float=0.0explorability:float=0.0goal_relevance:float=0.0

论文里的空间传播公式是P m , n t ← ( 1 − α m , n t ) P m , n t − 1 + α m , n t P i P_{m,n}^t \leftarrow (1-\alpha_{m,n}^t)P_{m,n}^{t-1}+\alpha_{m,n}^tP_iPm,nt(1αm,nt)Pm,nt1+αm,ntPi,其中α m , n t = max ⁡ ( 0 , 1 − ∥ p m , n − p F i ∥ / R ) \alpha_{m,n}^t=\max(0,1-\|\mathbf{p}_{m,n}-\mathbf{p}_{\mathcal{F}_i}\|/R)αm,nt=max(0,1pm,npFi∥/R)。这表示离 frontier 越近的网格受影响越大,超出半径R RR后不再传播。代码中的update_from_frontier()基本遵循这一思想:先把 frontier 体素坐标转换到世界坐标,再遍历潜力图节点,根据距离计算线性衰减权重,最后调用_update_node_scores()更新分数。

# 摘录自 SCOPE/src/potential_graph.pydistance=np.linalg.norm(node.position-frontier_pos_2d)ifdistance<=self.influence_radius:weight=max(0,1.0-distance/self.influence_radius)self._update_node_scores(node,potential_scores,weight)

_update_node_scores()中,代码先对旧分数做时间衰减,再根据该节点被 frontier 影响的次数调整学习率。第一次更新直接使用较大权重,前几次更新保持较高学习率,后续更新变得保守。这种处理比论文公式更工程化,因为真实运行中 VLM 分数存在噪声,frontier 视角也会变化,系统既不能完全相信某一次观察,也不能让很久之前的判断永久占据主导。

# 摘录自 SCOPE/src/potential_graph.pysteps_since_update=self.current_step-node.last_updatedifsteps_since_update>0:decay=self.decay_factor**steps_since_update node.potential_score*=decay node.semantic_richness*=decay node.explorability*=decay node.goal_relevance*=decayifnode.frontier_count==0:alpha=weightelifnode.frontier_count<3:alpha=weight*0.7else:alpha=weight*0.5

最终用于选择探索方向的不是裸潜力分数,而是带访问惩罚的exploration_value。论文中写作E m , n = ( ω p o t P m , n + ω s e m p m , n s e m + ω e x p l o r e p m , n e x p l o r e + ω g o a l p m , n g o a l ) ⋅ 1 1 + γ n m , n E_{m,n}=(\omega_{\mathrm{pot}}P_{m,n}+\omega_{\mathrm{sem}}p_{m,n}^{\mathrm{sem}}+\omega_{\mathrm{explore}}p_{m,n}^{\mathrm{explore}}+\omega_{\mathrm{goal}}p_{m,n}^{\mathrm{goal}})\cdot\frac{1}{1+\gamma n_{m,n}}Em,n=(ωpotPm,n+ωsempm,nsem+ωexplorepm,nexplore+ωgoalpm,ngoal)1+γnm,n1。本地实现中采用了更简化的加权项,重点权衡总体潜力、可探索性和目标相关性,并用访问次数降低重复区域的价值。这样做的实际效果是:高潜力区域会被优先探索,但一旦智能体已经去过附近位置,它的吸引力会下降,从而减少在同一房间内反复徘徊。

# 摘录自 SCOPE/src/potential_graph.pybase_exploration=(node.potential_score*0.5+node.explorability*0.3+node.goal_relevance*0.2)visit_penalty=max(0.1,1.0/(1+node.visit_count*0.5))node.exploration_value=base_exploration*visit_penalty

潜力图的另一个工程价值是可视化。PotentialGraph.visualize()会同时保存潜力分数、探索价值、访问次数和平滑潜力图四个子图,run_goatbench_evaluation.py会在每一步将其写入potential_graph目录。这使得研究者不仅能看最终成功率,还能回放智能体为什么偏向某个方向、是否被某个错误高分 frontier 误导、访问惩罚是否生效。对于具身导航这种长程闭环系统,可解释日志往往比单一指标更能暴露问题。

6. 把潜力图接回 VLM 决策:不是替代大模型,而是约束大模型

SCOPE 并没有让 potential graph 直接输出低层动作,而是把每个 frontier 的潜力分数加入 VLM 决策上下文。src/query_vlm_goatbench.py在准备step_dict时,会遍历当前tsdf_planner.frontiers,使用potential_graph.get_potential_at_position()读取相应位置的潜力分数,并写入frontier_potential_scores。随后src/eval_utils_gpt_goatbench.py在构造探索 prompt 时,会把分数附在每个 frontier 图像标题上,例如Frontier 0 (Potential Score: 4.20)

# 摘录自 SCOPE/src/query_vlm_goatbench.pyfrontier_world_pos=potential_graph._voxel_to_world(frontier.position)potential_position=np.array([frontier_world_pos[0],frontier_world_pos[2]])potential_score=potential_graph.get_potential_at_position(potential_position)step_dict["frontier_potential_scores"].append(potential_score)
# 摘录自 SCOPE/src/eval_utils_gpt_goatbench.pyiffrontier_potential_scoresandi<len(frontier_potential_scores):potential_score=frontier_potential_scores[i]content.append((f"Frontier{i}(Potential Score:{potential_score:.2f}) ",frontier_imgs[i]))else:content.append((f"Frontier{i}",frontier_imgs[i]))

这个设计体现了一种务实的大模型用法。VLM 擅长从图像和语言中做语义推理,但并不天然擅长维护长期空间状态;传统规划器擅长处理坐标、可达性和路径,但不懂目标语义。SCOPE 把两者拆开:VLM 给 frontier 语义潜力,potential graph 负责空间传播和历史记忆,最终 VLM 再在带潜力提示的候选集合中做高层选择。这比把所有图像一次性塞给模型并期待它自行完成长期记忆更可控。

在主循环中,这一链路的插入点非常清楚。run_goatbench_evaluation.py先更新场景对象和快照,再更新 frontier map;如果 frontier 有图像且启用潜力估计,就调用get_potential_estimation()获取文本分数,随后调用potential_graph.update_from_frontier()写入图结构;当需要重新选择导航目标时,再调用query_vlm_for_response(),并把potential_graph作为参数传进去。这个顺序保证了 VLM 做选择时看到的是已经被潜力图加工过的 frontier 分数。

…详情请参照古月居

http://www.jsqmd.com/news/935791/

相关文章:

  • 集团首都公报:武汉市放飞炬人产业引导基金有限责任公司财政处批准 创设 集体组织债 资本市场种品 将来为农村集体经济组织和乡镇经济管理提供资本来源和货币供应。
  • ComfyUI-VideoHelperSuite视频处理模块防御性编程实践与零除错误修复
  • Python 从不起眼到AI时代的王者之路
  • 【Web安全】-10-网站关键信息收集:目录扫描的概念,工具目录扫描(内含御剑,FindSomething安装链接),网站服务器收集,操作系统判断
  • 中老年人能用的免费证件照制作入口推荐?2026爸妈也能自己操作的证件照工具 - 科技大爆炸
  • Claude Code + PowerShell 命令大全:从入门到精通
  • 基于Tinkercad仿真的Arduino避障机器人:从虚拟到实物的嵌入式开发实践
  • 基于Arduino Nano RP2040的DIY可编程USB游戏手柄全流程开发指南
  • 计算机软件转 IC 验证(Design Verification, DV),学习路径
  • 从零打造垂直XY绘图机器人:Arduino步进电机控制与Makelangelo软件实战
  • 惠州黄金奢侈品回收综合实力排行榜2026中检认证正规门店梯队推荐(惠奢汇惠城旗舰店领衔) - 生活测评小能手
  • 大量频繁数据更新表格不卡顿的核心原因(通用原理 + 对应上套代码的设计)
  • 别再手动查漏洞了!用OWASP DependencyCheck给你的Maven项目做个自动化体检(附Jenkins流水线配置)
  • 基于Arduino与超声波传感器的智能扫地机器人V2.0设计与实现
  • DPDK 程序为什么越优化越慢?——深入理解数据面的“伪优化陷阱”
  • 参数化CAD设计实战:从创意草图到三维装配的完整流程解析
  • 抖音高清下载终极指南:免费获取无水印视频、音乐和封面
  • 【CGLIB】在你熟悉的 Flink、ShardingSphere-JDBC 等组件中,是否存在 CGLIB 的使用痕迹?如何排查?
  • Arduino超声波测距系统:从传感器原理到社交距离监测器实战
  • 办公用的免费证件照制作入口有什么?2026职场人必备免费入口 - 科技大爆炸
  • 2026重庆GEO优化公司TOP10:技术实力与服务能力全景测评 - 品牌官
  • 天赐范式第61天:为“雨”平反——从一次大模型“服务器繁忙”看 PDE 求解器的代数独立性——何以解忧,唯有杜康~
  • 告别动画重复K帧!用UE5的IK重定向器,5分钟让女武神动作适配你的自定义角色
  • 5个关键步骤掌握WorkshopDL:跨平台Steam创意工坊模组下载实战指南
  • 用Python写个脚本,自动帮你算出下一个“黄道吉日”(附完整代码)
  • 车牌号检测数据集 7800张 车牌识别 带标注 voc yolo
  • 2026 濮阳本地口碑好的GEO优化公司,豆包AI搜索排名推荐榜(综合实力TOP5) - 星际AI
  • 基于Arduino与MLX90614的非接触式智能测温仪设计与实现
  • 2026年武汉离婚律师推荐指南:从财产分割到抚养权全面解析 - 本地品牌推荐
  • 2026年实测:论文降AIGC降AI率怎么做?3款工具+DeepSeek/Claude指令,AIGC率99%降至5%