论文标题: InfraVLA: Extending Vision-Language-Action Navigation with Infrastructure Cameras
作者: Lukas Vierling, Benjamin Ramtoula, Luke Robinson, Ronald Clark, Daniele De Martini
机构: University of Oxford (Dept. of Computer Science & Oxford Robotics Institute)
arXiv: 2609.33647v1 [cs.RO], 2026-09-27
关键词: VLA / 导航 / 基础设施摄像头 / 行为克隆 / 反事实数据 / Recovery Data


一、介绍

先说一个特别生活化的事实:你现在走进任何一个仓库、医院、写字楼、火车站,头顶上都挂着一堆摄像头。这些摄像头 7×24 小时看着整个建筑,实时、高清、还免费——毕竟早就装好了。

而你派进去干活的机器人呢?它只看自己鼻子底下那一亩三分地。让它"走到那个箱子那儿去",箱子不在它视野里,它就只能一条过道一条过道地搜,搜到一半发现过道尽头被叉车堵死了,还得原路退回来。而头顶的摄像头把箱子在哪、哪条过道堵了看得一清二楚。

这就像什么?就像你玩RTS游戏,明明开了全图视野(或者至少队友在报点),你的单位却只靠自己的小视野在迷雾里摸索。信息就在那里,但策略不用它。

这篇论文的核心问题是:为什么不把现成的基础设施摄像头(CCTV)喂给导航策略? 更准确地说,为什么不喂给现在最火的 VLA(Vision-Language-Action)导航模型?

VLA 确实是个天然的接入点——它复用了 VLM 的视觉和语言骨干(DINOv2、SigLIP、LLaMA),本质上是个吃 token 序列的 Transformer,多一路视觉输入理论上就是多塞一段 token 进去。但作者做了实验后发现一个反直觉的事实:

光把 CCTV 编码器加进架构、再正常微调,模型根本不会去看这些摄像头。 语义任务成功率 36.0%,和没有 CCTV 的基线 34.0% 几乎没区别。

为什么?因为 CCTV 信息只在极少数决策点有用。一条轨迹里,机器人大部分时间在"沿当前过道直走",这个动作看机载相机就够了。只有在路径分叉的瞬间——“往左还是往右取决于监控里哪个箱子/哪条路堵了”——CCTV 视图才是决定性的。这种样本在数据里占比只有 5%~12%,模型不看 CCTV 也能把训练 loss 压得很低。这是典型的 shortcut learning(捷径学习),和行为克隆里著名的 copycat 问题同根同源:模型从自身历史/机载视角就能预测下一步,何必费力理解新模态。

所以这篇论文真正的贡献不是"加了个摄像头编码器"——那是工程活——而是一套让模型真正学会"看监控"的两阶段训练配方:

  1. Stage 1:反事实数据(counterfactual pairs)+ 上采样。同一起点录两条轨迹,只改指令或只改场景配置,两条轨迹在分叉点之前完全一样——这样只有 CCTV 视图能解释动作差异。把分叉点附近的片段上采样到采样质量的一半。
  2. Stage 2:恢复数据(recovery data)。用 Stage-1 策略自己跑,跑偏了让监督者(A* 或人)把车开回来,把"开回来"的轨迹加进训练。专治分叉点附近的复合误差和 copycat 捷径。

效果一句话总结:

  • 仿真语义任务(找到指令说出的物体):100% vs 基线 34.0%
  • 仿真空间任务(绕开堵死的过道):100% vs 基线 73.6%,最短路线占比 95.8% vs 55.6%
  • 分布外测试:88.2% / 88.9%
  • 真实 Boston Dynamics Spot 四足机器人,不到 10 分钟演示数据:83.3% vs 基线 29.2%,还保留了预训练的避障能力

给视频编码背景的读者一个类比:这整个故事本质上是一场信息论的码率分配问题。CCTV 视图就是一段"只在关键帧才被参考的高价值参考信号"——大多数帧(直行段)它对预测毫无增益,但在少数"决策关键帧"上它能大幅降低预测的不确定度。上采样反事实片段,相当于对这些关键帧做加权、提码率;recovery data 则像是处理误差传播——drift 累积到失配状态后,用"再同步"(监督者拉回参考路径)的数据教会解码器怎么恢复。而 copycat 捷径,就像预测器偷懒只做时域预测、无视更准的边信息——优化目标没逼它用,它就不用。

0.1 相关工作坐标:这篇论文站在哪

把 InfraVLA 放进相关工作的地图里,能更清楚它踩的是哪块空地:

  • 传统"监控辅助导航"路线(模块化):Ota et al. 用 CNN 在俯视图上预测最短路再让机器人跟随;Robot-Relay 用外部相机做视觉伺服、在手工划分的"交接区域"切换相机;SurveilNav 选相机构建 frontier/value 地图做物体搜索,走模块化规划管线;Indoor-R2X 把相机和 IoT 事件转成日志,让 LLM 规划器输出"左转"这类原子动作。共同点:中间表示把"从画面里取什么"提前写死,foundation model 没有参与局部导航本身。
  • 驾驶里的 V2X 融合:UniV2X 把路侧相机融进端到端管线但不用基础模型;V2X-VLM 让 VLM 从车端+路端视角直接预测 waypoints。但户外驾驶的相机"按构造"就在观察本车要走的路,室内监控观察的区域可能和当前动作毫无关系——"哪路画面此刻有用"本身就是模型要学的东西,这是室内问题独有的难度。
  • 多视角导航 VLA:MM-Nav 用四个相机,但全装在机器人身上,视野仍是局部的。
  • 给 VLA 注入新模态的通用配方:PointVLA(点云)、ForceVLA(触觉力)、E-VLA(事件相机)都是"模态专属编码器 → token 进骨干"的模式。区别在于这些传感器都长在机器人身上、每步都相关;基础设施相机不在机器人身上,策略还得学"什么时候看哪路"。

