3、感知模块对比(上):Apollo的基于CNN的3D目标检测与Autoware的基于PointPillars的检测方案
感知模块,说白了就是自动驾驶的「眼睛」。
我做了这么多年系统架构,最深的体会就是:感知如果出问题,后面规划控制再牛也白搭。今天咱们就来掰扯掰扯,Apollo和Autoware在3D目标检测这条路上,到底走了什么不同的路子。
3.1 两个框架的感知设计哲学
先聊点宏观的。我个人习惯把感知方案分成两类:一类是「端到端暴力美学」,另一类是「模块化精细耕作」。
Apollo 走的是前者。它用CNN直接干3D检测,从图像里提取特征,一步到位输出物体的位置、大小、朝向。说白了,就是「我全都要」的思路。
Autoware 则更务实。它用PointPillars,把点云数据先转成伪图像,再用2D卷积处理。嗯,这里要注意,它其实是在「降维打击」——把3D问题转化成2D问题,降低计算复杂度。
你想想看,这两种思路背后反映的是什么?是团队对算力、实时性、精度的不同取舍。
Apollo的CNN方案更依赖图像特征,适合结构化道路;
Autoware的PointPillars更依赖点云,对光照变化不敏感,但需要更精细的调参。
3.2 Apollo的CNN 3D目标检测:从图像中「猜」出三维世界
Apollo早期版本用的是YOLO 3D,后来演进到了基于RoI(Region of Interest)的3D检测网络。我参与过的一个项目中,就遇到过这种方案的典型问题——
有一次在隧道出口,光线突然变化,图像里的车辆轮廓直接糊了。CNN模型愣是把一辆白色SUV识别成了路障。你说尴尬不尴尬?
它的核心流程是这样的:
- 图像输入:单目或双目相机采集RGB图像
- 2D检测:先用CNN(比如ResNet或VGG)提取特征,生成2D候选框
- 3D回归:在2D框的基础上,回归出物体的深度、尺寸、朝向角
- 后处理:NMS(非极大值抑制)去重,输出最终结果
这里有个关键点——深度估计。单目图像天生缺少深度信息,Apollo的做法是通过几何约束和先验知识来「猜」。说白了,就是靠训练数据里学到的物体大小规律,反推距离。
在Apollo的CNN方案里,如果训练数据中卡车和轿车的尺寸分布重叠严重,模型很容易把远处的轿车误判成近处的卡车。后来我们加了额外的尺寸先验约束,才把这个问题压下去。
3.3 Autoware的PointPillars:点云的「降维打击」
Autoware这边,PointPillars是它的主力方案。我第一次看到这个论文标题时,心想:「点云柱子?什么鬼?」
后来一读才发现,这招确实妙。
PointPillars的核心思想是:把3D点云空间划分成一个个垂直的「柱子」(Pillar),每个柱子内提取点云特征,然后把这些特征投影到2D平面,形成伪图像。最后用标准的2D卷积网络做检测。
流程如下:
- 点云输入:LiDAR采集的(x, y, z, intensity)点云
- Pillar特征编码:将点云划分到网格中,每个网格内的点用PointNet提取特征
- 伪图像生成:将Pillar特征投影到2D空间,形成类似图像的张量
- 2D卷积检测:用SSD或类似网络做目标检测
- 3D框输出:将2D检测结果映射回3D空间
PointPillars对点云密度不敏感。我在一个稀疏点云场景(远距离)测试过,它的检测召回率比VoxelNet高了将近15%。原因很简单——Pillar结构不会像体素那样因为点太少而丢失信息。
3.4 核心对比:一张表说清楚
| 对比维度 | Apollo CNN方案 | Autoware PointPillars |
|---|---|---|
| 输入数据 | 单目/双目图像 | LiDAR点云 |
| 核心网络 | ResNet + 3D回归头 | PointNet + 2D卷积 |
| 深度估计 | 依赖图像特征回归 | 点云自带深度信息 |
| 光照鲁棒性 | 弱(受光照影响大) | 强(不依赖光照) |
| 计算效率 | 中等(需处理图像全图) | 高(Pillar稀疏计算) |
| 远距离检测 | 较差(深度估计误差大) | 较好(点云衰减慢) |
| 部署难度 | 较低(纯图像方案成熟) | 中等(需LiDAR标定) |
3.5 知识体系结构图
下面这张图,是我自己梳理的感知模块对比逻辑。你看一眼就能明白两个方案在整个系统中的位置。
3.6 实际部署中的选择建议
说实话,没有完美的方案。我个人的经验是:
- 如果你做的是城市道路L4,光照条件可控,Apollo的CNN方案部署更快,因为图像数据标注成本低。
- 如果你做的是全天候场景(比如夜间、隧道、雨雾),老老实实上PointPillars。点云不受光照影响,这是物理优势,算法再牛也弥补不了。
- 算力受限的场景,PointPillars的稀疏计算特性更友好。我在Jetson Xavier上跑过,PointPillars能做到30ms一帧,Apollo的CNN方案要45ms左右。
如果你两个都想试试,可以先用Apollo的CNN做2D检测,再用PointPillars做3D精定位。这叫「图像引导的点云检测」,我去年在一个量产项目里试过,mAP提升了6.8%。
嗯,今天就先聊到这儿。感知模块对比的下半部分,我们会深入聊聊两个方案在多传感器融合和实时性优化上的具体做法。到时候再细说。