Zhangzhe's Blog

The projection of my life.

0%

BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View

URL

TL;DR

  • 本文介绍了一种 BEV 视角下的 3D 障碍物检测算法,该算法的输入是由多张(6张)图片组成的车身环视视角,输出为车身周围障碍物的 3D bbox

  • LSS(lift-splat-shoot) 算法较为相似,但任务不同,LSS 想要解决的是 BEV 视角下的分割问题,BEVDet 想要解决的是 3D 障碍物检测问题

  • FCOS3D 等单目 3D 障碍物检测的任务类型相似,区别在于:单目 3D 障碍物检测对每个视角做 3D 障碍物检测后,需要使用后处理融合跨视角的物体,BEVDet 可以将跨视角融合问题内嵌到模型中(BEV

Algorithm

总体结构

BevDet.png

由上图可以看出,模型主要由四个部分组成,分别是:

  • Image-view Encoder:图像特征提取(backbone + neck),6个视角分别做特征提取,不做视角间特征融合
  • View Transformer:视角变换(同时也实现了图像间信息融合),从图像视角转换为 BEV 视角,使用的方法和 LSS 方法一样,输出为 BEV feature
  • BEV Encoder:对 BEV feature 用一个较小的 BEV backbone 做特征提取
  • Head:任务头,预测 3D bbox 等,本文使用了 CenterPoint Head

算法流程的伪代码表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 定义输入,shape: (8, 6, 256, 704, 3) [batch, camera, H, W, C]
input_images = get_input_images()

# 图像视图编码器,输出shape: (8, 6, 16, 44, 256) [batch, camera, H//16, W//16, C]
image_view_features = image_view_encoder(input_images)

# 视图变换器,输出shape: (8, 64, 128, 128) [batch, C, Bev_H, Bev_W]
transformed_features = view_transformer(image_view_features)

# BEV编码器,输出shape: (8, 256, 64, 64) [batch, C, Bev_H//2, Bev_W//2]
encoded_bev_features = bev_encoder(transformed_features)

# 任务特定头部进行3D物体检测,输出shape: (8, num_objects, object_info)
detection_results = task_specific_head(encoded_bev_features)

# 返回3D物体检测结果
return detection_results

数据增广方法

  • 独立图片空间数据增广:图片的翻转、裁剪和旋转可以用 3x3 矩阵表示,在 View Transformer 的时候需要做对应逆变换,即 同时更改图片和 View Transformer 过程

  • BEV视角下的数据增广:在BEV空间的学习中,数据量少于图像视图空间,因为每个样本包含多个摄像机图像,所以更容易过拟合;该增广方法遵循常见的 LiDAR 方法,采用了 2D 空间中的常见数据增广操作,如翻转、缩放和旋转,需要对应修改目标 3D bbox,即 同时更改 BEV Feature 和 3D bbox GT

Scale-NMS

  • 由于 BEV 空间中不同类别的空间分布与图像视图空间中的分布非常不同,所以作者提出了 Scale-NMS,在执行经典的 NMS 算法之前根据每个对象的类别来缩放每个对象的大小,可显著提高了对小面积类别(如行人和交通锥)的预测性能

Thought

  • 从模型结构和数据增广方式看 BEVDet 本质是一个二阶段算法:

    • image Encode + View Transformer:环视图像编码到 BEV 空间

    • BEV Encoder + Task HeadBEV 空间下的 3D 障碍物检测

  • 但第一阶段输出的 BEV Feature 没有用 LiDAR 点云监督就有点怪…(后续的改进算法加了)