InfraVLA 的占位:第一个把静态外部视图以端到端方式接进预训练导航 VLA、并在室内接受语言目标的工作。

下面进入正题。

二、原理

2.1 问题设定:单设施、少量数据、人能采集的规模

InfraVLA 的定位非常务实:为"某一个固定设施"做定制微调。场景由三元组 ξ=(c,G,s0)\xi = (c, G, s_0)ξ=(c,G,s0​) 描述——ccc 是场景配置(障碍物/目标物的摆放,可变部分),GGG 是任务说明(语言指令、目标图像或 2D 位姿),s0s_0s0​ 是初始状态。每步策略接收机载图像 + N 路静态摄像头图像,输出一串 waypoints 交给底层控制器执行。

注意两个设计约束:

  • 摄像头内外参不提供给策略。监控画面和机器人坐标系怎么对上,完全靠数据里学。这是和传统"监控定位/BEV 感知"路线的根本区别——不做显式标定和几何融合,让端到端训练自己决定从画面里取什么。代价是策略必须隐式学会"画面里那团像素对应我世界里的哪边",好处是免除了标定维护成本——仓库里挪个摄像头也不用重新跑标定流程。
  • 单设施意味着数据需求被压到"人短时间能采集"的量级——真实机器人实验总共录了 9 分 53 秒的演示。

这个"单设施定制"的定位值得多说一句。它看起来像缩窄了论文的野心,实际是深思熟虑的工程判断:通用导航策略要覆盖所有建筑,数据需求天文数字;而现实中 90% 的部署需求就是"在固定设施里把活干好"。把泛化范围从"全宇宙仓库"缩到"这一个仓库",就用不到 10 分钟遥操数据换来了 83% 的成功率——这是个典型的"用问题约束换数据效率"的 trade-off,和视频编码里"用码率约束换质量"一样,关键是知道自己放弃了什么。

为什么坚持端到端,不走"VLM 描述监控 → 策略读文字"的模块化路线? 作者的理由引用了端到端驾驶领域的共识结论:模块化管线中每个组件的误差会在下游复合放大。文本描述是有损压缩——"3 号通道有叉车"丢掉了叉车的精确位置、通道剩余宽度、是否还在移动;而"该从监控里提取什么"取决于当前任务状态,是策略运行时才能决定的事。让 CCTV token 直接进 Transformer 骨干,等于把"压缩率"交给损失函数和梯度下降来定,而不是让一个固定的前置模块替策略做决定。

2.2 架构:在 OmniVLA 上嫁接 CCTV 分支

底座是 OmniVLA(OpenVLA 的导航特化版):

  • 机载图像 → DINOv2 + SigLIP 双编码器,特征拼接后 MLP 投影进 LLaMA 2 7B 的 embedding 空间;
  • 目标图像走同一套编码器,2D 目标位姿走 MLP;
  • 语言指令走 LLaMA tokenizer;
  • 序列末尾是 4H 个全零 token(H=8),回归头在这些位置的输出上预测 8 个 waypoints,每个 waypoint 四元组 (x,y,cos⁡Δθ,sin⁡Δθ)(x, y, \cos\Delta\theta, \sin\Delta\theta)(x,y,cosΔθ,sinΔθ)——位置偏移 + 朝向,一个 waypoint 吃 4 个 token 位。

InfraVLA 的扩展只加三样东西,对应三个设计决策:

决策一:专用编码器,而不是文本化/图结构化。
最省事的路线是用一个 VLM 把监控画面转成文字描述(“3 号通道有叉车”)塞给策略。作者拒绝这么做,理由和端到端驾驶反对模块化管线是同一条:中间描述的错误会传播,而且"从画面里取什么"被模块提前写死了。用专用编码器,策略从监控里提取什么完全由训练损失决定。另外机载和 CCTV 的视觉任务性质不同——机载视角下"前方自由空间/障碍"总在图像的可预测区域,CCTV 视角下目标物、堵路、机器人本体可能出现在画面任何角落且往往很小,编码器需要保留全图细节。CCTV token 插在机载 token 和目标图像 token 之后——保持 OmniVLA 预训练时的 token 位置不动,这点在消融里被证明很重要。

决策二:每视角 256 token → 2×2 平均池化压到 64。
7B 骨干的 context 是要省着用的,4 个摄像头不池化就是 1024 个额外 token。池化是粗暴的,但消融显示压到每视角 16 token 会直接掉到接近瞎猜水平,64 是甜点位。

决策三:CCTV 编码器和投影层从机载分支初始化。
CCTV 编码器不是从零训练的,而是拷贝机载编码器(DINOv2+SigLIP)的权重作为起点。这样它的特征一开始就和骨干对齐,训练只需要学"两个任务之间的残差"——监控视角和机载视角看世界的差异,而不是从零学视觉。所有线性层用 LoRA(rank 16, α=8) 微调,其余部分不动。

2.3 Stage 1:反事实片段 + 上采样——制造"必须用监控"的优化压力

这是全文最有理论味道的部分。行为克隆最小化监督者数据上的期望负对数似然 R(π)R(\pi)R(π),理论最优风险是动作在观测条件下的条件熵 H(A∣O)H(A|O)H(A∣O)。关键操作:把观测拆成 O=(X,Z)O = (X, Z)O=(X,Z),ZZZ 是 CCTV 图像(指令目标是语言命名的物体时,指令也算进 ZZZ),XXX 是其余部分。

不看 ZZZ 的最优策略能压到 H(A∣X)H(A|X)H(A∣X),看了 ZZZ 能压到 H(A∣X,Z)H(A|X,Z)H(A∣X,Z),两者之差正是条件互信息 I(A;Z∣X)I(A;Z|X)I(A;Z∣X)——这就是激励。如果 I(A;Z∣X)=0I(A;Z|X)=0I(A;Z∣X)=0,无视监控就是训练目标的最优解,模型当然不看。反事实数据的作用就是把 I(A;Z∣X)I(A;Z|X)I(A;Z∣X) 拉起来。

