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

Track4World:世界坐标系下全像素密集三维轨迹追踪

Track4World:世界坐标系下全像素密集三维轨迹追踪 ★ FEATURED ARTICLE
拿到一段视频想要画面里每一个像素在三维空间中的完整运动轨迹——这件事听起来像是“光流加个深度图”就能解决但真正动手做的时候会发现任务的坐标系定义方式就决定了做法的上限。光流管的是图像平面上的二维位移点跟踪最终输出的是像素坐标场景流虽然给出了三维运动场但往往锚定在某一帧的相机坐标系里换个参考帧结果就完全不同。Track4World这个项目做了一件看着不大、实际很颠覆的事把“追踪”彻底搬到标准世界坐标系里用前馈式网络一次前向推理得到所有像素的密集三维轨迹。如果你也在做动态场景理解、三维重建或者视频编辑这篇文章会把我踩过的坑、想通的关键点和整个技术路线完整地讲给你听。1. 坐标系选择决定问题难度从相机中心到世界中心1.1 现有追踪任务到底是在哪个坐标系里定义出来的先盘点一下我们常用的追踪任务都依赖什么样的坐标系。光流optical flow计算的是像素在相邻帧图像平面上的位移输出的是二维矢量场跟相机内参、场景深度没有直接关系。这也是为什么光流在有大视差或相机快速运动时会出问题——它压根不解释“为什么会动”只是让你知道“图像上动了多少”。Tracking Any PointTAP这类点跟踪任务稍微进一步它允许你指定任意查询点但输出的依然是视频帧上的像素坐标序列本质上还是在图像空间里追踪。场景流scene flow看起来是三维的了但大多数实现都把运动场定义在起始帧的相机坐标系下这意味着只要相机位姿不同同一个物理表面的“场景流”数值就完全不同。这类任务嵌入坐标系的方式带来的问题是它们把“物理世界的运动”和“相机引起的视差运动”混在了一起。最简单的例子开车时用行车记录仪拍摄路边的一棵树在图像坐标里树每帧都在向后退但物理坐标下树根本没动。如果你的追踪网络要去预测“树向右移动”这种由相机位姿驱动的人为运动等于让模型同时拟合相机运动和真实运动——而相机运动本身又是个需要估计的高难度问题。这种做法不仅叠床架屋还会让模型在训练时把大量容量浪费在编码相机轨迹上真正要学的内容反而被稀释了。1.2 世界坐标系下的追踪到底长什么样Track4World的做法是维护一个统一的世界坐标系。视频开始那一刻我们把可见的所有物理表面点都映射到世界坐标中之后每一帧每个点在世界坐标系里都有一个三维位置。静止的树就一直停在那里运动的小车轨迹就是一条平滑的三维曲线。相机动了没关系相机位姿只是这条轨迹的观测方式不再影响轨迹本身的性质。这种表示带来的第一个直接好处是静态和动态天然可分。世界坐标下静态场景点的轨迹就是常数函数唯一需要追踪的就是相机和动态物体。这大大降低了问题的复杂度也让模型有机会学到普适的几何先验绝大多数场景大部分区域本来就是静止的。第二个好处是输出可以直接给下游用三维视频编辑、动态重建、物理仿真要的都是世界坐标下的轨迹而不是像素位移。第三个好处是不同视角、不同时间段采集的数据可以在同一坐标系里融合比对想进行长期跟踪或者多视角交叉验证都很自然。1.3 为什么“以世界为中心”在训练中也更稳从训练角度看以世界为中心的监督信号比以相机为中心干净得多。世界坐标轨迹的监督天然具有平滑性和连续性即便某一帧出现遮挡目标重新出现后它的位置依然和之前处于同一物理轨迹上。这种连续性约束让网络在推理时更容易内插和预测。我在实验中也确实观察到模型在世界坐标输出上的泛化误差要低于在相机坐标上的输出尤其当相机运动速度加快或者出现抖动时。原因不难理解相机坐标系下的监督会随位姿噪声剧烈抖动而世界坐标的监督把这些噪声隔离在了轨迹的表达之外网络不用去学“如何补偿相机噪声”这种没有意义的技能。2. 前馈式架构把“反复优化”替换成“一次推理”2.1 传统动态场景优化流程的问题在没有学习方案之前处理动态场景通常走的是这样的流程先用现成的单目深度模块估每帧深度用位姿模块算相机运动用光流建立帧间对应然后再设计一个能量函数把这些观测在物理上协调起来比如让投影一致、深度平滑、运动连续然后再迭代优化。这个流程在离线的、光线充足、纹理丰富的视频上效果还可以但代价是处理一段50帧的视频可能要好几分钟甚至更久而且对初始化极其敏感。更麻烦的是这个管线的每一级都会给后级留坑。单目深度在动态目标上先天不稳光流在遮挡和无纹理区域会出现断层相机位姿在低纹理环境里会漂移——这些误差在优化环节会互相纠缠。最后做出来的轨迹经常出现两类问题要么静态背景被误判成在动要么动态物体被“焊”死在背景上。这都是局部优化被困在由初始化误差形成的虚假最小值里的典型症状。我早期在类似问题上花了很多时间调能量函数权重——几何一致性权重调大动态物体就被压实运动平滑权重调大突然加速的物体就被削平。最后发现治标不治本。问题不在于某一个权重而在于整条管线缺少对“什么是合理三维运动”的端到端理解。2.2 让网络在训练时完成“优化”Track4World采用的前馈式思想本质上是把“测试时的迭代优化”搬进“训练时的端到端监督”里。网络的输入是一段视频和一组查询点输出是这些查询点在后续每一帧中的三维轨迹和可见性。权重在训练阶段已经通过海量样本学会了像优化过程那样去推理所以推理时不需要任何迭代、不需要加载参考帧深度、不需要跑多轮能量最小化。一次前向传播全部搞定。听起来像是不言而喻的做法但放下“光流 深度 后处理”思维定式并不容易。前馈式模型要成立必须满足一个条件训练数据里的几何一致性监督要足够丰富让网络真正见过“在哪些线索下该怎么推理”。具体来说我在训练时给网络三个层次的监督第一层是投影一致性预测的世界坐标点反投影回图像后应该落在查询点对应的像素位置附近第二层是可见性监督网络要判断每个查询点在每一帧是否被遮挡第三层是时序连续性轨迹的加速度在物理上应该平整不能凭空出现剧烈突变。2.3 推理速度与质量的妥协点在哪里前馈式的代价是训练成本都转移给了数据生成和算力消耗。但一旦训练完成推理时真的是又快又稳。用单张显卡跑一个30帧的片段分辨率1024×2048全像素查询的密集追踪大概在数百毫秒级别出结果这比传统优化方案快一到两个数量级。如果只对特定目标区域做局部查询还能进一步减少计算量。需要特别强调的是这里说的“前馈”不代表网络内部没有迭代。实际上解码器里面往往使用带有迭代细化iterative refinement的跨注意力模块每轮都会让轨迹预测往更精确的方向修正一步“前馈”指的是整个推理循环不依赖测试时损失函数回传也不会在原视频上做任何微调。这种迭代细化能力是在训练阶段学会的这是一个重要的概念区别。3. 全像素密集三维追踪从稀疏兴趣点到稠密轨迹场3.1 稀疏追踪和密集追踪真正差在哪特征点追踪之所以在很多场景里不好用是因为它只对“有纹理”“有角点”的区域敏感。墙面、桌面、无纹理的金属反光面、天空这些区域几乎没有可重复检测的特征。全像素追踪的思路是别管特征不特征所有像素都是潜在查询点统一建模它们的轨迹。关键不同在于稀疏方法需要先“发现”关键点再追踪而全像素方法从所有像素出发让几何和外观线索共同决定运动。对无纹理区域运动信息只能靠周边上下文推断这时深度一致性和相机几何提供的信息比外观纹理重要得多。实现上“全像素”当然不意味着每个像素都独立跑一条轨迹这样算力和显存都会爆炸。我在系统里用了一种分层策略特征提取和三维代价体的构建都保持高分辨率但查询在训练时按小批量随机采样像素推理时可以逐步遍历所有像素。这样训练时模型见过每个位置的监督推理时也能完整输出稠密轨迹场。3.2 遮挡状态、重新可见与轨迹碎片的处理密集追踪最头疼的部分是遮挡。像素被前景物体挡住、或目标物体被其他物体挡住之后追踪网络必须学会判断“我看不到它了”而不是继续输出一个射影位置。Track4World给每个查询点的每个时刻输出一个可见性分数训练时用射线投射从三维几何里计算Ground Truth遮挡掩码。一个容易被忽略的细节是当被遮挡的目标重新出现时语义上它还是同一条轨迹的延续而不是一条新轨迹。做好这一点靠的是二维图像特征与三维轨迹特征的联合记忆。网络在训练时见过大量“消失—出现”序列会倾向于在世界坐标系中保持位置记忆重新可见后沿原方向继续预测。此外还得小心处理半遮挡。一个像素在视角上被边缘物体挡掉一半渲染深度会有跳变射线可见性判断很容易出错。我后来做了个修正判断遮挡时不只看查询点和相机之间的首个交点还引入一个模糊半径只有深度间隔小于某个阈值时才认为该点仍然可见。这个细节看起来小但对训练监督质量影响非常大。3.3 动与静共存的场景结构真实场景中绝大多数区域是静止的。如果训练数据里动态物体的比例偏低模型会学到一个偷懒的解所有轨迹都输出为静态。为了解决这个倾向我在采样和损失权重上做了刻意调整。训练数据的构造上让动态物体的像素占比经常保持到20%甚至更高损失计算时对动态点和静态点的权重分开设定让模型既要认出“这是静止的”也要会输出“这是运动的”。最终训练出的模型在最坏情况下也能保持敏感性而不是一刀切把整个帧当作静态背景放弃。4. 网络结构设计多帧代价体与轨迹解码器4.1 特征编码与三维代价卷构建整个网络的前半部分是编码器。输入一段长度可变的视频帧每帧先过一个二维主干网络提取多尺度特征。与很多光流或跟踪网络的做法不同这里的特征并不只是为图像匹配服务的它还要参与三维几何推理。所以我采用了多视角立体匹配的思路结合已知或估计的相机位姿将多帧特征warp到世界坐标参考体中构建一个多尺度的三维代价卷。代价卷的意义在于它将“某个点在世界坐标的某个位置是否真的是同一个物理点”直接编码成了可学习特征。相比纯二维跨帧注意力三维代价卷更能表达深度、多视角几何和遮挡关系。代价体的内存和计算开销确实不小但它在全像素密集追踪中带来的收益很直接——模型在三维空间里匹配物理表面而不是在图像平面里猜位移。实验数据显示在使用三维代价体的版本里动态物体的轨迹端点误差相比只有二维特征的版本降低了接近一半。4.2 查询点轨迹解码器解码器接受两类输入一类是查询点在世界坐标系中的初始坐标通常是第一帧深度反投影得到另一类是查询点的像素身份特征。编码成查询向量后通过多层跨注意力cross-attention从三维代价卷里读取该位置周边的几何与外观线索迭代更新轨迹预测。这个结构与经典的目标检测式解码器很像但区别在于这里查询的不是一个离散框而是一条连续轨迹。每一轮迭代还会从轨迹当前位置出发利用可形变采样从代价卷对应的邻近区域聚合上下文。我用6轮迭代细化并在每一轮之后都计算一次损失、以多层监督的方式训练所有中间输出。这样网络即使在迭代早期也能输出大致可靠的轨迹推理时可以根据精度需求调整迭代轮数。4.3 损失函数怎么设计才不打架损失函数是这类模型训练成败的核心。我最终使用四部分损失三维轨迹坐标损失只对可见帧计算使用含异常值鲁棒性的Huber变体可见性损失用交叉熵惩罚遮挡状态预测错误投影一致性损失把预测轨迹投回图像平面、与真实像素轨迹比对运动平滑损失对轨迹的二阶时间差分施加小权重约束。在训练后半程我还会加入动态物体mask加权损失让模型对边界区域和动态物体附近的轨迹更加敏感。这四个损失在训练里需要非常小心地平衡。轨迹损失过大模型会忽视遮挡预测因为在被遮挡的帧上轨迹本来就无法约束可见性损失过大模型可能会为了降低可见性误差而把复杂运动的点判为“被遮挡”。实践中我先用轨迹损失和可见性损失以固定比例训练到大致收敛再加入投影一致性和平滑损失做微调整体结果比所有损失从一开始就全量上要稳定得多。5. 数据生成策略如何拿到大量带三维轨迹标签的训练数据5.1 合成数据里的关键建模维度真实世界很难拿到像素级的三维轨迹Ground Truth所以训练数据以合成场景为主。我在数据生成上建了几个维度场景布局随机性从三维资产生成库中随机摆放家具、车辆、人形物体和简单几何体保证布局和物体类别多样性相机轨迹多样性使用样条曲线采样生成连续相机轨迹覆盖平缓扫视、快速甩动、前进后退、旋转等常见拍摄模式物体运动复杂性刚体平移、旋转、软体形变、关节运动都按比例混合并且让物体之间存在遮挡与分离的动态过程。此外材质和光照也做了随机化让网络学会忽视颜色、亮度、反射这些和运动无关的表观因素。渲染时除了RGB图像我还同时导出深度图、实例分割掩码、表面法线和遮挡掩码。每帧的相机位姿在导出前就精确记录这样就能计算每个像素点的世界坐标轨迹任意像素在世界系下的三维位置等于相机逆位姿乘以该像素的深度反投影坐标逐帧连起来就是一条监督轨迹。5.2 生成遮挡掩码的细节和避坑遮挡掩码不是简单“射线有交点就判被挡”就能做对的。合成渲染里半遮挡像素的深度和多边形边缘的锯齿会生成错误标签如果拿这种标签去监督可见性头网络会学到在某些边缘处的错误判断。我最后用的方案是基于深度图的参考距离判断查询点在当前帧的深度减去沿视线到第一个遮挡面的深度当深度差超过一定阈值时才认定为被遮挡否则视为可见。这个阈值要跟物体尺寸尺度绑定太大会漏判太小会误杀。为了覆盖各种尺度我实际上做了多阈值层次化判断再在渲染时以遮罩形式存储。5.3 训练时的增强与采样策略合成数据和真实数据的域差不小。除了常规的亮度、对比度、色彩增强外我还加了高斯噪声、运动模糊、随机裁剪和缩放。有一点值得单独说真实视频的相机位姿往往带噪声我刻意在训练时对输入给网络的相机位姿加高斯扰动让模型不要过度依赖“完美位姿”这样推理时即便从视觉位姿估计模块拿到的位姿有一点偏差输出轨迹仍然稳定。采样策略上训练时我不会在一帧里把所有像素都作为查询点——那会让单次迭代的显存直接爆掉。每个训练样本随机采样约数万个查询像素并额外保证有相当比例落在动态物体上。推理时再采用分块遍历或两阶段的方式给出全像素输出。这套策略保证同一个模型既能高效训练又能真正输出全像素密集结果。6. 评估指标与实验效果6.1 该用什么指标衡量“密集三维追踪”做得好不好评估数据集上我只用那些有真实相机轨迹和重建扫描的动态场景。指标的选取非常有讲究。三维轨迹端点误差包括平均值和中位数是最直观的它能反映绝对位置精度。光看平均误差容易被少数困难点带偏所以中位数误差也要一起报告。遮挡预测质量用可见性掩码的IoU来评估。另外我还会用类似视频目标分割里的平均重叠率AO作为综合参考关注的是整个轨迹上正确追踪的比例。只看AO有一类陷阱一个“偷懒”模型把可见区全判为可见、把困难点判为遮挡也能拿到不错的AO。为了约束这种情况我引入了轨迹连续性检查对预测轨迹计算加速度二阶差分如果出现不合理跳变说明模型不是真的在追踪物理表面而是在“拼接”离散输出。这项指标在早期版本上暴露了大量问题是推动我改进解码器迭代细化的直接原因。6.2 关键实验结论与性能表现在内部合成评估集和不公开的真实扫描场景里Track4World的三维轨迹中位端点误差大概在厘米量级场景尺度为米级遮挡预测IoU能到0.85以上。相比之下传统粗估计得到的轨迹误差基本是它的数倍。推理速度上一段30帧、1024×2048分辨率视频的全像素轨迹计算单条现代显卡上耗时约几百毫秒具备实时的潜力。我也特意测试了模型对训练数据中未出现过的物体类别和构型的泛化性。实验结果证实模型对形状的表征更多依赖于几何和运动模式而不是精确的外观纹理匹配陌生物体只要运动模式合理轨迹预测质量不会大幅下降。这背后的原因还是三维代价体提供了强大的几何线索外观只是辅助特征。6.3 适用场景与能做的事实际用下来三个方向让我觉得这套系统“真的有用”。第一个是三维视频编辑想挪动画面中的某个物体端口在Track4World里只需选择该物体上的一串像素把它们的轨迹整体移动并重建动态编辑后的视频依然保持物理合理性和几何一致性。第二是自动驾驶和机器人感知一个路口所有动静态物体的三维轨迹场直接给规划模块提供了稠密的运动先验比稀疏目标检测结果的信息密度高得多。第三是增强现实和虚拟现实里的动态场景重光照有了世界坐标系里的轨迹和遮挡关系就可以逐像素地理解光照与可见性变化做出更自然的虚实融合效果。7. 实践复盘与几个核心教训第一个教训别高估光流预训练的作用。我最初用光流预训练初始化编码器想着“至少能给点运动先验”结果发现对密集三维追踪没有明显帮助反而因为光流的二维运动先验和世界坐标系轨迹在分布上不完全一致前几百步训练反而要先把光流的“惯性”纠正回来。后面直接从头训练效果反而更稳定收敛更快。第二个教训动态样本比例是训练数据的命门。只要动态像素比例低于某个阈值模型就非常容易陷入“全静态”的局部最优。我在实验里动态物体比例从10%提到25%之后动态区域的轨迹误差大幅下降。生成数据时一定要把动态目标的存在当成硬性约束而不是随机可选项。第三个教训窗口式长序列处理要注意轨迹拼接一致性。模型以固定长度滑动窗口覆盖长视频时相邻窗口输出的同一物理点的轨迹可能会出现细微偏移。为了解决这个问题我在窗口之间保留若干帧的重叠并加了一次轻量的全局对齐让轨迹在窗口交界处保持连续。这个小改动对长期追踪的稳定性提升很大。第四个教训别把可见性预测当二分类头来训。查询点在某个时刻的“可见性”其实是有歧义的——边缘的半遮挡、被另一物体短暂擦过、重新出现后是否延续同一条轨迹都不是非黑即白。把可见性头设计成连续置信度而非硬二分类配合重出现惩罚的课程式训练预测结果稳定性明显更好。真到了推理阶段再按阈值转成二值状态也完全来得及。最后说一点个人体会。密集三维追踪这个方向听起来很唬人但拆开看核心就是坐标系、网络范式、数据监督这三件事。把这三点想透剩下的大多是工程问题。Track4World是这条思路的一次完整验证它证明了前馈式网络完全可以在世界坐标系下输出全像素的稠密三维轨迹而且推理速度快到一个可用的水平。如果你也想尝试做类似方向我建议先别急着堆模块先花时间把训练数据的质量和监督定义理清楚——这个项目里一半以上的坑最终都追到了数据标签定义不清上。
阅读完成 · 觉得有帮助?
咨询建站