BEVDepth 建立在 LSS 的 view transformation 上。
对每个相机特征
对每个相机的每个像素,BEVDepth 预测了一个离散深度分布(和 LSS 一样):
然后做外积:
得到:
然后用相机内外参 KRT 将 frustum feaure 投影到 BEV Grid 中。
LSS/BEVDet 一类方法的问题是,深度网络没有深度监督。
梯度路径是:
深度网络就是学到了一个对最终 Det 任务有用的 Lifting 权重,并不需要预测出物理上准确的深度值。
乱预测的 DepthNet
作者把 learned Depthnet 直接换成 random softmax。
精度只掉了 4%……
也就是说 DepthNet 是在汤姆的乱预测。
因为离散深度分布把图像像素沿射线散射到不同深度,即使不知道真实深度,只要在正确深度附近有一定概率,那么这部分图像特征就会被保留下来,后面的 BEV Encoder 和 Det Head 仍然可能把物体找出来。
此外,在没有显式的深度监督时,Base Detector 在 foreground px 上的 AbsRel 有 3.03。
但是加入深度监督之后,这个误差变成了 0.23。
说明 DepthNet 是在学怎么 Lift 最利于检测,而非这个 px 的真实深度是多少。
网络结构

作者通过把 LiDAR 点云投影到 Camera 然后通过 min pooling 和 one-hot 得到离散的 Depth GT,然后直接监督 Depth Distribution,用 BCE Loss。
所以在工程上来说,BEVDepth 仍然是单模态的相机感知模型,LiDAR 仅用于训练阶段生成监督信号。
Camera-Aware DepthNet
深度这个东西和相机 Intrinsic 很明显是有关系的。
因此下面这个式子不完整:
这样更合理:
BEVDepth 将 KRT flatten 之后 concat,经过 MLP 再用 Squeeze-and-Excitation (通道加权)模块
Depth Refinement Module
对于外积之后的特征
作者给 Reshape 了:[C_F,C_D,H,W] \rightarrow [C_FH,C_D,W]
然后在最后两维 D\times W 平面上做卷积,不是普通卷积,而是让特征在 Depth Dim 上互相通信。
Efficient Voxel Pooling
原始 LSS voxel pooling 使用 Sort + Cumulative Sum
BEVDepth 改成了 CUDA 的 Parallel Scatter-add。每个 frustum feature 分配一个 CUDA thread。训练时间变成了优化前的 30%
评论