文章目录
- 先说说 BEVPoolv1
-
-
- 步骤1:3D点生成
- 步骤2 2D特征采样和BEV特征生成
- 特点
-
- 再谈谈BEVPoolv2
-
-
- 步骤1:3D点生成
- 步骤2: 计算索引关系
- 步骤3: `voxel_pooling`计算
-
- 鱼眼图片进行实践
-
- 步骤1、3D点生成(基于Kannala-Brandt 进行调整)
- 步骤2、2D特征采样和BEV特征生成
-
-
- (1) 体素化 (Voxelization)
- (2) 特征散射 (Scatter Operation)
-
- 补充:Kannala-Brandt 模型简短说明
- 参考
先说说 BEVPoolv1
BEVPoolv2 是 BEVPoolv1 的优化版本,其优化了图像特征到 BEV 特征的转换过程,实现了在计算和存储方面极大的降低。BEVPoolv1 (左)和 BEVPoolv2(右) 的示意图如下:
BEVPoolv1 的主要计算流程如下:
步骤1:3D点生成
利用get_geometry()
计算图像中每个像素对应的3D空间点在自车(Ego)坐标系下的坐标,即建立 2D像素坐标 ↔ 3D自车坐标 的映射关系。
输入(典型参数):
rots
:相机到自车的旋转矩阵[B, N, 3, 3]
trans
:相机到自车的平移向量[B, N, 3]
intrins
:相机内参矩阵[B, N, 3, 3]
post_rots
/post_trans
:图像后处理(如裁剪/缩放)的变换矩阵depth_假设
:离散深度值(如[4.0, 5.0, ..., 45.0]
)
输出:
points
:3D点坐标[B, N, D, H, W, 3]
B
:Batch大小N
:相机数量D
:深度采样数H/W
:特征图高度/宽度3
:自车坐标系下的(x, y, z)
坐标
首先执行(1) 生成视锥体(Frustum)
- 预定义一个 3D视锥体网格(Frustum),表示相机视野范围内的空间采样点:
# 伪代码:生成像素坐标 + 深度假设的网格 # frustum 是视锥空间的点集合,初始形状为 (B, N_cams, D, H, W, 3)。 frustum = create_frustum(depth_bins, H, W) # [D, H, W, 3]
- 每个点的初始坐标为
(u, v, d)
(像素坐标 + 深度)。
- 每个点的初始坐标为
其次执行(2) 逆投影到3D相机坐标系
- 通过相机内参的逆变换,将像素坐标转换为 归一化相机坐标:
[ x c a m y c a m 1 ] = K − 1 ⋅ [ u v 1 ] \begin{bmatrix} x_{cam} \\ y_{cam} \\ 1 \end{bmatrix} = K^{-1} \cdot \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} xcamycam1 =K−1⋅ uv1 - 乘以深度值得到 3D相机坐标:
P c a m = [ x c a m ⋅ d y c a m ⋅ d d ] P_{cam} = \begin{bmatrix} x_{cam} \cdot d \\ y_{cam} \cdot d \\ d \end{bmatrix} Pcam= xcam⋅dycam⋅dd
# 使用深度信息&#