反事实对(counterfactual pair)长这样:两个样本 {(x,z1,a1),(x,z2,a2)}\{(x, z_1, a_1), (x, z_2, a_2)\}{(x,z1​,a1​),(x,z2​,a2​)},共享 xxx,只有 zzz 不同、动作不同。生成方式非常朴素:

  • 仿真里:同一出生点,改指令或改场景配置,再录一条监督者轨迹。两条轨迹在分叉前逐帧几乎一样——机载视图(X)相同,只有监控(Z)能解释分叉后的不同动作。
  • 真机上:固定出生点,同一起点录不同物体的演示。
  • 实在无法复现同一起点时,退化为 CAST 式的合成反事实对。

分叉点附近固定窗口长度的片段叫反事实片段(counterfactual snippet),提取规则是比较两条轨迹同时刻的位姿,朝向差或距离差超阈值就切窗口。

然后是上采样:片段只占原始数据 5.7%~11.8%,但在数据加载器里被重采样到约占采样质量的一半(50%/47%/34.9%)。这直接把"用 Z"和"不用 Z"两种策略的可达 loss 差距拉大,制造优化压力。效果立竿见影:不上采样时,策略在反事实片段上的验证 loss 是总体 loss 的 8.9 倍(说明决策点根本没学会);上采样后降到 0.3 倍。

2.4 Stage 2:Recovery Data——在分叉点治复合误差

行为克隆假设 i.i.d. 样本,但闭环 rollout 时小误差会让机器人走进演示没覆盖的状态,误差复利式放大(covariate shift)。经典解法是 DAgger 家族,这里用的是 HG-DAgger 风格 + A* 监督者,且只在反事实片段内挖数据:

  1. 把 Stage-1 策略 π1\pi_1π1​ 放到片段内的一个位姿上 rollout;
  2. 检测脱轨(derail):与演示轨迹距离超过 drd_rdr​ 的第一步记为 tofft_{off}toff​,之前最后一次距离在 ϵon\epsilon_{on}ϵon​ 内的步记为 tont_{on}ton​;
  3. 监督者在 [ton,toff][t_{on}, t_{off}][ton​,toff​] 里均匀抽一步接管,把机器人开回演示路径附近(ϵon\epsilon_{on}ϵon​ 内),只保留这段返回轨迹;
  4. 挖到 K 条 recovery 轨迹为止。

为什么只挖片段?因为 OmniVLA 预训练时见过海量"巡航"数据,反事实片段(需要依据监控做决策的部分)才是它真正陌生的分布——复合误差就发生在那里。

Recovery data 还有一个意外收获,也是空间任务里最精彩的发现:它顺带干掉了 copycat 捷径。Stage-1 策略的典型失败是:明明前方过道畅通,却拐进中间区域横穿到对面过道。事后离线验证确认,策略是从机载图像里自己的朝向推断该不该横穿——而确定性 A* 演示让"每次横穿都从同一位置的同一个小转角开始",这个捷径太好学了。recovery rollout 的随机性打破了"小转角 → 横穿"的伪相关,朝向不再能预测路线,策略被迫回去看监控。这一段是整篇论文的训练学精华:捷径不是靠"劝"模型戒掉的,是靠打碎捷径赖以成立的数据相关性。

2.5 监督者与执行

  • 仿真监督者:0.1 m 栅格 A*,障碍按机器人半径膨胀,用欧氏距离场(EDF)做边缘代价让路径远离障碍,自然三次样条平滑,纯跟踪(pure pursuit)30 Hz 控制,数据 3 Hz 记录。这套管线的每个选择都在为行为克隆的数据质量服务:栅格分辨率 0.1 m 决定了 A* 路径的空间精度上限;EDF 边缘代价让演示路径天然远离货架(语义任务演示平均间距 1.47 m 就是这么来的);三次样条保证路径二阶连续,否则平滑损失项(公式 1)和人类直觉都会打架;pure pursuit 是最经典的无模型路径跟踪器,行为稳定可复现——演示数据的一致性直接决定 BC 的天花板,监督者的"无聊的确定性"是特性不是缺陷(虽然后面会看到,这个确定性也埋了 copycat 的雷)。
  • 训练:从 OmniVLA 120k 步 checkpoint 出发,AdamW,lr=1e-4,batch 30,H=8,λ=0.1。

2.6 测试时执行:从 waypoint 到轮速

推理链路是理解整个系统延迟预算的关键:策略 3 Hz 跑一次前向,从 8 个预测 waypoint 里取第 5 个(不是最后一个——留出预测时域的安全边际,相当于控制上的预瞄),用逆 unicycle 模型把 (x,y,cos⁡Δθ,sin⁡Δθ)(x, y, \cos\Delta\theta, \sin\Delta\theta)(x,y,cosΔθ,sinΔθ) 反解成线速度 vvv 和角速度 ω\omegaω,交给机器人底盘的速度控制器闭环执行。3 Hz 的决策频率 + 190 ms 的推理延迟(加 CCTV 后)意味着单步推理占掉半个控制周期——这也是为什么 token 池化省 context 的同时也在保延迟。

三、公式

3.1 训练损失:waypoint 回归 + 平滑项

