InfraVLA 深度解析:让机器人“偷看“监控摄像头导航,为什么光加编码器没用?
论文标题: 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 问题同根同源:模型从自身历史/机载视角就能预测下一步,何必费力理解新模态。
所以这篇论文真正的贡献不是"加了个摄像头编码器"——那是工程活——而是一套让模型真正学会"看监控"的两阶段训练配方:
- Stage 1:反事实数据(counterfactual pairs)+ 上采样。同一起点录两条轨迹,只改指令或只改场景配置,两条轨迹在分叉点之前完全一样——这样只有 CCTV 视图能解释动作差异。把分叉点附近的片段上采样到采样质量的一半。
- 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* 监督者,且只在反事实片段内挖数据:
- 把 Stage-1 策略 π1\pi_1π1 放到片段内的一个位姿上 rollout;
- 检测脱轨(derail):与演示轨迹距离超过 drd_rdr 的第一步记为 tofft_{off}toff,之前最后一次距离在 ϵon\epsilon_{on}ϵon 内的步记为 tont_{on}ton;
- 监督者在 [ton,toff][t_{on}, t_{off}][ton,toff] 里均匀抽一步接管,把机器人开回演示路径附近(ϵon\epsilon_{on}ϵon 内),只保留这段返回轨迹;
- 挖到 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=H1i=1∑Hairef−a^i22+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)],πminR(π)=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 摄像头数 | 4 | 4 | 2 |
| 目标模态 | 语言 | 2D 位姿 | 语言 |
| 成功判据 | 距物体 1 m | 距目标 1 m | 人工判定 |
| 测试 rollout 数 | 50 | 72 | 24 |
| 训练/验证轨迹 | 552 / 48 | 481 / 46 | 75 (全用于训练) |
| 训练数据时长 | 3.03 h | 6.89 h | 0.16 h (9min53s) |
| CF 片段原始占比 | 5.7% | 10.2% | 11.8% |
| CF 挖掘规则 | 朝向>1° 或距离>0.75 m | 朝向>8° | — |
| 片段窗口(前/后) | 3 / 0 | 16 / 8 | 4 / 0 |
| 上采样后 CF 占比 | 50% | 47% | 34.9% |
| Stage 1→2 步数 | 15k→5k | 15k→5k | 3k (仅 stage1) |
| Recovery 轨迹 K | 48 | 6–48 | 未做 |
| Stage2 混合(CF/其他/recovery) | 80/0/20 | 50/0/50 | — |
| 底座 checkpoint | OmniVLA 120k | 同左 | 同左 |
| LoRA | rank 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.0 | 0.67 |
| InfraVLA,无上采样 | 36.0 | 0.62 |
| InfraVLA,上采样(Stage 1) | 100.0 | 0.71 |
| + recovery(Stage 2) | 100.0 | 1.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)
| 物体 | 同义词1 | SR | 同义词2 | SR |
|---|---|---|---|---|
| 叉车 | lift truck | 91.7% | vehicle | 66.7% |
| 桶 | canister | 91.7% | oil drum | 75.0% |
| 箱子 | package | 91.7% | crate | 83.3% |
| 锥桶 | safety cone | 100.0% | witch’s hat | 25.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.6 | 55.6 |
| InfraVLA,无上采样 | 76.4 | 51.4 |
| InfraVLA,上采样(Stage 1) | 77.8 | 44.4 |
| + 仅 CF 片段,无 recovery | 75.0 | 52.8 |
| + recovery, K=6 | 100.0 | 91.7 |
| + recovery, K=12 | 100.0 | 93.1 |
| + recovery, K=24 | 100.0 | 95.8 |
| + recovery, K=48 | 100.0 | 94.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 种不出现在训练里):
| 策略 | 已见场景 SR | Held-out 场景 SR |
|---|---|---|
| Stage 1 | 75.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,人工判定)
| 策略 | 总体 | 植物 | 灭火器 | 锥桶 |
|---|---|---|---|---|
| 微调 OmniVLA | 29.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.0 | 0.71 |
| 每视角 16 token(池化过度) | 28.0 | 0.77 |
| 共享 CCTV 编码器 | 96.0 | 0.61 |
| CCTV token 放序列开头 | 94.0 | 0.65 |
| 冻结机载编码器 | 90.0(撞货架×5) | 0.59 |
| 冻结机载编码器 + LLM | 26.0 | 0.61 |
7.6 最惊人的一个数字
我的选择是 Table V 里 Stage 1 的 Route = 44.4% < 基线 55.6%。绝大多数"多模态融合"论文的表格里每个数字都在涨,这张表敢把一个"加了我们的输入反而变差"的中间结果放在主表里,并且用它引出了 copycat 诊断和 recovery 方案——这是整篇论文科学性最强的部分。其次才是真机 9 分 53 秒数据换 83.3%:基础模型时代,"为单设施定制一个导航策略"的数据成本已经压到了人类午休时间的量级。
7.7 横向总结:三条曲线合起来读
把三张主表的"配方递进"拉直了看,能看到一条一致的因果链:
| 递进步骤 | 语义(sim) | 空间(sim) | 语义(真机) |
|---|---|---|---|
| 无 CCTV 基线 | 34.0 | 73.6 | 29.2 |
| + CCTV 编码器(无上采样) | 36.0 | 76.4 | — |
| + 上采样(Stage 1) | 100.0 | 77.8 | 83.3 |
| + recovery(Stage 2) | 100.0 | 100.0 | 未做 |
三个任务里,“+编码器"这一步的增益全部在噪声量级(+2.0 / +2.8 / 未测),而”+上采样"和"+recovery"才是真正拉开差距的两级火箭。架构是入场券,配方是胜负手——这就是标题里"Extending"二字的真实分量。另一条暗线是两个指标的不对称:SR 容易被"能到达"刷高,而最短路占比、与货架间距这类"质量指标"只有 recovery 数据才能撬动——评估多模态策略时,只看成功率会漏掉一半的故事。
八、总结
InfraVLA 做的事情一句话:把楼里已经装好的监控摄像头,变成导航 VLA 的第二双眼睛——并且证明了真正的难点不在架构在训练配方。
三层可迁移的经验:
- 信息论视角审视新模态:I(A;Z∣X)I(A;Z|X)I(A;Z∣X) 是"模型会不会用新输入"的第一性判据。数据里没有条件互信息,架构再对也白搭;反事实对(同 X、异 Z、异 A)是拉高互信息的通用手段,且不需要合成标注。
- 捷径长在数据生成过程上:确定性专家(A* 演示)的规律性会被模型走捷径利用——copycat 不看监控看自己的朝向。诊断方法(交叉喂输入)值得直接抄走;解药是让 recovery rollout 的噪声打碎伪相关,而不是加正则或改结构。
- recovery 数据是分叉点特化的 HG-DAgger:只在模型最陌生、最容易复合误差的反事实片段内挖掘,几条轨迹就有巨大收益——但它依赖失败模式是"漂移"而非"起点错误",真机迁移要先分析自己的失败分布。
边界也很清楚:单设施、≤4 摄像头、固定起点、单次训练、推理时间随摄像头数线性涨。多摄像头大建筑、任意起点、真机 recovery,都是留给后续的坑位。
和视频编码的世界对个表:InfraVLA 的两阶段训练本质上是一套面向关键决策点的码率分配方案——反事实片段是关键帧,上采样是给它加权,recovery 数据是处理误差传播的再同步机制,copycat 是预测器弃用边信息的偷懒模式。模型、任务千差万别,但"把有限的优化压力集中投放到信息增益最大的样本上"这个思想,两边是同一枚硬币。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)