四、自上而下的BEV空间特征构建方法
自上而下的这类算法通常是利用点云的感知范围以及体素大小预先构建一组BEV空间下的3D网格坐标,然后利用相机的内外参变换矩阵将3D空间坐标投影到图像坐标系下,并对相应位置的图像特征进行采样,或者借鉴Transformer中的Query思想,利用在3D空间下构建的Object Query与图像特征进行交互,最终实现BEV特征的构建。下面主要梳理下CaDDN、BEVFormer以及PETR算法模型;
1. CaDNN:Categorical Depth Distribution Network for Monocular 3D Object Detection
论文链接:https://arxiv.org/pdf/2103.01100.pdf;
Github仓库源码:https://github.com/TRAILab/CaDDN;
CaDDN是发表在CVPR 2021上的一篇论文,该论文主要是基于单目相机实现3D目标检测任务。CaDDN算法模型的整体流程图如下:
CaDDN算法模型的前向过程主要包括以下四个部分:
- 利用主干网络提取输入单目图像的多尺度特征(对应上图的Image Backbone);
- 利用提取到的多尺度特征预测特征图每个单元格上的语义表达和深度方向的概率估计,从而构建相机视锥特征(对应上图的Frustum Features);
- 将BEV空间下构造的3D网格点根据相机的内外参变换矩阵投影到相机视锥坐标系,进行特征采样(对应上图的Voxel Features),并利用Voxel Collapse形成最终的BEV空间特征;
- 对得到的BEV特征先经过BEV Backbone实现多尺度特征的提取,然后接Detection Head实现3D目标检测;
利用主干网络提取输入单目图像的多尺度特征
论文中采用的是ResNet-101主干网络提取图像的多尺度特征,多尺度特征如下
Python Tensor([bs, 2048, H / 8, W / 8]); # 降采样8倍的特征图用于后续预测深度方向的离散信息; Tensor([bs, 256, H / 4, W / 4]); # 降采样4倍的特征图用于后续预测语义特征;
利用提取到的多尺度特征预测特征图单元格的语义特征和深度方向的离散概率估计,从而构建相机视锥特征
CaDDN构建视锥特征的方式整体与LSS算法相近,二者算法主要的区别是CaDDN中深度预测网络是靠显式监督,而LSS算法中的深度预测网络是隐式监督的。
- 对降采样4倍的特征图,论文中采用ASPP模块,通过不同大小的卷积来扩大感受野,用于预测特征图上每个单元格的语义特征;
- 对降采样8倍的特征图,论文中利用深度预测网络预测深度方向的离散概率分布;
- 最后根据预测的语义特征以及深度方向的离散概率分布利用外积运算得到相机视锥特征;
将BEV空间下构造的3D网格点根据相机内外参投影到相机视锥坐标系,并进行采样,利用Voxel Collapse构建最终BEV特征
- 根据点云感知范围以及体素大小构建BEV空间下的3D网格点(源码中的create_meshgrid3d()函数)
Python def create_meshgrid3d(width, height, depth): xs: Tensor = torch.linspace(0, width - 1, width, device=device, dtype=dtype) ys: Tensor = torch.linspace(0, height - 1, height, device=device, dtype=dtype) zs: Tensor = torch.linspace(0, depth - 1, depth, device=device, dtype=dtype) # generate grid by stacking coordinates base_grid = stack(torch_meshgrid([zs, xs, ys], indexing="ij"), dim=-1) # DxWxHx3 return base_grid.permute(0, 2, 1, 3).unsqueeze(0) # 1xDxHxWx3
根据得到的3D网格点,利用相机内外参投影回相机的视锥空间得到相机视锥网格。其中视锥的横纵坐标的计算方式与正常投影过程的计算方式相同。需要注意的是,论文中对网格点的深度大小利用LID算法进行了处理,其中LID的示意图和公式如下:
LID示意图:
LID公式:
在得到相机视锥特征以及相机视锥网格后,通过F.grid_sample()函数进行采样,从而得到图中的Voxel Features,再利用Voxel Collapse操作去掉Voxel Features的高度信息,得到最终的BEV空间特征。
对得到的BEV特征经过BEV Backbone特征提取后,接Detection Head实现3D目标检测
这里Detection Head所预测的内容与BEVDet中检测头预测的内容基本保持一致,就不再重复介绍啦 ~
2. BEVFormer:Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers
论文链接:https://arxiv.org/pdf/2203.17270.pdf;
Github仓库源码:https://github.com/fundamentalvision/BEVFormer;
BEVFormer是发表在ECCV 2022上的一篇论文,该论文主要是基于环视图像实现感知中的3D目标检测和地图分割任务的。BEVFormer算法模型的整体流程图如下:
BEVFormer算法模型的前向过程主要包括以下三个部分:
- 主干网络和特征融合网络提取环视图像的多尺度特征;
- 利用上图中的Encoder模块(由Temporal Self-Attention模块和Spatial Cross-Attention模块组成)实现空间BEV特征的构建;
- Object Query与BEV特征利用Decoder模块进行交互得到Output Embedding,进而接3D检测头或者语义分割头完成3D目标检测和地图分割任务;
主干网络和特征融合网络提取环视图像的多尺度特征,输出的多尺度特征如下
Python [0]: Tensor([bs, cam, 256, h / 8, w / 8]) [1]: Tensor([bs, cam, 256, h / 16, w / 16]) [2]: Tensor([bs, cam, 256, h / 32, w / 32]) [3]: Tensor([bs, cam, 256, h / 64, w / 64])
利用Temporal Self-Attention模块和Spatial Cross-Attention模块完成BEV特征的构建
由论文中的流程图可知,Encoder模块由Temporal Self-Attention模块以及Spatial Cross-Attention模块组成实现BEV特征构建。两个模块的功能描述如下:
Temporal Self-Attention模块
该模块的主要作用是通过引入之前时序帧的信息特征(图中的History BEV)并与当前时刻的BEV Query利用Self-Attention机制实现融合,然后将融合后的BEV Query送入到后面的Spatial Cross-Attention模块中。将时序信息引入到模型里的好处是可以使算法模型更好的解决感知中存在的遮挡问题,也可以比较准确的预测周围物体的速度信息。
Spatial Cross-Attention模块
Spatial Cross-Attention模块利用Temporal Self-Attention模块输出的BEV Query,对主干网络和特征融合网络提取到的多尺度环视图像特征进行查询,生成BEV空间下的
BEV Embedding特征;
BEVFormer这里的实现方式与CaDDN算法类似,都是采用了自上而下的构建方式;根据点云感知范围和体素大小构建BEV下的3D空间网格,通过相机内外参变换矩阵将3D空间点映射到图像特征上,BEVFormer算法借鉴了Deformable Transformer的局部注意力机制的思想对图像特征进行采样完成最终的BEV特征构建。
Object Query与BEV特征利用Decoder模块进行交互得到Output Embedding,进而接3D检测头或者语义分割头完成3D目标检测和地图分割任务
由于官方代码只提供了3D目标检测的实现方式,所以这里主要介绍3D目标检测的实现方式。
算法中将Object Query与BEV特征借鉴Deformable DETR中局部注意力的思想输出Output Embedding。利用FFN网络充当3D目标检测头预测相关的感知参数(预测内容与BEVDet算法相似),实现最终的3D目标检测任务。
3. PETR:Position Embedding Transformation for Multi-View 3D Object Detection
论文链接:https://arxiv.org/pdf/2203.05625.pdf;
Github仓库源码:https://github.com/megvii-research/PETR;
PETR是发表在ECCV 2022上的一篇论文,该论文的主要思想是希望类似于DETR算法一样实现完全端到端的3D目标检测任务;PETR算法模型的整体流程图如下:
PETR算法模型的前向过程主要包括以下三个部分:
- 利用主干网络和特征融合网络提取图像的2D特征;
- 利用3D位置编码器输出具有3D空间位置的特征;
- 利用Decoder获得Output Embedding,最后接3D检测头实现3D目标检测;
利用主干网络和特征融合网络提取图像的2D特征,实现流程如下
Python # 主干网络输出的多尺度特征如下 l0 = Tensor([bs * N, 1024, H / 16, W / 16]) l1 = Tensor([bs * N, 2048, H / 32, W / 32]) # 特征融合网络对主干网络输出的多尺度特征进行融合,输出图像的2D特征 out[0] = Conv1x1(l1) --> Tensor([bs * N, 256, H / 32, W / 32]); out[1] = Conv1x1(l0) + Up(Tensor([bs * N, 256, H / 32, W / 32]) --> Tensor([bs * N, 256, H / 16, W / 16]);
利用3D位置编码器输出具有3D空间位置的特征,3D位置编码器整体流程图如下:
对主干网络和特征提取网络输出的2D图像特征利用1x1卷积进行拟合得到图像语义特征;
生成视锥网格点,并利用相机内外参转换到3D空间(对应上图中的3D Coordinates),利用3D Position Embedding进行3D位置编码
最后将3D位置编码 + 1x1卷积拟合后的图像语义特征进行相加,得到具有空间位置的语义特征(对应上图中的3D Position-aware Features)
利用Decoder获得Output Embedding,最后接3D检测头实现3D目标检测
这部分的实现逻辑与传统的Transformer的Decoder的逻辑类似,利用Cross-Attention模块将生成的3D空间下的Object Query和具有3D空间位置的语义特征进行交互,得到Output Embedding,然后利用FFN网络充当3D检测头实现最终的3D检测结果。
参考文章
[1] https://arxiv.org/pdf/2208.02797.pdf
[2] https://arxiv.org/pdf/2209.05324.pdf
[3] https://arxiv.org/pdf/2008.05711.pdf(LSS)
[4] https://arxiv.org/pdf/2112.11790.pdf(BEVDet)
[5] https://arxiv.org/pdf/2103.01100.pdf(CaDDN)
[6] https://arxiv.org/pdf/2203.17270.pdf(BEVFormer)
[7] https://arxiv.org/pdf/2203.05625.pdf(PETR)
原文首发微信公众号【自动驾驶之心】:一个专注自动驾驶与AI的社区(https://mp.weixin.qq.com/s/NK-0tfm_5KxmOfFHpK5mBA)