【3D点云】目标检测总结(持续汇总)
创始人
2024-05-30 09:24:20
0

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、SECOND(Sensors 2018)
    • 1、前言
    • 2.MeanVFE (voxel特征编码)
    • 3、VoxelBackBone8x
    • 4、HeightCompression (Z轴方向压缩)
    • 5、BaseBEVBackbone
    • 6、AnchorHeadSingle
    • 7. 数据增强
  • 二、Point RCNN(CVPR2019)
    • 1.第一阶段:proposal generation 自底向上的预选框生成
    • 2. 第二阶段:再筛选和优化bounding box
  • 三、深度估计的雷达成像(检测 CVPR2019)
  • 四、3DBoNet(检测+实例分割 NeurIPS2019)
    • 1.核心思想
    • 2.主要算法
  • 五、IA-SSD目标检测(CVPR 2022)
    • 1.摘要
    • 2、相关工作(综述)
      • 1.基于Voxel方法
      • 2.基于Point方法
      • 3.Point-Voxel方法
    • 3.创新点
      • 1.实例感知下采样策略
      • 2.上下文实例质心感知
    • 4.实验细节
  • 六、SST(CVPR2022)
    • 0.摘要
    • 1.消融实验(证明下采样损失精度)
    • 2.Methodology
    • 3.Experiments
  • 七、FlatFormer(麻省理工 2023)
  • 八、Pillar R-CNN(2023)
    • 1.前言
    • **两阶段2D和3D检测之间的域差距**
    • 2.本文方法
    • 2.1、Pillar-based Backbone
    • 2.2、Pyramidal Region Proposal Network
    • 2.3、R-CNN via 2D RoI Pooling on BEV Plane
    • 1、Lateral connection layer
    • 2、Auxiliary segmentation supervision
    • 3.实验结果
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、SECOND(Sensors 2018)

题目:SECOND: Sparsely Embedded Convolutional Detection
论文:https://www.mdpi.com/1424-8220/18/10/3337
代码:https://github.com/traveller59/second.pytorch

1、前言

SECOND是基于 Voxel按anchor-based 的点云检测方法,整体结构和实现接近 VoxelNet,改进了中间层的3D卷积,采用稀疏卷积来完成,提高了训练的效率和网络推理的速度,同时解决了VoxelNet中角度预测中,因为物体完全反向和产生很大loss的情况;同时,SECOND还提出了GT_Aug的点云数据增强。

在这里插入图片描述
在这里插入图片描述

2.MeanVFE (voxel特征编码)

经过对点云数据进行Grouping操作后得到三份数据:

1、所有的voxel shape为(N,5,4) ; 5为每个voxel最大的点数,4为每个point的数据:x,y,z,reflect intensity

2、每个voxel的位置坐标 shape(N, 3)

3、每个voxel中有多少个非空点 shape (N)

1.原文中分别对车、自行车和行人使用了不同的网络结构,PCDet仅使用一种结构训练三个类别。2.在kitti数据集的实现中,点云的范围为[0, -40, -3, 70.4, 40, 1],超出部分会被裁剪, 此处以OpenPCDet中的统一规范坐标为准:x向前,y向左,z向上,旋转角从x到y逆时针为正。3.原论文中的每个voxel的长宽高为0.2,0.2,0.4且每个voxel中采样35个点,在PCDet的实现中每个voxel的长宽0.05米,高0.1米且每个voxel采样5个点;同时在Grouping的过程中,一个voxel中点的数量不足5个的话,用0填充至5个。N为非空voxel的最大个数,训练过程中N取16000,推理时取40000。

在新的实现中,去掉了原来Stacked Voxel Feature Encoding,直接计算每个voxel内点的平均值,当成这个voxel的特征.

(Batch16000, 5, 4) --> (Batch16000, 4)

class MeanVFE(VFETemplate):def __init__(self, model_cfg, num_point_features, **kwargs):super().__init__(model_cfg=model_cfg)voxel_features, voxel_num_points = batch_dict['voxels'], batch_dict['voxel_num_points']# 求每个voxel内 所有点的和# eg:SECOND  shape (Batch*16000, 5, 4) -> (Batch*16000, 4)points_mean = voxel_features[:, :, :].sum(dim=1, keepdim=False)# 正则化项, 保证每个voxel中最少有一个点,防止除0normalizer = torch.clamp_min(voxel_num_points.view(-1, 1), min=1.0).type_as(voxel_features)# 求每个voxel内点坐标的平均值points_mean = points_mean / normalizer# 将处理好的voxel_feature信息重新加入batch_dict中

3、VoxelBackBone8x

在VoxelNet中采用3D卷积提取特征,计算量太大,进行了改进:
submanifold卷积 将输出位置限制为在且仅当相应的输入位置处于活动状态时才处于活动状态。 这避免了太多的激活位置的产生,从而导致后续卷积层中速度的降低。
在这里插入图片描述

黄色代表作者自己提出的稀疏卷积,白色代表submanifold卷积,红色代表sparse-to-dense层
代码在:pcdet/models/backbones_3d/spconv_backbone.p


class VoxelBackBone8x(nn.Module):def __init__(self, model_cfg, input_channels, grid_size, **kwargs):super().__init__()self.model_cfg = model_cfgnorm_fn = partial(nn.BatchNorm1d, eps=1e-3, momentum=0.01)self.sparse_shape = grid_size[::-1] + [1, 0, 0]self.conv_input = spconv.SparseSequential(spconv.SubMConv3d(input_channels, 16, 3, padding=1, bias=False, indice_key='subm1'),norm_fn(16),nn.ReLU(),)block = post_act_blockself.conv1 = spconv.SparseSequential(block(16, 16, 3, norm_fn=norm_fn, padding=1, indice_key='subm1'),)self.conv2 = spconv.SparseSequential(# [1600, 1408, 41] <- [800, 704, 21]block(16, 32, 3, norm_fn=norm_fn, stride=2, padding=1, indice_key='spconv2', conv_type='spconv'),block(32, 32, 3, norm_fn=norm_fn, padding=1, indice_key='subm2'),block(32, 32, 3, norm_fn=norm_fn, padding=1, indice_key='subm2'),self.conv_out = spconv.SparseSequential(# [200, 150, 5] -> [200, 150, 2]spconv.SparseConv3d(64, 128, (3, 1, 1), stride=(2, 1, 1), padding=last_pad,bias=False, indice_key='spconv_down2'),norm_fn(128),nn.ReLU(),def forward(self, batch_dict):"""Args:batch_dict:batch_size: intvfe_features: (num_voxels, C)voxel_coords: (num_voxels, 4), [batch_idx, z_idx, y_idx, x_idx]Returns:batch_dict:encoded_spconv_tensor: sparse tensor"""# voxel_features, voxel_coords  shape (Batch * 16000, 4)voxel_features, voxel_coords = batch_dict['voxel_features'], batch_dict['voxel_coords']batch_size = batch_dict['batch_size']# 根据voxel坐标,并将每个voxel放置voxel_coor对应的位置,建立成稀疏tensorinput_sp_tensor = spconv.SparseConvTensor(# (Batch * 16000, 4)features=voxel_features,# (Batch * 16000, 4) 其中4为 batch_idx, x, y, zindices=voxel_coords.int(),# [41,1600,1408] ZYX 每个voxel的长宽高为0.05,0.05,0.1 点云的范围为[0, -40, -3, 70.4, 40, 1]spatial_shape=self.sparse_shape,# 4batch_size=batch_size)"""稀疏卷积的计算中,feature,channel,shape,index这几个内容都是分开存放的,在后面用out.dense才把这三个内容组合到一起了,变为密集型的张量spconv卷积的输入也是一样,输入和输出更像是一个  字典或者说元组注意卷积中pad与no_pad的区别"""# # 进行submanifold convolution# [batch_size, 4, [41, 1600, 1408]] --> [batch_size, 16, [41, 1600, 1408]]x = self.conv_input(input_sp_tensor)# [batch_size, 16, [41, 1600, 1408]] --> [batch_size, 16, [41, 1600, 1408]]x_conv1 = self.conv1(x)# [batch_size, 16, [41, 1600, 1408]] --> [batch_size, 32, [21, 800, 704]]x_conv2 = self.conv2(x_conv1)# [batch_size, 32, [21, 800, 704]] --> [batch_size, 64, [11, 400, 352]]x_conv3 = self.conv3(x_conv2)# [batch_size, 64, [11, 400, 352]] --> [batch_size, 64, [5, 200, 176]]x_conv4 = self.conv4(x_conv3)# for detection head# [200, 176, 5] -> [200, 176, 2]# [batch_size, 64, [5, 200, 176]] --> [batch_size, 128, [2, 200, 176]]out = self.conv_out(x_conv4)

其中block为稀疏卷积构建:

def post_act_block(in_channels, out_channels, kernel_size, indice_key=None, stride=1, padding=0,conv_type='subm', norm_fn=None):# 后处理执行块,根据conv_type选择对应的卷积操作并和norm与激活函数封装为块if conv_type == 'subm':conv = spconv.SubMConv3d(in_channels, out_channels, kernel_size, bias=False, indice_key=indice_key)elif conv_type == 'spconv':conv = spconv.SparseConv3d(in_channels, out_channels, kernel_size, stride=stride, padding=padding,bias=False, indice_key=indice_key)elif conv_type == 'inverseconv':conv = spconv.SparseInverseConv3d(in_channels, out_channels, kernel_size, indice_key=indice_key, bias=False)else:raise NotImplementedErrorm = spconv.SparseSequential(conv,norm_fn(out_channels),nn.ReLU(),)return m

4、HeightCompression (Z轴方向压缩)

前面VoxelBackBone8x得到的tensor是稀疏tensor:[batch_size, 128, [2, 200, 176]]

这里需要将原来的稀疏数据转换为密集数据;同时将得到的密集数据在Z轴方向上进行堆叠,因为在KITTI数据集中,没有物体会在Z轴上重合;同时这样做的好处有:

1.简化了网络检测头的设计难度

2.增加了高度方向上的感受野

3.加快了网络的训练、推理速度

最终得到的BEV特征图为:(batch_size, 128*2, 200, 176) ,这样就可以将图片的检测思路运用进来了。

5、BaseBEVBackbone

在获得类图片的特征数据后,需要在BEV的视角上提取特征:分别对特征图进行不同尺度的下采样、上采用、通道维度拼接。

下采样分支一:(batch_size, 1282, 200, 176) --> (batch,128, 200, 176)
下采样分支二:(batch_size, 128
2, 200, 176) --> (batch,128, 200, 176)

反卷积分支一:(batch, 128, 200, 176) --> (batch, 256, 200, 176)
反卷积分支二:(batch, 256, 100, 88) --> (batch, 256, 200, 176)

最终将结构在通道维度上进行拼接的特征图维度:(batch, 256 * 2, 200, 176)
代码在:pcdet/models/backbones_2d/base_bev_backbone.py

6、AnchorHeadSingle

经过BaseBEVBackbone后得到的特征图为(batch, 256 * 2, 200, 176);在SECOND中,作者提出了方向分类,将原来VoxelNet的两个预测头上增加了一个方向分类头,来解决角度训练过程中一个预测的结果与GTBox的方向相反导致大loss的情况(框架图中最后三个黄色模块)

3D世界中,各类物体大小相对固定,将KITTI数据集中每个类别的平均长宽高作为anchor大小,同时每个类别的anchor都有两个方向角为0度和90度,则特征图上像素点含6个anchor(3类*2)

1.anchor的类别尺度大小(单位:米):
分别是车 [3.9, 1.6, 1.56],anchor的中心在Z轴的-1米、
人[0.8, 0.6, 1.73],anchor的中心在Z轴的-0.6米、
自行车[1.76, 0.6, 1.73],anchor的中心在Z轴的-0.6米2.每个anchro都有被指定两个个one-hot向量,一个用于方向分类,一个用于类别分类;还被指定一个7维的向量用于anchor box的回归,分别是(x, y, z, l, w, h, θ)其中θ为PCDet坐标系下物体的朝向信息。最终可以得到3个类别的anchor,维度都是[z, y, x, num_size, num_rot, 7],其中num_size是每个类别有几个尺度(1个);num_rot为每个anchor有几个方向类别(2个);7维向量表示为[x, y, z, dx, dy, dz, rot](每个anchor box的信息)。

代码在:pcdet/models/dense_heads/target_assigner/anchor_generator.py

7. 数据增强

SECOND提出了对GT进行采样截取,生成GT的Database,该方法在后续的很多网络中都得到了使用。(后续被称为GT_AUG)。该方法加速了网络的收敛速度,提升了最终精度。

   1.首先,先对数据集中的标签和对应的box内的点云数据进行截取来创建database2.其次,在训练的点云帧上随机从database中采样一部分GT,放入该帧中3.对所有的GT进行碰撞检测,防止放入的GT会相互碰撞,产生不可能在物理世界中出现的结果,删除碰撞GT

二、Point RCNN(CVPR2019)

论文:PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud

Two-stage detector (Faster R-CNN!)

1.第一阶段:proposal generation 自底向上的预选框生成

这个阶段有两个功能:分割前景点,生成预选框。

先用pointnet提取点云的特征。输入是(bs, n, 3)的点云,输出是(bs, n, 128)的特征。后接一个前景点分割网络(图中蓝色)和一个box生成网络(图中黄色)。

在这里插入图片描述
前景点分割网络:由两个卷积层组成。输入(bs, n, 128)的特征,输出(bs, n, 1)的mask。1表示这个点属于前景点的概率,值越大,则它属于前景点的概率越高。加一个sigmoid限制到(0,1),然后用focal loss计算损失。
box生成网络:由两个卷积层组成。输入是(bs, n, 128)的特征,输出是(bs, n, 76)。对于3d目标的bounding box,需要7个量来表示:box中心点(x,y,z), box的长,宽,高(w,h,l),俯视图的旋转角ry。这里用基于bin的预测方法使76个维度特征来代表这7个量,如下图左所示。
在这里插入图片描述
筛选:这一步网络的输出是(bs, n, 76),即对场景中的每一个点,预测一个bounding box。为减少冗余,所结合之前分割的mask,只考虑前景点的预测结果。再使用了NMS算法来进一步减少bounding box。 在相机 0~40m距离内的bounding box,先取得分类得分最高的6300个,然后计算bird view IOU,把IOU大于0.85的都删掉,到这里bounding box 又少了一点。然后再取得分最高的210个。在距离相机40~80m的范围内用同样的方法取90个。这样第一阶段结束的时候只剩下300个bounding box了。再进行第二阶段置信度打分和bounding box优化。

2. 第二阶段:再筛选和优化bounding box

输入:300个proposal bounding box,即(bs,300,7)。然后用sample和设置阈值的方法把bbox减少到128个。把在每个bounding box proposal 内部的点聚集起来,得到大小(bs,m,512,c)的数据。m表示每个batch中有多少个bounding box(比如128), 512表示每个bounding box里面有多少个point。然后进行数据增强操作。

接下来把每个bounding box内的points转换到局部坐标系(canonical 转换)下。如下图。
在这里插入图片描述
在这里插入图片描述
具体就是,新坐标系的坐标原点是bbox的中心点。并且让新的x轴和这个bbox头部平行。第二阶段会结合第一阶段预测的到的大小为(bs,n,128)的feature。

把大小为(bs,n,1)的mask,每个点距离相机的距离,每个点的反射强度(从雷达相机直接可以得到的值),每个点的坐标(x,y,z),全部concat在一起,上采样到128维度,和第一阶段预测的128维global feature结合为256维新特征。

pointnet++的SA module(是一个采样,分组,特征提取模块)继续对这个特征进行卷积操作,得到一个(m,1,512)的特征,表示一个场景中有m个bounding box, 一个512维的point来代表这个bbox。

最后分别接一个reg_layer和一个cls_layer(conv1d)改变特征通道。得到(m,46)的bbox相关的预测结果和(m,1)的置信度结果。这46特征也是基于bin的预测,只是现在0-6表示x_bin,从而得到128个bounding box。结合预测得到的confidence筛选出最后的bounding box。PointRCNN检测结果如下图所示。

result:
在这里插入图片描述

三、深度估计的雷达成像(检测 CVPR2019)

题目:Pseudo-LiDAR from Visual Depth Estimation
在这里插入图片描述

四、3DBoNet(检测+实例分割 NeurIPS2019)

论文链接:https://arxiv.org/abs/1906.01140
代码链接:https://github.com/Yang7879/3D-BoNet (tensorFlow)

1.核心思想

利用逐点多层感知机(MLP),直接预测3D边框,同时预测边框内各个点的二分标志,即判断它是属于物体还是属于背景。因此有 两个组成部分,一是3D边框预测网络,二是框内点分类网络。3D-BoNet不仅是单阶段、无锚点、端到端的系统,而且相比于传统思路效率大幅度提高,因为它不需要非极大值抑制(NMS)、特征采样、聚类、投票等后处理操作

2.主要算法

传统方法缺点:实例分割在此之前主要有两类,第一类是基于候选目标框的算法(Proposal-based methods),这类方法通常先生成大量的候选框,然后依赖于两阶段的训练和昂贵的非极大值抑制等操作来对密集的候选框进行选择,缺点自然是运算量特别大。第二类是无候选目标框的算法(Proposal-free methods),这类方法的核心思想是为每个点学习一个分类,然后再通过聚类方法来将属于同一个实例的点聚集到一起,缺点最终聚类到一起的实例目标性比较差,而且后处理步骤的时间成本也比较高。

改进思路:首先不使用候选框,但为了提高目标性,不能放弃边界框,所以可以直接预测边界框,设计了一种边界框关联的方法,把预测和真值关联在一起,完成关联,后续的损失值设计等步骤就好做了。最后再对回归的边界框内的点做一个二分类,把背景点去掉,就可以得到实例分割的结果了。

流程:首先提取全局特征,直接使用这个全局特征来预测边界框。与此同时,提取点的特征,待边界框回归结束以后,某些点就会落入对应的框中,这样就可以进行二值分类,分割出实例目标。
在这里插入图片描述
训练时,边界框的关联(真值与预测值)是本文重点,可以分为以下几步:

1分配预测框给最近的真值框
2 计算顶点之间的欧式距离、交并比、交叉熵
3计算损失函数
4反向估计

完成了边界框的回归,剩下的最后一步就是背景点的剔除了,具体流程图下图所示。即根据点特征和边界框的得分,对框内的点进行二分类.
在这里插入图片描述

在这里插入图片描述
ScanNet 上实验结果:
在这里插入图片描述
消融实验:
在这里插入图片描述

五、IA-SSD目标检测(CVPR 2022)

题目:End-to-End Multi-View Fusion for 3D Object Detection in LiDAR Point Clouds
论文:https://arxiv.org/abs/1910.06528v2

1.摘要

对于detector(即预测7自由度的三维box框,包括三维位置、三维尺寸、方向和类别标签)来说,前景点本质上比背景点更重要。基于此,论文提出了一种高效的单级基于point的3D目标检测器,称为IA-SSD:利用两种可学习的, 面向任务、实例感知 的下采样策略来分层选择属于感兴趣对象的前景点。此外,还引入了上下文质心感知模块,以进一步估计精确的实例中心。为了提高效率,论文按照 纯编码器 架构构建了IA-SSD。

由于三维点云的非结构化和无序性质,早期的工作通常首先将原始点云转换为中间规则表示,包括将三维点云投影到鸟瞰视图或正面视图的二维图像,或转换为密集的三维体素(3D-2D投影或体素化引入了量化误差),基于点的pipeline,许多重要的前景点在最终的边界框回归步骤之前被丢弃。
在kitti数据集上:
在这里插入图片描述

2、相关工作(综述)

1.基于Voxel方法

为了处理非结构化三维点云,基于体素的检测器通常首先将不规则点云转换为规则体素网格,这允许利用成熟的卷积网络架构。早期的工作,对输入点云进行密集体素化,然后利用卷积神经网络学习特定的几何模式。然而,效率是这些方法的主要限制之一,因为计算和内存成本随着输入分辨率呈立方体增长。为此,Yan等人[49]通过利用3D子流形稀疏卷积[9],提出了一种称为SECOND的高效架构。通过减少对空体素的计算,计算和存储效率显著提高。此外,提出了PointPillars,以进一步将体素简化为pillars (即仅在平面中进行体素化)。

现有的方法大致可分为单级检测器[7,11,54,55,57,58]和两级检测器[4,36–39,53]。尽管简单有效,但由于空间分辨率降低和结构信息不足,尤其是对于具有稀疏点的小对象,它们通常无法实现令人满意的检测性能。为此,SA-SSD通过引入辅助网络来利用结构信息。Ye等人[54]介绍了一种混合体素网络(HVNet),用于集中和投影多尺度特征图,以获得更好的性能。郑等人[58]提出了置信IoU感知(CIA-SSD )网络来提取空间语义特征,用于目标检测。相比之下,两级检测器可以获得更好的性能,但计算/存储成本较高。Shi等人[39]提出了一种两级检测器,即Part-A2,它由Part-aware和聚合模块组成。Deng等人[5]通过引入完全卷积网络来扩展PV-RCNN[36],以进一步利用原始点云的体积表示并同时进行细化。

总的来说,基于体素的方法可以实现良好的检测性能和良好的效率。然而,体素化不可避免地引入量化损耗。为了补偿预处理阶段的结构失真,需要在[20,25,27,28,35]中引入复杂的模块设计,这反过来会大大降低最终检测效率。此外,考虑到复杂的几何结构和各种不同的对象,在实践中确定最佳分辨率并不容易。

2.基于Point方法

与基于体素的方法不同,基于点的方法[30,38,52]直接从非结构化点云学习几何,进一步为感兴趣的对象生成特定proposal。考虑到3D点云的无序性,这些方法通常采用PointNet[31]及其变体[22、32、33、45、47],使用对称函数聚合独立的逐点特征。Shi等人[38]提出了PointRCNN,一种用于3D对象检测的两阶段3D区域proposal框架。该方法首先从分割的前景点生成对象建议,然后利用语义特征和局部空间线索回归高质量的三维边界框。Qi等人[30]介绍了VoteNet,这是一种基于深度Hough投票的单级point 3D检测器,用于预测实例质心。受2D图像中单级检测器[21]的启发,Yang等人[52]提出了一种3D单级检测(3DSSD)框架,而关键是融合采样策略,包括特征和欧几里德空间上的最远点采样。PointGNN[40]是一个将图形神经网络推广到3D对象检测的框架。

基于点的方法直接在原始点云上操作,无需任何额外的预处理步骤(如体素化),因此通常直观直观。然而,基于点的方法的主要瓶颈是学习能力不足和效率有限。

3.Point-Voxel方法

为了克服基于点的方法(即不规则和稀疏的数据访问、较差的内存局部性[23])和基于体素方法(如量化损失)的缺点,已经开始使用几种方法[3、16、36、37、53]从3D点云学习点-体素联合表示。PV-RCNN【36]及其后续工作[37]从体素抽象网络中提取逐点特征,以细化从三维体素主干生成的proposal。

HVPR[29]是一种单级3D探测器,通过引入高效内存模块以增强基于点的功能,从而在准确性和效率之间提供更好的折衷。Qian等人[34]提出了一种轻量级区域聚合细化网络(BANet)通过局部邻域图构造,产生更精确的box边界预测。

3.创新点

梗概: 首先将输入的激光雷达点云送入网络以提取逐点特征,然后进行拟议的实例感知下采样,以逐步降低计算成本,同时保留信息丰富的前景点。学习的潜在特征进一步输入到上下文质心感知模块,以生成实例建议并回归最终边界框。
在这里插入图片描述

1.实例感知下采样策略

计算效率前景点的保留 之间实现理想的权衡。为此,论文首先进行了一项实证研究,以定量评估不同的抽样方法,并遵循常用的编码体系结构(即具有4个编码层的PointNet++[32]),评估了随机点采样[14]、基于欧几里德距离的FPS(D-FPS)[32]和特征距离(Feat FPS)[52]等方法。

实验显示,在多次随机下采样操作后,实例召回率显著下降,表明大量前景点已被删除。D-FPS和Feat FPS在早期阶段都实现了相对较好的实例召回率,但在最后一个编码层也无法保留足够的前景点。因此,精确检测感兴趣的目标仍然是一项挑战,特别是对于行人和骑自行车的人等小目标,在这些小目标中只剩下极有限的前景点。

为了尽可能多地保留前景点,论文利用每个点的潜在语义,因为随着分层聚合在每个层中运行,学习的点特征可能包含更丰富的语义信息。根据这一思想,论文通过将前景语义先验合并到网络训练管道中,提出了以下两种面向任务的采样方法:

Class-aware Sampling

该采样策略旨在学习每个点的语义,从而实现选择性下采样。为了实现这一点,论文引入了额外的分支来利用潜在特征中丰富的语义。通过将两个MLP层附加到编码层,以进一步估计每个点的语义类别:
在这里插入图片描述
C表示类别数,si表示one-hot标签,si^表示预测Logit。在推理过程中,具有前k个前景分数的点被保留,并被视为馈送到下一编码层的代表点(为保留更多的前景点,实现了较高的实例召回率)。
在这里插入图片描述

Centroid-aware Sampling

考虑到实例中心估计是最终目标检测的关键,进一步提出了一种质心感知下采样策略,为更接近实例质心的点赋予更高的权重。将实例i的soft point mask定义如下:
在这里插入图片描述
其中f∗, b∗, l∗, r∗, u∗, d∗ 分别表示点到边界框的6个surface(前、后、左、右、上和下)的距离。在这种情况下,靠近长方体质心的点可能具有更高的mask score(最大值为1),而位于surface上的点的mask分数为0。在训练期间,soft point mask将用于根据空间位置为边界框内的点指定不同的权重,因此将几何先验隐含地纳入网络训练。

