ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第297篇 点云3D目标检测——CenterPoint与PointPillars

第297篇 点云3D目标检测——CenterPoint与PointPillars 上篇聊了体素化方法和3D卷积在点云处理中的应用。你可能有个疑问稀疏卷积虽然快了但端到端跑完一帧还是要好几百毫秒自动驾驶场景要求10Hz以上的推理速度这差距怎么补这就要请出今天的主角——PointPillars和CenterPoint。这两个方法在工程落地中用得非常多理解它们的思路对你面试和实际项目都有帮助。PointPillars把3D压成2DPointPillars的核心想法很巧妙既然3D卷积太慢那能不能把点云编码成二维图像然后用成熟的2D卷积来做检测具体做法是这样的。把点云按X和Y方向分成一个个柱子pillar每个柱子在Z方向上不限高度。这样三维空间就变成了一个X-Y方向的二维网格每个格子就是一个pillar。# pillar特征提取的核心逻辑 # points: (N, 4) - [x, y, z, intensity] # 每个pillar内取固定数量的点不足补零多了随机采样 pillar_features [] for pillar in all_pillars: pts sample_points(pillar, max_points100) # 对每个点拼接扩展特征: [x,y,z,r, xc,yc,zc, xp,yp] feats expand_features(pts) # (100, 9) feat linear_layer(feats) # (100, 64) feat feat.max(dim0) # (64,) max pooling pillar_features.append(feat)每个pillar内部用一个小PointNet提取特征对每个点拼接一组扩展特征包括点在pillar内的相对坐标、pillar中心的偏移等过一个MLP然后max pool得到一个固定长度的向量。所有pillar的特征按X-Y位置排列就形成了一张伪图像通道数就是pillar特征的维度。接下来就是标准的2D目标检测流程——用几个2D卷积层提取空间特征最后接检测头输出3D bounding box。这个方法为什么快2D卷积的计算量远小于3D卷积。一个800×800×60的3D网格卷积核在每个位置都要做3D内积。压成2D后变成800×800的图像卷积核小了一个维度计算量直接降一个数量级。PointPillars在KITTI数据集上的表现相当不错特别是Car类别的3D检测精度接近当时的SOTA方法但推理速度快了很多在GPU上能跑到62Hz。这个速度在工程上是非常有吸引力的。不过PointPillars也有明显的短板。Z方向的信息被max pool压缩掉了对于高度差异明显的场景比如桥上桥下区分能力会下降。pillar的大小也是固定参数太小了计算量大太大了精度下降。CenterPoint中心点检测的思路CenterPoint换了一个检测范式。传统的3D检测器包括PointPillars大多用的是anchor-based的方法——预先定义一组不同大小和方向的bounding box模板anchor然后预测每个anchor的偏移量和类别。anchor-based方法有两个烦人的问题。第一个是超参数多anchor的尺寸、长宽比、数量都需要针对数据集调优。你换个场景、换个数据集anchor参数可能得重新调这在实际项目中很头疼。第二个是正负样本不均衡大部分anchor对应背景只有少数对应物体训练时需要精心设计采样策略。比如KITTI数据集中一辆车周围可能摆了上千个anchor但只有跟GT重叠度最高的那几个算正样本其余全是负样本。这个比例失调会导致训练效率很低。CenterPoint用的是center-based检测。它不预设anchor而是直接预测物体的中心点位置。检测头输出两张东西一张热力图表示每个位置是不是某个类别物体的中心一组回归值表示中心点的偏移、尺寸、朝向角等。# CenterPoint检测头的输出结构 # heatmap: (B, num_classes, H, W) - 中心点热力图 # reg: (B, 2, H, W) - 中心点xy偏移 # height: (B, 1, H, W) - 中心点z坐标 # dim: (B, 3, H, W) - 长宽高 # rot: (B, 2, H, W) - 朝向角(sin, cos) # vel: (B, 2, H, W) - 速度可选推理时对热力图做NMS非极大值抑制取峰值位置作为检测到的物体中心再结合回归值拼出完整的3D bounding box。CenterPoint的backbone可以灵活选择。论文中用了PointPillars和VoxelNet两种实验表明CenterPoint在两种backbone上都能获得提升。这说明center-based检测范式本身是有效的不依赖于特定的特征提取方式。在nuScenes数据集上CenterPoint取得了非常好的成绩NDSNuScenes Detection Score达到60.3%大幅超过之前的方法。更重要的是它在速度-精度权衡上表现优异。两者对比与工程选型面试中经常被问到PointPillars和CenterPoint怎么选从检测精度看CenterPoint通常更好特别是在多类别、密集场景下。center-based检测避免了anchor匹配的歧义对小目标和密集物体的检测更有优势。从推理速度看PointPillars更快。它的backbone是纯2D卷积计算效率高。CenterPoint如果用PointPillars作backbone速度会慢一些因为检测头更复杂要预测热力图和多个回归量。如果用VoxelNet作backbone速度差距更大。从工程落地看PointPillars部署更简单。2D卷积在各种硬件上的优化都很成熟量化、剪枝的生态也完善。CenterPoint的后处理热力图峰值提取在某些嵌入式平台上不太友好需要额外优化。实际项目中的选择逻辑大致是算力充裕、追求精度选CenterPoint算力受限、追求实时性选PointPillars。很多团队会两个都跑一遍在目标数据集上做对比实验再决定。还有个现实问题要考虑你的部署平台是什么。如果跑在车载GPU比如Orin上两个方案都能满足实时性要求这时候优先选精度更高的。如果跑在算力更受限的平台上比如某些机器人用的嵌入式GPUPointPillars的优势就体现出来了。模型量化后PointPillars在Jetson Nano上也能跑到30Hz以上。面试高频追问面试官听到你做过点云检测通常会问这几个问题。第一个是朝向角的问题。3D检测需要预测物体的朝向这在2D检测中没有对应物。PointPillars直接回归角度但角度有周期性问题0度和360度是同一个方向。CenterPoint用sin和cos表示角度避免了周期性的不连续。面试时把这个细节讲清楚会加分。第二个是多帧融合。单帧点云稀疏且存在遮挡把前后几帧的信息融合起来能显著提升检测效果。做法是用自车位姿把历史帧点云变换到当前帧坐标系拼在一起做检测。CenterPoint论文中也做了这个实验多帧融合后NDS提升了约5个百分点。第三个是NMS策略。center-based检测用的是热力图NMS和传统IoU NMS不太一样。热力图NMS先在热力图上找局部极大值然后按置信度排序用3D IoU做去重。这里有个细节不同类别的阈值可以设得不一样比如行人和车辆的NMS阈值就应该不同。第四个是数据增强。点云数据增强和图像很不一样。常用的有全局旋转、全局缩放、GT采样从训练集中随机抽取物体放到场景中。GT采样对稀疏的小目标帮助特别大但实现起来比较tricky需要维护一个物体模型的数据库。给你的建议如果你要深入理解这两个方法建议按这个顺序来先读PointPillars论文理解pillar特征提取和伪图像的概念再读CenterPoint论文理解center-based检测和热力图的思路最后跑一遍开源代码。CenterPoint的官方代码在GitHub上有基于mmdetection3d框架。建议从nuScenes数据集开始这个数据集的可视化做得好调试起来直观。面试时聊点云检测核心要展示的是你对检测范式的理解。anchor-based和center-based的区别、各自解决什么问题、工程上怎么取舍。把这些讲清楚了面试官会认为你有扎实的基础。上一篇第296篇 点云深度学习之体素化方法——3D卷积的方案下一篇预告第298篇 视觉里程计中的深度学习方法
返回列表