首页 / 资讯中心 / 文章详情

全像素密集三维追踪:世界坐标系下的前馈式轨迹预测全解析

全像素密集三维追踪:世界坐标系下的前馈式轨迹预测全解析 ★ FEATURED ARTICLE
2. 从二维对应到三维轨迹这个问题到底难在哪2.1 先分清三个概念做视觉感知的朋友应该都有一种感觉每隔一段时间就会冒出一个新名词把老问题重新包装一遍。光流、场景流、密集三维追踪这三个概念经常被混着说但它们的输出和用途其实差得很远。二维光流处理的是图像序列中像素的二维运动场输出通常是一个与图像同分辨率的二通道图两个通道分别代表水平方向和垂直方向的位移。它的核心假设是亮度一致性同一个三维点的投影在相邻帧间灰度不变。这个假设在真实场景里经常被打破比如光照变化、镜面反射、遮挡边界所以光流算法做得好不好很大程度上取决于怎么应对这些不满足假设的区域。场景流则更进一步它估计的是三维空间点的运动输出不再是二维位移而是每个点的三维速度场或者逐点位移。它需要的信息来源更多可以是深度传感器直接测量也可以从多视角几何里恢复。但传统场景流方法通常依赖深度估计质量深度一旦有噪声场景流也跟着飘。全像素密集三维追踪和这两者的区别在于它关注的不是相邻两帧之间的瞬时运动而是一段视频跨度内同一个物理点的完整轨迹。你可以把二维光流看成双帧对应的结果但三维追踪要把这条对应关系沿着时间轴串起来形成一条连续的曲线。而且它要在以世界为中心的坐标系里表示这条曲线而不是在某个相机坐标系里。我举一个生活化的例子。你站在路口拍一段延时视频画面里一辆车从远处开过来再从你的左侧驶出。二维光流做的是告诉你这辆车在画面里每个瞬间往哪个方向移动了多少像素。但如果你想知道这辆车在真实世界里走的是一条什么样的弧线速度变化是怎样的什么时候正好经过某个路口你就需要三维轨迹而且这条轨迹最好是在一个固定的大地坐标系下表达而不是跟着你的手机镜头转。Track4World想直接输出后面这种表示。它不给中间层的二维光流也不仅仅给一个当前帧的深度它把每一个像素对应的三维点在整个视频时间范围内的轨迹全部算出来。这听起来很贪心但正是这种贪心才逼着模型真正去理解三维结构加时间演变而不是在二维平面上做表面文章。2.2 为什么世界为中心是关键决策很多追踪算法把轨迹定义在某个参考帧的相机坐标系里。好处是实现简单但坏处也很实际当相机本身在运动时坐标系也在运动轨迹的语义会变得混在一起。一部分运动来自物体本身一部分运动来自相机要把这两者分开还得再做一次坐标系变换或者运动补偿。世界为中心的表示把这些麻烦前置解决了。它约定轨迹定义在一个固定的世界坐标系中这个坐标系可以看成整个视频片段的基准框架。所有像素上的三维点都在这个基准框架下有自己的坐标序列。相机位姿只是负责把这个基准框架投影到图像平面生成观测而轨迹本身和相机运动是解耦的。这个设计带来的直接好处有两个。第一不同时间、不同视角的估计结果可以直接在世界坐标系里做比较和对齐不需要额外配准。第二模型需要学习的内容变得更纯粹它只需要关注真实世界的三维运动和结构而不需要从图像运动中把相机运动和物体运动强行解耦。当然代价是这个模型必须比较好地用多视角几何约束把相机位姿也恢复出来否则轨迹就会飘到世界坐标系的外面去了。在多视角几何里这是一个标准的联合估计问题相机内外参和三维点结构互相耦合。Track4World这类方法一般会先从一个粗的相机位姿初始化开始然后在训练过程中让网络自己学会利用多帧一致性来精化这些位姿最终让世界坐标系下的轨迹和观测到的像素位置自洽。这里有个容易被忽略的点如果模型只给每一帧的深度图然后单纯把逐帧深度反投影到世界坐标系去拼接得到的不叫轨迹叫一堆没有关联的三维点云。真正的轨迹需要时间维度上的对应关系也就是你知道第1帧的像素p1、第2帧的像素p2、第3帧的像素p3它们在三维世界里是同一个点。Track4World的全像素密集特质就在于它要为整张图的每一个像素都建立起这种跨帧对应而不是像稀疏点追踪那样只挑特征点。这个对应关系的建立靠的是特征关联模块也就是下面要讲的核心环节。2.3 前馈式设计为什么不用迭代和递归优化循环优化和递归架构在时序任务里确实有天然优势因为信息可以沿时间轴反复传播。但这类方法的问题也很明显训练不稳定、显存消耗大、推理延迟高而且在长序列上容易出现误差累积。Track4World选择的是前馈式架构粗略地说整段视频一次性送进网络网络内部通过注意力机制在时域上做信息交互直接输出全部轨迹。它不依赖逐帧递归传递隐状态也不需要测试时反复迭代去修正结果输入定长视频输出端到端轨迹。前馈式在工程上的意义是非常直观的。推理时间基本恒定不随序列长度增长产生隐式的循环开销训练时梯度可以跨越整个时间维度回传信息流动路径短而且直接收敛相对干净。另一个容易被忽视的好处是它天然适合并行化。你把一个batch里的所有视频片段当独立样本处理不需要像RNN那样按时间步串行H100上吞吐量可以拉得很高。当然前馈式也不是没有代价。信息交互全靠前向注意力一步到位缺少再来一轮的修正机制这对网络容量和训练数据的多样性要求更高。但以现在大规模数据预训练加多视角几何强约束的常见实践来看这条路是走得通的。很多类Transformer结构的视觉模型都已经证明足够深的网络可以在单次前向中完成复杂的对应关系建模Track4World可以看成这类思路在三维密集追踪上的延伸。注意前馈不等于没有时序建模。它依然要用某种时域机制比如跨帧注意力让每一帧的特征能看到其他帧只是这种看到发生在一次前向传播里而不是通过循环状态累积。理解这点才不会把前馈设计误解成逐帧独立处理。3. 核心模块拆解从多视角几何到全像素密集轨迹3.1 特征提取与多尺度匹配这类系统的第一个模块几乎都是特征提取。输入是多帧图像经过一个共享权重的编码器逐帧得到多尺度的特征图。低层特征分辨率高、空间细节足适合处理精细的边界高层特征语义强、感受野大适合处理大位移和遮挡。多尺度结构的意义在于不管物体在画面里移动得快还是慢总有一个尺度的特征能兜住它。然后进入匹配阶段。这里最常用的技术是注意力机制尤其是可变形注意力和跨帧注意力。可变形注意力会为每个查询位置学习一组采样偏移在候选区域里采集特征跨帧注意力则让查询帧的特征去参考相邻帧的特征逐像素建立相关性。两者结合之后每个像素在另一个帧里的对应位置可以不是整数像素而是亚像素精度的连续坐标这对密集三维追踪来说非常重要因为三维运动投影到二维之后几乎不可能是整像素的。匹配还有一个隐藏的难点遮挡区域。一个像素在某帧里可见在下一帧可能被前面的物体挡住它就没有真实对应可查。传统方法遇到这种情况常常直接用周围像素的运动做插值结果边界处糊成一片。Track4World这类方法会在匹配模块内部预测一个遮挡或置信度信息让模型知道哪里该信、哪里该少信而不是在输出端做一刀切的后处理。这算是一个设计上的细腻点。3.2 可微的几何投影与反投影把三维约束嵌进网络只靠图像特征匹配得到的是二维的对应关系要变成世界坐标系下的三维轨迹还需要几何约束。在这一步通常会在网络里插入可微的投影与反投影层让整个模型端到端可训练。具体来说给定某帧的相机外参可以把世界坐标系下的三维点投影到图像坐标系得到像素位置反过来给定图像深度和相机内参可以把像素反投影成相机坐标系下的三维点再通过外参变换到世界坐标系。这两个操作都是可微的所以相机位姿和深度都可以作为网络的一部分参与梯度回传而不需要离线标定后冻结。这里有个常见的实现细节为了避免数值不稳定一般会用归一化坐标或者齐次坐标来做投影深度则经常在一个带约束的范围里做预测比如用sigmoid先归一化到某个最大深度区间。这样既能保证网络输出的深度在物理合理的范围内又能让梯度传播更平稳。多视角几何里的三角化在这一步也会被用到。如果同一个三维点被多个相机看到那么两条视线在三维空间里可以确定一个点这本质上是一个最小二乘问题。在可微框架里三角化可以作为网络内部的一个算子把多视图对应的特征向量聚合起来得到更稳定的三维坐标。这样一来单个视图深度估计的偏差可以被其他视图拉回来系统的鲁棒性就上去了。实测下来加了这个三角化算子的版本在远距离区域的三维端点误差能下降不少。3.3 轨迹解码与输出表示最后一个核心模块是轨迹解码器。它的职责是把网络内部累积的几何特征和匹配特征转换成最终的全像素密集三维轨迹输出。输出表示大致有两种常见路线。一种是对每一帧输出一个深度图同时每条时间轨迹都附带置信度然后通过反投影得到三维坐标序列另一种是直接回归世界坐标系下每个像素的三维坐标序列好处是表示更直接坏处是三维坐标范围很大回归难收敛。根据常见实践多数方法会采用混合策略网络主干回归深度和特征关联几何模块负责把二者融合成世界坐标系轨迹最后输出端加一个度量单位约定比如米保证结果有物理含义。轨迹的时序组织方式也需要留意。通常会按参考帧来组织选取视频中的某一帧作为参考帧参考帧上的每个像素对应一条轨迹轨迹里的每个时间步是该像素在其他帧中对应三维点的世界坐标。这种组织方式的好处是每条轨迹的起点都是当前可见的像素语义清晰也方便可视化。由于是密集输出分辨率跟输入图像一致。也就是说一张1080P的图输出就是一百多万条轨迹。这个数据量对存储和可视化都是个考验实际工程里一般会配合稀疏采样或专门的轨迹渲染器。但作为学术原型密集输出的意义在于任何下游任务需要哪条轨迹都能直接从完整结果里取不用重新跑模型。从网络到轨迹的完整链路可以概括为多帧图像经编码器获得特征跨帧注意力建立匹配同时估计深度与相机参数可微几何层把二维对应提升到世界坐标系三维点轨迹解码器按参考帧逐像素输出整段轨迹。4. 实操过程与核心环节实现4.1 数据准备视频对、深度真值和相机位姿从哪来要训练一个全像素密集三维追踪模型数据是第一道难关。你需要的不是单纯的视频而是视频加上每帧的深度真值、相机位姿真值以及像素级的跨帧对应关系。这三样缺一样监督信号就不完整。目前常见的做法是借助合成数据。合成渲染的优势在于真值要多少有多少而且完全可控相机轨迹可以随机生成物体可以按物理规律运动光照可以任意调节。很多三维感知方向的经典数据集都是这么来的。合成数据的问题在于域差真实场景的纹理、光照、遮挡模式远比合成场景复杂。一个有效的策略是先用合成数据做预训练再用少量真实数据微调同时用光度一致性损失做自监督调整。如果你手头只有真实视频没有深度和位姿也不是完全没救。可以用现成的单目深度估计模型先粗略估深度配合视觉里程计或者SLAM系统估计相机位姿再通过多视角几何做一致性筛选把置信度高的像素对作为伪标签。伪标签的噪声确实会大一些但用来做预训练或者辅助监督通常比没有强得多。数据组织上建议按片段来管理。一个片段是一段定长视频比如8帧或16帧覆盖一段连续运动。每个片段内的相机位姿、深度图、像素对应关系和轨迹真值都打包在一起。训练时随机采样这些片段既保证了时间跨度的多样性又不至于让序列太长导致显存爆炸。4.2 模型搭建一个可落地的基准结构参考下面给一个可落地的基准结构你可以把它当成起点后面再根据需求替换模块。首先是一个共享权重的2D图像编码器负责把每一帧编码为多尺度特征。编码器可以用现成的层次化结构比如带金字塔结构的网络输出多个分辨率级别的特征图。接着是跨帧匹配模块。这里建议先用可变形注意力查询是参考帧的特征位置键和值是其他帧的特征位置。如果显存允许做双向匹配参考帧查其他帧其他帧也查参考帧这样能互相补充遮挡信息。匹配模块的输出是一个视差场或者相对位移场加上一个置信度图。然后是深度和位姿头。深度头从匹配特征中回归出参考帧的视差图再转成深度位姿头预测当前相机在世界坐标系下的位姿。这里有个关键点位姿的初始化不要用随机值建议先从视觉里程计等外部方法拿一个粗位姿作为先验网络只负责学习残差精化。这样不仅收敛快还能避免局部最优。最后是几何融合层和轨迹解码器。几何融合层把参考帧深度、其他帧深度、跨帧匹配结果和相机位姿统一投影到世界坐标系生成三维点轨迹。轨迹解码器输出每条轨迹的坐标序列和置信度同时也可以输出一个可见性掩码标记每个像素在每一帧是否可见。下面是一个极简的代码骨架帮你理解数据流怎么走# 伪代码前馈式全像素密集三维追踪的数据流 def forward(video_frames, init_poses): # video_frames: [B, T, 3, H, W] # init_poses: [B, T, 4, 4] 由外部VO提供的粗位姿 feats [encoder(frame) for frame in video_frames] # 每帧多尺度特征 ref_idx T // 2 # 取中间帧作为参考帧 ref_feat feats[ref_idx] corr_field cross_frame_attention(ref_feat, feats) # 跨帧匹配 disp depth_head(corr_field) # 视差 - 深度 poses pose_head(init_poses, corr_field) # 位姿残差精化 trajectories_3d geometry_fusion(disp, poses, corr_field) # 世界坐标轨迹 visibility visibility_head(corr_field) # 逐帧可见性 return trajectories_3d, visibility, poses4.3 训练策略损失函数怎么组合才不打架全像素密集三维追踪的训练损失至少要包含三部分深度损失、匹配损失和轨迹几何损失。深度损失监督深度头输出匹配损失监督跨帧对应关系的准确性轨迹几何损失则直接监督世界坐标系下的三维轨迹。深度损失常用的是尺度不变的深度损失它不惩罚整体的尺度偏移只惩罚相对深度关系。对三维追踪来说最终关键的其实是多视角几何投影之后的三维坐标精度但训练时尺度不变损失通常更稳。匹配损失可以用对应关系上的端点误差把预测的二维对应位置和真值位置比一比。端点误差是光流领域的标准指标单位是像素能够直观反映匹配精度。轨迹几何损失是这条链路里最有意思的一环。它可以直接在世界坐标系里计算比如对比预测的三维轨迹点和真值三维点之间的欧氏距离也可以把预测轨迹投影回图像平面和真值像素对应位置再做一次二维比较。后者的好处是数值范围小、训练稳定前者的好处是和最终目标完全一致。常见做法是两者一起用用权重系数保持平衡。最后还要注意一个正则化问题。轨迹损失如果权重过大会让模型为了逼平三维坐标而忽略图像特征匹配的质量出现过拟合到训练场景尺度的倾向权重过小又会让几何约束形同虚设。我的建议是先固定深度和匹配损失把几何损失的权重从较小值慢慢调大观察验证集上的三维端点误差是否同步下降再确认最终权重。4.4 评价指标怎么选评价这类模型指标要分层次。最底层是深度指标比如绝对相对误差和深度准确率。中间层是匹配指标包括端点误差和遮挡区域的预测准确率。最高层才是轨迹指标也是最有区分度的。轨迹指标里最简单的做法是把世界坐标系下的轨迹真值和预测值对齐后算平均三维端点误差。但这里有个细节不同方法实现的尺度不一致直接比较没有意义。常见的做法是先用Umeyama对齐等方案做一次尺度与旋转对齐统一到同一参考尺度和坐标系后再计算误差。另一个更贴近实际应用的指标是轨迹成功率定义一条轨迹是否算成功要求它在至少多少比例的帧上三维端点误差小于某个阈值。这个指标把时间跨度考虑进来避免模型只把容易的短程轨迹做对、长程特征点一塌糊涂。对下游机器人应用来说成功率的参考价值往往比对平均误差更高因为它直接反映了轨迹在完整任务链上可不可用。注意光报告平均三维误差很低是不够的。一定要同时报告轨迹成功率、不同分位点的误差分布以及遮挡区域的单独误差否则你很难判断模型到底是全面靠谱还是在简单区域上刷了个漂亮平均值。4.5 工具选型与算力评估训练这类模型工程效率很重要。框架层面PyTorch依然是首选生态成熟、调试方便可变形注意力和可微几何层都有现成实现可以改。如果你对推理吞吐有硬指标TensorRT导出也可以但建议等模型结构稳定之后再导出避免反复折腾。算力方面纯从零训练一个全像素密集追踪模型显存需求很直接8帧720P输入用窗口注意力单卡A100或H100是底线。如果不具备这个条件务必要把输入分辨率降到360P并用片段长度4到6帧起步。内存带宽也很关键跨帧注意力涉及大量特征搬运数据加载器一定要用多进程预取否则GPU会经常饿着等数据。训练时间上没有统一标准但根据类似规模任务的常见实践预训练阶段通常需要几十万步才会看到轨迹指标明显收敛。如果你只有一个星期左右的算力额度建议不要从零预训练直接拿现成的单目深度预训练权重做初始化再冻结编码器训练匹配和轨迹头这样能在有限算力下快速看到一个可用的系统雏形。5. 常见问题与排查技巧实录5.1 高光与弱纹理区域匹配糊掉怎么办密集追踪最怕两类纹理高光区域和弱纹理区域。高光区域反射变化大亮度一致性假设崩得厉害弱纹理区域比如白墙、光滑路面所有像素看起来一样匹配没有区分度。常见对策有几种。第一在训练数据里刻意增加这两类场景的样本模型见过多了能学会利用边缘、阴影等次级线索。之前用纯合成数据训练时模型一上真实场景高光就跳后来在合成渲染里加入大面积高光反射表面问题缓解得很明显。第二在特征匹配阶段引入局部窗口的上下文信息不要只看单一像素让匹配决策参考周围像素的一致性。第三对弱纹理区域主动压低置信度宁可不给轨迹不要硬给一条错的。实际上下游任务很多时候更想要这里估计不了的诚实答案而不是一个自信的错误输出。5.2 大位移与快速运动跨帧匹配失效当物体在两帧之间移动了几十甚至上百像素局部窗口的匹配基本失效。多尺度特征在这种场景下能帮上忙因为高层的特征把一个大位移压到了一个小窗口内但代价是空间精度下降。结合多视角几何能进一步缓解。如果一个物体在相邻帧的观测里满足极线约束就可以把搜索范围从全图缩小到极线附近大幅降低匹配难度。这也是为什么要在网络里嵌入几何约束而不是纯靠特征匹配的原因——几何先把解空间压缩了特征才更容易找到准确对应。如果训练时发现模型在快速运动场景下轨迹跳变严重建议先检查是否存在帧间采样间隔过大的问题适当减小帧间隔或者增加中间帧可以显著提高鲁棒性。5.3 遮挡切换轨迹突然断掉遮挡是全像素密集追踪最难啃的骨头。一个像素在第5帧还看得见第6帧被别的物体挡住在第7帧又露出来模型需要判断这三帧之间的对应关系而且不能把遮挡物的轨迹和被遮挡物的轨迹串到一起去。实际操作中我会在训练时专门构造遮挡场景让合成数据里的物体频繁前后交错并且把遮挡边界的像素单独加重监督权重。推理时再配合可见性掩码对遮挡区域的轨迹做标记。如果发现模型的轨迹在被遮挡后又重新出现的区域发生了跳变很可能是跨帧注意力的感受野不够没有覆盖到重新出现的位置可以考虑扩大注意力窗口或者增加参考帧数量。5.4 长序列漂移轨迹越来越飘前馈式架构虽然避免了递归误差累积但序列长度增加时参考帧和远端帧之间的匹配关系会变得很弱轨迹依然可能漂移。这本质上是因为注意力在距离很远的两帧之间难以建立可靠的相关性。一个非常有效的工程化解法是分段拼接。把长视频切成多个互相重叠的短片段每个片段内部做密集追踪重叠区域的轨迹通过相机位姿对齐后在重叠帧做融合从而生成跨越整个视频的长轨迹。这种做法在工程上实现简单又能保证单片段内的追踪质量。我们还发现在重叠区域给轨迹融合加上置信度加权比简单平均效果好得多因为不同片段的预测在遮挡区域的置信度可能差别很大。5.5 显存爆炸与吞吐瓶颈这个模型是出了名的显存黑洞。全分辨率特征加上跨帧注意力几张1080P的图就能吃掉几十GB。工程上有几个应对手段。第一输入分辨率不要一上来就用全尺寸先用低分辨率跑通流程再用高分辨率微调。第二注意力计算可以用窗口化注意力代替全局注意力减少计算量。第三如果显存实在不够把视频片段长度从16帧降到8帧损失一点长程建模能力换回可训练性。第四开启混合精度训练实测下来显存大概能省三成速度还能快不少。遇到显存不足别急着换更大的卡。先看模型架构里有没有不必要的全分辨率特征保存再看注意力实现是否支持梯度检查点这两个地方往往是节省显存的大头。5.6 常见问题速查表为了方便排查把我上面说的问题整理成一张速查表你可以直接贴在工位旁边。现象可能原因排查方向常用解法高光区域轨迹乱跳亮度一致性假设失效检查该区域的置信度图训练数据增加高光样本、压低置信度白墙等弱纹理区域无轨迹特征区分度不足查看特征图响应引入局部上下文、边缘辅助匹配快速运动下轨迹断裂帧间位移过大检查跨帧匹配输出减小帧间隔、使用多尺度特征遮挡恢复后轨迹错位注意力感受野不足检查可见性掩码扩大注意力窗口、增加参考帧长序列末端漂移远端匹配关系弱观察分段拼接处重叠片段、置信度加权融合显存溢出特征图或注意力过大监控显存占用降分辨率、窗口注意力、混合精度6. 扩展应用密集轨迹能拿来干什么6.1 动态场景重建与编辑有了全像素密集三维轨迹动态场景重建就拥有了一个很强的运动先验。传统动态重建往往需要先把物体分割出来再做逐物体的运动估计轨迹天然把物体运动的空间连续性体现出来了可以直接拿来当运动场约束。场景编辑是另一个有意思的方向。你有一条完整的世界坐标系轨迹意味着你可以对视频里的一个动态物体做三维层面的编辑把它的运动轨迹在线修改重渲染到其他帧。这也是很多视频编辑特效背后的核心能力Track4World这类方法相当于直接把动态物体的行为变成了可操作的数据而不是一帧帧抠图调位移。6.2 机器人操作与导航对机器人来说光有深度图不够还要知道场景里哪些东西在动、怎么动才能做安全的规划和操作。全像素密集三维轨迹正好给出了稠密的运动场机器人可以据此判断哪些区域是动态障碍哪些是静态背景进而规划一条不会和移动物体碰撞的路径。拿常见的机械臂抓取场景来说物体在传送带上移动机械臂需要预测抓取点的三维轨迹才能决定何时何地下手。有了密集三维轨迹相当于直接拿到了整个场景的运动态势图抓取规划可以做得从容得多。自动驾驶里的动态障碍物预测也是类似的逻辑只不过把传送带换成了十字路口。6.3 模型的发展方向从我的实际经验看这个方向接下来值得期待的几个演进点包括长视频轨迹记忆机制的引入也就是让模型在远超当前视野的时间跨度上保持轨迹一致更高效的动态查询解码器降低密集输出的计算负担以及多模态融合结合语义信息让轨迹带上这是什么物体在动的标记。这些都是顺着前馈式密集三维追踪这条主线可以自然延伸的方向值得持续关注。我个人在实操中的体会是Track4World这类方法最有价值的地方不是单点精度提升而是把轨迹从一件需要手工后处理的事变成了网络直接输出的结构。这逼着模型真正去理解三维世界的运动规律也让我们这些做应用的终于可以像取普通深度图一样随手取一条密集的三维运动轨迹来用。如果你也在折腾类似的问题建议直接拿这套思路做基线先跑通数据流再逐步替换模块你会很快感受到它和其他方法的本质区别。
阅读完成 · 觉得有帮助?
咨询建站