• 自动驾驶 知识点 Review 点云 感知算法 五(PointPillar,SECOND,RangeDet)


    点云模型综述

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

    点视图

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

    网格(Voxel、Pillar、BEV)

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

    在这里插入图片描述

    Point+Voxel

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

    前视图

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

    PointPillar

    在这里插入图片描述
    Pillar Feature Net :用于特征的提取。后面FPN和SSD头都是传统的方法了。
    在这里插入图片描述
    每个点有9个维度,r是强度。xc,yc,zc是每一个点相对于pillar所有点的平均值的偏差,xp,yp每一个点相对于pillar中心点的偏差。c是相对于整个pillar所有点的平均值的偏差,p是自己pillar中心点的偏差。Pillar表示称3维的tersor。N是点数,需要上下采样,保证每个pillar点的数目是固定的。

    第二步是D升到C维,通过全连接网络来做。max pooling会把pillar中所有点N进行一个取最大值,这样3维的tersor就降维到2维。

    最后一步是将稀疏的pillar映射回x,y的平面,也就是2D的网格。我们先记录非空pillar的索引,有了这个信息,我们就可以映射回2D的平面,得到2D网格的数据,每个网格有C维的特征。

    以上就是pillar的特征提取的流程,充分利用了点视图忽略了非空区域的特点,快速计算。又通过俯视图,来结构化数据,更有效的提取临域的特征,完成后面的物体检测。

    在这里插入图片描述
    因为上面已经是一个图像的结构,我们就通过经典的FPN和SSD头来进行物体检测。生成不同分辨率的特征图,再进行拼接。SSD是基于anchor的方法做回归。输出每个anchor的类别,位置,大小,角度。

    在这里插入图片描述
    点云和图像的anchor设计机制有些不同。图像是透视结构,物体的大小会随着距离大小很大变化。物体形状在不同角度也会有差别。不同物体类别,大小和长宽比也会不一样。所以需要设计不同大小的anchor,来识别不同远近,不同类别的目标。
    3种不同的长宽比。1:1,2:1,1:2.每个有3个不同的尺度。每个位置有9个anchor,来适应不同类别,不同大小,不同长宽比的物体。

    但是点云是俯视图,点云如果采用前视图的方式,anchor设计与图像比较类似,但是基于俯视图的anchor设计会有点不同。俯视图,物体大小和长宽比都是不变的,都是对应真是世界坐标系下的大小。同一物体,基本上也不会差别太大。这时候设计anchor,就是根据不同类别设计anchor。比如车辆的anchor或者行人的anchor。一般定义一个0度的anchor,和一个90度的anchor。anchor越多,效果越好,计算量也就越大。anchor是3D的,有长宽高信息。在与gt匹配时,我们高度信息是忽略的。如果anchor与gt高于IOU,就是positve的anchor,否则就是negative的anchor。

    在俯视图下,不同类别,大小差别比较大。这对anchor的positive和negative差别会很大。所以车辆的IOU的threshold会高一些,行人的threshold会低一些。更容易找到正样本。

    在这里插入图片描述
    pointpillar是7维的tensor来定义一个物体框。xyz 3D物体框的位置。wlh长宽高。theta就是方向盘的转向角度。理论上讲,还有另外2个角度。但是对自动驾驶不太重要,这里就没有写。

    xyz就是中心点偏移的位置。

    在这里插入图片描述

    在这里插入图片描述
    gama调整难样本和容易样本的权重。alpha是平衡正负样本的权重。

    这里只写了positve的anchor的loss,整体还要加上negative的loss。
    在这里插入图片描述
    一些漏检的情况及改进方法:
    在这里插入图片描述
    在这里插入图片描述
    但是注意无法无限度的提高特征图分辨率,硬件效果也是有上限的。
    在这里插入图片描述
    在这里插入图片描述
    PointPillars,是2019年出自工业界的一篇Paper。

    该模型最主要的特点是检测速度和精度的平衡。该模型的平均检测速度达到了62Hz,最快速度达到了105Hz,确实遥遥领先了其他的模型。这里我们引入CIA-SSD模型中的精度-速度图,具体对比如下所示。

    在这里插入图片描述
    可以看出,截止CIA-SSD论文发表前,PointPillars的检测速度都是遥遥领先的,而且精度也不低。

    现有的一些研究喜欢将不规则、稀疏的点云数据按照以下两种方式进行处理,然后引入RPN层进行3D Bbox Proposal,这两种方法为:

    (1)将点云数据划纳入一个个体素(Voxel)中,构成规则的、密集分布的体素集。常见的有VoxelNet和SECOND,这在之前的文章中已经解析过了;

    (2)从俯视角度将点云数据进行处理,获得一个个伪图片的数据。常见的模型有MV3D和AVOD,这也说过了。

    本文采用了一种不同于上述两种思路的点云建模方法。从模型的名称PointPillars可以看出,该方法将Point转化成一个个的Pillar(柱体),从而构成了伪图片的数据。

    然后对伪图片数据进行BBox Proposal就很简单了,作者采用了SSD的网络结构进行了Proposal。

    2 数据处理和网络结构
    前面说到本文的一大亮点是将点云划分为一个个的Pillar,从而构成了伪图片的数据。

    如何构成这个伪图片呢?作者在论文中是给出了这样的图,如下。

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

    VoxelNet

    在这里插入图片描述
    在这里插入图片描述
    先给3D空间画网格,然后将每一个点分配到网格中去,每一个网格有不同数量的点,设定点的数量,如果一个网格点数过多,就进行下采样,如果点比较少,就进行上采样,保证每一个有点的网格数目是一致的。

    VFE:先用全连接层对点进行提取,3维升维到64或者128.再求所有点的均值mean pooling,得到一个网格所有点的一个整体描述,灰色特征向量为之后的特征向量,将pooling后的特征向量,再和每一个点进行拼接。那么每一个点包含本身的特征和网格整体的特征,每个点就包含了临域的信息。

    stacked VFE:重复多次的VFE

    在这里插入图片描述
    我们输出是一个4D的tersor,我们会用3D卷积对4D的tersor进行特征的提取。空号内是x,y,z的分别stride。倒数第2层,将高度和通道进行融合,高度的信息就融合在了128的通道特征里。这样就输出了一个2D的图像+一个chanal,不是真实的图像,但是结构上是。
    在这里插入图片描述

    这时候就可以用2D比较好的方法去进行目标检测了。VoxelNet结构类似于FPN,和U-shape Net。
    由于这个输入数据很想2D检测的图片,所以传统比较好的网络结构都可以用。所以VoxelNet经过前2个步骤后,后面用传统的即可。
    在这里插入图片描述

    但是Voxel存在2个问题,网格数据表示比较低效,因为不是所有数据都有点云,比较稀疏,很多网格是空的。这样采用卷积会浪费很多算力,用SECOND系数卷积。另一个问题是VoxelNet有很多3D卷积,3D卷积计算量比较大,通过PIXOR改进,但是性能会降低。

    SECOND

    在这里插入图片描述
    SECOND将VoxelNet的卷积换成了稀疏的卷积。
    稠密网格只保留非空的网格,并记录非空网格在3D的索引(位置)。
    在这里插入图片描述
    卷积计算只在非空进行。
    记录P1和P2的值和索引。

    RangeDet

    在这里插入图片描述
    在这里插入图片描述
    这里以机械旋转式的激光雷达为例,来进行说明。
    64线激光雷达,就对应发射出64的垂直的射线,对应在垂直Elavation的64个离散的角度。在水平Azimuth方向,在水平的视场内扫描一遍,长生很多个离散角度,假设水平是0.2度,那么360度就产生了1800个角度。
    最后生成64*1800的2D前视图,可以想象将一个椭圆型用剪刀剪开平铺,椭圆底边是1800,高是64.
    像素值定义为每个点的深度。距离传感器的距离。或者采用每个点的反射强度,来作为像素值,即可见过的图像。
    通过上面的变换,就可以把3D的点云从视觉坐标系转到前视图坐标下。
    在这里插入图片描述
    前视图
    优点:相比于俯视图,网格更为紧致,可能每个网格都有数据。每个网格都有垂直方向和水平方向的扫描线,不对前视图进行缩放,不会有量化损失。
    缺点:由于透视变换,不同物体,差别很大。但是在俯视图或者点视图下都是不影响的,这两个都是基于世界坐标系,不论物体远近,大小都是一样的。另外前视图是一个2维图像的结构,需要在这个2D图像上提取2D的特征,这时候,物体的3D信息,或者说是深度信息是嵌入在特征的某一个channal里,因为在提取2d的特征时,3D物体的深度或者3D形状可能不能提取到。
    在这里插入图片描述
    LaserNet:
    基于前视图,比较基础的一个算法。数据是2D的前视图,以及一些深度range前视图,以及光照强度前视图。然后过Conv,之后在特征图上直接需要bounding box的参数。bounding conner以及每一个点属于哪个class。所有预测都是像素级的。方法与CenterNet比较像,每一个点是不是物体还是背景,是哪个物体。这里细节还用到了自适应NMS。总的来说,LaserNet是前视图很标准的方式,也可以使用faster-rcnn, yolo, centnet等等方法。这里没有考虑到前视图和2D是有区别的,只考虑是相似之处。有一些channal是深度信息或者光照信息或者高度信息。这些可能会丢失。

    在这里插入图片描述
    RangeDet:
    先来回顾一下前视图的问题。前视图就是一个2D的图像,如果我们只是当作普通的2D的图像做,前视图在不同距离,物体差别很大。俯视图就不需要考虑。另一个是前视图提取的是2D的特征,而最后的物体检测要在3D的坐标下的3D的结果。用标准卷积,无法提取3D信息,效果很差。RangeDet就对这两个问题进行了优化。提升了准确度。

    输入也是多个channal的前视图图像,Meta-Kernel是用了提取深度信息。然后通过FPN的结构,不同尺寸进行物体检测。不同大小的物体,分配不同尺度的特征图上,RangeDet做了比较特别的设计。最后输出物体分类的结果和bounding box回归的结果。这个网络结构和2D的网络结构整体上讲一致。但是Meta-Kernal和不同大小物体不同分配做了改进。下面详细看下:

    在这里插入图片描述
    2D的特征图,每一个3*3卷积,找到红色中心点,其他点位在3D坐标下都是相对于红点的相对位置,这样可以算出一个权重值,这个权重值是可以在网络中学习的,权重值和原始点的值进行点积计算。这样就充分利用了不同数据,不同位置的集合特性。
    在这里插入图片描述
    传统是比较大的物体分配到分辨率比较低的特征图上,比较小的物体,分配到分辨率比较高的特征图上。但是这是传统目标检测的方法,基于同一个物体的大小是差不多的。但是在前视图中,同一个物体,因为距离的远近,大小差很多,前视图虽然是图像,但是是点云集合的信息。将物体按照距离划分,近距离,中距离,远距离。每一个距离,处理的物体都在一个层级。保证集合特征基本一致。保证每一层次不会处理差别太大的物体。
    在这里插入图片描述

  • 相关阅读:
    Windows 安装PostgreSQL
    初识爬虫自我感受
    四、JavaScript Promise[基础、异步链式操作]
    多表查询以及外键约束
    栈与队列 | 用栈实现队列 | 用队列实现栈 | 基础理论与代码原理
    python神经网络编程 豆瓣,python搭建神经网络模型
    JVM 内存设置大小(Xms Xmx PermSize MaxPermSize 区别)
    测试人员的KPI怎么设置
    GoF23—抽象工厂模式
    前端 VSCode 常用快捷键提高你的效率
  • 原文地址:https://blog.csdn.net/weixin_43716712/article/details/126030591