[论文阅读]PointPainting——基于Sequential融合的3D目标检测

PointPainting

Sequential Fusion for 3D Object Detection
基于Sequential融合的3D目标检测
论文网址:PointPainting

简读论文

这篇论文提出了一种称为PointPainting的方法,用于图像和激光雷达数据的融合,以提高3D物体检测的性能。主要内容如下:

  1. 提出了一种简单有效的序列融合方法PointPainting。该方法将激光雷达点云中的每个点投影到图像语义分割网络的输出中,并将分割结果(每个像素的分类分数)拼接到对应的激光雷达点上,从而为每个激光雷达点“上色”,增添图像的语义信息。
  2. 经过投影“上色”后的点云可以输入到任意基于激光雷达的3D物体检测网络中,与图像数据实现序列融合。这种方法既避免了特征对齐问题,也不需要额外构建伪激光雷达点云。
  3. 在KITTI和nuScenes两个数据集上,分别与PointPillars、VoxelNet和PointRCNN这三种不同的激光雷达检测网络结合,结果都获得显著提升,说明该方法泛化能力强。
  4. PointPainting使PointRCNN在KITTI测试集上达到了当时最先进的性能;与增强版PointPillars相结合,在nuScenes测试集上获得6.3的mAP提升。
  5. 通过调整图像语义分割网络的质量,探究了分割效果对最终检测性能的影响;另外还研究了不同的匹配方式,证明了PointPainting可以通过流水线实现实时低延迟的多传感器融合。
  6. 总体而言,PointPainting作为一种简单有效的序列融合方法,取得了很好的效果,为多传感器的3D物体检测提供了一种新的思路。值得后续研究继续优化和扩展该方法。

pointpainting

摘要

相机和激光雷达是机器人和自动驾驶汽车的重要传感器,它们两个提供互补的信息,所以传感器融合研究是必须的。
但是,现有的(2020年之前),仅基于激光雷达的方法在主要基准数据集上要优于融合的方法。所以,本文提出了PointPainting:一种顺序融合的方法。PointPainting的工作原理是将激光雷达的点云投影到纯图像语义分割网络的输出中,并将类别分数附加到每个点,然后可以将制作的点云送到任何仅激光雷达的方法。

引言

