【三维目标检测】VoxelNet(二):数据处理

         本节主要介绍VoxelNet的数据处理部分,数据下载及预处理部分请参考:三维点云目标检测 — VoxelNet详解crop.py (一)_Coding的叶子的博客-CSDN博客。

        其他三维目标检测算法的数据处理,特别是基于KITTI的三维目标检测,都可以参考这些处理方式,具有一定的通用性。

1 代码环境部署

        请参考:三维点云目标检测 — VoxelNet详解crop.py (一)_Coding的叶子的博客-CSDN博客。

        另外有两处需要进行修改:

        (1)config.py:第35、36行需要进行如下修改,否则会报错:TypeError: 'float' object cannot be interpreted as an integer。

x = np.linspace(xrange[0]+vw, xrange[1]-vw, W//2)
y = np.linspace(yrange[0]+vh, yrange[1]-vh, H//2)

        (2)voxelnet.py:第163行需要进行如下修改,否则会报维度不匹配的错误。

dense_feature[:, coords[:,0], coords[:,1], coords[:,2], coords[:,3]]= sparse_features.transpose(0, 1)

2 构建目标3D检测框

        根据标签数据构建3D检测框:

        (1)通过外参逆矩阵将标签中3D检测框中心坐标由相机坐标系变回到激光雷达坐标系。需要注意的是,在长度和宽度方向坐标处于中心位置,而高度方向的中心是底部坐标。在构建3D检测框的时候的坐标范围为(-l/2, l/2)、(-w/2, w/2)、(0, h)。

        (2)标签数据中的ry旋转角度需要转换为雷达坐标系绕z轴的旋转角度,角度大小是与车正前方的夹角,而ry是与车身方向上的夹角,ry+rz=-pi/2,这个负号与坐标系正方向定义相关。

        (3)根据rz构建旋转矩阵,将旋转矩阵乘以(1)中检测框后加上(1)中的中心坐标可以得到雷达坐标系中检测框的8个顶点。

        相应函数为:

box3d_corner = box3d_cam_to_velo(obj[8:], Tr)

3 数据增强

        (1)随机平移与旋转,并且平移之后不同目标在俯视图上不存在重叠,即不发生碰撞。源码似乎由错误,未将变换后的顶点坐标tmp更新到原始顶点坐标中去。

        (2)随机旋转,对点云坐标和真实检测框8个顶点坐标进行随机旋转。

        (3)随机缩放,对点云坐标和真实检测框8个顶点坐标进行随机缩放。

        相应函数为:

lidar, gt_box3d = aug_data(lidar, gt_box3d)

4 空间范围筛选

        筛选出指定空间范围内的点云和真实检测框顶点的坐标。x方向范围为(0, 70.4);y方向范围为(-40, 40);z方向范围为(-3, 1)。

lidar, gt_box3d = utils.get_filtered_lidar(lidar, gt_box3d)

5 体素化

         体素尺寸为vw=0.2、vh=0.2、vd=0.4,全部体素个数为400x352x10,包含有点云的体素和无点云的体素。这里主要计算出含有点云的体素坐标。每个体素最多选择出35个点,对于不满足35个点的用零向量进行填充。每个有7个特征,前3个为35个点的xyz坐标,4-6为坐标与中心点坐标的差值,最后1维特征填充为0。返回体素特征voxel_features(Nx35x7)和体素坐标oxel_coords(Nx3)。

​​​​​​​voxel_features, voxel_coords = self.preprocess(lidar)

6 anchors

        (1)生成200x176x2=70400个anchor,每个anchor有两种rz,所以乘以两倍。后续特征图大小为(200x176),相当于每个特征生成两个anchor。anchor的属性包括x、y、z、h、w、l、rz,即70400x7。

        (2)通过计算anchor和目标框在xoy平面内外接矩形的iou来判断anchor是正样本还是负样本。正样本的iou 阈值为0.6,负样本iou阈值为0.45。正样本还必须包括iou最大的anchor,负样本必须不包含iou最大的anchor。

        (3)由于anchors的维度表示为200x176x2,用维度为200x176x2矩阵pos_equal_one来表示正样本anchor,取值为1的位置表示anchor为正样本,否则为0。

        (4)同样地,用维度为200x176x2矩阵neg_equal_one来表示负样本anchor,取值为1的位置表示anchor为负样本,否则为0。

        (5)用targets来表示anchor与真实检测框之间的差异,包含x、y、z、h、w、l、rz等7个属性之间的差值,这跟后续损失函数直接相关。targets维度为200x176x14,最后一个维度的前7维表示rz=0的情况,后7维表示rz=pi/2的情况。

7 最终返回值

        (1)voxel_features:Nx35x7

        (2)voxel_coords:Nx3

        (3)pos_equal_one:200x176x2

        (4)neg_equal_one:200x176x2

        (5)targets:200x176x14

        (6)image:RGB图像,HxWx3

        (7)calib:校准数据P2、R0、Tr_velo2cam

        (8)self.file_list[i]:文件名

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_python三维点云重建从三维基础知识到深度学习,将按照以下目录持续进行更新。更新完成的部分可以在三维点云专栏中查看。https://blog.csdn.net/suiyingy/category_11740467.htmlhttps://blog.csdn.net/suiyingy/category_11740467.html1、点云格式介绍(已完成)常见点云存储方式有pcd、ply、bin、txt文件。open3d读写pcd和plhttps://blog.csdn.net/suiyingy/article/details/124017716

更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(python,深度学习,三维点云,Voxelnet,三维目标检测,点云目标检测,kitti,目标检测)