文章

快速了解一个网络:BevDepth

快速了解一个网络:BevDepth

以下内容偏向于记录个人学习过程及思考,非常规教学内容

背景

作者将LSS (Lift, Splat, Shoot)网络中估计的深度进行了可视化,发现结果意外的差。

作者认为LSS网络有3大缺陷:

  1. 深度预测部份并非有loss直接监督,而是通过检测loss反传梯度间接训练的,因此导致深度预测效果并不好。
  2. 大部分像素点没有预测出合理的深度值,作者认为这些地方并没有训练的比较好,推断深度预测部份的泛化性应该不会很好。
  3. 由于深度预测的不准确,在变换时会导致后续的frustum features、bev features都只能取到部份的fv features,影响模型性能。

作者尝试将LSS中的深度预测部份输出替换为Lidar点云的真值深度,发现模型性能大幅提升。因此可以说明深度预测的准确度对于3D目标检测任务而言至关重要。

因此提出本文的网络:BevDepth

核心思想

  1. 利用Lidar点云生成真值深度,在训练过程中显式的监督深度预测loss
  2. 将相机内外参encode作为深度预测网络的输入,预期提高网络对不同相机内外参的泛化性
  3. 提出一个深度精调的网络结构,用于精调预测的深度(个人感觉有点凑数,这个模块对于检测效果的作用也不是很显著)。
  4. 其他贡献:Efficient Voxel Pooling & Multi Frame Fusion,前者利用并行性提高训练和计算效率,后者利用多帧信息融合到当前帧加强feature实现涨点。

Pipeline

bevdepth-pipeline

亿些细节

深入分析LSS中的深度预测部份

让LSS工作非常简单,但让LSS工作好非常困难。

Making Lift-splat work is easy

这里作者做了个试验,将LSS中的深度预测替换为随机值,并在后续的训练和测试中冻住。

作者发现这种做法并没有引起太多的掉点。

这个试验表明,因为即使是随机的深度分布,仍然有正确的深度被激活时,从而获得一定的检测能力。

Making Lift-splat work well is hard

  • 当网络没有直接关于depth的loss时,网络只是通过部份的深度学习对目标进行检测。
  • 作者试验发现大部分像素没有被学习到正确的深度,因此推测网络的泛化性必然不足。作者尝试使用不同的img size和相机参数时,发现原LSS网络掉点比较严重。
  • 由于深度不准确,导致通过aggregation获得bev features,只能通过部份/不完整的img features,影响后续的模型性能。

BevDepth

Explicit Depth Supervision

这里作者引入了显式的深度监督。而深度的来源是将Lidar点云通过相机内外参反投到img上,取min pooling + one hot作为深度真值。

Camera-aware Depth Prediction

在相机模型中,相机的内外参对于深度的学习至关重要。因此这里作者考虑将相机参数也encode作为深度预测网络的输入。

具体是将相机内参通过MLP scale up到features,然后利用一个SeNet模块去re-weight img features,最后将相机外参concat在一起以使DepthNet获得ego系的一些感知信息。

Depth Refinement Module

这里作者是将3D voxel features CF x CD x H x W reshape成 (CF x H) x CD x W,然后在CD x W平面进行卷积,以获得沿着深度方向上的features aggregation,期望可以对深度的预测进行调整和优化。

Experiments

Efficient Voxel Pooling

作者对每个frustum feature assign一个CUDA线程,用于计算其对应的bev grid features,充分地利用了GPU的并行计算能力,大大提升了训练速度,值得学习。

Multi-frame Fusion

将历史多帧的frustum features通过外参变换到当前帧,合并作Voxel Pooling,消除ego运动到影响,有利于积累features。

进一步了解

SeNet: Squeeze-and-Excitation Networks

MVSNet: Multi-View Stereo Network

原文和代码

https://arxiv.org/abs/2206.10092

参考资料

本文由作者按照 CC BY 4.0 进行授权