一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法制造技术

技术编号:26033252 阅读:28 留言:0更新日期:2020-10-23 21:11
本发明专利技术涉及3D网络技术领域,具体是一种体素化3D网络voxel‑encoder与VFE基于FPGA的实现算法,本发明专利技术专利主要是针对3D目标检测的深度学习网络的数据预处理中voxel‑encoder部分(体素编码)以及vfe部分(特征提取)基于FPGA算法的从0到1的实现,整个过程全流水运算,有效的将CPU耗时的运算淹没至RAM,输入到3D卷积的过程中,极大得提升了点云卷积网络的效率,提高了整体帧率,为后续CNN的3D卷积预留更多的时间。

【技术实现步骤摘要】
一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法
本专利技术涉及3D网络
,具体是一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法。
技术介绍
随着3d传感器技术发展以及传感器价格的降低,因3d云数数据含有原始的几何信息且没有离散,使得3d点云数据受到越来越多的青睐,而3d激光传感器因检测范围大且精度高等特点在自动驾驶领域被广泛使用。基于3d激光点云数据,使用深度学习技术进行3d目标检测的使用越来越广泛,目前主要有两种主流的方法:voxel_based方法以及point_based方法,相对point_based方法的精度高但对于点云数据量大的情形下帧率较低的特点,基于voxel_based的方法因处理数据量大的点云效率高而被工业界多为采用,比如SECOND(SparselyEmbeddedConvolutionalDetection)。目前,基于激光点云数据进行3d目标检测的深度学习网络多使用GPU来加速来进行前向推断,比如:使用1080Ti来进行SECOND(small)网络的推断,论文显示每帧0.025s,即40帧/秒,尽管用GPU进行检测推断帧率很高,但GPU的高成本与高功耗的缺点使得它在低成本低功耗的下的应用受到很大限制,而基于FPGA的实现的网络前向推断则在低成本低功耗的场合下表现优异,且帧率亦能满足目前用于自动驾驶的激光雷达数据采集10~20帧/秒之间的处理速度的要求,本专利则是针对数据预处理中voxel-encoder部分(体素编码)以及vfe部分(特征提取)基于FPGA算法的从0到1的实现,同时保证在预处理中将处理速度提升到流水状态,使得这部分不影响整个网络的10~20帧/s的帧率要求。
技术实现思路
本专利技术的目的在于提供一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法,以解决上述
技术介绍
中提出的问题。为实现上述目的,本专利技术提供如下技术方案:一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法,为说明Voxel-encoder以及vfe在FPGA上的算法实现过程,如下首先会对其在cpu上代码实现算法过程加以说明,以作为参照,接着,会对其在FPGA上的实现算法加以描述,所述Voxel-encoder以及vfe算法在cpu上代码实现过程包括:(1)输入数据和中间数据如下:(2)算法实现细节:步骤1:初始化一个K×T×4维张量(命名为voxels),值为全0:用于存储所有的体素输入特征;一个K×3维张量(命名为coors),值为全0:用于存储所有的体素格的坐标;一个K维张量(命名为num_points_per_voxel),值为全0:用于存储每个体素格采样点数;一个40×800×1104(grid_size)的张量(命名为coor_to_voxelidx),值为全-1:用于指示是否是有效体素;K是非空体素的最大数目,T是每个体素的最大采样点数,4是每个点的输入特征维数;步骤2:对于点云中的每个点(eg点坐标(x1,y1,z1,r1)),我们检查对应的体素是否已经存在;检查方法:1)首先是向体素格投影,获取体素格的坐标(coor_x,coor_y,coor_z):coor_x=int((x1-point_cloud_range[0])/voxel_size[0])coor_y=int((y1-point_cloud_range[1])/voxel_size[1])coor_z=int((z1-point_cloud_range[2])/voxel_size[2])2)判断坐标(coor_x,coor_y,coor_z)的三个元素是否在grid_size的范围内:若0≤coor_x<grid_size[0]and0≤coor_y<grid_size[1]and0≤coor_z<grid_size[2]则表明点落入体素格内,若单个体素格内的点数小于T,统计该体素格内的点数num加1,对该体素格进行编号(voxelidx),编号从0开始,最大达到max_voxels-1,落入同一体素格的编号相同,并将编号voxeidx赋值给coor_to_voxelidx[coor_x,coor_y,coor_z],同时将更新后的num赋值给num_points_per_voxel[voxeidx],将点的特征数据赋值给voxels[coor_to_voxelidx[coor_x,coor_y,coor_z],num,:];步骤3:遍历所有点后,或者voxelidx达到k-1且和所有体素格的点数统计num均达到T时,即完成对步骤1中前四个张量的更新;(3)输入部分:步骤3获取的更新后的三个张量voxels,coors,num_points_per_voxel作为输入,算法实现细节:步骤4:基于voxels,num_points_per_voxel计算每个有效体素格内的所有非特征全0点在特征的每个维度上的平均,得到K×4维度的张量,每一行存储了(x_bar,y_bar,z_bar,r_bar),表达了一个体素格的特征信息,计算方法:voxels(K×T×4)在第2个维度上求和的到维度(K×4)的张量,然后除以num_points_per_voxel,即得到上面的(x_bar,y_bar,z_bar,r_bar);步骤5:将步骤4得到的更新后的voxels(维度K×4),针对其每一行计算(x_bar^2+y_bar^2)^(1/2);步骤6:拼接特征,将步骤5计算的(x_bar^2+y_bar^2)^(1/2)与步骤4计算的z_bar,r_bar拼接为一个最终特征表达voxels(维度为K×3,每一行是((x_bar^2+y_bar^2)^(1/2),z_bar,r_bar)即一个有效体素格的特征;步骤7:返回步骤6中获得的voxels以及步骤3获得的coors结束;(4)Voxel-encoder以及vfe的FPGA实现:Voxel-encoder以及vfe在FPGA的实现由ARM端和FPGA共同处理完成,对于低功耗ARM平台,除法和开平方等操作是个耗时的过程,全由ARM处理会影响CNN的3d网络的效率,因此将部分运算转移至FPGA运行可以大大提高整体的运行效率。本专利技术专利模块主框架,主要分为两个模块,包括:1)ARM端实现模块,主要用于处理encoder;2)FPGA实现模块,主要用于实现vfe。ARM端实现模块:步骤1:ARM端在内存中为每个体素格建立一个缓存,将每个雷达点转化为体素格坐标,直接用地址坐标找到对应的体素格,更新该体素格的数据;步骤2:在步骤1更新体素格数据的同时,ARM端对缓存中的体素格累加正在处理的雷达数本文档来自技高网
...

【技术保护点】
1.一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法,其特征在于,包括Voxel-encoder以及vfe在FPGA上的算法实现过程:/n(1)输入数据和中间数据如下:/npoints:维度(n,4);/n共n个点,每个点含有三维坐标和雷达反射强度信息(x,y,z,r);/npoint_cloud_range:[0,-20.0,-3,55.2,20.0,1];/n数据说明:x轴前后检测范围[0,55.2],y轴左右检测范围[-20,20],z轴上下检测范围[-3,1];/n雷达坐标系x轴向前为正,y轴向左为正,z轴向上为正;/nvoxel_size:[0.05,0.05,0.1];/n体素格划分在x,y,z三个轴方向的分辨率;/nmax_number_of_points_per_voxel:T=5;/nmax_voxels:K=40000;/n中间数据:/ngrid_size=(point_cloud_range[3:]-point_cloud_range[:3])/voxel_size=[1104,800,40];/n(2)算法实现细节:/n步骤1:初始化一个K×T×4维张量(命名为voxels),值为全0:用于存储所有的体素输入特征;/n一个K×3维张量(命名为coors),值为全0:用于存储所有的体素格的坐标;/n一个K维张量(命名为num_points_per_voxel),值为全0:用于存储每个体素格采样点数;/n一个40×800×1104(grid_size)的张量(命名为coor_to_voxelidx),值为全-1:用于指示是否是有效体素;/n步骤2:对于点云中的每个点(eg点坐标(x1,y1,z1,r1)),检查对应的体素是否已经存在;/n检查方法:/n1)首先是向体素格投影,获取体素格的坐标(coor_x,coor_y,coor_z):/ncoor_x=int((x1-point_cloud_range[0])/voxel_size[0])/ncoor_y=int((y1-point_cloud_range[1])/voxel_size[1])/ncoor_z=int((z1-point_cloud_range[2])/voxel_size[2])/n2)判断坐标(coor_x,coor_y,coor_z)的三个元素是否在grid_size的范围内:/n若0≤coor_x<grid_size[0]and 0≤coor_y<grid_size[1]and 0≤coor_z<grid_size[2]/n则表明点落入体素格内,若单个体素格内的点数小于T,统计该体素格内的点数num加1,对该体素格进行编号(voxelidx),编号从0开始,最大达到max_voxels-1,落入同一体素格的编号相同,并将编号voxeidx赋值给/ncoor_to_voxelidx[coor_x,coor_y,coor_z],/n同时将更新后的num赋值给num_points_per_voxel[voxeidx],将点的特征数据赋值给/nvoxels[coor_to_voxelidx[coor_x,coor_y,coor_z],num,:];/n步骤3:遍历所有点后,或者voxelidx达到k-1且和所有体素格的点数统计num均达到T时,即完成对步骤1中前四个张量的更新;/n(3)输入部分:步骤3获取的更新后的三个张量voxels,coors,num_points_per_voxel作为输入,算法实现细节:/n步骤4:基于voxels,num_points_per_voxel计算每个有效体素格内的所有非特征全0点在特征的每个维度上的平均,得到K×4维度的张量,每一行存储了(x_bar,y_bar,z_bar,r_bar),表达了一个体素格的特征信息,计算方法:voxels(K×T×4)在第2个维度上求和的到维度(K×4)的张量,然后除以num_points_per_voxel,即得到上面的(x_bar,y_bar,z_bar,r_bar);/n步骤5:将步骤4得到的更新后的voxels(维度K×4),针对其每一行计算(x_bar^2+y_bar^2)^(1/2);/n步骤6:拼接特征,将步骤5计算的(x_bar^2+y_bar^2)^(1/2)与步骤4计算的z_bar,r_bar拼接为一个最终特征表达voxels(维度为K×3,每一行是((x_bar^2+y_bar^2)^(1/2),z_bar,r_bar)即一个有效体素格的特征;/n步骤7:返回步骤6中获得的voxels以及步骤3获得的coors结束;/n(4)Voxel-encoder以及vfe的FPGA实现:/nVoxel-encod...

【技术特征摘要】
1.一种体素化3D网络voxel-encoder与VFE基于FPGA的实现算法,其特征在于,包括Voxel-encoder以及vfe在FPGA上的算法实现过程:
(1)输入数据和中间数据如下:
points:维度(n,4);
共n个点,每个点含有三维坐标和雷达反射强度信息(x,y,z,r);
point_cloud_range:[0,-20.0,-3,55.2,20.0,1];
数据说明:x轴前后检测范围[0,55.2],y轴左右检测范围[-20,20],z轴上下检测范围[-3,1];
雷达坐标系x轴向前为正,y轴向左为正,z轴向上为正;
voxel_size:[0.05,0.05,0.1];
体素格划分在x,y,z三个轴方向的分辨率;
max_number_of_points_per_voxel:T=5;
max_voxels:K=40000;
中间数据:
grid_size=(point_cloud_range[3:]-point_cloud_range[:3])/voxel_size=[1104,800,40];
(2)算法实现细节:
步骤1:初始化一个K×T×4维张量(命名为voxels),值为全0:用于存储所有的体素输入特征;
一个K×3维张量(命名为coors),值为全0:用于存储所有的体素格的坐标;
一个K维张量(命名为num_points_per_voxel),值为全0:用于存储每个体素格采样点数;
一个40×800×1104(grid_size)的张量(命名为coor_to_voxelidx),值为全-1:用于指示是否是有效体素;
步骤2:对于点云中的每个点(eg点坐标(x1,y1,z1,r1)),检查对应的体素是否已经存在;
检查方法:
1)首先是向体素格投影,获取体素格的坐标(coor_x,coor_y,coor_z):
coor_x=int((x1-point_cloud_range[0])/voxel_size[0])
coor_y=int((y1-point_cloud_range[1])/voxel_size[1])
coor_z=int((z1-point_cloud_range[2])/voxel_size[2])
2)判断坐标(coor_x,coor_y,coor_z)的三个元素是否在grid_size的范围内:
若0≤coor_x<grid_size[0]and0≤coor_y<grid_size[1]and0≤coor_z<grid_size[2]
则表明点落入体素格内,若单个体素格内的点数小于T,统计该体素格内的点数num加1,对该体素格进行编号(voxelidx),编号从0开始,最大达到max_voxels-1,落入同一体素格的编号相同,并将编号voxeidx赋值给
coor_to_voxelidx[coor_x,coor_y,coor_z],
同时将更新后的num赋值给num_points_per_voxel[voxeidx],将点的特征数据赋值给
voxels[coor_to_voxelidx[coor_x,coor_y,coor_z],num,:];
步骤3:遍历所有点后,或者voxelidx达到k-1且...

【专利技术属性】
技术研发人员:卢亮江承谦
申请(专利权)人:上海雪湖科技有限公司
类型:发明
国别省市:上海;31

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1