动态体素化实现
动态体素化DV克服了硬体素化HV的一些缺点。动态体素化DV保留了分组grouping阶段,相反,它没有采样固定的点数或体素容量,它保留了点和体素之间的完全映射。因此,体素数和每个体素中的点数都是动态的,依赖于具体的映射函数。这消除了对固定大小缓冲区的需求,也消除了对随机点和体素的丢弃过程。
因为所有原始点和体素信息都被保留了,动态体素化DV没有引入信息丢失,并产生了确定的体素嵌入,使得检测结果更稳定。
另外,动态体素化建立了每一个点和体素对之间的双向关系,为从不同视图融合点级上下文特征提供了自然基础。
动态体素化DV动态高效分配资源来管理所有体素和点。
简单的动态体素特征编码,也是简单地对体素中所有点的特征向量进行平均值运算作为整个体素的特征,只不过每个体素中的点个数是动态的,每个体素都不同。
![](https://img-blog.csdnimg.cn/8325de12e47943c1aa230868fdababde.png)
1,核心函数
torch::Tensor generate_voxel(torch::Tensor &points,
const std::vector<float> &voxel_size,
const std::vector<float> &coors_range,
const int NDim){
torch::Tensor coors = points.new_zeros({points.size(0), 3},
torch::TensorOptions().dtype(torch::kInt).device(torch::kCUDA, 0));
dynamic_voxelize_gpu(points, coors, voxel_size, coors_range, 3);
return coors;
}
std::vector<at::Tensor> DynamicSimpleVFE(torch::Tensor &voxels,
torch::Tensor &coors){
assert(coors.size(1) == 3 && voxels.size(0) == coors.size(0));
std::vector<at::Tensor> res = dynamic_point_to_voxel_forward_gpu(voxels, coors, MEAN);
assert(res.size() == 2);
return res;
}
2.动态体素化 dynamic_voxelize_gpu
void dynamic_voxelize_gpu(const at::Tensor& points, at::Tensor& coors,
const std::vector<float> voxel_size,
const std::vector<float> coors_range,
const int NDim) {
CHECK_INPUT(points);
at::cuda::CUDAGuard device_guard(points.device());
const int num_points = points.size(0);
const int num_features = points.size(1);
const