L=1H∑i=1H∥airef−a^i∥22  +  λH−1∑i=1H−1∥a^i+1−a^i∥22 \mathcal{L} = \frac{1}{H}\sum_{i=1}^{H}\left\lVert a_i^{\mathrm{ref}} - \hat{a}_i \right\rVert_2^2 \;+\; \frac{\lambda}{H-1}\sum_{i=1}^{H-1}\left\lVert \hat{a}_{i+1} - \hat{a}_i \right\rVert_2^2 L=H1​i=1∑H​​airef​−a^i​​22​+H−1λ​i=1∑H−1​∥a^i+1​−a^i​∥22​

  • a^i∈R4\hat{a}_i \in \mathbb{R}^4a^i​∈R4:第 iii 个预测 waypoint,四维 (x,y,cos⁡Δθ,sin⁡Δθ)(x, y, \cos\Delta\theta, \sin\Delta\theta)(x,y,cosΔθ,sinΔθ)。朝向用 (cos⁡,sin⁡)(\cos,\sin)(cos,sin) 表示而不是角度本身,避免 −π/π-\pi/\pi−π/π 的回归边界问题——这是回归旋转量的标准操作,和编码运动矢量的思路相通。
  • airefa_i^{\mathrm{ref}}airef​:监督者(A*/人类遥操)给出的参考 waypoint。
  • 第二项是平滑正则:惩罚相邻 waypoint 的突变,λ=0.1\lambda = 0.1λ=0.1。轨迹输出天然该是平滑的,这一项等于在输出空间加了个低通滤波器。

一个值得注意的删减:OmniVLA 原本还有一个语言跟随损失(language-following loss),作者发现它在自己的设定里会产生伪影——把最后一个预测 waypoint 往原点拉。于是直接砍掉。这提醒我们:从上游模型继承的损失项不是祖传代码,换设定就得重新审视。做视频编码的人对此应该很有共鸣——RDO 里某个 lambda 换了量化配置就不再是原来的最优 lambda。

再展开说两个损失设计的细节。为什么 waypoint 用 L2 回归而不是离散动作分类? 导航输出是连续空间量 (x,y,θ)(x, y, \theta)(x,y,θ),回归头直接输出 4H 个实数值,配合 (cos⁡,sin⁡)(\cos, \sin)(cos,sin) 参数化天然平滑;OpenVLA 原版用离散化 token 分类是为了复用 LLM 的解码头,而 OmniVLA/InfraVLA 用零 token 占位 + 回归头读取,等于把"语言模型"退化成"特征提取器 + 小回归头"——骨干负责理解,头负责数值,分工干净。平滑项为什么放预测侧而不是监督侧? ∥a^i+1−a^i∥2\|\hat a_{i+1} - \hat a_i\|^2∥a^i+1​−a^i​∥2 惩罚的是模型自己输出的抖动,对参考轨迹的形状不做假设——如果平滑的是残差(参考与预测的差),就会在参考轨迹本身有拐点的地方(真实的转向)和模型过不去。输出空间正则,是"相信轨迹该平滑,但不相信参考完美"的折中表达。

3.2 核心激励公式:条件互信息

行为克隆的目标风险是条件熵:

R(π)=E(o,a)∼DE[−log⁡π(a∣o)],min⁡πR(π)=H(A∣O) R(\pi) = \mathbb{E}_{(o,a)\sim \mathcal{D}_E}\left[-\log \pi(a \mid o)\right], \qquad \min_\pi R(\pi) = H(A \mid O) R(π)=E(o,a)∼DE​​[−logπ(a∣o)],πmin​R(π)=H(A∣O)

拆分观测 O=(X,Z)O = (X, Z)O=(X,Z)(ZZZ = CCTV 视图 + 目标语言指令,XXX = 其余),可得:

H(A∣X)−H(A∣X,Z)=I(A;Z∣X) H(A \mid X) - H(A \mid X, Z) = I(A; Z \mid X) H(A∣X)−H(A∣X,Z)=I(A;Z∣X)

这个等式是整篇论文训练配方的理论地基,逐项解读:

  • H(A∣X)H(A|X)H(A∣X):不用监控的最优策略能达到的极限损失——只靠机载视图能消除多少动作不确定性;
  • H(A∣X,Z)H(A|X,Z)H(A∣X,Z):用监控的极限;
  • I(A;Z∣X)I(A;Z|X)I(A;Z∣X):监控在机载视图之外带来的额外信息量,等于"看监控能省下的 loss"。

推论非常清晰:原始数据里 I(A;Z∣X)I(A;Z|X)I(A;Z∣X) 太小(大多数步骤直行,监控不改变最优动作),所以忽略监控就能把 loss 训到很低,梯度里几乎没有"学习使用监控"的分量。反事实对共享 XXX、只变 ZZZ 且 a1≠a2a_1 \neq a_2a1​=a2​,在数学上就是强行构造 AAA 与 ZZZ 在给定 XXX 下的统计依赖——分叉点上,动作的正确答案只藏在监控里。再叠加把片段上采样到 50% 采样质量,等于对这个互信息加权放大。

这套逻辑对任何"给预训练模型加新模态"的工作都成立:新模态如果只贡献了冗余信息,端到端训练会自动学会无视它。 消融表里"加了编码器但不上采样 = 36.0% vs 基线 34.0%"就是活生生的证据。

3.3 Recovery 挖掘的三个阈值

toff=min⁡{t:d(stπ1, stdemo)>dr},ton=max⁡{t<toff:d(stπ1, stdemo)≤ϵon} t_{off} = \min\{t : d(s_t^{\pi_1},\, s_t^{\mathrm{demo}}) > d_r\}, \qquad t_{on} = \max\{t < t_{off} : d(s_t^{\pi_1},\, s_t^{\mathrm{demo}}) \le \epsilon_{on}\} toff​=min{t:d(stπ1​​,stdemo​)>dr​},ton​=max{t<toff​:d(stπ1​​,stdemo​)≤ϵon​}

  • dr=0.5d_r = 0.5dr​=0.5 m:判定"脱轨"的距离阈值;
  • ϵon=0.05\epsilon_{on} = 0.05ϵon​=0.05 m:判定"在轨"的更严阈值——刻意比 drd_rdr​ 小很多,中间留了一个滞回带(hysteresis),避免在阈值附近来回抖动判定;
  • 监督者接管时刻 τ∼U(ton,toff)\tau \sim \mathcal{U}(t_{on}, t_{off})τ∼U(ton​,toff​),只保留返回段数据。

