1. 从“看”到“看懂”:为什么我们需要给点云“上色”?
大家好,我是老张,在自动驾驶和三维感知领域摸爬滚打了十来年。今天想和大家深入聊聊一个让我眼前一亮的经典技术——PointPainting。很多刚入行的朋友可能会觉得,3D目标检测嘛,不就是用激光雷达(LiDAR)扫一圈,然后用深度学习模型去框出物体吗?听起来挺直接的。但实际干过就知道,这里面的坑可不少。
最头疼的问题之一就是:激光雷达点云太“稀疏”了,而且缺乏语义信息。想象一下,你面前有一张黑白素描,线条勾勒出了物体的轮廓和深度,但你看不出哪个轮廓是车,哪个是树,哪个是行人。激光雷达点云就像这张素描,它提供了精确的三维坐标(x, y, z)和反射强度,告诉你“这里有个东西,距离你10米,高1.5米”,但它不告诉你“这个东西是啥”。尤其是在远处,或者对于行人、自行车这类纤细的物体,点云可能只有稀稀拉拉的几个点,单靠这些点,模型很难做出准确判断,经常会把电线杆误检成行人。
那相机图像呢?图像色彩丰富,纹理清晰,一个训练好的语义分割网络能轻松地把图像中的每个像素都打上标签,比如“这是汽车”、“那是行人”。但图像缺乏精确的深度信息,你很难从一张2D图片里判断出那个“汽车”像素到底离你20米还是50米。
所以,一个很自然的想法就冒出来了:能不能把图像的“看懂是什么”(语义)和激光雷达的“知道在哪”(几何)结合起来? 这就是多模态融合的核心。但在PointPainting之前,很多融合方法走得有点“拧巴”。比如,有的方法尝试把图像特征图直接拼接到点云鸟瞰图(BEV)的特征图上,但BEV上的一个像素可能对应图像上一长条像素,信息对不齐,造成了“特征模糊”。还有的方法先做2D检测,再把2D框反投影到3D空间生成锥形区域,这种方法受限于2D检测的精度,而且计算复杂。
PointPainting的思路则异常简单和巧妙:我们不折腾复杂的特征对齐和网络结构改动,就直接把图像语义分割的结果,“刷”到对应的激光雷达点上。每个激光雷达点被投影到图像上,找到对应的像素,然后把这个像素的语义分割分数(比如,属于“汽车”的概率是0.9,属于“行人”的概率是0.1)作为一个新的特征,附加到这个点的原始特征(x, y, z, 反射强度等)后面。这样一来,原本“沉默”的点云,每个点都带上了“我是啥”的标签信息。这个过程,就像给一幅黑白素描涂上了颜色,瞬间一切都清晰明了了。
我最早在项目里尝试这个方法时,感觉就像给模型装上了一副“语义眼镜”。模型还是那个基于点云的检测模型(比如PointPillars、PointRCNN),它的架构、训练流程完全不用变,只是输入的每个点多了几个维度(语义分数)。但就是这简单的“加法”,让检测性能,尤其是对行人和自行车这些难检目标的性能,得到了肉眼可见的提升。
2. PointPainting技术拆解:三步走,把语义“刷”上去
PointPainting的整个流程非常清晰,可以概括为三个顺序执行的阶段。这种顺序性设计既是它的优点(简单、通用),也带来了一些关于延迟的思考,我们后面会详细说。
2.1 第一步:获取图像的“语义地图”
这一步的目标是得到一张图片上每个像素属于各个类别的概率。比如在自动驾驶场景,类别通常是汽车、行人、骑车人、卡车、交通锥等。
- 网络选择:这里你可以用任何现成的、表现好的语义分割网络。在原始的PointPainting论文里,对于KITTI数据集,作者使用了在Mapillary和Cityscapes上预训练过的DeepLabv3+网络,然后在KITTI数据上进行了微调。对于更大的nuScenes数据集,他们自己用ResNet骨干网络训练了一个全卷积网络(FCN)。这告诉我们一个关键点:PointPainting本身不绑定任何特定的分割网络。你可以用DeepLabV3、PSPNet,或者更轻量化的BiSeNet、Fast-SCNN,取决于你对精度和速度的权衡。
- 输出是什么:假设我们有C个待检测的类别(比如C=4:汽车、行人、自行车、背景),那么分割网络对一张尺寸为HxW的图片,会输出一个形状为
[H, W, C]的张量。这个张量在(h,w)位置的值,就是一个C维向量,表示该像素属于每个类别的分数(通常经过softmax,总和为1)。这就是我们后面要用的“颜料”。 </


2320

被折叠的 条评论
为什么被折叠?



