ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从二维到三维:自动驾驶三维目标检测的跨维学习方法与工程实践

从二维到三维:自动驾驶三维目标检测的跨维学习方法与工程实践 自动驾驶感知圈子里有个老生常谈的争论激光雷达点云方案和纯视觉方案到底哪条路才是正解。激光雷达派觉得点云天生带深度信息做三维检测是顺水推舟纯视觉派则坚持摄像头成本低、分辨率高、语义信息丰富只要算法够强二维图像一样能推出三维结构。我做了几年感知算法落地越来越觉得这个争论本身有点跑偏——真正在工程里卡脖子的往往不是用哪种传感器而是怎么把二维里学到的东西高效地迁移到三维空间去。这篇就围绕从二维提升到三维的学习方法这个思路聊聊它在自动驾驶三维目标检测里到底怎么落地、为什么值得认真对待以及实操中那些文档里不会写的坑。1. 为什么从二维升到三维是条值得走的路1.1 纯三维检测的尴尬数据贵、标注慢、样本少先说清楚背景。三维目标检测的任务是在三维空间里给出目标的类别、位置通常是中心点坐标、尺寸长宽高和朝向角。激光雷达点云做这件事很直接点本身就有xyz坐标网络学的是如何在三维体素或柱体里找目标。但问题在于这套流程对数据的要求极高。一个典型的三维标注流程是这样的标注员在点云可视化工具里先框出一个粗略的三维框然后逐面调整长宽高再旋转朝向角对齐车头方向。一个熟练标注员标一辆车大概要几十秒到一分钟一帧场景里如果有几十个目标单帧成本就上去了。相比之下二维图像上画个矩形框几秒钟搞定而且二维标注工具成熟、标注员培训成本低、众包平台上一抓一大把。这就导致一个现实二维图像数据的规模和获取速度远远超过三维点云数据。公开的二维检测数据集动辄几十万上百万张图而三维检测数据集往往只有几万帧且采集场景有限。数据量上的差距直接决定了模型泛化能力的上限。1.2 二维预训练模型是一座现成的富矿过去几年二维视觉领域积累了海量的预训练模型。在ImageNet、COCO这些大规模数据上训练出来的骨干网络已经学到了非常强的特征提取能力——边缘、纹理、部件、语义层次分明。这些能力不是凭空来的是靠海量数据和算力堆出来的。如果做三维检测时从零开始训练一个三维骨干网络等于把这些已经学好的视觉先验全部扔掉重新在有限的三维数据上摸索。这在小数据集上几乎必然过拟合泛化能力堪忧。而从二维提升到三维的核心动机就是把这批二维预训练权重利用起来让三维检测站在二维视觉的肩膀上。我自己的经验是在一个只有几千帧的三维检测任务上用二维预训练骨干初始化比随机初始化的收敛速度快将近一倍最终mAP也能高出好几个点。这个差距在小数据集上尤其明显。1.3 提升这个词到底指什么需要澄清一个容易混淆的点。从二维提升到三维不是简单地把二维检测框拉伸成三维框也不是把二维坐标硬塞一个深度值。它指的是一套学习方法利用二维图像上学到的特征表示、网络结构或监督信号来辅助三维检测网络的学习。具体来说可以分成几个层次特征层面的提升用二维骨干网络提取图像特征再通过某种映射把它投影或融合到三维空间作为三维检测的输入或辅助特征。监督层面的提升用二维检测的标注框、类别作为额外的监督信号约束三维网络的学习比如让三维框在图像平面的投影和二维框对齐。结构层面的提升把二维检测里验证有效的网络模块如FPN、注意力机制迁移到三维网络设计中。理解了这三个层次后面看具体方法就不会迷糊。2. 二维特征怎么搬进三维空间2.1 相机-激光雷达标定一切融合的前提只要涉及二维和三维的联合标定就是绕不开的第一道坎。相机和激光雷达之间的外参旋转和平移以及相机的内参决定了图像像素和三维点之间的对应关系。这个关系不准确后面所有的特征融合都是错的。标定这件事理论上很成熟实操上很折磨。常见的做法是让车在标定场地里走特定轨迹用标定板或特定目标同时被相机和激光雷达看到然后求解外参。但实际路上跑一段时间后震动、温度变化都会让外参发生微小漂移。我遇到过外参偏了0.5度导致投影到图像上的点云整体偏移十几个像素融合特征直接错位检测精度掉得很难看。提示外参标定不要只做一次就完事。建议在数据采集流程里加入定期标定校验或者用在线标定方法做补偿。哪怕只是每隔一段时间用一段直行场景做一次粗略校验也能避免大问题。2.2 投影式融合把点云投到图像上取特征最直观的做法是投影式融合。对每个三维点用标定参数算出它在图像上的像素坐标然后从图像特征图上采样出对应的特征向量拼接到这个点的特征上。这样每个点既有几何信息xyz又有图像语义信息。这个思路的代表性工作是PointPainting这类方法先跑一个二维语义分割网络把图像上每个像素的类别车、人、路等算出来然后把点云投影到图像上给每个点涂上对应的语义标签再送入三维检测网络。相当于用二维的语义信息给三维点云做了增强。实操中要注意几个细节投影时的遮挡问题一个三维点投影到图像上可能落在被遮挡的区域取到的特征其实是前面物体的。严格做法是做可见性判断但计算量大。工程上常用近似只取投影落在图像范围内的点遮挡靠网络自己学。特征图分辨率如果图像特征图下采样太狠投影采样会丢失细节。一般用较高分辨率的特征图如原图的1/4做采样。多相机拼接量产车往往有多个相机需要把点云投影到各个相机图像上分别取特征再融合。这里要处理好相机之间的重叠区域和边界。2.3 深度估计式提升从图像直接推三维另一条路是让二维网络直接预测深度再结合相机内参把图像像素反投影到三维空间形成伪点云或深度图然后在这个基础上做三维检测。这类方法的好处是不依赖激光雷达纯视觉就能跑。但深度估计的精度是命门。单目深度估计在远距离和弱纹理区域误差很大而自动驾驶恰恰对远距离目标的深度精度要求高。我试过用单目深度做前向车辆测距近距离20米内还行超过50米误差就奔着几米去了做检测框回归根本不够用。所以纯视觉的深度提升方案通常要配合时序信息多帧或双目/多目几何约束来提升深度质量。如果车上有激光雷达那更常见的做法是用激光雷达的稀疏深度去监督和校正图像深度估计形成一个互补。2.4 三种提升路径的对比提升路径依赖传感器优点主要短板适用场景投影式融合相机激光雷达语义信息直接注入点云实现相对简单依赖标定精度遮挡处理麻烦有激光雷达的量产/测试车深度估计式纯相机或多目成本低不依赖激光雷达远距离深度精度差纯视觉方案、成本敏感场景特征级融合相机激光雷达信息保留最完整精度上限高网络结构复杂训练难度大追求高精度的研发阶段选哪条路取决于你的传感器配置和精度要求。有激光雷达且追求精度投影式融合是性价比最高的起点纯视觉方案深度估计式是必经之路但要接受精度上的妥协。3. 监督信号层面的提升让二维标注管三维学习3.1 二维框和三维框的几何一致性约束二维标注便宜三维标注贵。一个自然的想法是能不能用大量的二维标注去辅助三维网络的学习答案是能通过几何一致性约束。核心逻辑是这样的一个三维检测框投影到图像平面上应该和该目标的二维检测框高度重合。如果三维框投影下来和二维框对不上说明三维框的位置或尺寸有问题。于是可以设计一个损失函数惩罚三维框投影和二维框之间的偏差。这个约束在训练时特别有用。当三维标注稀疏时大量只有二维标注的帧也能参与训练提供监督信号。我做过一个实验只用三维标注训练和三维标注加二维一致性约束训练后者在验证集上的朝向角误差明显更小。原因是二维框对目标的水平位置和宽度有很强的约束能反过来纠正三维框的横向偏移。3.2 用二维检测结果做伪标签更进一步可以用一个成熟的二维检测器在无三维标注的帧上跑出二维框作为伪标签再配合几何约束去训练三维网络。这就是自训练self-training的思路。实操中要注意伪标签的质量控制。二维检测器也会有漏检和误检如果伪标签噪声太大反而会带偏三维网络。我的做法是只保留置信度高于某个阈值的二维检测框作为伪标签。对伪标签做类别平衡避免某一类目标过多主导训练。用一致性检查过滤如果同一目标在连续多帧的伪标签位置跳变很大就丢弃。这套流程跑下来能在不增加标注成本的前提下把三维检测的召回率提升几个百分点。代价是训练流程变复杂需要维护一个二维检测器的推理环节。3.3 跨模态对比学习让二维和三维特征对齐还有一个更时髦的思路是对比学习。核心思想是同一个目标它在图像里提取的特征和它在点云里提取的特征应该在特征空间里靠近不同目标的特征应该远离。通过这种方式让二维和三维的特征表示对齐从而把二维学到的判别能力迁移到三维。这类方法在论文里效果不错但工程落地时对batch size和负样本采样很敏感。batch太小负样本不够对比学习的效果出不来batch太大显存吃不消。我一般会在特征维度上做降维再用动量编码器来稳定训练这样能在有限显存下把batch撑大一些。4. 网络结构层面的迁移二维模块在三维里的改装4.1 FPN思想在三维特征金字塔上的复用二维检测里FPN特征金字塔网络是标配用来处理多尺度目标。三维检测同样面临尺度问题近处的车和远处的车在点云里占据的空间差异巨大。直接把FPN的结构搬过来在三维特征图上做自顶向下的融合是很多三维检测器的标准做法。但三维的下采样和二维不一样。二维是池化或步长卷积三维常用的是体素化加稀疏卷积。稀疏卷积的好处是只对非空体素计算效率高坏处是实现复杂调参麻烦。我在用稀疏卷积做FPN时踩过一个坑上采样时如果直接对稀疏特征做插值会引入大量原本不存在的空体素导致显存暴涨。后来改成只在有特征的体素位置做上采样才把显存压下来。4.2 注意力机制从二维到三维的适配注意力机制在二维视觉里已经被验证得非常充分从通道注意力到空间注意力各种变体层出不穷。搬到三维里最直接的是通道注意力——因为通道维度在二维和三维里含义一致都是特征通道。空间注意力则需要重新设计因为三维空间比二维多了一个维度计算量是立方级增长。我的经验是三维检测里优先用通道注意力和轻量的空间注意力比如只在BEV俯视图平面上做全三维的空间注意力计算代价太高收益不成正比。除非你的场景对精度要求极高且有充足算力否则没必要上全三维注意力。4.3 骨干网络的初始化策略前面提到用二维预训练权重初始化三维骨干具体怎么初始化是有讲究的。三维骨干和二维骨干的结构往往不完全一样不能直接整网加载权重。常见的做法是对结构相同的层如卷积层直接加载二维预训练权重。对三维特有的层如处理高度维度的层用二维权重做扩展初始化比如在高度维度上复制或平均。对全新的层用标准初始化如Kaiming初始化。这里有个细节二维卷积核是k×k三维是k×k×k。把二维核扩展到三维一种做法是在高度维度上复制k次再除以k做归一化保持激活值量级一致。我对比过复制和随机初始化前者收敛更稳尤其在训练初期。5. 实操中那些绕不开的坑5.1 标定误差的累积效应前面提过标定这里展开说误差累积。假设相机内参有1个像素的误差外参有0.1度的旋转误差单看都不大。但当目标在50米外时0.1度对应的横向偏差是50×tan(0.1°)≈8.7厘米加上像素误差投影到远处的放大最终三维位置误差可能到十几厘米。对于检测任务这个误差还能忍但如果下游要做测距或规划就危险了。所以做融合检测时标定精度要按最远检测距离来要求而不是按近处。我一般会把标定误差控制在目标检测距离对应的可接受范围内再留一倍余量。5.2 训练时的模态丢失问题多模态融合网络有个隐蔽的坑训练时两个模态都在网络可能过度依赖其中一个模态。比如激光雷达信息强网络就懒得学图像特征。一旦测试时某个模态出问题相机过曝、激光雷达被遮挡性能断崖式下跌。解决办法是训练时做模态随机丢弃modality dropout以一定概率把某个模态的特征置零强迫网络学会在单模态下也能工作。这个技巧在量产落地时特别重要因为实车环境里传感器失效是常态。5.3 数据不平衡与长尾类别自动驾驶数据里车、人、骑行者这些常见类别样本多而像工程车、特殊车辆这些长尾类别样本极少。三维检测里长尾问题比二维更严重因为三维标注本身就少分到长尾类上就更可怜了。我常用的应对手段重采样对含长尾类别的帧提高采样概率。损失加权给长尾类别更高的分类损失权重。数据增强对长尾类目标做复制粘贴增强把目标粘贴到不同场景的点云里。这里要注意粘贴时的遮挡和地面一致性否则会引入不真实的样本。5.4 评估指标的选择陷阱三维检测的评估指标常见的有3D IoU和BEV IoU。3D IoU对高度敏感BEV IoU只看俯视投影。如果任务更关注平面位置比如前向碰撞预警BEV IoU更合适如果关注完整三维框比如机械臂抓取3D IoU更合适。我见过有人用BEV IoU调参结果模型在高度方向上一塌糊涂换到3D IoU评估时原形毕露。所以评估指标要和下游任务对齐别只看一个数字好看。6. 一个可复现的最小实践路径6.1 环境与数据准备如果你想自己动手验证从二维提升到三维的效果我建议从投影式融合入手因为它的依赖最少、最容易看到效果。需要准备一份带相机和激光雷达标定参数的数据KITTI、nuScenes这类公开数据集都行。一个在COCO或ImageNet上预训练好的二维骨干网络。一个基础的三维检测框架如基于PointPillars或VoxelNet的实现。6.2 分步实现第一步跑通基础三维检测。先不加任何二维信息用点云训练一个基线模型记录mAP。这是你的对照基准。第二步加入二维语义分割。用一个预训练的二维分割网络对每帧图像做推理得到逐像素类别。第三步做投影融合。用标定参数把点云投影到图像上给每个点附上对应的语义类别作为额外特征维度拼接到点特征里。第四步重新训练三维检测网络对比mAP变化。正常情况下你会看到明显的提升尤其是对远处小目标和被部分遮挡的目标。第五步做消融实验。分别去掉语义特征、去掉投影看性能变化确认提升确实来自二维信息的注入而不是其他因素。6.3 预期结果与调参建议根据我的经验投影式融合在KITTI这类数据集上相比纯点云基线mAP能提升3到8个点具体取决于基线强弱和融合细节。调参时重点关注语义特征的编码方式用one-hot还是embedding维度多少。融合位置是在点特征输入层融合还是在网络中间层融合。学习率加入新特征后学习率可能需要适当调小避免破坏预训练权重。注意不要指望一次调参就到位。融合网络的超参比单模态网络更敏感建议用较小的学习率做warmup观察loss曲线再决定后续策略。7. 我对这条技术路线的一点判断做了几年下来我的体会是从二维提升到三维不是一个具体的算法而是一类方法论。它的价值在于承认一个现实三维数据永远比二维数据稀缺与其在有限的三维数据上死磕不如想办法把二维领域积累的红利引过来。但也要清醒地看到它的边界。二维信息能补语义、补纹理、补水平位置的约束但补不了精确的深度和高度。所以这条路线最适合的场景是有一定三维数据打底、但希望用二维信息进一步提升精度和泛化能力的情况。如果你的三维数据本身就极少那可能先解决数据问题比研究融合方法更实际。另外融合方法越复杂工程落地的维护成本越高。标定、同步、多模态失效处理每一项都是实打实的工作量。选方案时要把这些隐性成本算进去别只看论文里的mAP数字。我见过太多在数据集上刷得很漂亮、一上实车就各种问题的方案根子往往不在算法而在这些工程细节没处理好。最后分享一个我常用的排查思路当融合模型效果不如预期时先别急着改网络结构而是把中间结果可视化出来——投影后的点云和图像对齐了吗语义特征有没有正确附着到点上十有八九问题出在数据对齐环节而不是模型本身。把这一步做扎实后面的调优才有意义。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进