将soft point mask与前景点的损失项相乘,以便为中心附近的点分配更高的概率。注意,在推理过程中不再需要box,如果模型训练充分,只需在下采样后保留得分最高的前k个点。

2.上下文实例质心感知

上下文质心预测

受2D图像中上下文预测成功的启发[6,51],论文试图利用边界框周围的上下文线索(质心预测)。遵循[30]明确预测偏移量∆ c到实例中心,并添加了正则化项以最小化质心预测的不确定性,质心预测损失公式如下:
在这里插入图片描述

基于质心的实例聚合

对于移位代表(质心)点,进一步利用PointNet++模块学习每个实例的潜在表示。将相邻点转换为局部规范坐标系,然后通过共享MLP和对称函数聚合点特征。

Proposal Generation Head

将聚集的质心点特征输入到提案生成头中,预测具有带有类别的bounding box。论文将proposal编码为具有位置、规模和方向的多维表示。最后,所有proposal都通过具有特定IoU阈值的3D-NMS后处理进行过滤。

4.实验细节

为了提高效率,论文基于单级编码器体系结构构建了IA-SSD。SA层[32]用于提取逐点特征,并使用具有递增半径组的多尺度分组([0.2,0.8]、[0.8,1.6]、[1.6,4.8])来稳定地提取局部几何特征。考虑到早期层中包含的有限语义,在前两个编码层中采用D-FPS,然后是所提出的实例感知下采样。256个代表点特征被馈送到上下文质心预测模块中,然后是三个MLP层(256→256→3) 以预测实例质心。最后,添加分类和回归层(三个MLP层)以输出语义标签和相应的边界框。

六、SST(CVPR2022)

