本节主要介绍VoxelNet的数据处理部分,数据下载及预处理部分请参考:三维点云目标检测 — VoxelNet详解crop.py (一)_Coding的叶子的博客-CSDN博客。
其他三维目标检测算法的数据处理,特别是基于KITTI的三维目标检测,都可以参考这些处理方式,具有一定的通用性。
请参考:三维点云目标检测 — 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)
根据标签数据构建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)
(1)随机平移与旋转,并且平移之后不同目标在俯视图上不存在重叠,即不发生碰撞。源码似乎由错误,未将变换后的顶点坐标tmp更新到原始顶点坐标中去。
(2)随机旋转,对点云坐标和真实检测框8个顶点坐标进行随机旋转。
(3)随机缩放,对点云坐标和真实检测框8个顶点坐标进行随机缩放。
相应函数为:
lidar, gt_box3d = aug_data(lidar, gt_box3d)
筛选出指定空间范围内的点云和真实检测框顶点的坐标。x方向范围为(0, 70.4);y方向范围为(-40, 40);z方向范围为(-3, 1)。
lidar, gt_box3d = utils.get_filtered_lidar(lidar, gt_box3d)
体素尺寸为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)
(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的情况。
(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]:文件名
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。