对自动驾驶车辆的大量研究工作致力于3D目标检测。本工作中,考虑的是将激光雷达点云和RGB图像融合的问题。点云提供了准确的范围视图,但分辨率和纹理信息较低,图像可以提供细腻的纹理和颜色信息,但是缺乏深度信息。如何充分利用两个传感器的优点是一个研究课题。
KITTI数据集的早期工作,例如MV3D[Multi-view 3d object detection network for autonomous driving-2017]和AVOD[Joint 3d proposal generation and object detection from view aggregation-2018]提出了多视图融合pipeline来利用这些协同作用。然而,最近的工作,如pointpillars,voxelnet和STD仅使用激光雷达,并且效果由于融合的方法。虽然有很多基于融合的研究[Frustum pointnets for 3d object detection from RGB-D data-2018, Fusing bird’s eye view lidar point cloud and front view camera image for 3d object detection-2018, Multitask multi-sensor fusion for 3d object detection-2019, Pseudo-lidar+±2020],但KITTI排行榜上排名靠前的只有基于激光雷达的方法。这是否意味着图像对于3D目标检测来说变得多余了?
答案当然是否定的,考虑到下图中的示例,其中行人和路标在图像中清晰可见,但在激光雷达模式中看起来或多或少相同。因此,基于视觉的语义信息应该有助于改进此类目标的检测。此外,根据第一原则,添加更多信息至少应该产生相同的结果,而不是更糟。那么为什么这么难?原因之一是由于视角不一致。
在这里插入图片描述
虽然两个传感器的视图都是在一定范围捕获的,但大多数最先进的方法(例如 PointPillars 或 STD )在鸟瞰视图中使用卷积。这种视图有几个优点,包括没有尺度模糊性和最小的遮挡。它还不会受到将 2D 卷积应用于范围视图时发生的深度模糊效应的影响 [Pseudo-lidar from visual depth estimation-2019]。然而,虽然激光雷达点云可以轻松地转换为鸟瞰图,但对于图像来说,这样做要困难得多。
因此,传感器融合网络设计的核心挑战在于将激光雷达鸟瞰图与摄像机视图相整合。以前的方法可以分为四类:以对象为中心的融合、连续特征融合、显式变换和detection seeding
由 MV3D 和 AVOD 首创的以对象为中心的融合是两阶段架构最明显的选择。在这里,模态具有不同的主干,每个视图中都有一个主干,并且通过在每个模态中从一组共享的 3D 提案中应用 roi 池化,在对象提案级别进行融合。这允许端到端优化,但往往缓慢且麻烦。
第二类方法应用“连续特征融合”,以允许在图像和激光雷达主干的所有步幅之间共享特征信息。这些方法可以与单状态检测设计一起使用,但需要先验地为每个样本计算从点云到图像的映射。这一系列方法的一个微妙但重要的缺点是“特征模糊”。发生这种情况是因为鸟瞰视图中的每个特征向量对应于图像视图中的多个像素,反之亦然。 ContFuse 提出了一种基于 kNN、双线性插值和学习 MLP 的复杂方法来解决这个问题,但核心问题仍然存在。
第三类方法尝试将图像显式转换为鸟瞰图表示形式并在那里进行融合。一些最有前景的纯图像方法使用这种想法,即首先从图像创建人工点云,然后在鸟瞰视图中进行处理。随后的工作尝试基于这个想法进行融合,但性能达不到最先进的水平,并且需要几个昂贵的处理步骤来构建伪点云。
第四类方法使用detection seeding。先验地从图像中提取语义并用于在点云中进行seed(感兴趣区域)检测。 Frustrum PointNet 和 ConvNet 使用 2D 检测来限制视锥体内的搜索空间,而 IPOD 使用语义分割输出来seed(感兴趣区域) 3D 提议。这提高了精确度,但对召回率施加了上限。
最新工作。[Multitask multi-sensor fusion for 3d object detection-2019] 尝试结合其中几个概念。并未公开所有类别的结果,但该方法在汽车类别上的性能优于仅使用激光雷达的顶级方法 STD。
在这项工作中提出了 PointPainting:一种简单而有效的顺序融合方法。每个激光雷达点都被投影到图像语义分割网络的输出中,并且通道级激活被连接到每个激光雷达点的强度测量。连接的(绘制的)激光雷达点可以用于任何激光雷达检测方法,无论是鸟瞰图还是前视图。 PointPainting解决了之前融合概念的缺点:它没有对3D检测架构添加任何限制;它不会受到特征或深度模糊的影响;它不需要计算伪点云,并且不限制最大召回率。
请注意,对于直接在原始点云上运行的激光雷达检测方法,PointPainting 需要最少的网络调整,例如更改专用于读取点云的通道数量。对于使用手工编码特征的方法,需要一些额外的工作来修改特征编码器。
PointPainting 在设计上是顺序的,这意味着并不总是能够针对 3D 检测的最终任务进行端到端优化。从理论上讲,这意味着性能不是最优的。然而,根据经验,PointPainting 比所有其他提出的融合方法更有效。此外,顺序方法还具有其他优点:(1) 图像的语义分割通常是有用的独立中间产品,(2) 在实时 3D 检测系统中,可以通过pipeline化图像和激光雷达来减少延迟网络,使激光雷达点用前一图像的语义进行装饰。在消融中证明这种流水线不会影响性能。
使用三种具有公共代码的最先进的仅限激光雷达的方法来实现 PointPainting:PointPillars 、VoxelNet (SECOND) 和 PointRCNN 。 事实上,PointRCNN 的绘制版本在 KITTI 排行榜上达到了最先进的水平。
**贡献:**主要贡献是一种新颖的融合方法,PointPainting,它通过图像语义增强点云。通过大量的实验,表明 PointPainting 是:

  • general - 在 KITTI 和 nuScenes 基准测试中与 3 种顶级仅激光雷达方法一起使用时实现显着改进;
  • accurate - PointRCNN 的绘制版本在 KITTI 基准上达到了最先进的水平;
  • robust - PointRCNN 和 PointPillars 的绘制版本分别提高了 KITTI 和 nuScenes 测试集上所有类别的性能。
  • fast - 低延迟融合可以通过pipeline化图像和激光雷达处理步骤来实现。

pointpainting架构

pointpainting
PointPainting 架构接受点云和图像作为输入和面向估计的 3D 框。它由三个主要阶段组成。 (1)语义分割:基于图像的语义分割阶段计算像素级分割分数的网络。 (2)融合:激光雷达点用seg分数绘制。 (3) 3D 物体检测:基于激光雷达的 3D 检测网络。

Image Based Semantics Network

图像语义分割网络接收输入图像并输出每个像素类别的分数。这些分数作为图像的紧凑概括特征。使用语义分割有几个关键优势在融合pipeline中。首先,语义分割是比 3D 目标检测更容易的任务,因为分割只需要局部的、每个像素的分类,而对象检测需要 3D 定位和分类。执行 seg 的网络更容易训练并且也适合执行快速推理。其次,语义分割技术正在快速进步,这使得 PointPainting 能够受益于分割和 3D 目标检测方面的进步。最后,在机器人或自动驾驶车辆系统中,seg 对于自由空间估计等任务来说,输出是有用的独立输出作用。
在本文中,KITTI 实验的分割分数是从 DeepLab v3+ 生成的,而对于 nuScenes 实验,训练了一个自定义的、更轻的网络。然而,注意到 PointPainting 与图像分割网络设计无关。

PointPainting

