视觉3D目标检测 | 从视觉几何到BEV检测

作者 | Black  编辑 | 汽车人

原文链接:https://www.zhihu.com/people/youseeblack

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心技术交流群

后台回复【3D检测综述】获取最新基于点云/BEV/图像的3D检测综述!

1. 前言:

做为被动传感器的相机,其感光元件仅接收物体表面反射的环境光,3D场景经投影变换呈现在2D像平面上,成像过程深度信息丢失了。而当我们仅有图片时,想要估计物体在真实3D场景中所处的位置,这将是一个欠约束的问题。

2ca2077ecfa90ff7ac6a4febeb4731d1.png

2. 几何求解

分类、2D目标检测等图像任务已经在工业界得到广泛应用,可以认为是已经解决了的问题,并且数据价格低廉。但2D目标框无法满足自动驾驶、机器人等对障碍物有定位需求的领域。传统算法利用2D检测框的底部中心点,基于平面假设,求解近似三角形来获得目标离自车的距离。这类方法简单轻量,数据驱动的部分仅限于2D目标检测部分,但对地面有较强的假设,面对车辆颠簸敏感(俯仰角变化),且对2D检测框的完整性有较强的依赖。下图来自apollo lite。

bbc49046b4960dc89537cef460b6bd4f.png

3. 单目3D目标检测

随着标注方法的升级,目标的表示由原来的2D框对角点表示进化成了3D坐标系下bounding box的表示,不同纬度表示了3D框的位置、尺寸、以及地面上的偏航角。有了数据,原本用于2D检测的深度神经网络,也可以依靠监督学习用于3D目标框检测。

这样的3D数据业界目前主要有两种获取方式,一种是车辆除了配备了相机,同时安装了LiDAR这样的3D传感器,经扫描,目标轮廓以点云的形式被记录下来,标注员主要看点云来标注。另一种是像特斯拉这样仅配备相机的车辆,收集的只有图像数据,依靠多种交叉验证的离线算法,辅以人工来生成3D标注数据。

5d1166f10eb1c38ad266fb361da230e5.png

焦距适中的相机,FOV是有限的,想要检测车身  目标,就要部署多个相机,每个相机负责一定FOV范围内的感知。最终将各相机的检测结果通过相机到车身的外参,转换到统一的车辆坐标系下。

cb0b79227f652f064e048b975d0e684f.png

但在有共视时,会产生冗余检测,即有多个摄像头对同一目标做了预测,现有方法,如FCOS3D,会在统一的坐标系下对所有检测结果做一遍NMS,有重合的目标框仅留下一个分类指标得分最高的。

f80ba0e68ad9f289e37a34a4bed135e8.png

冗余问题得到缓解,但要命的是被截断的目标往往在任一个相机里都只出现了一部分,多数情况是每个相机下的检测质量都堪忧。原因是多相机的图片在深度神经网络是以 的形式传递的,传统网络中会有纬度  的特征间交互,也会有纬度  的空间交互,但唯独没有不同图片间batch纬度的交互。简单来说就是下图中左边图片在检测黑色客车时,是无法用到右边图片的信息的。

4db8986af4fe39e72124096e4d3e5414.png

4. 统一多视角相机的3D目标检测

4.1 看到哪算哪

自下而上的方法,手头的信息看到哪算哪。下图来自CaDNN这篇文章,很好的描述了这一类方法,包括Lift、BEVDet、BEVDepth。这类方法预测每个像素的深度/深度分布,有的方法隐式的预测,有的方法利用LiDAR点云当监督信号(推理时没有LiDAR),虽然只用在训练阶段,但不太能算在纯视觉的方法里比较精度,工程使用的时候可能涉及部署车辆和数据采集车辆割裂的尴尬。总之,有了深度就可以由相机内外参计算此像素在3D空间中的位置,然后把图像特征塞入对应位置。可以理解为由图片生成3D“点云”,多视角相机形成的“点云”拼在一起,有了“点云”就可以利用现有的点云3D目标检测器了(如PointPillars, CenterPoint)。

60de16c4a8faee9f7ac763cac4d122ce.png

4.2 先决定看哪

自上而下的方法,先确定关注的地方(但可能手头不宽裕,不配关注这个地方... 比如想关注自车后方,可后方视野完全被一辆大车遮挡了的情况)。关于这类的方法,下图碰瓷一下特斯拉,简单来说就是先确定空间中要关注的位置(图中网格代表的车身周围的地方),由这些位置去各个图像中“搜集”特征,然后做判断。根据“搜集”方式的不同衍生出了下面几种方法。

20358b93f7021c35eb4d21b46069c3b4.png
4.2.1 关键点采样

下图来自DETR3D,其作为将DETR框架用于3D目标的先锋工作,由一群可学习的3D空间中离散的位置(包含于object queries),根据相机内外参转换投影到图片上,来索引图像特征,每个3D位置仅对应一个像素坐标(会提取不同尺度特征图的特征)。

32f7a687ea5875926aa3b038eca38954.png
4.2.2 局部注意力

下图来自BEVFormer,该方法预先生成稠密的空间位置(含不同的高度,且不随训练更新),每个位置投影到各图片后,会和投影位置局部的数个像素块发生交互来提取特征(基于deformable detr),相比于DETR3D,每个3D点可以提取到了更多的特征。最终提取的3D稠密特征图在高度纬度会被压扁,形成一张BEV视角下稠密的2D特征图,后续基于此特征图做目标检测。BEVFormer相比DETR3D在精度上有提升(结构上也多了额外的BEV decoders),在BEV视角下,目标尺度被统一了,不会出现图像视角下目标近大远小的问题。一张稠密的BEV特征图还可以做车道线检测/道路分割等任务,缺点是计算量大,显存占用大。

aac35e24dc2ca213ce77d4f3209a8429.png
4.2.3 全局注意力

典型方法如PETR,该方法强调保持2D目标检测器DETR的框架,探索3D检测需要做哪些适配。PETR同样利用稀疏的3D点(来自object queries)来“搜索”图像特征,但不像DETR3D或BEVFormer把3D点投影回图片,而是基于标准的attention模块,每个3D点会和来自全部图片的所有像素交互。相似度(attention matrix)计算遵循,其中来自object queries,里面包含的信息和3D bounding box的信息强相关(暂不讨论query也包含的表观信息),而来自图像(可以理解为和RGB信息强相关,原生DETR中还会加入像素位置编码),这两个向量计算相似度缺乏可解释性(直接训练也不怎么work)。可以理解为下图描述的场景,很难说一个3D框和哪个像素相似。

e2dff02e9b00f0f274376670fa9b5703.png

PETR对矩阵下手,为每个像素编码了3D位置相关的信息,使得相似度得以计算。实现上简单来说是相机光心到像素的射线上每隔一段距离采样一个点的,并转换到query坐标系下。相比之下,DETR3D和BEVFormer都遵循了deformable detr的方式,由query预测权重来加权“搜集”来的特征,规避掉了点积相似度的计算,PETR是正面硬刚这个问题了属于是。下图是PETR单位置编码相似度效果图(达到了跨相机相似的效果),只是这个相似度是“虚假”的,跟真实场景没关系,也不会变化。很快,PETRv2中加上了图像特征,效果也有提升。不过全局注意力算力消耗巨大,PETR只用了单尺度特征图,一般显卡还需利用混合精度、checkpoint等降显存的方法才能训练起来。

951e6f80b720767c7891398da7dd498d.png

参考文献:

[1] nuscenes: A multimodal dataset for autonomous driving. CVPR 2020.

[2] Lift, splat, shoot: Encoding images from arbitrary camera rigs by implicitly unprojecting to 3d. ECCV 2020.

[3] Categorical Depth DistributionNetwork for Monocular 3D Object Detection. CVPR 2021.

[4] BEVDet: High-performance Multi-camera 3D Object Detection in Bird-Eye-View. arXiv:2112.11790 2021.

[5] DETR3D: 3D Object Detection from Multi-view Images via 3D-to-2D Queries. CoRL 2021.

[6] Deformable DETR: Deformable Transformers for End-to-End Object Detection. ICLR 2021.

[7] BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers. ECCV 2022.

[8] Petr: Position embedding transformation for multi-view 3d object detection. ECCV 2022.

往期回顾

Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、规划控制、模型部署落地、自动驾驶仿真测试、硬件配置、AI求职交流等方向;

加入我们:自动驾驶之心技术交流群汇总!

自动驾驶之心【知识星球】

想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球(三天内无条件退款),日常分享论文+代码,这里汇聚行业和学术界大佬,前沿技术方向尽在掌握中,期待交流!

4d1654e17676ca7c9decd10f6f5a8969.jpeg

### 使用Transformer实现3D图像目标检测的方法 #### 单目3D目标检测中的Transformer应用 MonoDTR算法将Transformer引入单目3D目标检测领域,通过深度感知特征增强模块和深度感知Transformer模块,实现了全局上下文和深度感知特征的综合[^1]。此方法采用深度位置编码向Transformer注入深度位置提示,使得模型能更好地理解场景的空间布局。 ```python class DepthAwareFeatureEnhancer(nn.Module): def __init__(self, input_channels, output_channels): super(DepthAwareFeatureEnhancer, self).__init__() # 定义网络层... def forward(self, features, depth_map): enhanced_features = ... # 结合features与depth_map进行计算 return enhanced_features ``` #### 处理不同形式的3D数据表示 对于不同的3D数据表示方式,如点云或体素化网格,研究者们设计了专门针对这两种输入类型的Transformers架构。具体来说: - **基于体素的Transformers**:当输入为离散化的三维空间单元格时适用; - **基于点云的Transformers**:直接作用于原始不规则分布的数据点集合之上[^2]; 两种方案均旨在捕捉复杂的几何形状及局部细节的同时保持较高的效率。 #### 跨模态融合提升性能表现 为了克服单一传感器局限性带来的挑战,在某些情况下会考虑结合来自多个源的信息来改善最终效果。例如FusionFormer就是一个成功的案例,它不仅能够有效整合激光雷达(LiDAR)和摄像头(camera),而且还能进一步加入时间维度上的信息累积,从而达到更加鲁棒的结果[^3]。 ```python def fuse_multimodal_data(lidar_input, camera_input, historical_bevs=None): """ 对多模态数据进行融合 参数: lidar_input (Tensor): LiDAR点云或其他格式的3D数据. camera_input (Tensor): 图像序列或者其他二维视觉信号. historical_bevs (list of Tensor, optional): 过去时刻BEV视角下的特征图列表. 返回: fused_output (Tensor): 经过变换器处理后的联合表征. """ ... return fused_output ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值