自动驾驶感知圈子里有个老生常谈的争论:激光雷达点云方案和纯视觉方案,到底哪条路才是正解。激光雷达派觉得点云天生带深度信息,做三维检测是顺水推舟;纯视觉派则坚持摄像头成本低、分辨率高、语义信息丰富,只要算法够强,二维图像一样能推出三维结构。我做了几年感知算法落地,越来越觉得这个争论本身有点跑偏——真正在工程里卡脖子的,往往不是"用哪种传感器",而是"怎么把二维里学到的东西高效地迁移到三维空间去"。这篇就围绕"从二维提升到三维的学习方法"这个思路,聊聊它在自动驾驶三维目标检测里到底怎么落地、为什么值得认真对待,以及实操中那些文档里不会写的坑。
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数字。我见过太多在数据集上刷得很漂亮、一上实车就各种问题的方案,根子往往不在算法,而在这些工程细节没处理好。
最后分享一个我常用的排查思路:当融合模型效果不如预期时,先别急着改网络结构,而是把中间结果可视化出来——投影后的点云和图像对齐了吗?语义特征有没有正确附着到点上?十有八九问题出在数据对齐环节,而不是模型本身。把这一步做扎实,后面的调优才有意义。