这个滞回设计很工程化:tont_{on}ton​ 是"最后一次确实还在轨上的时刻",保证接管点一定还在演示分布附近,监督者返回轨迹的起点是有监督信号的。

四、图示

4.1 整体架构(对应论文 Fig. 2)

                        ┌──────────────────────────────────────────────────┐
                        │              LLaMA 2 7B Backbone (LoRA)          │
 机载相机 ─► DINOv2+SigLIP ─► AvgPool ─► MLP ─► [机载 tokens] ────────────┤
 目标图像 ─► (共享编码器) ─► AvgPool ─► MLP ─► [目标 tokens] ────────────┤
 目标位姿 ──────────────────────────► MLP ─► [位姿 tokens] ─────────────┤        ┌──────────────┐
 指令文本 ──────────────────────► LLaMA Tokenizer ─► [语言 tokens] ─────┤ ─────► │ 回归头(4H个  │──► a1..a8
 CCTV×N ─► DINOv2+SigLIP ─► 2×2 AvgPool ─► MLP ─► [CCTV tokens ×64/视角]┤        │ 零token位置) │   waypoints
           (从机载分支初始化)                                              │        └──────────────┘
                        └──────────────────────────────────────────────────┘
            ╰──────────────── 绿色部分为本文新增 ────────────────╯

三个要点:CCTV 编码器从机载分支拷贝权重起步;token 位置保持 OmniVLA 预训练布局,CCTV 插队但不挪老位置;4 个摄像头 × 64 token = 256 个额外 token,context 可控。

4.2 两阶段训练流程

 录制数据(同起点反事实对)          Stage 1                     Stage 2
 ┌────────────────────┐    ┌───────────────────┐       ┌──────────────────────┐
 │ 轨迹A: "去箱子"      │    │ 全量演示微调 OmniVLA│       │ π1 在片段内自 rollout │
 │ 轨迹B: "去锥桶"      │───►│ + 反事实片段上采样  │───π1─►│ 脱轨→A*接管开回       │───π2
 │ 轨迹C: 同指令,场景变了│    │ (片段≈50%采样质量)  │       │ 只留返回段 → 50%混合  │
 └────────────────────┘    └───────────────────┘       └──────────────────────┘
      只有Z(监控/指令)        片段loss: 8.9×总体        打破 copycat 捷径
      能解释动作差异          → 0.3×总体                SR 77.8%→100%

4.3 反事实对为什么是关键(对应论文 Fig. 3/4 的思想)

 同一出生点 s0,机载视图完全相同的时刻 t:
 
   情形A: 指令="去箱子"     → 正确动作: 左转进1号通道
   情形B: 指令="去锥桶"     → 正确动作: 右转进4号通道
   情形C: 指令="去箱子"但通道被叉车堵死 → 右转绕行
   
   X(机载图像) 一样,Z(监控) 不同,正确动作不同
   ⇒ I(A;Z|X) 被强行拉高 ⇒ 不看监控就必然压不下 loss

4.4 语义任务 vs 空间任务

语义任务空间任务
考察能力在监控里认出指令命名的物体从监控里读出哪条通道被堵
目标模态语言指令2D 目标位姿
反事实对来源同起点、不同目标物体同起点终点、不同堵路模式
基线失败模式接近瞎猜(34% ≈ 25%猜通道+9pp)copycat:按自己朝向决定横穿
关键结果100% vs 34.0%100% & 95.8% 最短路 vs 73.6% & 55.6%

五、踩坑点

这一节是全文含金量最高的部分——作者的实验设计本身就是"踩坑实录",好几个坑是论文正文一笔带过、但做工程的人必须刻在脑子里的。

坑 1:加了新模态编码器 ≠ 模型会用它(范式级)
这是全文最核心的坑。CCTV 编码器 + 正常微调 = 36.0%,比 34.0% 的无监控基线只高 2 个点,属于噪声级差异。根本原因是 I(A;Z∣X)I(A;Z|X)I(A;Z∣X) 在原始数据里近乎为零——梯度里没有激励,架构里再多输入通道也是摆设。所有"给预训练模型接新传感器"的工作(点云、触觉、事件相机,以及一切多模态融合)都该先问一句:我的数据里,新模态的互信息够大吗?

坑 2:copycat 捷径——模型看自己的朝向而不是看监控(范式级)
空间任务里 Stage-1 策略的典型失败:明明直行道畅通,却拐去横穿。离线诊断方法很漂亮:喂给它一条轨迹的机载图像 + 另一条轨迹的监控图像(交叉喂),输出跟着机载朝向走——实锤模型在用"我现在的朝向"预测"我要不要横穿",因为确定性 A* 演示让每个横穿都从同一位置的同一个小转角开始。解法不是改结构、不是加正则,而是 recovery 数据的随机性打碎了这个伪相关。教训:行为克隆里的捷径,往往长在"演示生成过程本身"的规律上,而不在你设计的输入特征上。

坑 3:Token 池化不能太狠(工程级)
每视角 64 token → 100% SR;压到 16 token → 28.0%,直接瞎猜水平。监控画面里的关键目标往往只占画面一小块,2×2 池化已经是在刀尖上跳舞,再压四倍,细节全没了。这和编码里的"给 ROI 分配更多码率"是同一个道理——监控视图的有效信息密度低但位置不定,只能整体保真。

坑 4:冻结策略的两种死法(工程级)

  • 冻结机载编码器 + 冻结 LLM:26.0%,瞎猜。骨干不能动的话,新 token 根本学不会被"读懂"。
  • 只冻结机载编码器:90.0% 看着还行,但真机上撞货架 5 次——机载分支学不到"别撞"的残差了,安全能力是硬底线,不能省。

坑 5:CCTV token 插入位置和共享编码器(工程级)
共享一个 CCTV 编码器(不区分视角):96.0%;token 插到序列开头:94.0%。都能用但有少量失败,主要是局部导航变差。不共享编码器 + 保持预训练 token 布局是甜点位——每个视角有自己的编码器学出自己的残差,老 token 位置一个都不挪。

坑 6:语言跟随损失会产出伪影(工程级)
OmniVLA 原版的语言跟随损失在这个设定里把最后一个 waypoint 往原点拉。继承上游损失函数前先看它在新设定下学出来的东西长什么样。

坑 7:红色灭火器 vs 红色锥桶(数据级)
真机实验里灭火器只有 62.5%(最弱目标),失败全部终结在锥桶上。俯视监控里灭火器被压缩成一个"红色圆盘",和锥桶颜色一致;而训练数据里只有 7 个摆放同时把两个红物体分到机载前视之外的不同侧——数据里区分两个易混淆目标的样本太少了。这是典型的数据多样性漏洞,和编码里"某个序列的统计特性没被测试覆盖"一个性质。

坑 8:真机上 Stage 2 反而没法用(边界条件)
作者明确说没在真机跑 Stage 2,且试过"从摆好的固定起点收集 recovery 数据"替代真 mining,结果反而伤害性能。原因:简单实验室场景里失败是"起点处的错误决策"而非"沿途漂移",可挖的 derail 少且集中在单一物体上。recovery 数据的价值依赖失败模式的分布——这点在迁移到自家项目时务必先分析自己的失败长什么样。

坑 9:推理时间翻倍
RTX PRO 6000 上,4 路 CCTV 视图让单步推理从 95 ms 涨到 190 ms,且随摄像头数量线性增长。3 Hz 控制频率下 190 ms 尚可接受,但这个开销上限明显——论文自己在 Limitations 里承认可扩展性受限。token 池化和推理预算的权衡是部署时的第一道坎。

坑 10:实验边界要记牢
所有结果来自单次训练(无多种子统计);单一设施、最多 4 个摄像头;两个语言任务起点固定。多摄像头 + 任意起点 + 多设施都是未验证区域。别把"100%"当成可以照搬的承诺。

坑 11:反事实对对起点的依赖是双刃剑(数据级)
反事实对靠"同一起点录两条"来保证 X 相同,真机上这意味着固定出生点。作者自己点破了风险:数据集这么小,固定起点容易被模型记住——策略可能学会"在这个出生点 + 这个指令 → 走那条路"的查表行为,而不是真的读监控。论文用"每个场景物体摆放随机"来对冲,但这依赖摆放空间足够大(真机实验要求测试摆放与最近训练摆放平均位移 ≥1.33 m)。如果你的部署场景起点天然多变,反事实对的录制成本会直接上一个台阶——论文也承认这时只能退回 CAST 式合成对。

坑 12:上采样比例是和数据量联动的(工程级)
仿真里 CF 片段上采样到 50%,真机 9 分钟数据只敢到 34.9%。数据总量越小,过度重复少数片段的过拟合风险越大。这个比例不是超参玄学,是"片段信息量 vs 数据总量"的函数——迁移时要重调,别照抄 50%。

六、源码拆解

论文未开源代码,以下根据方法章节(Sec. III)、附录超参数(Table I)和 Fig. 2/3 重构核心算法的伪代码,标注对应出处。

6.1 反事实片段提取(对应 Sec. III-C)

# 对应 Sec. III-C "Pairs and snippets",阈值为实验特定值(Table I)
def extract_counterfactual_snippets(traj_a, traj_b, heading_th, dist_th, win):
    """traj_a/traj_b: 同一起点的两条演示 [(pose_t, action_t, obs_t), ...]"""
    snippets = []
    for t in range(min(len(traj_a), len(traj_b))):
        d_heading = angle_diff(traj_a[t].yaw, traj_b[t].yaw)   # 语义任务: >1°
        d_dist    = dist(traj_a[t].pos, traj_b[t].pos)         # 语义任务: >0.75m
        if abs(d_heading) > heading_th or d_dist > dist_th:
            # 在分叉步周围切固定窗口:如 语义(sim) 前3后0步, 空间(sim) 前16后8步
            lo, hi = max(0, t - win[0]), min(len(traj_a), t + win[1])
            snippets.append(Snippet(traj_a[lo:hi], pair_id=(id_a, id_b)))
    return snippets

注意提取规则是比较两条轨迹同时刻的位姿差,而不是找动作差——因为监督者轨迹在分叉前的规划可能完全重合,位姿差是分叉的最直接观测。

6.2 Stage 1 数据加载:上采样(对应 Sec. III-C + Table I)

# 片段占比 5.7%~11.8% → 上采样到 ~50% 采样质量
loader = MixSampler(
    datasets={
        "cf_snippets":   cf_snippets,   # 重采样权重 0.50 (语义sim) / 0.47 (空间sim) / 0.349 (真机)
        "full_demo":     full_demo,     # 其余采样质量
    },
    # 采样时片段被重复抽取,但不改变梯度计算本身——这就是 Wen et al. keyframe
    # 上加权思想的数据版:不改 loss 形式,改采样分布
)

6.3 Stage 2 Recovery 挖掘(对应 Sec. III-D)

def mine_recovery(pi1, snippets, d_r=0.5, eps_on=0.05, K=24, oracle=A_star_oracle):
    """仿真监督者为 A*;真机应为人类遥操作。对应 HG-DAgger 风格"""
    recovery = []
    for snip in snippets:
        s0 = random_pose_inside(snip)          # 从片段内部出生
        roll = rollout(pi1, s0)
        t_off = first_t(roll, lambda t: dist_to_demo(t) > d_r)   # 脱轨检测
        t_on  = last_t_before(roll, t_off, lambda t: dist_to_demo(t) <= eps_on)
        if t_off is None:
            continue                            # 没跑偏就不需要恢复
        tau = uniform_int(t_on, t_off)          # 监督者接管时刻
        ret = oracle.drive_back_to(roll[tau], demo_path, tol=eps_on)
        recovery.append(ret)                    # 只保留返回段!
        if len(recovery) >= K:
            break
    return recovery

