1. 从二维到三维目标跟踪的维度跃迁与核心痛点做过视觉跟踪的人都有一个共识二维框跟踪已经卷到天花板了。从最早的核相关滤波到后来的孪生网络系列再到大伙儿一窝蜂上的Transformer架构二维平面上的精度提升已经进入小数点后两位的拉锯战。但真实世界是三维的自动驾驶要判断前车距离机械臂要抓取运动中的零件无人机要绕开移动障碍物——这些场景里一个二维边界框根本不够用你需要知道目标在三维空间中的位置、朝向和尺寸。这就是3D目标跟踪要解决的问题。而3D孪生跟踪顾名思义是把孪生网络那套“模板匹配”的思路搬到三维空间里来。听起来很直接二维里用RGB图像块做互相关三维里用点云块做互相关不就完了但实际操作过点云数据的人都知道这里有个绕不开的坎——点云的稀疏性和不完整性。激光雷达扫一圈近处目标可能有个几百上千个点远处目标可能就剩下十几个点再远一点直接变成个位数。更麻烦的是遮挡一个行人被车挡住半边身子点云就只剩半边轮廓。这种数据丢给网络它连目标完整形状都看不出来你让它怎么在后续帧里做精确匹配这就好比让你拿一张被撕掉一半的照片去人群里找人难度可想而知。这篇论文的核心思路就是冲着这个痛点去的在跟踪过程中同步做形状补全。不是先补全再跟踪也不是先跟踪再补全而是把这两个任务揉进一个孪生网络框架里联合优化。跟踪需要形状信息来提升匹配精度形状补全需要跟踪提供的时序信息来约束补全结果两者互相促进。这个思路在逻辑上非常自洽也是我认为这篇工作最有价值的地方。适合谁看这篇内容如果你正在做自动驾驶感知、机器人抓取、人机交互相关的项目或者你单纯对三维视觉中的孪生网络架构感兴趣那这篇论文的思路和实现细节都值得仔细拆解。即便你不做3D跟踪这种“主任务辅助任务联合优化”的架构设计思路在很多视觉任务里都能迁移使用。2. 核心架构拆解形状补全与孪生跟踪如何联姻2.1 整体网络结构的设计哲学先看整体框架。输入是两帧点云数据模板帧和搜索帧。模板帧里包含已知的目标点云块搜索帧是当前帧里可能包含目标的区域。传统3D孪生跟踪的做法是分别对这两个点云块做特征提取然后在特征空间做互相关找到响应最大的位置作为目标位置。这篇论文在这个基础上加了一条支路形状补全校验支路。具体来说模板帧的点云块先经过一个形状补全网络生成一个完整的、稠密的目标形状表示。这个完整形状有两个用途一是作为模板特征的一部分参与互相关计算二是用来评估搜索帧中候选区域的形状完整性作为跟踪置信度的一个参考维度。为什么这么设计因为点云跟踪最大的问题就是模板本身就不完整。如果模板帧里目标被遮挡了你拿一个残缺的模板去匹配匹配结果自然不可靠。先补全模板相当于把“参考答案”先修正一遍再去批改“学生作业”准确率自然提升。2.2 形状补全网络的选择与考量形状补全这个任务本身在三维视觉领域已经有不少成熟方案。常见的有基于体素的3D卷积编解码结构、基于点的PointNet系列变体、以及基于隐式函数的Occupancy Network思路。这篇论文选择的是基于体素的编解码结构原因很实际体素表示和后续的孪生网络特征提取在数据结构上更容易衔接而且体素化的点云可以直接用3D卷积处理工程实现上更成熟。具体来说模板点云首先被体素化到一个固定分辨率的网格中比如32×32×32或者64×64×64。这个分辨率的选择是个权衡分辨率太高计算量爆炸显存吃不消分辨率太低形状细节丢失严重补全出来的东西跟真实形状差太远。论文里用的是32×32×32这个分辨率在精度和效率之间取得了不错的平衡。编码器是一系列3D卷积层逐步下采样提取全局特征。解码器则是反卷积层逐步上采样恢复空间分辨率。关键的地方在于跳跃连接编码器中间层的特征被直接拼接到解码器对应层这样既保留了全局语义信息又保留了局部几何细节。这个结构和U-Net非常像本质上就是三维版本的U-Net。实操提示如果你自己要复现这个结构体素分辨率不要一上来就设太高。我试过64×64×64的配置单帧推理时间直接翻了三倍但精度提升不到两个百分点。32×32×32是性价比最高的选择除非你的目标特别小或者形状特别复杂。2.3 孪生网络的互相关机制在三维中的适配二维孪生网络里的互相关操作是在特征图上做滑窗卷积本质上是计算模板特征和搜索区域特征的相似度。到了三维这个操作变成在三维特征体上做滑窗计算量直接立方级增长。所以论文里没有直接在原始分辨率上做互相关而是先对特征体做了降采样。具体流程是模板点云经过形状补全后和原始模板点云一起送入特征提取网络得到一个模板特征体。搜索帧点云同样经过特征提取网络得到搜索特征体。两个特征体在通道维度上做互相关得到一个三维响应图。响应图中最大值的位置就是目标在搜索帧中的三维位置。这里有个细节值得注意模板特征融合了补全后的形状信息。也就是说参与互相关的模板特征不是单纯从原始稀疏点云提取的而是包含了补全网络推断出的完整形状信息。这是整个方法的核心创新点也是性能提升的主要来源。2.4 损失函数的设计与联合优化训练这个网络需要同时优化两个任务形状补全和跟踪定位。形状补全用的是什么损失论文里用的是体素级别的二元交叉熵损失每个体素预测是否被占用和真实完整形状的体素标签做对比。这个选择很标准没什么好说的。跟踪定位的损失用的是响应图上的分类损失把目标位置作为正样本其他位置作为负样本用focal loss或者交叉熵来训练。这里的关键是两个损失的权重分配。如果形状补全损失权重太大网络会偏向于把形状补全做好但跟踪精度上不去反过来如果跟踪损失权重太大形状补全就变成了摆设起不到辅助作用。论文里通过实验确定了一个权重比例大概是形状补全损失占0.3跟踪损失占0.7。这个比例不是绝对的取决于你的数据集和任务侧重点。如果你的应用场景特别依赖形状信息比如抓取任务需要精确估计目标尺寸那可以适当提高形状补全的权重。踩坑记录我一开始把两个损失设成1:1结果网络训练到中期就开始震荡跟踪精度忽高忽低。后来把形状补全权重降到0.3训练立刻稳定了。辅助任务就是辅助任务不能喧宾夺主。3. 实操复现从数据准备到模型训练的全流程3.1 数据集选择与预处理要点要做3D跟踪数据集的选择很关键。目前主流的3D跟踪数据集有KITTI、nuScenes、Waymo Open Dataset这几个。KITTI是最经典的虽然规模不大但标注质量高适合做算法验证。nuScenes数据量更大场景更丰富但标注噪声也相对多一些。数据预处理的第一步是点云对齐。激光雷达和相机之间的外参标定必须准确否则你拿到的点云和图像对不上后续所有工作都是白搭。KITTI数据集提供了标定文件直接读取使用即可。如果是自己采集的数据建议用棋盘格或者专门标定板做一次精细标定。第二步是目标点云块提取。根据标注框的位置从整帧点云中把目标周围的点云裁剪出来。这里有个细节裁剪范围不要刚好卡在标注框边界上要往外扩一点比如扩1.2倍。因为标注框有时候会偏紧如果刚好卡边界目标边缘的点会被切掉影响形状补全的效果。第三步是体素化。把裁剪出来的点云块转换到体素网格中。体素化的分辨率要和网络输入分辨率一致比如32×32×32。体素化的具体操作是对每个体素如果里面有点就标记为占用否则标记为空。这里可以用PyTorch3D或者Open3D提供的体素化函数也可以自己写逻辑很简单。3.2 形状补全网络的训练细节形状补全网络可以单独预训练也可以和跟踪网络联合训练。论文里采用的是联合训练策略但形状补全网络在训练初期会有一个预热阶段先用形状补全损失单独训练几轮让网络先学会补全的基本能力然后再加入跟踪损失一起优化。这个预热策略很实用。如果一上来就联合训练形状补全网络还没学会补全输出的形状乱七八糟反而会干扰跟踪特征的学习。预热几轮之后形状补全网络有了基本的补全能力再联合优化两个任务就能互相促进了。学习率方面初始学习率设0.001用Adam优化器。训练过程中如果验证集损失连续5轮不下降学习率减半。这个策略很常规但确实有效。Batch size根据显存来定32×32×32的体素输入batch size设16或者32都可以显存占用大概在8G到12G之间。3.3 跟踪推理阶段的完整流程推理阶段和训练阶段略有不同。训练时我们有完整的标注信息知道目标在搜索帧中的真实位置。推理时我们不知道需要通过互相关响应图来推断。具体流程是这样的首先根据上一帧的目标位置在当前帧中裁剪出一个搜索区域。搜索区域的大小通常是模板的2到3倍这样既能覆盖目标的移动范围又不会引入太多背景干扰。然后对搜索区域点云做体素化送入特征提取网络。同时模板点云经过形状补全网络和特征提取网络得到模板特征。两个特征做互相关得到响应图。响应图中最大值的位置就是目标在当前帧中的位置。这里有个工程上的小技巧响应图平滑。直接取最大值有时候会跳变因为点云的稀疏性会导致响应图有噪声。可以对响应图做一个高斯平滑再取最大值这样跟踪轨迹会更平滑。高斯核的大小根据目标移动速度来定移动快就用小核移动慢就用大核。3.4 关键参数配置速查表参数名称推荐值说明体素分辨率32×32×32精度与效率的平衡点模板尺寸1.0m×1.0m×1.0m根据目标实际尺寸调整搜索区域倍数2.5倍覆盖目标移动范围初始学习率0.001Adam优化器学习率衰减5轮不降减半验证集监控形状补全损失权重0.3辅助任务权重跟踪损失权重0.7主任务权重Batch size16-32根据显存调整预热轮数5-10轮形状补全单独训练注意模板尺寸不是固定的要根据你的目标类型来调整。跟踪汽车和跟踪行人的模板尺寸肯定不一样。建议先统计一下数据集中目标尺寸的分布取中位数作为模板尺寸的参考。4. 常见问题与排查技巧实录4.1 形状补全效果差导致跟踪漂移这是最常见的问题。表现是跟踪框在几帧之后开始偏移逐渐跟丢目标。排查思路是先把形状补全网络的输出可视化出来看看补全出来的形状是不是合理。如果补全出来的形状跟真实形状差太远那跟踪漂移就是必然的。解决方法有几个方向。第一检查体素化参数是否合理。如果体素分辨率太低形状细节丢失严重补全网络再厉害也补不出细节。第二检查形状补全网络的容量是否足够。如果网络太浅表达能力不够补全效果自然差。可以适当加深编码器和解码器但要注意计算量。第三检查训练数据中是否包含足够多的遮挡样本。如果训练数据里目标都是完整可见的网络没见过遮挡情况推理时遇到遮挡就懵了。4.2 互相关响应图出现多峰响应图出现多个峰值说明网络在多个位置都检测到了类似目标的东西。这种情况通常发生在背景中有和目标任务相似的物体时。比如跟踪一辆白色轿车背景里还有另一辆白色轿车响应图就会出现两个峰。解决思路是引入形状一致性约束。在响应图上不仅看响应值大小还要看对应位置的形状补全结果和模板形状的相似度。两个峰里哪个位置的形状和模板更一致就选哪个。这个约束在论文里是通过形状补全支路隐式实现的但如果你自己实现可以显式地加一个形状相似度评分。4.3 训练损失震荡不收敛训练损失震荡通常有几个原因。第一学习率太大。可以先把学习率降到0.0001试试如果损失稳定下降说明就是学习率的问题。第二两个损失的权重比例不合适。前面说过形状补全损失权重太高会导致震荡可以试着降低辅助任务的权重。第三Batch size太小。如果Batch size只有4或者8梯度估计的方差会很大损失自然震荡。在显存允许的情况下尽量把Batch size设大一些。4.4 推理速度达不到实时3D跟踪的推理速度是个硬指标自动驾驶场景下至少要达到10FPS才有实用价值。如果推理速度太慢可以从几个方面优化。第一降低体素分辨率。从64×64×64降到32×32×32推理速度能提升三倍左右。第二减少互相关操作的通道数。特征提取网络的最后一层通道数可以从256降到128精度损失不大但速度提升明显。第三用TensorRT或者ONNX Runtime做推理加速。这些工具能对网络做算子融合和量化推理速度能提升两到三倍。4.5 常见问题速查表问题现象可能原因排查方法解决措施跟踪漂移形状补全效果差可视化补全结果提高体素分辨率、加深网络响应图多峰背景相似目标干扰检查响应图分布引入形状一致性约束损失震荡学习率过大/权重失衡监控损失曲线降低学习率、调整权重推理慢体素分辨率高/通道数多测各层耗时降分辨率、减通道、推理加速跟丢目标搜索区域太小检查目标移动范围扩大搜索区域倍数形状补全模糊训练数据不足检查数据量数据增强、增加遮挡样本5. 个人实操体会与扩展思路这个方案我在一个机械臂抓取项目里实际跑过。场景是传送带上随机摆放的零件零件之间有遮挡点云质量也一般。直接用原始点云做跟踪成功率大概在六成左右加上形状补全之后成功率提到了八成五。提升主要来自遮挡场景目标被挡住一半的时候形状补全网络能根据可见部分推断出完整形状跟踪就不会因为点云缺失而漂移。不过有个问题值得注意形状补全网络推断出的形状是“合理猜测”不是真实形状。如果目标形状变化很大比如跟踪一个正在变形的物体补全网络可能会补出一个错误的形状反而误导跟踪。这种情况下形状补全的权重就要调低或者干脆关掉补全支路只用原始点云做跟踪。后续扩展的话我觉得有几个方向可以尝试。一是把形状补全换成隐式函数表示比如Occupancy Network或者DeepSDF这样补全出来的形状更精细不受体素分辨率的限制。二是引入时序信息用多帧点云一起做补全比单帧补全更准确。三是把跟踪和补全做成端到端的在线学习跟踪过程中不断用新观测到的点云更新形状模型适应目标形状的变化。最后分享一个小技巧如果你的计算资源有限跑不动完整的联合训练可以先用公开数据集预训练一个形状补全网络然后冻结补全网络的参数只训练跟踪部分。这样训练速度快很多精度损失也不大。等跟踪部分收敛了再解冻补全网络做微调。这个策略在工程上很实用能省不少时间和显卡。
阅读完成 · 觉得有帮助?