4. 目标检测基础:YOLO系列原理、点云检测(PointPillars)、检测输出格式(Bounding Box)
各位好,我是老张。今天咱们聊聊感知融合里最基础、也最核心的一块——目标检测。说白了,就是让车“看见”并“认出”周围的东西。摄像头看到的是像素,激光雷达看到的是点云,怎么把这些原始数据变成一个个有意义的“框”,这就是我们要解决的问题。
我个人习惯把目标检测分成两大流派:基于图像的(比如YOLO)和基于点云的(比如PointPillars)。两者思路不同,但最终输出的东西是一样的——Bounding Box。嗯,咱们一个一个来。
4.1 YOLO系列:从“看一眼”到“看一眼就懂”
YOLO(You Only Look Once)这个名字起得真贴切。它不像老派的R-CNN那样先提候选区域再分类,而是直接拿整张图过一遍神经网络,同时输出“这是什么”和“在哪儿”。
我最早接触YOLOv3的时候,觉得这玩意儿太暴力了。但后来发现,暴力也有暴力的好处——快,真快。在自动驾驶这种实时性要求极高的场景下,YOLO几乎是唯一的选择。
4.1.1 核心思想:网格化 + 回归
YOLO的核心逻辑其实不复杂:
- 把输入图片分成 S×S 的网格。比如 7×7,或者 13×13。
- 每个网格负责检测中心点落在它里面的物体。
- 每个网格预测 B 个边界框(Bounding Box),以及每个框的置信度(Confidence Score)。
- 同时预测 C 个类别概率。
你想想看,这样一来,输出就是一个 S×S×(B×5 + C) 的张量。5 代表 (x, y, w, h, confidence)。
关键点:YOLO把检测问题当作一个回归问题来处理。不是“先找区域再分类”,而是“直接回归出框的位置和类别”。这是它快的原因,也是它早期对小物体检测不准的原因。
4.1.2 从v3到v8:我踩过的坑
YOLOv3 是经典,但我在项目中遇到过一个问题:它对遮挡严重的行人检测效果很差。后来换了 YOLOv5,用了更深的骨干网络和更好的数据增强,情况好了不少。
到了 YOLOv8,其实已经非常成熟了。我个人建议,如果项目刚起步,直接上 YOLOv8 或者 YOLOv9 就行。别在 v3 上浪费时间了,除非你要做学术对比。
避坑指南:我曾经在某个项目中,为了追求极致速度,把 YOLO 的输入分辨率从 640×640 降到了 320×320。结果检测精度掉了 15 个点。后来发现,对于远距离的小目标,分辨率是关键。所以,别盲目压缩输入尺寸。
4.2 点云检测:PointPillars 是怎么工作的
摄像头有它的局限性——晚上看不清,逆光也难受。激光雷达就不一样了,它直接给你三维空间里的点云数据。但点云是稀疏的、无序的,怎么处理?
PointPillars 是我个人非常喜欢的一个方案。它把点云“竖起来”处理,思路很巧妙。
4.2.1 核心思想:把点云“拍扁”成伪图像
PointPillars 的做法分三步:
- Pillar 化:把点云在 XY 平面上划分成一个个网格(Pillar)。每个 Pillar 就是一个垂直的柱子,里面包含若干个点。
- 特征提取:对每个 Pillar 里的点,用 PointNet 提取特征。说白了,就是把每个点的 (x, y, z, intensity) 加上一些相对坐标,然后通过一个简单的 MLP 网络,得到一个 Pillar 级别的特征向量。
- 散射回伪图像:把这些特征向量放回到原来的网格位置,就得到了一张“伪图像”。这张图的每个像素,其实对应着一个 Pillar 的特征。
嗯,到这里,点云检测问题就转化成了图像检测问题。后面就可以直接用 2D 的检测网络(比如 SSD 或者 YOLO 的变体)来处理了。
为什么这么做? 因为 3D 卷积太慢了。PointPillars 把 3D 问题降维到 2D,在保持精度的同时,速度提升了一个数量级。我在实际部署时,PointPillars 在嵌入式设备上能跑到 30 FPS 以上。
4.2.2 我在项目中遇到的点云问题
我曾经在一个雨雪天气的测试中,发现 PointPillars 的检测框抖动得很厉害。后来排查发现,是雨滴和雪花产生的噪声点被当成了有效目标。解决办法也很简单——在预处理阶段加一个高度滤波,只保留地面以上 0.5 米到 3 米范围内的点。效果立竿见影。
注意:点云检测对“稀疏性”非常敏感。如果激光雷达的线束太少(比如 16 线),远距离的点会非常稀疏,检测效果会急剧下降。这时候,融合摄像头信息就变得至关重要。
4.3 检测输出格式:Bounding Box 的“身份证”
不管你是用 YOLO 还是 PointPillars,最终输出的东西都是一样的——Bounding Box。但这里有个坑:2D 框和 3D 框的格式完全不同。
4.3.1 2D Bounding Box
对于摄像头图像,输出的是 2D 框。常见格式有:
- (x1, y1, x2, y2):左上角和右下角坐标。这是最直观的。
- (cx, cy, w, h):中心点坐标 + 宽高。YOLO 系列常用这种。
- 归一化坐标:所有值除以图像宽高,范围在 [0, 1] 之间。方便不同分辨率之间迁移。
4.3.2 3D Bounding Box
对于激光雷达点云,输出的是 3D 框。格式要复杂得多:
| 参数 | 含义 | 示例值 |
|---|---|---|
| x, y, z | 框的中心点坐标(通常以激光雷达为原点) | 10.5, 2.3, 0.8 |
| w, l, h | 宽、长、高(注意:长是车辆行驶方向) | 1.8, 4.5, 1.6 |
| yaw | 偏航角(绕 Z 轴的旋转角度) | 0.78 rad |
| class_id | 类别编号 | 2(代表“car”) |
| confidence | 置信度 | 0.95 |
个人经验:在融合 2D 和 3D 检测结果时,我习惯把 3D 框投影到图像平面上,生成一个“虚拟 2D 框”,然后跟摄像头检测到的 2D 框做 IoU 匹配。这样做的好处是,可以同时利用图像的颜色信息和点云的深度信息,提高检测的鲁棒性。
4.4 本章知识体系:一张图看懂
下面这张 SVG 图,是我自己画的。它把本章的核心逻辑串起来了——从传感器数据到最终输出,一目了然。
嗯,这张图把咱们今天讲的内容串起来了。左边是摄像头图像走 YOLO,右边是点云走 PointPillars,最终都汇聚到 Bounding Box 输出。说白了,不管中间怎么折腾,最后给到下游融合模块的,就是这些框。
总结一下:YOLO 的核心是“看一眼就懂”,PointPillars 的核心是“把点云拍扁”。两者输出的 Bounding Box 格式虽然不同,但最终都要统一成 (x, y, w, h, yaw, class, confidence) 这样的标准格式,才能被感知融合模块消费。
好了,这一节就到这儿。记住,检测只是第一步,后面的融合、跟踪、预测才是真正考验系统能力的地方。咱们下一节见。