2. 目标检测基础
大家好,我是你们这堂课的主讲。今天咱们聊聊目标检测,这是感知融合里最基础、也最关键的一环。说白了,就是让车“看见”周围有什么东西——是车、是人、还是路障?
我个人习惯把目标检测分成两大流派:基于视觉的2D/3D检测和基于激光雷达的点云检测。当然,还有把两者结合起来的多模态融合。咱们一个一个来拆解。
1.1 基于视觉的2D目标检测:YOLO与CenterNet
先说说2D检测。你想想看,摄像头拍到的就是一张二维图像,我们要从里面找出物体,并框出它的位置。这活儿,YOLO干得最漂亮。
YOLO:一阶段检测的标杆
YOLO(You Only Look Once)的核心思想很简单:把检测当成回归问题。它把图像分成网格,每个网格负责预测中心点落在它里面的物体。
我记得刚接触YOLOv3时,被它的速度惊艳到了。为什么快?因为它没有“先提候选框再分类”的两阶段流程,而是直接一步到位。
# YOLO的核心思想(伪代码)
def yolo_inference(image):
grid = divide_into_cells(image, S=7) # 分成7x7网格
for cell in grid:
bbox, confidence, class_probs = predict(cell)
if confidence > threshold:
output.append(bbox, class_probs)
return nms(output) # 非极大值抑制去重
CenterNet:无锚框的另一种思路
YOLO用的是锚框(anchor box),但CenterNet换了个玩法——直接预测物体的中心点,然后回归出宽高和深度。
说白了,CenterNet把检测问题转化成了关键点估计问题。它输出一个热力图,热力图的峰值就是物体中心。这样做的好处是:不需要调锚框的超参数,训练更稳定。
| 方法 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| YOLO | 网格+锚框回归 | 速度快,工程成熟 | 小目标差,锚框需调参 |
| CenterNet | 中心点+热力图 | 无锚框,结构简单 | 重叠物体处理弱 |
1.2 基于激光雷达的点云目标检测:PointPillars与VoxelNet
摄像头有它的短板——光线不好时,或者物体被遮挡,它就抓瞎了。这时候,激光雷达(LiDAR)就派上用场了。它发射激光束,返回的是三维点云数据。
点云数据长什么样?就是一堆(x, y, z, intensity)的坐标点。怎么从这些点里找出物体?嗯,这里有两个经典方案。
VoxelNet:体素化的先驱
VoxelNet的思路很直观:把点云划分成三维体素(voxel),每个体素里用PointNet提取特征,然后做3D卷积。
我在项目里试过VoxelNet,效果确实好,但有个问题——计算量太大了。一个64x64x32的体素网格,3D卷积的参数量是2D卷积的几十倍。那时候我们的嵌入式平台根本跑不动。
PointPillars:把3D问题变成2D问题
PointPillars的聪明之处在于:它把点云投影到鸟瞰图(BEV)上,然后只用2D卷积来处理。
具体怎么做?它把点云沿着Z轴方向切成一个个“柱子”(pillar),每个柱子里的点用PointNet提取特征,然后拼成一张伪图像。剩下的,就交给2D检测网络了。
# PointPillars的核心流程
def pointpillars_inference(point_cloud):
pillars = create_pillars(point_cloud, grid_size=(0.16, 0.16)) # 柱子大小
pillar_features = pointnet(pillars) # 每个柱子提取特征
pseudo_image = scatter_to_image(pillar_features) # 拼成伪图像
detections = 2d_detector(pseudo_image) # 用2D检测网络
return detections
说实话,PointPillars的速度比VoxelNet快了一个数量级。我印象很深,有一次在Jetson Xavier上跑,VoxelNet只有8 FPS,换成PointPillars直接飙到35 FPS。这就是工程上的胜利。
1.3 多模态融合检测思路
讲到这里,你可能会问:既然摄像头和激光雷达各有优缺点,为什么不把它们结合起来?
没错,这就是多模态融合。我把它分成三个层次:
- 数据级融合:把图像和点云在原始数据层面对齐。比如把点云投影到图像上,生成RGB-D图像。但问题是,两种数据的分辨率差异太大,容易引入噪声。
- 特征级融合:分别提取图像特征和点云特征,然后在特征图上做融合。这是目前的主流做法。比如AVOD、F-PointNet都是这个思路。
- 决策级融合:两个模态各自独立检测,最后把结果合并。简单粗暴,但容易漏检。
我个人比较推荐特征级融合。为什么?因为它在信息损失和计算效率之间取得了平衡。我在一个项目中试过,单纯用摄像头检测行人,远距离的召回率只有60%;加上激光雷达后,召回率提升到了85%。
本章知识体系
下面这张图,是我自己画的,帮你理清本章的知识脉络: