盘一盘 | 基于BEV空间的视觉感知算法模型梳理(自下而上&自上而下)(下)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 激光雷达传感器可以提供物体准确的深度信息以及结构信息;但激光雷达传感器提供物体信息的距离比较有限,同时其获得的点云数据与相机传感器采集到的图像信息相比更加稀疏;

四、自上而下的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算法模型的整体流程图如下:


640.png


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示意图:

640.png


LID公式:


640.png


在得到相机视锥特征以及相机视锥网格后,通过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算法模型的整体流程图如下:

640.png


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算法模型的整体流程图如下:


640.png


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

相关文章
|
5天前
|
算法
基于模糊PI控制算法的龙格库塔CSTR模型控制系统simulink建模与仿真
本项目基于MATLAB2022a,采用模糊PI控制算法结合龙格-库塔方法,对CSTR模型进行Simulink建模与仿真。通过模糊控制处理误差及变化率,实现精确控制。核心在于将模糊逻辑与经典数值方法融合,提升系统性能。
|
5天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
29天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
76 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
29天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
78 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
81 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
115 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
116 8
|
2月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
40 4

热门文章

最新文章