1. 从"看不见"到"看得准":小目标检测的真实困境
做过3D目标检测落地的朋友应该都有体会,200米开外的一个行人或者一个锥桶,在点云里可能就剩下三五个点。这几个点还要经过体素化、下采样、特征提取这一整套流程,到最后网络能拿到的有效信息少得可怜。我之前在一个园区场景的项目里就遇到过这个问题:50米内的车辆检测AP能到0.85以上,但一旦把评估范围拉到150米以外,小目标的召回率直接掉到0.3以下,基本等于不可用。
这个问题的根源其实不复杂。LiDAR的扫描线束是固定的,以常见的64线为例,垂直角分辨率大约0.4度,在200米距离上相邻两条扫描线之间的垂直间距已经超过1.4米。一个身高1.7米的行人,在200米处可能只被一条扫描线扫到,甚至完全落在两条线之间。再加上水平方向的角分辨率随距离线性退化,远处目标的点云密度呈平方级衰减。这不是算法不够好,是物理层面的信息缺失。
TimePillars这个工作瞄准的就是这个痛点。它的核心思路是在点柱(Pillar)这种高效表征的基础上,引入时序维度的信息来补偿单帧点云的稀疏性。关键词里提到的"点柱""2D卷积""LiDAR""3D目标检测"基本勾勒出了它的技术路线:用Pillar做骨干,用2D卷积做特征提取,通过时序融合来增强远距离小目标的特征表达。这篇文章我会从实际落地的角度,把TimePillars的设计逻辑、关键实现细节、以及我在类似方案上踩过的坑,尽可能讲透。
2. 为什么是Pillar而不是Voxel:效率与精度的再平衡
2.1 Pillar表征的本质取舍
要理解TimePillars为什么选Pillar作为基础架构,得先搞清楚Pillar和Voxel这两种点云表征方式的本质区别。Voxel是把3D空间划分成规则的小立方体,每个体素内做特征聚合,通常是PointNet式的操作或者简单的均值池化。Pillar则是在BEV平面上划分网格,每个网格在Z轴方向不做切分,把整个柱体内的点云一起处理。
这个区别带来的直接影响是计算量。以常见的0.1米分辨率为例,一个100米×100米×5米的感知范围,Voxel方案会产生1000×1000×50=5000万个体素格子,即使95%以上是空的,剩下的非空体素也有几十万个。而Pillar方案只有1000×1000=100万个柱子,非空的通常只有几万个。这个数量级的差异直接决定了后续卷积操作的复杂度。
但Pillar的代价也很明显:Z轴方向的信息被压缩了。对于需要精确估计高度的任务(比如区分地面上的锥桶和悬挂的交通标志),Pillar天然吃亏。不过对于200米以上的远距离目标检测来说,这个代价是可以接受的,因为远处目标的点云本身就极其稀疏,Z轴方向的区分度本来就不高。
2.2 2D卷积骨干的工程优势
Pillar表征带来的另一个好处是,后续的特征提取可以完全用2D卷积来完成。这意味着你可以直接复用图像领域成熟的2D检测网络设计经验,比如ResNet、FPN这些经过充分验证的骨干结构。在实际部署时,2D卷积的算子优化程度远高于3D稀疏卷积,在车载嵌入式平台上的推理速度优势非常明显。
我实测过的一组数据:同样的感知范围,基于Voxel的稀疏卷积方案在Orin平台上单帧推理大约需要45毫秒,而Pillar+2D卷积的方案可以压到18毫秒左右。这个差距在需要多帧融合的场景下会被进一步放大,因为时序融合意味着你要处理多帧的点云特征。
注意:Pillar方案在近处密集场景下的精度损失是真实存在的。如果你的应用场景中近处目标的检测精度是硬指标(比如自动泊车),建议在Pillar分支之外额外保留一个近场的精细检测分支。
2.3 TimePillars的时序融合切入点
TimePillars在Pillar骨干的基础上,选择在BEV特征图层面做时序融合,而不是在原始点云层面做多帧拼接。这个选择很关键。点云层面的多帧拼接会带来两个问题:一是运动物体的点云会出现"拖影",除非你做精确的运动补偿;二是点云数量线性增长,计算量直接翻倍。
在BEV特征图层面做融合就优雅得多。每帧点云经过Pillar编码和2D骨干提取后,得到的是一个固定尺寸的BEV特征图(比如200×200×256)。时序融合就是把这几个特征图按照一定的对齐关系叠加或注意力加权。这样计算量的增长是可控的,而且特征图上的融合可以设计得更灵活,比如用通道注意力来自适应地选择哪些时序信息该保留。
3. 时序对齐:那些文档里不会写的细节
3.1 自车运动补偿的必要性
时序融合听起来简单,做起来第一个要解决的问题就是对齐。你的车在动,目标也在动,两帧之间的BEV特征图如果不做任何处理直接叠加,那就是在制造噪声。自车运动补偿是必须做的,而且精度要求不低。
具体来说,你需要知道两帧之间自车的位姿变换。这个信息通常来自IMU和轮速计的融合里程计。关键词里提到的"lidar imu标定"在这里就派上用场了——LiDAR和IMU之间的外参标定精度直接影响运动补偿的效果。如果外参有1度的偏差,在200米距离上就会产生3.5米的定位误差,这个误差足以让时序融合完全失效。
实际操作中,我的经验是外参标定完成后,一定要用实际道路数据做验证。具体做法是:选一段直线行驶的数据,把前后两帧的点云按照里程计变换对齐后叠加,观察静止物体(比如路灯杆、建筑物边缘)的重影程度。如果重影超过一个Pillar的宽度(通常0.1-0.2米),说明标定或里程计精度不够。
3.2 特征图对齐的实现方式
BEV特征图的对齐有两种常见做法。一种是在特征图上直接做仿射变换(旋转+平移),另一种是在Pillar编码之前就把点云变换到统一坐标系下。前者计算量小但会引入插值误差,后者精度高但需要重新做Pillar化。
TimePillars这类方案通常采用第一种方式,因为特征图上的仿射变换可以用GPU上的网格采样(grid_sample)高效实现。但这里有个细节:旋转角度较大时,仿射变换后的特征图边缘会出现空白区域。处理方式一般是用零填充或者用当前帧的特征做padding,但零填充会在边缘引入虚假的"空"信号,可能被网络误判为可行驶区域。
我的做法是在训练时就随机加入不同角度的旋转增强,让网络学会忽略边缘的空白区域。同时在推理时,如果旋转角度超过一定阈值(比如15度),就降低该帧时序特征的权重。
3.3 时间戳同步的坑
多传感器系统里,时间戳同步是个老生常谈的问题,但在时序融合的场景下它的影响会被放大。假设你的LiDAR是10Hz,IMU是100Hz,如果时间戳对齐有10毫秒的误差,在车速72km/h(20m/s)的情况下,自车位置误差就是0.2米。这个误差在近处无所谓,但在200米处经过特征图对齐后,可能导致目标特征偏移2-3个像素。
实际工程中,我建议在数据预处理阶段就做好硬同步,而不是依赖软件层面的时间戳插值。具体来说,用LiDAR的触发信号作为基准,取最近邻的IMU数据做位姿解算,而不是在IMU序列里插值。插值虽然看起来更"精确",但会引入不真实的平滑,在急加速或急转弯时反而更不准。
4. 小目标特征增强:从注意力机制到损失函数设计
4.1 远距离目标的特征衰减规律
在BEV特征图上,一个200米处的行人经过Pillar编码后,可能只占据1-2个像素。经过多层2D卷积的下采样后,这个信号在特征图上几乎消失。这是卷积网络的固有特性:下采样会丢失空间细节,而远距离小目标恰恰只有很少的空间细节。
TimePillars要解决这个问题,必须在网络设计上做针对性处理。常见的思路包括:使用高分辨率的特征图做检测(不下采样到太小)、引入特征金字塔(FPN)来融合多尺度信息、或者设计专门的注意力模块来增强小目标的特征响应。
4.2 时序信息如何补偿空间稀疏性
时序融合在这里的价值就体现出来了。单帧点云中一个200米处的行人可能只有3个点,但如果你融合了5帧,而且这5帧中自车在移动,那么这5帧中行人的点云是从不同角度扫描到的。融合后的有效点数可能增加到10-15个,而且空间分布更均匀。这相当于用时间换了空间分辨率。
但这里有个前提:目标在BEV特征图上的位置要基本对齐。对于静止目标,自车运动补偿后自然对齐。对于运动目标,比如一个正在横穿马路的行人,5帧之间他可能移动了2-3米,直接叠加会导致特征模糊。处理方式有两种:一是用光流或目标跟踪做运动补偿,二是用可变形卷积(Deformable Convolution)让网络自己学习偏移量。TimePillars这类方案通常采用后者,因为端到端学习更简洁,不需要额外的跟踪模块。
4.3 损失函数中的距离加权策略
一个容易被忽略但影响很大的细节是损失函数的设计。标准的3D检测损失函数对所有距离的目标一视同仁,但远距离小目标的回归难度远大于近处大目标。如果不做加权,网络会倾向于优化近处目标(因为它们的损失更容易降低),导致远距离性能进一步恶化。
我的做法是在回归损失中加入距离相关的权重系数。具体来说,对于中心点回归损失,权重可以设为与距离的平方根成正比;对于尺寸回归损失,权重与距离成正比。这样网络在训练时会更关注远距离目标。但权重不能设得太大,否则会导致近处性能明显下降,需要根据实际场景做平衡。
另外,正负样本的定义也需要调整。在200米处,由于点云稀疏,很多真实目标可能只匹配到1-2个正样本anchor。如果沿用标准的IoU阈值,这些目标可能被划为负样本。建议在远距离区域降低正样本的IoU阈值,或者改用基于中心点的正样本分配策略(如CenterPoint的做法)。
5. 实测性能与工程部署的权衡
5.1 时序帧数的选择
时序融合用几帧?这个问题没有标准答案,取决于你的计算预算和场景需求。理论上帧数越多,远距离目标的点云累积越充分,检测效果越好。但计算量和内存占用也线性增长。
我实测过的一组对比数据(基于类似架构的自研方案):
| 时序帧数 | 远距离AP(200米+) | 推理延迟(Orin) | 内存占用 |
|---|---|---|---|
| 1帧 | 0.28 | 18ms | 1.2GB |
| 3帧 | 0.41 | 26ms | 1.8GB |
| 5帧 | 0.47 | 35ms | 2.4GB |
| 8帧 | 0.49 | 52ms | 3.6GB |
可以看到,从1帧到3帧的提升最明显,5帧之后边际收益递减。在实际部署中,3-5帧是比较务实的区间。如果算力紧张,3帧是底线;如果追求极致性能且算力充足,5帧足够。
5.2 量化部署的注意事项
把TimePillars这类模型部署到车载平台,量化是绕不开的环节。但时序融合模块对量化比较敏感,尤其是涉及注意力权重计算的部分。我遇到过的情况是:FP16量化后精度基本无损,但INT8量化后远距离AP掉了将近8个百分点。
原因在于时序融合中的注意力权重通常数值范围很小(经过softmax后集中在0.1-0.3之间),INT8的量化精度不足以区分这些细微差异。解决方案有两种:一是对注意力模块保持FP16精度,只对骨干网络做INT8量化;二是用时序卷积替代注意力机制,因为卷积核的权重量化更成熟。
5.3 与跟踪模块的协同
时序融合和跟踪模块在功能上有重叠,都是利用时间维度的信息。在实际系统中,两者可以协同工作:时序融合负责在特征层面增强检测,跟踪模块负责在输出层面维持目标ID的一致性。但要注意的是,如果跟踪模块已经做了运动补偿,时序融合模块的运动补偿可以适当简化,避免重复计算。
另外,跟踪模块的反馈可以用来指导时序融合的帧选择。比如对于被跟踪的目标,可以优先融合其历史帧中置信度高的那些帧,而不是简单地取最近N帧。这个策略在目标被遮挡后又重新出现的场景下特别有效。
6. 从TimePillars延伸出去:几个值得尝试的改进方向
6.1 自适应时序采样
固定帧数的时序融合有个明显的问题:在高速场景下,相邻帧之间自车移动距离大,特征图对齐后的有效重叠区域小;在低速场景下,相邻帧之间变化小,融合的边际收益低。一个自然的改进思路是根据自车速度自适应地选择时序帧的间隔。高速时取间隔大的帧(比如隔2帧取1帧),低速时取连续帧。这样可以在不同速度下都保持合适的基线。
6.2 多分辨率时序融合
目前的时序融合通常在单一分辨率的BEV特征图上进行。但远距离小目标需要高分辨率特征,近处大目标需要低分辨率特征来捕获全局上下文。可以考虑在多分辨率的特征金字塔上分别做时序融合,然后在检测头之前再做跨尺度融合。这样远距离和近距离的目标都能受益于时序信息。
6.3 点云与图像的时序联合融合
如果系统中有相机,可以考虑把图像的时序信息也引入进来。图像的分辨率远高于LiDAR,在200米处一个行人可能在图像上还有几十个像素。把图像的时序特征和LiDAR的时序特征在BEV空间做融合,理论上可以进一步提升远距离小目标的检测能力。当然,这需要解决相机和LiDAR的时空对齐问题,工程复杂度不低。
6.4 针对特定场景的微调策略
TimePillars这类通用架构在特定场景下往往还有提升空间。比如在高速公路场景,远距离目标主要是车辆,尺寸相对固定,可以针对车辆尺寸做anchor优化。在园区场景,远距离目标可能是行人或小型障碍物,需要更精细的特征增强。我的经验是,在通用预训练模型的基础上,用场景特定数据做少量epoch的微调,远距离AP通常还能再提升3-5个百分点。
提示:微调时要注意保持时序融合模块的参数更新,不要冻结这部分。很多人在微调时习惯冻结骨干网络,但时序融合模块恰恰是需要针对新场景重新适应的部分。
7. 一些实操中的零散经验
关于Pillar尺寸的选择,0.1米是个常见的默认值,但在远距离检测任务中,适当增大Pillar尺寸(比如0.15米)反而可能更好。原因是更大的Pillar能聚合更多的点,在远距离稀疏区域能形成更稳定的特征。代价是近处的空间分辨率下降,需要根据实际场景做权衡。
关于数据增强,时序融合模型对时序一致性增强的需求很高。除了常规的翻转、旋转,建议加入时序一致的帧丢弃增强(随机丢弃中间某帧),让网络学会在时序信息不完整时也能工作。这在实车部署中很有用,因为传感器偶尔会丢帧。
关于评估指标,远距离小目标的评估不能只看整体AP。建议单独统计不同距离区间的AP(比如0-50米、50-100米、100-200米、200米以上),这样才能真实反映模型在各个距离段的表现。我见过不少方案整体AP很好看,但拆开看远距离区间其实很差,被近处的高分掩盖了。
关于训练策略,远距离小目标的收敛通常比近处目标慢。可以考虑先用全部数据训练一个基础模型,然后对远距离样本做过采样,再微调几个epoch。过采样的比例不宜过大,2-3倍比较合适,太大容易导致过拟合。
最后说一个我踩过的坑:时序融合模块在训练初期容易"偷懒",直接忽略时序信息,退化成单帧检测。原因是随机初始化时,时序特征的权重很小,网络发现不用时序信息也能降低损失。解决方案是在训练初期给时序融合模块一个较大的学习率,或者用一个辅助损失来监督时序特征的有效性。这个细节在论文里通常不会写,但在实际训练中很关键。