题目:Embracing Single Stride 3D Object Detector with Sparse Transformer,【CASIA,UIUC,CMU】
代码: https://github.com/TuSimple/SST
论文: https://arxiv.org/pdf/2112.06375.pdf

0.摘要

作者发现,3D目标检测方法中提取特有下采样的操作(如PointPillars),特征图变小,导致信息损失;采用Transformer 无下采样,attention机制也适合稀疏点云操作。

做法

1.点云体素化(或者Pillars化),将每个体素当作一个token,输入Transformer;
2.Regional Grouping:临近的token分为一个Group,Group内token做self-attention交互
3.Region Shift,再做self-attention,合并为一个block(共有6个):
4.后接一个检测头进行检测。

Group尺寸是3.84m×3.84m×6m,Pillars尺寸是0.32m×0.32m×6m

Group内做局部self-attention,是因为3D点云空间中,目标相对于整个点云很小,因此不需要很大的全局特征,只需局部特征。

在这里插入图片描述
下采样算子的丢弃导致两个问题:1)计算成本的增加2)感受野的减少。前者限制了对实时系统的适用性,后者阻碍了对象识别的能力。对于计算的问题,稀疏卷积似乎是一个解决方案,但体素之间的稀疏连接使得感受野的下降更加严重。对于感受野问题,膨胀卷积对小对象不友好,较大的内核导致无法承受的计算开销在单步架构中。
注意力机制是个更好的选择:1)可以捕捉长距离的上下围信息,拥有更大的感受野.2)适合稀疏点云数据

因此,我们将体素化的 3D 空间划分为许多局部区域,并在每个区域内应用自我注意。最终,这种称为稀疏区域注意 (SRA) 的局部注意机制享有两全其美。通过堆叠 SRA 层,我们使单步网络可行,并获得了一个Transformer风格的网络,称为单步稀疏Transformer (SST)。在大规模的 Waymo 开放数据集上进行实验,验证分割上的 83.8 LEVEL 1 AP

1.消融实验(证明下采样损失精度)

选择MMDetection3D框架中的PointPillars作为base model,在waymo数据集上进行测试。

在标准 PointPillars 模型 D2 的基础上,我们将其扩展为另外三个变体:D3、D1 和 D0,它们仅在网络步长上有所不同。从 D3 到 D0,每个模型的四个阶段的步长集合是{1, 2, 4, 8}, {1, 2, 4, 4}, {1, 2, 2, 2} 和 {1,1, 1, 1},分别。由于四个阶段的输出特征图将通过类似 FPN 的模块上采样到原始分辨率,因此我们的修改不会改变检测头中特征图的分辨率。除了特征图的分辨率,所有四个模型都具有相同的超参数。为了减少内存开销,我们将卷积层中的过滤器数量从 256 更改为 128。结果如表 1 所示。 D3 到 D1在不断提升,并且从 D2 到 D1 有显着提升。从 D3 到 D1 的性能提升支持了我们的动机,即更小的步幅更适合 3D 检测。但从D1到D0,车辆性能下降明显,而行人性能下降幅度较小,自行车的性能不断上升。 D0 的有限感受野阻碍了从 D1 到 D0 的性能提升,因为行人和自行车比车辆的尺寸更小。

为验证推测,增加了两个变种,膨胀卷积核5*5卷积核。采用膨胀卷积的汽车检测精度提高,行人和自行车降低,证明提高感受野的同时会损失细节上的信息。更大尺寸的卷积核会对所有类型的检测精度有提升,但是速度慢。足够的感受野至关重要
在这里插入图片描述

2.Methodology

  1. Overall Architecture

目前来看,single stride architecture feasible 的关键就是充足的感受野可接受的计算量。卷积架构很难同时满足上述两个要求。构建的SST(Single-stride Sparse Transformer ),如下图所示:
在这里插入图片描述

每个voxel看作一个token.:首先将体素化的 3D 空间划分为固定大小的非重叠group。然后将稀疏注意 (SRA) 应用于每个group。为处理分散于不同区域的对象并捕获有用的局部上下文,采用了区域移位,其灵感来自 Swin-Transformer中的移位窗口。主干保留了体素的数量以及它们的空间位置,从而满足单步属性,并且可以与主流检测头集成

  1. Regional Grouping

在这里插入图片描述

给定输入体素tokens,区域分组将 3D 空间划分为不重叠的区域,以便自我注意仅与来自相同区域的标记交互。区域分组不仅保持了足够的感受野,而且避免了全局注意力中昂贵的计算开销。我们在上图中直观地说明了这一点。每个区域分组根据输入标记的物理位置将其分成组,其中属于相同区域(绿色矩形)的标记被分配到同一组。

  1. Sparse Regional Attention

稀疏区域注意 (SRA) 对来自同一个区域分组的区域稀疏体素tokens 进行操作。对于一组tokens F 及其对应的空间 (x, y, z) 坐标I,SRA 遵循以下常规 self attention操作
在这里插入图片描述
其中PE(·)代表绝对位置编码函数,MSA(·)代表Multi-head Self-Attention,LN(·)代表Layer Normalization。这种 SRA 方式很好地利用了点云的稀疏性,因为它只计算具有实际 LiDAR 点的体素

区域批处理以实现高效执行 :由于点云的稀疏性,每个group的有效tokens 数量各不相同。为了利用并行计算,我们将具有相似数量tokens 的group批处理在一起。在实践中,如果一个group包含 N个 token ,满足

在这里插入图片描述

然后我们将tokens 数量填充为 2i+1。使用填充tokens ,我们可以将所有group分成几个批次,然后并行处理同一批次中的所有区域。由于填充的tokens 在计算中被屏蔽,它们对其他有效tokens 没有影响。这样,在当前流行的深度学习框架中很容易实现高效的 SRA 模块,而无需像稀疏卷积中所做的工程努力

  1. Region Shift

