前面我们提到bev 之 LSS, 知道视觉的BEV方案的主要痛点在于:
1、depth 的预测
2、图像特征到BEV特征之间的视图变换消耗大量计算
LSS 为什么需要D维深度
占据大量消耗的原因是LSS 对每个图像特征点引入深度D,即假设每个像素上存在可能的D维深度。也就是假设不同像素深度上对应的图像特征不同。
能不能去除深度特征
从M2BEV中,假设图像到BEV视图的转换过程沿相机光线的深度均匀分布,也就是说不同深度对应的图像特征是相同的。基于这个理论,就可以将深度D去掉。
LSS 基于像素深度上的特征均匀分布, 这比LSS 看起来非常暴力,去掉深度维度确实可以大幅度提高速度。
分析原因:Lss想做的是对于射线空间中无占据的区域希望其特征为0,只保留有物体的语义特征的精准预测,这就依赖深度预测。而fastbev 则假设射线经过的空间均有可能存在语义特征,且相同。然后用3d neck进一步融合粗采样的bev特征。所以对图像上的同一个物体,映射到BEV上后其特征也能像带有深度预测一样聚集一块,只是会有部分局部特征会分散到bev空间其他位置,这部分分散的特征在BEV空间是冗余的,但是不影响聚集特征的预测。所以3d neck本身是不可或缺的,否则精度将明显掉点。
LSS 中的BEV Pooling
LSS 去除了深度Depth,为了加速2D图像特征到3D BEV空间特征,不像LSS , 先构建N个图像的映射视锥 N x H x W x D,再对特征进行索引投影映射。LSS直接将不同视角的N个图像的直接投影到BEV空间。
原始是在BEV空间独立产生N份特征,再pooling成一份。但是图像重叠区域部分占的比例极低,所以fastBEV 干脆在BEV空间只产生一份特征,对重叠区域只保留任意一份(这会失去重叠的融合特征,但是实验验证精度损失极小)
推理查表进行特征映射
构建BEV体素空间到图像空间的映射关系。
构建好查找表后,我们只需要对最终要产生的voxel按索引查找一遍其对应采样的2d特征按需索取填充即可,这样避免了大量冗余计算。
总结:
fast BEV 相对 LSS 做了以下加速:
1、去除 depth 估计,也就去除了D维的计算量,节省存储和计算。
2、直接从BEV 特征空间通过映射表获取图像特征,且对重叠区域只保留一个特征,加快视场空间转换。