通过上面的图片可以发现,bevpoolingV2 相比于bevpooling少了一步:不需要显式地构建frustum feature(尺寸为NDHWC),而是为2D backbone输出的context feat 、DepthScore生成索引,预计算bevfeat的voxel index与上述两个索引之间的映射关系,能节省显存消耗,提高执行效率;具体过程如下: 一、初始化阶段: 1.构建单个相机的视锥...
代码路径:BEVDET/mmdet3d/models/necks/view_transformer.py voxel_pooling计算 预计算体素索引和视锥索引后,将其与 backbone 输出的 context_feat 和 depth score 一起输入到voxel_pooling_v2函数中进行计算。相关代码如下所示: def voxel_pooling_v2(self, coor, depth, feat): # 准备体素池化所需的索引和区间...
BEV pooling v2优化点便是解决这个问题,对比如下图所示。 图5 BEV pooling v2 BEV pooling v2不再直接将特征张量和深度张量进行叉乘,而是在原来的视锥体素索引rank的基础上,新增特征张量的索引rank_feat和深度张量的索引rank_depth。通过对rank预处理操作,将落在同一个BEV网格的点相邻排列,同时作用到rank_feat和r...
得到包含图像特征的视锥(点云);Splat——结合相机内外参把所有相机的视锥(点云)分配到BEV空间的网格中,对每个格子中的多个视锥点进行pooling计算,形成BEV特征图;Shoot——用task head处理BEV特征图,输出感知结果。
BEV pooling过程中的预先计算视锥点与BEV网格,可以在节约推理耗时,保证了模型在车端部署的实时性。例如,在实际落地实践中,觉非的BEV 3D感知可实现自车前后80米、左右40米范围,哈希映射计算前置与BEV pooling的并行加速节约耗时可达到16毫秒。2.相机视椎体切割(Camera Frustum Cutting)在BEV pooling环节中,可以...
3D视锥特征经过pooling操作拍扁到BEV空间,BEV特征编码器(BEV Encoder)对BEV空间下的特征做多尺度特征提取,得到BEV特征。 最后送入检测头进行3D目标检测,分类监督使用的损失函数为Focal loss,包围盒监督使用的损失函数为L1 loss。 2.2.2. BEVDepth 作者实验发现LSS估计的深度替换成随机值影响不大,而采用真值深度对指...
沿着x,y两个方向,按照rxr的BEV网格,使用BEV Pooling对Camera Feature点云进行聚合量化。 最后,沿z轴Flatten这些特征。 这个过程中的BEV Pooling耗时严重,作者提出了Precomputation和Interval Reduction解决这个问题。 Precomputation 相机的外参是固定的,内参也是固定的,相机的射线上采样的D个离散点的采样间隔也是已知的,因...
问题2 BEVpooling的索引操作支持问题 公版在做2D到3D转换时,从图像空间的index映射到BEV空间的index,相同的BEV空间index相加后再赋值到BEV tensor上,即公版的步骤二。考虑到征程5对索引操作无法支持,因此该操作在部署时需要做替换。 问题3 分割头粒度太粗 地平线提供的是多任务的BEV感知算法,对于多任务模型来说不...
BEV_pooling部署优化 使用grid_sample代替公版的3D空间转换。即从原来的前向wrap-从图像空间特征转换到BEV空间特征,改为从BEV空间拉取图像空间特征。 公版实现: a.通过一个深度估计变成6D的tensor Python volume = depth.unsqueeze(1) * cvt_feature.unsqueeze(2) ...
而转换成的BEV空间的特征点云,以自车作为坐标系原点,沿x轴和y轴展开,以局部网格采样的方式,如网格间隔(grid)为r,一般通过池化(pooling)操作来聚合每个 r × r BEV空间网格内的特征,并沿 z 轴(高度方向)展平特征,于是完成了从2D到BEV空间的转换。