LSS中的Voxle pooling学习

没有搞明白,这是为是什么?

BEV特征空间是以自车为中心的栅格,X轴Y轴最远检测距离各50米,Z轴各10米。这个100 * 100 * 20的空间就是BEV特征需要表征的,栅格内每个位置是空间中该位置的特征。

xbound=[-50.0, 50.0, 0.5],   # x方向网格
ybound=[-50.0, 50.0, 0.5],   # y方向网格
zbound=[-10.0, 10.0, 20.0],  # z方向网格
dbound=[4.0, 45.0, 1.0],     # 深度方向网格

来看模型流水线图,其实Extrinsics+Splat,完整流水线可以分为5部分:

1.生成视锥点云,代表特征图中元素的相机坐标
2.根据相机内外参数、数据增强参数,将视锥点云从相机坐标映射到世界坐标
3.CamEncode网络提取2D图片的深度特征矩阵
4.⭐深度特征绑定视锥点云,Voxel Pooling为BEV特征
5.BEV特征编码,输出

2D图片 - > 深度特征

相机坐标->世界坐标的映射关系

第一步,先建立特征图在世界坐标系下坐标位置的视锥点云,也就是深度特征每个点的在相机坐标系的位置。
CamEncode网络输出维度是【 64, 41, fW, fH】,表示高宽深分别为【fH,fW,41】的立方体中,每个位置特征64维;视锥点云维度【41 x fH x fW x 3】中,3代表XYZ三条坐标轴,因此视锥点云存储立方体每个位置在相机坐标系的XYZ坐标。有些类似位置编码对吧。

步骤【2】坐标系转换。这些特征点的在相机坐标系的位置,需要通过相机内外参数映射到世界坐标系下。代码中的映射涉及仿射变化和相机参数

BEV池化

将这【6,41 ,fW, fH】个特征点一一放置在了早先准备好的BEV特征空间下。终于可以到达【4】,构建BEV特征。在这张像棋盘一样的BEV特征空间中,有位置放了多个特征点,有的位置没放特征点,因此需要【4】在每个栅格进行BEV池化,得到尺寸统一的BEV特征。

先根据特征点的XYZ坐标和batch,计算每个点的索引值;索引值相同的点位于同一个栅格中;【代码26-30】
根据索引值排序,则索引值变为有序数组,形如【1.2,1.4,2,4,4,5 … 】;
只需“遍历”索引值,将相同索引值的位置求和,完成池化,形如【1.2+1.4,2,4+4,5 … 】

Splat:Pillar池化

作者采用与pointpillars算法中一样的方式处理Lift操作生成的点云,一个Pillar定义为无限高度的体素。每个点被分配到与其最近的Pillar中然后执行求和池化,产生一个可以被标准CNN处理的维度的张量。为了提升效率,作者采用“累计求和”的方式实现求和池化,而不是等填充完每个Pillar后再来做池化。这种操作具有可分析的梯度,可以高效地计算以加速自动微分过程。由于Lift操作生成的点云坐标只与相机的内外参有关,因此可以预先给每个点分配一个索引,用于指示其属于哪个Pillar。对所有点按照索引进行排序,累积求和的具体实现过程如下:

引用:BEV感知经典LSS(Lift-Splat-Shoot)论文注释代码,三十分钟全搞定_bev lss论文-CSDN博客

BEV感知算法 | LSS论文与代码详解 - 文章 - 开发者社区 - 火山引擎 (volcengine.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值