虽然 SRA 可以覆盖相当大的区域,但仍有一些对象不可避免地被分组截断。为了解决这个问题并聚合有用的上下文,我们在设计中进一步使用了 Region Shift,这类似于 Swin Transformer 中用于信息通信的移位机制。假设group分组中的区域大小为 (lx, ly , lz ),Region Shift 将原始区域移动 (lx/2, ly /2, lz /2) 并根据这组新的group对tokens 进行分组,如下图的所示。
在这里插入图片描述
5. Integration with Detection

为了与现有的检测器头一起融合,SST 根据其空间位置将稀疏体素标记放回密集特征图。未占用的位置用零填充。由于 LiDAR 仅捕获物体表面上的点,3D 物体中心很可能位于零特征的空白位置,这对当前的检测头设计不友好。所以我们添加了两个 3 × 3 的卷积来填充对象中心的大部分空洞。

至于检测头和损失函数,为简单起见,我们采用与 PointPillars 相同的设置。具体来说,我们使用 SSD 头、smooth L1 边界框定位损失 Lloc、focal loss形式的分类损失 Lcls,以及惩罚错误方向的方向损失 Ldir。最终的损失函数是 Eq 3,其中 Np 是正样本的数量。
在这里插入图片描述尽管我们的主为了使性能与当前的两级检测器相匹配,我们将 LiDAR-RCNN 作为我们的第二级。LiDAR-RCNN 是一个轻量级的第二阶段网络,由一个简单的 PointNet组成,用于特征提取,仅将proposal中的原始点云作为输入。

3.Experiments

Model Setup 模型以Point-Pillars为基础,将其backbone 替换为6 个连续的稀疏区域注意 (SRA) 块,每个block包含2次 attention module(应该就是两次group,第二次做shift),8头,在区域分组中,每个区域覆盖大小为 3.84m × 3.84m × 6m 的体积,采用的BEV pillar size0.32m×0.32m×6m。
在这里插入图片描述

七、FlatFormer(麻省理工 2023)

论文:https://arxiv.org/pdf/2301.08739.pdf

作者单位:麻省理工学院 上海交通大学 清华大学

  1. 论文思路

本文介绍了FlatFormer,通过交易空间邻近性(trading spatial proximity ),以获得更好的计算规律性,来缩小trans的延迟差距。本文 1.首先使用基于窗口的排序和划分点将点云扁平化(flatten)成相同大小的组(groups of equal sizes),而不是相同形状的窗口(windows of equal shapes)。这有效地避免了昂贵的结构化和填充开销。然后,本文 2.在组内应用自注意力来提取局部特征,交替排序轴从不同的方向收集特征,并移动窗口来在组间交换特征。FlatFormer在Waymo Open Dataset上提供了最先进的精度,比(transformer-based)SST加速4.6×,比(sparse convolutional)CenterPoint加速1.4×。这是第一个在边缘GPUs上实现实时性能的点云transformer,并且比稀疏卷积方法更快,同时在大规模基准测试上达到同等甚至更高的精度。

  1. 网络设计

在这里插入图片描述

FlatFormer的基本构件是Flattened Window Attention(FWA)。如图5右所示,FWA采用基于窗口的排序来flatten点云,并将其划分为相同大小的组,而不是相同形状的窗口。这很自然地解决了组大小不平衡的问题,并避免了填充和分区开销。然后,FWA在组内应用自注意力来提取局部特征,交替使用排序轴来聚集从不同方向上的特征,并移动窗口来在组间交换特征。最后,本文提供了一个FWA的实现,进一步提高了其效率,并最小化了开销。

  1. 实验

在这里插入图片描述

八、Pillar R-CNN(2023)

1.前言

在这里插入图片描述

当前最先进的 两阶段3D目标检测方法 如图1所示,通常使用 基于点体素的特征学习方案来生成基于BEV的3D Proposals,然后在3D空间中进行点级框细化。在这两个阶段中,有效的关键点表示都起着主要作用。

  1. 开创性的PV-RCNN通过最远点采样(FPS)对原始点云进行子采样,作为中间关键点,并采用基于点的集合操作进行点体素交互。尽管PV-RCNN具有令人印象深刻的检测精度,但其点采样和邻居搜索过程耗时。

  2. Voxel R-CNN认为,粗糙的3D体素而不是原始点的精确定位足以在大目标上进行精确定位。Voxel RCNN将稀疏但规则的三维体视为一组非空体素中心点,并利用加速的PointNet模块在精度和效率之间实现新的平衡。

  3. PART-A2 采用了类似UNet的架构,用于更精细的体素点,并为小目标获得了更多的利润。最新的工作试图解决中间关键点的稀疏性和点密度变化问题,以提高检测精度。

总之,典型的基于点体素的3D检测器将点云转换为规则网格,用于基于BEV的3D
Proposals生成,并取决于关键点的粒度,以便进一步细化框。这不可避免地加剧了检测系统的复杂性。

从基于BEV的感知的角度来看,作者希望设计一个紧凑的R-CNN Head,在简单的Pillar上,以实现框的细化。基于三维体素的检测器,将三维特征体积转换为密集检测头的BEV表示,仅仅是鸟瞰图(BEV)表示仍然可以提供足够的3D结构信息,无需通过点级表示来恢复该上下文。 为了确认观点的正确性,作者构建了具有可管理粒度的合理池化特征图,并为每个3D Proposals裁剪该2D密集图,以进行3D RoI细化。

两阶段2D和3D检测之间的域差距

