让六只眼睛共享坐标系:CrossDepth 如何用几何约束打破自监督深度估计的天花板
一个自监督深度估计的"视角孤岛"困境
想象你在一辆自动驾驶车上装了六台相机——前、后、左、右、左前、右前——每台相机都在 30Hz 的频率下拍摄周围环境。你没有 LiDAR,没有深度标注,只有这六路视频流。你想训练一个深度估计模型。
自监督深度估计的经典套路是:用相邻帧之间的光度误差作为训练信号。模型预测当前帧的深度,用位姿网络估计相机运动,把当前帧投影到下一帧的位置,计算像素级光度差异。差异越小,深度估计越准。
这个方法在单目相机上已经成熟,但在多相机系统上遇到了一个根本困难:六台相机各自为政。每台相机的深度估计都是独立优化的,它们之间没有共享的几何约束。结果是:从左前相机和右前相机看同一个物体,两台相机给出的深度估计可能差了 20%——即使这个物体显然只有一个真实距离。
这就是 Mohammed Abu Alhanud 等人(休斯顿大学)在论文 CrossDepth: Geometry-Constrained Attention for Generalizable Multi-View Depth Estimation 中试图解决的问题。
跨图像注意力:让相机"看见"彼此
CrossDepth 的核心思路是:在 Transformer 的注意力层中引入跨图像交互,让不同相机的特征图直接参与彼此的注意力计算。
标准自监督深度估计网络的结构是:每台相机的图像经过一个共享的 CNN 编码器,得到特征图;特征图经过 Transformer 解码器,输出深度图。在标准 Transformer 中,注意力只在同一张特征图内部计算——每台相机的特征只和自己互动。
CrossDepth 改了一件事:它把同一时刻六台相机的特征图堆叠在一起,让 Transformer 的注意力跨越相机边界。具体来说,对于来自相机 A 的一个 query token,它的 key 和 value 不仅来自相机 A 的特征图,还来自相机 B、C、D、E、F 的特征图。
这意味着:当模型预测相机 A 中某个像素的深度时,它可以"参考"相机 B 中同一场景的视角。如果相机 A 和相机 B 的视野有重叠区域,同一物体在两个视角下的表观差异(视差)直接编码了深度信息。模型不需要通过光度误差间接学习这种关系,而是在注意力层中直接看到它。
圆柱体射线嵌入:把 3D 几何注入注意力
但光有跨图像注意力还不够。Transformer 不知道六台相机之间的空间关系——它不知道相机 A 在车前方,相机 B 在车左侧。如果只是简单地把所有相机的特征堆在一起做注意力,模型需要从数据中学习这种空间先验,这既慢又不可靠。
CrossDepth 的第二个创新是圆柱体射线嵌入(Cylindrical Ray Embedding)。对于每台相机的每个像素,作者计算一条从相机光心出发、穿过该像素的 3D 射线。这条射线在圆柱体坐标系下被参数化为两个角度(方位角和俯仰角)。这个射线嵌入被加到位置编码中,让 Transformer 知道每个 token 在 3D 空间中的"方向"。
为什么用圆柱体坐标系而不是笛卡尔坐标?因为自动驾驶场景中,相机的安装通常是环绕车身的,圆柱体坐标系天然适配这种环形布局。方位角直接对应"相机在车的哪个方向",俯仰角对应"看上还是看下"。这种参数化让 Transformer 的注意力可以按方向聚类——前向相机之间的注意力自然比前向和后向相机之间更强。
自监督训练:光度误差 + 跨视角一致性
CrossDepth 的训练信号来自两个光度误差:
1. 时序光度误差:同一相机相邻帧之间的投影误差(经典自监督深度估计的训练信号) 2. 跨视角光度误差:同一时刻不同相机之间的投影误差(CrossDepth 新增)
跨视角光度误差的实现方式是:对于相机 A 中的一个像素,用相机 A 的深度估计和已知的相机外参(相机之间的相对位姿是标定已知的),把这个像素投影到相机 B 的图像平面上。如果相机 A 的深度估计正确,投影到相机 B 的像素应该和相机 B 中对应位置的像素颜色一致。不一致就意味着深度估计有误。
这个跨视角光度误差是关键——它直接惩罚了"同一物体在不同相机视角下深度估计不一致"的问题。而且,由于相机之间的相对位姿是已知常数(不像时序位姿需要网络估计),这个误差信号比时序光度误差更可靠。
实验结果:DDAD 数据集上的全面领先
论文在 DDAD(Dense Depth for Autonomous Driving)数据集上评估,这是一个包含六相机配置的自动驾驶深度估计基准。
主要结果(使用 ResNet-101 编码器):
| 方法 | Abs Rel | RMSE | δ < 1.25 |
|---|---|---|---|
| 基线(无跨图像注意力) | 0.156 | 5.872 | 0.789 |
| CrossDepth | 0.141 | 5.421 | 0.812 |
更值得注意的是消融实验的结果:
- 只加跨图像注意力,不加圆柱体射线嵌入:Abs Rel 降 3.2%
- 只加圆柱体射线嵌入,不加跨图像注意力:Abs Rel 降 1.8%
- 两者都加:Abs Rel 降 9.6%
泛化性:从 DDAD 到 nuScenes
论文还测试了跨数据集泛化性:在 DDAD 上训练,在 nuScenes 上测试。nuScenes 也有多相机配置,但相机数量和安装位置都和 DDAD 不同。
结果:CrossDepth 在 nuScenes 上的 Abs Rel 为 0.215,基线为 0.241。跨数据集泛化性提升了 10.8%。
这个结果比同数据集提升更值得关注。它说明 CrossDepth 学到的不是 DDAD 特定的相机配置先验,而是"如何利用跨视角信息"的通用能力。当相机配置变化时,圆柱体射线嵌入自动适配新的相机布局——每台相机的射线嵌入是根据其实际安装位置计算的,不需要重新学习。
从"独立通道"到"联合视角"
CrossDepth 的深层贡献不在于绝对数值的提升,而在于它代表了一种多相机感知的设计哲学转变。
当前自动驾驶的多相机感知主流范式是"独立通道"——每台相机独立做深度估计、目标检测、语义分割,最后在后处理阶段把结果融合。这种范式简单但浪费信息:重叠视野中的冗余信息在特征提取阶段就被丢弃了,到后处理时已经无法恢复。
CrossDepth 把融合提前到了特征提取阶段。不同相机的特征在 Transformer 注意力层中直接交互,冗余信息在特征层面就被利用了。这和 BEV(Bird's Eye View)感知的思路有异曲同工之处——BEV 把多相机特征投影到统一的鸟瞰图坐标系中,CrossDepth 则用跨图像注意力在原始特征空间中实现类似的融合。
但 CrossDepth 比 BEV 更轻量。BEV 需要显式的视角变换模块(如 Lift-Splat-Shoot),需要预测每个像素的深度分布然后投影到 3D 空间。CrossDepth 不需要显式的视角变换——跨图像注意力隐式地完成了视角融合,模型自己学会如何利用跨视角信息。
限制与未解问题
论文诚实地承认了几个局限。首先,跨图像注意力的计算复杂度是 O(N²M),其中 N 是单张特征图的 token 数,M 是相机数量。六相机时计算量是单相机的 36 倍。论文通过限制跨图像注意力的范围(只和相邻相机交互)来缓解,但这牺牲了全局一致性。
其次,圆柱体射线嵌入假设相机安装位置已知且固定。对于标定偏移或动态相机系统(如无人机上的可旋转相机),这个假设不成立。如何把射线嵌入做成自适应的是未来工作。
第三,论文只在自动驾驶场景测试了。室内多相机系统(如安防监控)的相机布局更多样,CrossDepth 的通用性有待验证。
对多视角感知的启示
CrossDepth 的工作提出了一个值得追问的问题:多相机系统的信息融合应该发生在哪个层面?
当前实践是"后融合"——每台相机独立感知,结果在后处理阶段融合。CrossDepth 主张"前融合"——在特征提取阶段就跨相机交互。BEV 是"中融合"——在特征提取后、决策前做视角变换。
三种范式各有优劣。后融合最简单但信息损失最大;前融合信息最完整但计算量最大;中融合是折中。CrossDepth 的实验表明,前融合的性能上限比后融合高——但计算代价是否值得,取决于具体场景的延迟要求。
从更广的视角看,CrossDepth 是"几何先验注入注意力"设计模式的一个实例。圆柱体射线嵌入把 3D 几何信息直接编码到 Transformer 的位置编码中,让注意力计算可以利用物理先验。这个模式可以推广到其他需要几何约束的场景:单目深度估计中的相机运动先验、多视角立体匹配中的极线约束、SLAM 中的回环检测——所有这些场景都可以把几何先验注入注意力层,让模型在数据驱动学习的同时利用已知的物理约束。
---
*论文:arXiv:2609.05397* *项目页:https://abualhanud.github.io/CrossDepthPage/* *无开源代码*