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/SCOPE1. 问题背景具身视觉导航通常假设智能体拥有 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.py和src/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.pydataclassclassFrontier:Frontier class for frontier-based exploration.position:np.ndarray orientation:np.ndarray region:np.ndarray frontier_id:intimage:strNonetarget_detected:boolFalsefeature:torch.TensorNonefrontier 检测的具体流程可以分为几步先根据当前 TSDF探索体素计算未探索区域再用邻域卷积找出处在可通行岛屿和未探索空间交界处的候选点随后用 DBSCAN 聚类 frontier 区域并根据角度范围、区域面积和历史 frontier 的 IoU 关系做过滤与合并。这样得到的 frontier 不是单个像素点而是一个面向未知区域的边界簇。代码随后会让智能体“转头看向”该 frontier保存对应观察图像并把缩放后的图像写入frontier.feature。# 摘录自 SCOPE/src/tsdf_planner.pyprocessed_rgbresize_image(frontier_obs,prompt_img_size[0],prompt_img_size[1])frontier.imagef{cnt_step}_{i}.pngfrontier.featureprocessed_rgb这段代码说明了 SCOPE 与传统 frontier exploration 的差异。传统方法通常只关心 frontier 的位置、面积和可达性最多根据距离或信息增益排序SCOPE 则认为每个 frontier 的“朝向图像”本身就是决策证据。假设两个 frontier 距离相近一个图像中能看到门框、走廊和家具边缘另一个图像只有近距离墙面那么即使两者在几何上都连接未知区域它们对后续探索的意义也不同。SCOPE 将这种差异交给 VLM 识别再把识别结果沉淀到 potential graph 中。4. 前沿级潜力估计让 VLM 对未知入口做结构化判断src/potential_estimation_gpt_goal.py是 SCOPE 最直接体现论文思想的文件。它将 frontier 图像、问题文本和可选目标图像组织成多模态消息要求模型严格输出四项字段SEMANTIC_RICHNESS、EXPLORABILITY、GOAL_RELEVANCE和POTENTIAL_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_tokens4096、top_p0.95、frequency_penalty0和presence_penalty0。代码还对 RateLimit、连接错误、超时和 BadRequest 做了分支处理并在潜力估计失败时返回None由潜力图模块使用默认中性分数兜底。这一点在工程复现中很关键因为导航评估会反复调用 VLM任何一次 API 抖动都不应该让整个 episode 直接崩溃。# 摘录自 SCOPE/src/potential_estimation_gpt_goal.pycompletionclient.chat.completions.create(modelgpt-4o-2024-11-20,messagesmessage_text,temperature0.7,max_tokens4096,top_p0.95,frequency_penalty0,presence_penalty0,)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.pydataclassclassPotentialNode:position:np.ndarray voxel_position:np.ndarray potential_score:float0.0visit_count:int0last_updated:int0frontier_count:int0exploration_value:float0.0semantic_richness:float0.0explorability:float0.0goal_relevance:float0.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,nt−1​αm,nt​Pi​其中α 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,1−∥pm,n​−pFi​​∥/R)。这表示离 frontier 越近的网格受影响越大超出半径R RR后不再传播。代码中的update_from_frontier()基本遵循这一思想先把 frontier 体素坐标转换到世界坐标再遍历潜力图节点根据距离计算线性衰减权重最后调用_update_node_scores()更新分数。# 摘录自 SCOPE/src/potential_graph.pydistancenp.linalg.norm(node.position-frontier_pos_2d)ifdistanceself.influence_radius:weightmax(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_updateself.current_step-node.last_updatedifsteps_since_update0:decayself.decay_factor**steps_since_update node.potential_score*decay node.semantic_richness*decay node.explorability*decay node.goal_relevance*decayifnode.frontier_count0:alphaweightelifnode.frontier_count3:alphaweight*0.7else:alphaweight*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​(ωpot​Pm,n​ωsem​pm,nsem​ωexplore​pm,nexplore​ωgoal​pm,ngoal​)⋅1γnm,n​1​。本地实现中采用了更简化的加权项重点权衡总体潜力、可探索性和目标相关性并用访问次数降低重复区域的价值。这样做的实际效果是高潜力区域会被优先探索但一旦智能体已经去过附近位置它的吸引力会下降从而减少在同一房间内反复徘徊。# 摘录自 SCOPE/src/potential_graph.pybase_exploration(node.potential_score*0.5node.explorability*0.3node.goal_relevance*0.2)visit_penaltymax(0.1,1.0/(1node.visit_count*0.5))node.exploration_valuebase_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_pospotential_graph._voxel_to_world(frontier.position)potential_positionnp.array([frontier_world_pos[0],frontier_world_pos[2]])potential_scorepotential_graph.get_potential_at_position(potential_position)step_dict[frontier_potential_scores].append(potential_score)# 摘录自 SCOPE/src/eval_utils_gpt_goatbench.pyiffrontier_potential_scoresandilen(frontier_potential_scores):potential_scorefrontier_potential_scores[i]content.append((fFrontier{i}(Potential Score:{potential_score:.2f}) ,frontier_imgs[i]))else:content.append((fFrontier{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 分数。…详情请参照古月居