与2D不同,其中输入图像是2D密集图,点云的固有稀疏性和不规则性使其在方法上偏离了2D检测领域。主要差距可以是两阶段框架中基于3D点/体素的点云表示和过渡关键点。因此,2D检测的最新方法很难应用于3D检测

例如,作为2D检测中的基本组件,特征金字塔网络(FPN)尚未被当前基于LiDAR的3D检测成功使用。基于Pillar的3D检测的最新进展通过在2D检测到3D检测中引入成熟的主干(如VGGNet和ResNet),部分弥补了这一差距,并取得了成功。

沿着这一研究方向,作者的目标是通过开发一种2D R-CNN型检测器,用于基于激光雷达的3D检测,从而缩小畴隙。所提出的Pillar R-CNN将基本FPN与RPN适当集成,用于小目标检测,并裁剪二维密集池化特征图,如RoIPool或RoIAlign,用于进一步的框细化,而无需使用过渡关键点表示。

2.本文方法

在这里插入图片描述

如图2所示提出的Pillar R-CNN在概念上很简单,包括两个阶段:第一阶段(RPN)产生3D Proposals,并在所有类别相关尺度上进行分类;第二阶段(R-CNN)以可管理的分辨率细化BEV平面上的3D框。

2.1、Pillar-based Backbone

Pillar R-CNN 将点云转换为规则的Pillar ,并以自下而上的方式分层处理稀疏的2D Voxel。PillarNet利用ConvNets(如VGGNet和ResNet)的2D检测优势,在一次前向传播中计算特征层次。它以自下而上的方式通过2D稀疏和密集卷积的混合创建一组低层稀疏2D柱体高层密集特征图。用{C1,C2,C3,C4,C5}表示不同金字塔级别的多层次特征图,Pillar scales的Stride为{ 1,2,4,8,16 }。

2.2、Pyramidal Region Proposal Network

构建了金字塔(FPN)区域建议网络,以提高行人等小目标的检测精度。为了在所有类相关的尺度上构建高级语义特征图,修改了横向连接层,以有效地合并自上而下的密集图和自下而上的稀疏体。每个横向连接 合并了 来自自下而上路径和自上而下路径的相同空间大小的 稀疏特征量密集特征图

具体而言:

1.上下路径通过使用步长为2的反卷积层从更高的金字塔级别对语义更强的密集特征图进行上采样,从而产生更高分辨率的特征。
2.通过简单的连接,将上采样的密集特征图与来自其稀疏voxel的相应的密集自下而上的特征图合并。重复该过程,直到所需的多尺度特征图准备就绪。
3.在每个合并的映射上附加一个3×3卷积层,以减轻上采样的混叠效应并降低通道维数。这里,具有高级丰富语义的最后一组特征图(称为P3 P4)在空间大小方面分别对应于{ C3,C4 }。

2.3、R-CNN via 2D RoI Pooling on BEV Plane

为了证明BEV表示保留了关键的3D结构信息,通过简单设计的横向连接层以可管理的比例构建了密集池化特征。然后,通过在BEV平面上使用Faster R-CNN-like RoI池化模块来进一步细化3D Box。作者还使用语义监督来监督每个3D Proposals的网格点,以进一步检查BEV表示的3D结构能力,并对齐PV-RCNN中使用的额外关键点分割监督分支。

1、Lateral connection layer

用于构建池化图的横向连接层的目的是以可管理的分辨率将低级别稀疏Pillar特征量和高级别密集语义特征图集成到密集池化图中。具体而言:

1.使用2D稀疏卷积层用于将所选低层Pillar从自下而上的路径降采样到期望的空间分辨率。
2.步长为2的反卷积层以自顶向下的方式对来自金字塔颈部模块的密集语义特征图进行上采样。
3.通过3×3卷积层以相同的空间分辨率合并语义更强的密集映射和空间更精确的稀疏体,构建密集池化映射。

横向连接层略微偏离了原始FPN中的逐元素相加方式,因为稀疏体积可能非常稀疏,大部分为空点。为了解决稀疏特征导致的中心特征缺失的问题,简单地应用cat和标准卷积运算来混合来自自下而上路径的特征图和来自自上而下路径的特征图。通过这种方式横向连接设计可以为空间精确但稀疏的自下而上的Pillar提供关键的语义信息。

2、Auxiliary segmentation supervision

在每个3D Proposal中附加了网格点的可分离辅助分割监督,以提高基于BEV的池化图的3D结构能力,这是受PV-RCNN中基于3D体素的结构上下文的关键点的额外分割监督的启发
在这里插入图片描述
具体而言,使用具有Sigmoid函数的2层MLP来预测每个投影2D旋转RoI中每个网格点的前景/背景分数。通过识别每个网格点是在图3中投影的GT旋转框的内部还是外部,可以从3D框标注中直接生成分割层,因为3D目标在BEV平面上不重叠。
此外,辅助分段监督分支仅在训练期间使用,因此没有额外的推理计算开销。
与RoI池化和RoI Align类似,使用投影的2D旋转RoI裁剪密集池化图,以提取BEV平面上的3D RoI特征。具体而言,简单地利用双线性插值操作来对图3中每个投影的3D RoI中均匀分布的 G*G网格点进行采样。然后,通过两个256-D FC层将采样的网格点特征RG*G*G
因此,Faster R-CNN-like 2D RoI池化模块将具有不同大小目标的每个3D RoI特征转换为固定的空间范围用于3D Proposal细化和置信度预测。值得注意的是第2个R-CNN阶段与Faster R-CNN略有不同,因为它需要在可管理的尺度上使用池化图,并通过横向连接层充分融合语义空间特征。

3.实验结果

在这里插入图片描述

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...