主要为PillarVFE和PointPillarScatter部分。
流程:
- 读取bin格式点云
PillarVFE:
- 根据设定大小体素化,每个体素内存放至多32个点,每个点10个特征(x,y,z,r,等)。体素用结构体存储,Points为(32,10)的数组:
struct Voxel {
//float x, y, z, height, width, length, intensity;
int point_num = 0 ; //体素内点云数
float sum_x = 0; //x坐标求和后平均
float sum_y = 0; //y坐标求和后平均
float sum_z = 0; //z坐标求和后平均
std::vector<std::vector<float>> Points;
};
- PFN,用linear层将10维特征扩展到64维。耗时主要在这一层。权重数据经pytorch保存为txt文件后读取。
- Maxpool,对比32个点中的每维特征,保留最大值。64->1,降为1维数组
PointPillarScatter:
拆分voxel维度(原本是H*W个体素,现在拆开[H,W]),填入一个三维数组中。
结果:
体素大小 :0.16*0.16*4
-
VOXEL time = 0.138s
-
PFN time = 3.029s
-
max time = 0.263s
-
time = 4.219s
-
非空体素数目 8377
-
总体素数目 251001
-
非空率 8377/251001 = 3.3%