# Stage 2: π2 ← 继续训练 π1, 混合 = CF片段(50%) + recovery(50%) (空间sim: 50/0/50)

6.4 训练主循环

policy = OmniVLA.from_pretrained("omnivla-120k")
cctv_encoder = copy(policy.onboard_encoder)    # 决策三:从机载分支初始化
cctv_proj    = copy(policy.onboard_proj)
freeze_nothing_except(LoRA(rank=16, alpha=8, target="all linear layers"))
# 注意:动作头/回归头随 LoRA 一起微调;机载 token 位置不动

for stage, steps in [("stage1", 15000), ("stage2", 5000)]:
    for batch in loader(stage):                # stage2 换成 CF+recovery 混合
        seq = build_sequence(
            onboard_tok=batch.onboard, goal_tok=batch.goal,
            lang_tok=batch.lang,
            cctv_tok=[cctv_pipe(v) for v in batch.cctv_views],  # 4×64 tokens
        )
        # 4H=32 个零 token 位置上读出 embedding → 回归 8×4 维 waypoints
        pred = policy.action_head(policy.backbone(seq))
        loss = waypoint_mse(pred, batch.ref) \
             + 0.1 * smoothness(pred)           # 公式(1),λ=0.1
        loss.backward(); optimizer.step()

6.5 关键超参数总表(Table I + Sec. IV-A)

超参数语义(sim)空间(sim)语义(真机)
CCTV 摄像头数442
目标模态语言2D 位姿语言
成功判据距物体 1 m距目标 1 m人工判定
测试 rollout 数507224
训练/验证轨迹552 / 48481 / 4675 (全用于训练)
训练数据时长3.03 h6.89 h0.16 h (9min53s)
CF 片段原始占比5.7%10.2%11.8%
CF 挖掘规则朝向>1° 或距离>0.75 m朝向>8°—
片段窗口(前/后)3 / 016 / 84 / 0
上采样后 CF 占比50%47%34.9%
Stage 1→2 步数15k→5k15k→5k3k (仅 stage1)
Recovery 轨迹 K486–48未做
Stage2 混合(CF/其他/recovery)80/0/2050/0/50—
底座 checkpointOmniVLA 120k同左同左
LoRArank 16, α=8同左同左
优化器AdamW lr=1e-4, batch 30同左同左
recovery 阈值d_r=0.5m, ε_on=0.05m同左—

三个实验的对比读法:真机数据只有 0.16 小时(人类的采集成本!),所以 CF 占比调低到 34.9%、步数只有 3k——数据越少,上采样越要克制,否则过拟合到少数据上是必然。片段窗口也随任务变化巨大(空间任务前 16 后 8 步,因为绕路决策链更长)。

6.6 推理执行(对应 Sec. IV-A “Execution”)

@torch.inference_mode()
def run_loop(policy, robot, goal, hz=3, wp_idx=4):
    """wp_idx=4 即第5个waypoint(0-indexed),与OmniVLA保持一致"""
    while not reached(goal):
        obs = dict(
            onboard=robot.rgb(),                          # 机载图
            cctv_views=[cctq[i].grab() for i in range(N_CCTV)],  # N路静态监控
            goal=goal,                                    # 语言/图像/位姿
        )
        wps = policy.predict(obs)                # [H,4]: (x,y,cosθ,sinθ)
        v, w = inverse_unicycle(wps[wp_idx])     # 取第5个 → (线速度, 角速度)
        robot.velocity_cmd(v, w)
        time.sleep(1.0 / hz)
# 延迟预算: 4路CCTV时单次前向 190ms (RTX PRO 6000, 无CCTV为95ms)
# 3Hz控制周期333ms,推理占~57% —— 加摄像头前先算这笔账

七、效果对比

7.1 语义任务主表(Table II,50 rollouts,Success = 1m 内到达物体)

策略SR (%) ↑与货架最小间距 (m) ↑
微调 OmniVLA(无 CCTV)34.00.67
InfraVLA,无上采样36.00.62
InfraVLA,上采样(Stage 1)100.00.71
+ recovery(Stage 2)100.01.27

两个数字值得盯住:其一,34.0% vs 随机瞎猜 25%(四选一)只差 9 个点——没有监控这个任务对机载策略而言近乎不可能;其二,Stage 2 不提 SR(已经满了),但把与货架的间距从 0.71 m 拉到 1.27 m(演示值 1.47 m)——recovery 数据的价值体现在安全裕度上,小偏移被提前纠正、不累积。

7.2 未见指令词(Table III,每个同义词 12 rollouts)

物体同义词1SR同义词2SR
叉车lift truck91.7%vehicle66.7%
桶canister91.7%oil drum75.0%
箱子package91.7%crate83.3%
锥桶safety cone100.0%witch’s hat25.0%

8 个训练时从未出现的同义词里 7 个 ≥66.7%(瞎猜基线 25%)。说明语言 embedding 和 CCTV 编码器的视觉 embedding 真的对齐了——模型是在监控画面里"认出"物体,而不是背通道位置。“witch’s hat”(锥桶的英式俗称)掉到 25% 是合理的语义鸿沟。OOD 物体摆放(Table IV):held-out 场景下目标物放在未见过的通道,SR 仍有 88.2%(同场景其他目标 99.0%)。

7.3 空间任务主表(Table V,72 个系统性场景)

