推广 热搜: page  音视频  使用  个数  选择  搜索引擎  企业  父亲  百度  可以 

点云3D检测篇二:VoxelNet

   日期:2024-12-16     作者:npd6y    caijiyuan   评论:0    移动:http://ww.kub2b.com/mobile/news/4687.html
核心提示:论文地址:VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection代码地址:https://github.co

论文地址VoxelNet: End-to-End Learning for Point Cloud based 3D Object Detection

代码地址https://github.com/Hqss/VoxelNet_PyTorch

        VoxelNet不同于之前的pointxet直接对原始点云进行特征提取的方案,提出了将点云体素化(网格化的提取方案,极大地提高了点云网络的计算效率,具体流程如图1所示。

        具体步骤

        (1)首先对原始激光点云进行体素化处理,构建一个个小栅格,包围整个点云,并对每一个体素栅格进行编码。

        (2)遍历原始点云,给每个点云中的点分配一个体素栅格索引,也就是找到每一个栅格中包含哪些点云,再对每一个栅格中随机采样T个点作为该栅格的点云特征(保证了每一个体素块中点云数目是均匀的)。

        (3)使用特征编码网络Feature Encoding对(2)构建的voxel体素特征进行特征提取。

        (4)使用RPN网络对Feature Encoding的输出特征进行映射,得到cls的置信度分数回归框bounding box大小

2.1.1 aug_data 点云数据增强

2.1.1.1 原理

        VoxelNet选择的是随机点云数据增强方案,随机生成一个0~10之间的数,根据生成数的大小来选择点云数据增强方式,有点云旋转、点云缩放等。

        注:这里的点云数据增强比较类似图像数据增强,包括旋转、缩放等,这里建议取仔细阅读一下代码,比较杂。

2.1.1.2 代码
 

2.1.2 Voxel Partition 点云体素化(process_pointcloud)

2.1.2.1 原理

        Voxel Partition体素化是Voxelnet最为关键的一步,也是其区别与其他点云处理网络的重点,这里其实也可以理解为是对原始点云的预处理工作。这中间主要包含三步:Voxel Partition、Grouping、Random Sampling。

       (1Voxel Partition的作用是将3D空间中的点云细分为一个一个等间隔的体素,如图2最左侧所示。通过定义每一个体素的大小为,将3D空间划分为的体素空间。

        代码中是通过 voxel_index = np.floor(shifted_coord[:, ::-1] / voxel_size).astype(np.int)函数来实现的,这里的 shifted_coord[:, ::-1] 是将xyz进行逆序排列,也就是(X, Y, Z) -> (Z, Y, X),因为论文中设定的voxel_size是按照(Z, Y, X)来排列的。 

        这里的int取整操作才是体素化的核心,因为我们的原始点云都是一堆float32类型的变量,除以voxel_size之后还是float32的变量,这样的体素化是没有意义的;举一个例子来说,就比如图3中的[18.308,40.02,3.828]、[18.324,40.078,3.829]的两个点来说。体素化的目的是使用一个voxel来同时包含整个两个点,但是它经过voxel_size缩放之后仍然是两个不相同的float32的值,为了使得它们一样,作者在这里取了一个巧,都对其进行了int操作,使得它们相等,这样就完成了使用同一个voxel可以同时表示2个点的操作(这也是体素化的核心思想)。

        (2) GroupingRandom Sampling的作用根据原始点云所在的体素对点云进行分组同时对每个组的点云抽取固定数量的T个点以便减少了体素间点的不平衡。具体过程如图2中间和最右边所示。

         从代码中来看,首先使用coordinate_buffer = np.unique(voxel_index, axis = 0)提取出所有不重复的voxel体素块,之后初始化一个字典index_buffer = {},遍历每一个coordinate_buffer,给其添加唯一的index索引。最后,再初始化一个number_buffer(shape为[K,1])feature_buffer(shape为[K,T,7]),分别表示每个体素网格中的点数特征缓冲区,再通过for循环对其中的每一个值进行赋值。

        注意:feature_buffer的shape为[K,T,7],其中K表示体素化后的网格格数T表示每个体素化网格中最多点的数目7表示4个原始点云坐标+3个中心化点云坐标。

2.1.2.2 代码
 

2.1.3 Feature Learning Network特征学习网络

2.1.3.1 原理

        FeatureNet类主要接收的是feature, number, coordinate这三个参数,也就是在2.1.2小节的最终结果。之后将这3个参数在batch维度进行拼接,送给VFELayer层。(这里为什么要拼接batch,个人觉得可能是一个误区,这样的话不就直接消除时间戳的影响,并且容易受到batch大小的影响,看到这里希望有大佬可以解释一下)。

        VFELayer层的作用就是对输入的voxel进行局部特征全局特征提取。

(1)首先将输入的 Voxel-input 经过一个全连接层进行特征映射,得到Voxel-feature。

(2)将(1)的结果进行torch.max提取Voxel全局特征,并将其expand复制多份(和Voxel-feature的shape一样)。

(3)将(1)和(2)得到的结果在特征维度上concat起来,这样就得到了编码之后的体素特征。

2.1.3.2 代码
 
 

2.1.4 Region Proposal Network区域候选网络

2.1.4.1 原理

        RPN来源于Faster RCNN网络,其输入是中间层提供的特征映射,也就是2.1.3 Feature Learning Network得到Voxel特征,shape[B,10,400,352,128],输出是cls的置信度分数回归框bounding box大小

        RPN网络的体系结构如图5所示,包含一个3D卷积层块三个2D卷积层块2个head(reg_head + cls_head

        (1)3D卷积层

        首先使用3D卷积层nn.conv3D对输入特征[B,128,10,400,352]进行特征提取,得到[B, 64, 2, 400, 352]的特征,并将dim=1和dim=2的维度进行合并,最终得到shape为[B,128,400,352]的特征图。

        注nn.Conv3d的输入维度应为(N,C_in,D,H,W),输出维度应为(N, C_out, D_out, H_out, W_out)。其中D表示输入数据的深度

        (2)2D卷积层

        之后连续使用3个 2D堆叠卷积层对(1)取得的特征进行特征提取,最后将3个卷积层得到的特征concat起来得到最终的特征图,shape为[B,756,200,176]

        (3)reg_head和cls_head

        分别使用 2个 1X1 的卷积层作为分类头回归头进行置信度分数bounding box的预测。

2.1.4.2 代码
 
 
 
 

2.2.1 原理

        cal_rpn_target函数的作用是对RPN区域候选网络的特征进行正负样本计算。

        Input输入为

        labels:[N,N'],,标签数据,每个批次中的真实边界框信息

        feature_map_shape:[w,l],RPN输出特征图的形状,用于计算目标在特征图上的位置

        anchors:[w,l,2,7],锚点框的参数,描述不同尺度和方向的锚点框,其中2表示两种不同的anchor,7表示描述物体的七个关键参数(x,y,z,h,w,l,r)。

        Output输出为

        pos_equal_one:[N,w,l,2],正样本标记,表示哪些锚点框是正样本,表示正样本anchor位置。

        neg_equal_one:[N,w,l,2],负样本标记,表示哪些锚点框是负样本,表示负样本anchor位置。

        targets:[N,w,l,14],锚点框的回归目标,用于辅助目标框的位置回归,包含anchor的回归的目标值。

        注意这边代码逻辑比较复杂,建议去仔细阅读一下源码,中间涉及到很多2D与3D空间的转换。

2.2.2 代码

 
 

2.3.1 原理:

分类损失权重系数回归损失权重系数分类损失函数回归损失函数正样本系数负样本系数reg-head预测的box大小真实box大小ground truth

       Voxelnet的损失函数与传统的检测任务一样,主要由分类损失和回归损失组成。其中分类损失主要由正样本对和负样本对分别计算得到,回归损失则是通过较为常见的L1损失计算得到。

2.3.2 代码:

 
 

        1、相比于pointnet系列直接对原始激光点云进行特征提取voxelnet将原始激光点云进行一个一个voxel的体素化分割,再利用卷积神经网络对体素特征进行特征提取。

        2、Voxelnet提出的先体素化再采样的点云特征提取方法大大提高了点云数据的处理速度与精度。

        3、Voxelnetloss计算方案延续了faster R-CNNRPN结构,借用anchors先验眶,对Feature network提出的特征进行处理,使用 cls-headreg-head 进行 类别置信度回归 bounding box的计算

点云学习笔记11——VoxelNet算法+代码运行_voxel-net代码运行环境 csdn-CSDN博客

代码复现: VoxelNet论文和代码解析 pytorch版本_voxelnet pytorch 跑通-CSDN博客

无人驾驶汽车系统入门(二十八)——基于VoxelNet的激光雷达点云车辆检测及ROS实现_基于3d-voxel的无人驾驶场景点云目标检测和分割-CSDN博客

本文地址:http://ww.kub2b.com/news/4687.html     企库往 http://ww.kub2b.com/ ,  查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新文章
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新文章
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号