PointPainting
在这里提供有关painting算法的详细信息。激光雷达点云中的每个点对于 KITTI 和 nuScenes 分别是 (x, y, z, r) 或 (x, y, z, r, t),其中 x, y, z 是每个激光雷达点的空间位置, r 是反射率,t 是激光雷达点的相对时间戳(适用于使用多个激光雷达扫描)。激光雷达点通过齐次变换进行变换,然后投影到图像中。对于 KITTI,这种转换由 T camera←lidar 给出。由于激光雷达和摄像头以不同的频率运行,nuScenes 转换需要格外小心。完整的改造是:
在这里插入图片描述
分割网络的输出是 C 类分数,其中 KITTI C = 4(汽车、行人、骑自行车者、背景),nuScenes C = 11(10 个检测类加上背景)。将激光雷达点投影到图像中后,相关像素 (h, w) 的分割分数将附加到激光雷达点以创建绘制的激光雷达点。请注意,如果两个相机的视野重叠,则会有一些点同时投影在两个图像上,本文从两个图像之一中随机选择分割分数向量。另一种策略可以是通过比较它们的熵或前两个分数之间的差值来选择更具辨别力的分数向量。

Lidar Detection

任何学习编码器的激光雷达网络都可以使用装饰后的点云,因为 PointPainting 只是更改激光雷达点的输入维度。 PointPainting 也可以由带有手工设计的编码器的激光雷达网络使用,但每种方法都需要专门的特征工程。在本文中,证明了 PointPainting 可与三种不同的激光雷达检测器配合使用:PointPillars 、VoxelNet 和 PointRCNN 。这些都是最先进的激光雷达探测器,具有不同的网络架构:单级(PointPillars、VoxelNet)与两级(PointRCNN),以及柱(PointPillars)与体素(VoxelNet)与逐点特征(PointRCNN)。尽管有这些不同的设计选择,但所有激光雷达网络都受益于 PointPainting。

结论

本文提出了 PointPainting,这是一种新颖的顺序融合方法,可以使用基于图像的语义来绘制激光雷达点云。 PointPainting 使用多个不同的激光雷达网络在 KITTI 和 nuScenes 挑战中产生了最先进的结果。 PointPainting 框架非常灵活,可以将任何分割网络的输出与任何激光雷达网络相结合。这些结果的强度和普遍适用性表明,PointPainting 在融合图像和激光雷达信息进行 3D 物体检测时是领先的架构。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LFM(Lightweight Feature Module)是一种用于加速目标检测的技术,可以显著提高检测速度,同时保持高准确率。以下是一个基于LFM的加速目标检测代码示例,使用的是PaddlePaddle深度学习框架。 ```python import paddle import paddle.nn as nn from paddle.vision.models import resnet50 # 定义LFM模块 class LFM(nn.Layer): def __init__(self, in_channels, out_channels): super(LFM, self).__init__() self.conv1 = nn.Conv2D(in_channels, out_channels, kernel_size=1, stride=1, padding=0) self.bn1 = nn.BatchNorm2D(out_channels) self.conv2 = nn.Conv2D(out_channels, out_channels, kernel_size=3, stride=1, padding=1) self.bn2 = nn.BatchNorm2D(out_channels) self.relu = nn.ReLU() def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.conv2(x) x = self.bn2(x) x = self.relu(x) return x # 定义加速目标检测模型 class FasterRCNN(nn.Layer): def __init__(self, num_classes): super(FasterRCNN, self).__init__() self.backbone = resnet50(pretrained=True) self.lfm1 = LFM(1024, 256) self.lfm2 = LFM(512, 256) self.roi_head = nn.Sequential( nn.Linear(256 * 7 * 7, 4096), nn.ReLU(), nn.Linear(4096, 4096), nn.ReLU(), nn.Linear(4096, num_classes + 1) ) def forward(self, x, rois): x = self.backbone(x) x1 = x[0] x2 = x[1] x1 = self.lfm1(x1) x2 = self.lfm2(x2) x = paddle.concat([x1, x2], axis=1) x = paddle.flatten(x, start_axis=1) x = self.roi_head(x) return x # 加载数据集和模型 train_dataset = ... val_dataset = ... train_loader = paddle.io.DataLoader(train_dataset, batch_size=2, shuffle=True) val_loader = paddle.io.DataLoader(val_dataset, batch_size=2, shuffle=False) model = FasterRCNN(num_classes=10) optimizer = paddle.optimizer.Adam(learning_rate=0.0001, parameters=model.parameters()) criterion = nn.CrossEntropyLoss() # 训练模型 for epoch in range(10): for i, (images, targets) in enumerate(train_loader): images = paddle.to_tensor(images) targets = paddle.to_tensor(targets) output = model(images, targets) loss = criterion(output, targets) optimizer.clear_grad() loss.backward() optimizer.step() if i % 10 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, i+1, len(train_loader), loss.item())) # 在验证集上评估模型 model.eval() with paddle.no_grad(): correct = 0 total = 0 for images, targets in val_loader: images = paddle.to_tensor(images) targets = paddle.to_tensor(targets) output = model(images, targets) _, predicted = paddle.max(output.data, 1) total += targets.size(0) correct += (predicted == targets).sum().item() print('Accuracy of the model on the test images: {:.4f}%'.format(100 * correct / total)) ``` 在LFM模块中,我们使用了一个1x1卷积和一个3x3卷积来提取特征。在加速目标检测模型中,我们首先使用预训练的ResNet50作为backbone网络,然后通过LFM模块对不同尺度的特征图进行处理,最后在RoI Pooling层上进行ROI对齐,然后通过RoI head进行分类和回归。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一朵小红花HH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值