策略SR (%) ↑走 A* 最短路 (%) ↑
微调 OmniVLA(无 CCTV)73.655.6
InfraVLA,无上采样76.451.4
InfraVLA,上采样(Stage 1)77.844.4
+ 仅 CF 片段,无 recovery75.052.8
+ recovery, K=6100.091.7
+ recovery, K=12100.093.1
+ recovery, K=24100.095.8
+ recovery, K=48100.094.4

这张表信息量极大,按列读:

  • SR 列:基线 73.6% 不低——很多场景机载视角确实能解。加 CCTV 后 SR 只涨到 77.8%,但看第二列。
  • Route 列:Stage 1 的最短路占比 44.4%,比基线 55.6% 还低!这是 copycat 捷径的直接后果——模型用了监控但用法是错的(按自己朝向横穿)。"加了新模态,指标反而局部变差"是捷径学习的典型信号,比"没提升"更值得警惕。
  • "仅 CF 片段无 recovery"行(75.0/52.8):证明 recovery 不是随便多训 5k 步能替代的——同样的步数喂 CF 数据,捷径还在。
  • K 的边际效应:K=6 就把 SR 拉满到 100%,最短路 91.7%;K=24 达到峰值 95.8%;K=48 略回落。6 条 recovery 轨迹(每条约几秒的数据)换 24 个点的最短路提升——性价比高得离谱。

OOD 堵路模式(Table VI,9 种模式留 2 种不出现在训练里):

策略已见场景 SRHeld-out 场景 SR
Stage 175.9%33.3%
+ recovery (K=30,仅从已见模式挖)100.0%88.9%

Stage 1 对没见过的堵路组合几乎崩盘(33.3%),Stage 2 拉回 88.9%——而且 recovery 数据只来自已见模式。说明 recipe 学到的是"看监控判断通道通堵"这个通用能力,不是背 9 种模式。

7.4 真机 Spot 四足(Table VII,24 rollouts,人工判定)

策略总体植物灭火器锥桶
微调 OmniVLA29.2%12.5%50.0%25.0%
InfraVLA (Stage 1)83.3%100.0%62.5%87.5%

背景重申一遍量级:9 分 53 秒遥操数据、75 条轨迹、3k 步训练,2 路摄像头。基线的失败模式很有画面感——它基本不看指令,“大多右转,5 次直行”,植物只有 12.5% 命中。InfraVLA 植物全中、锥桶 7/8,灭火器 5/8(踩坑点里的红盘混淆问题)。

7.5 架构消融(Table VIII,语义任务,Stage-1 配方,各 50 rollouts)

配置SR (%)间距 (m)
InfraVLA Stage-1(完整)100.00.71
每视角 16 token(池化过度)28.00.77
共享 CCTV 编码器96.00.61
CCTV token 放序列开头94.00.65
冻结机载编码器90.0(撞货架×5)0.59
冻结机载编码器 + LLM26.00.61

7.6 最惊人的一个数字

我的选择是 Table V 里 Stage 1 的 Route = 44.4% < 基线 55.6%。绝大多数"多模态融合"论文的表格里每个数字都在涨,这张表敢把一个"加了我们的输入反而变差"的中间结果放在主表里,并且用它引出了 copycat 诊断和 recovery 方案——这是整篇论文科学性最强的部分。其次才是真机 9 分 53 秒数据换 83.3%:基础模型时代,"为单设施定制一个导航策略"的数据成本已经压到了人类午休时间的量级。

7.7 横向总结:三条曲线合起来读

把三张主表的"配方递进"拉直了看,能看到一条一致的因果链:

递进步骤语义(sim)空间(sim)语义(真机)
无 CCTV 基线34.073.629.2
+ CCTV 编码器(无上采样)36.076.4—
+ 上采样(Stage 1)100.077.883.3
+ recovery(Stage 2)100.0100.0未做

三个任务里,“+编码器"这一步的增益全部在噪声量级(+2.0 / +2.8 / 未测),而”+上采样"和"+recovery"才是真正拉开差距的两级火箭。架构是入场券,配方是胜负手——这就是标题里"Extending"二字的真实分量。另一条暗线是两个指标的不对称:SR 容易被"能到达"刷高,而最短路占比、与货架间距这类"质量指标"只有 recovery 数据才能撬动——评估多模态策略时,只看成功率会漏掉一半的故事。

八、总结

InfraVLA 做的事情一句话:把楼里已经装好的监控摄像头,变成导航 VLA 的第二双眼睛——并且证明了真正的难点不在架构在训练配方。

三层可迁移的经验:

  1. 信息论视角审视新模态:I(A;Z∣X)I(A;Z|X)I(A;Z∣X) 是"模型会不会用新输入"的第一性判据。数据里没有条件互信息,架构再对也白搭;反事实对(同 X、异 Z、异 A)是拉高互信息的通用手段,且不需要合成标注。
  2. 捷径长在数据生成过程上:确定性专家(A* 演示)的规律性会被模型走捷径利用——copycat 不看监控看自己的朝向。诊断方法(交叉喂输入)值得直接抄走;解药是让 recovery rollout 的噪声打碎伪相关,而不是加正则或改结构。
  3. recovery 数据是分叉点特化的 HG-DAgger:只在模型最陌生、最容易复合误差的反事实片段内挖掘,几条轨迹就有巨大收益——但它依赖失败模式是"漂移"而非"起点错误",真机迁移要先分析自己的失败分布。

边界也很清楚:单设施、≤4 摄像头、固定起点、单次训练、推理时间随摄像头数线性涨。多摄像头大建筑、任意起点、真机 recovery,都是留给后续的坑位。

和视频编码的世界对个表:InfraVLA 的两阶段训练本质上是一套面向关键决策点的码率分配方案——反事实片段是关键帧,上采样是给它加权,recovery 数据是处理误差传播的再同步机制,copycat 是预测器弃用边信息的偷懒模式。模型、任务千差万别,但"把有限的优化压力集中投放到信息增益最大的样本上"这个思想,两边是同一枚硬币。

Logo

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

更多推荐