OpenPCDet系列 | 5.2 PointPillars算法——PointPillarScatter伪图像BEV特征构建模块

news2024/10/7 4:25:49

文章目录

  • PointPillarScatter模块
  • 1. PointPillarScatter初始化
  • 2. PointPillarScatter前向传播

OpenPCDet的整个结构图:
在这里插入图片描述

PointPillarScatter模块

在进行了PillarVFE编码后,此时的batch_dict更新如下所示,追加了pillar_features字段,表示每个voxel的特征,随后进行Map_to_BEV模块处理。

在这里插入图片描述

在Map_to_BEV结构中,在对应的__init__文件下,也可以找到全部可供选择的模块,在PointPillars算法中选择使用的PointPillarScatter模块。

# 根据MODEL中的MAP_TO_BEV确定选择的模块
__all__ = {
    'HeightCompression': HeightCompression,
    'PointPillarScatter': PointPillarScatter,
    'Conv2DCollapse': Conv2DCollapse
}

1. PointPillarScatter初始化

PointPillarScatter模块的初始化部分比较简单,只是简单的保存了相关的yaml配置,以及保存了点云场景的平面网络的grid size。由于 PointPillar将整个点云场景切分为平面网格,所以这里的z维度一定是1,也就是没有在z轴上面对网络进行切分。

self.model_cfg = model_cfg
self.num_bev_features = self.model_cfg.NUM_BEV_FEATURES
self.nx, self.ny, self.nz = grid_size   # PointPillar将整个点云场景切分为平面网格,所以这里的z维度一定是1
assert self.nz == 1

2. PointPillarScatter前向传播

由batch_dict中可以发现,现在points和coords全靠每一个维度来进行点云帧场景的区分。
在这里插入图片描述

在map2bev模块中需要做的就是将提取出来的voxel特征还原到原空间中,构成一个伪图像特征。

具体的做法是,比如当前提取的voxel特征为Nx64。首选对整个伪空间构造出一个0矩阵,这里两点grid size为[1, 432, 496],所以就会构造出一个[64, 1x432x496]的空矩阵。依次更具相对应的维度获取到个点云帧场景,构造出batch掩码。根据这个掩码就可以获取某个点云帧的pillar特征以及位置coord特征。那么,由于coord存储了voxel的具体网格,可以对其构造出在一维空间中的索引,然后根据索引在空矩阵的相应对位置上填充voxel特征。再进行reshape回到原来的空间中,构造成一个伪图像的特征矩阵。

完整的操作流程如下所示:

def forward(self, batch_dict, **kwargs):
    """
    Args:
        pillar_features:(31530,64)
        voxels:(31530,32,4) --> (x,y,z,intensity)
        voxel_coords:(31530,4) --> (batch_index,z,y,x) 在dataset.collate_batch中增加了batch索引
        voxel_num_points:(31530,)
    Returns:
        batch_spatial_features:(4, 64, 496, 432)
    """
    pillar_features, coords = batch_dict['pillar_features'], batch_dict['voxel_coords']     # (102483, 64) / (102483, 4)
    batch_spatial_features = []
    batch_size = coords[:, 0].max().int().item() + 1    # 16

    # 依次对每个点云帧场景进行处理
    for batch_idx in range(batch_size):
        spatial_feature = torch.zeros(      # 构建[64, 1x432x496]的0矩阵
            self.num_bev_features,   # 64
            self.nz * self.nx * self.ny,    # 1x432x496
            dtype=pillar_features.dtype,
            device=pillar_features.device)

        batch_mask = coords[:, 0] == batch_idx  # 构建batch掩码
        this_coords = coords[batch_mask, :]     # 用来挑选出当前真个batch数据中第batch_idx的点云帧场景
        # this_coords: [7857, 4]  4个维度的含义分别为:(batch_index,z,y,x) 由于pointpillars只有一层,所以计算索引的方法如下所示
        indices = this_coords[:, 1] + this_coords[:, 2] * self.nx + this_coords[:, 3]     # 网格的一维展开索引
        indices = indices.type(torch.long)
        pillars = pillar_features[batch_mask, :]    # 根据mask提取pillar_features [7857, 64]
        pillars = pillars.t()   # 矩阵转置 [64, 7857]
        spatial_feature[:, indices] = pillars       # 在索引位置填充pillars
        batch_spatial_features.append(spatial_feature)      # 将空间特征加入list,每个元素为(64,214272)

    batch_spatial_features = torch.stack(batch_spatial_features, 0)     # 堆叠拼接 (16, 64, 214272)
    # reshape回原空间(伪图像)--> (16, 64, 496, 432), 再保存结果
    batch_spatial_features = batch_spatial_features.view(batch_size, self.num_bev_features * self.nz, self.ny, self.nx) # (16, 64, 496, 432)
    batch_dict['spatial_features'] = batch_spatial_features
    return batch_dict

最后构造出来的spatial_features维度是 (16, 64, 496, 432)。这里的16是batch_size,表示有16个点云帧场景信息。496x432表示伪图像的网格尺寸大小,64表示每个网格上的特征维度。在有voxel上的特征会被pillars_featuer进行填充,其他非voxel索引上的位置特征为0,所以整个特征矩阵还是比较稀疏的。

最后,经过PointPillarScatter模块处理,就可以将一维存储的voxel特征转换成维度的bev视角特征,尽管是比较稀疏的。batch_dict数据更新情况如下:

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好程序员:转行学Java怎么样?什么工作可以月入过万?

去年的时候有个学妹跟小源说,想转行,但是目前又比较迷茫,不知道该从事啥行业?她跟小源说了下具体情况,本科学历,Java零基础。小源让好程序员的就业老师跟她分享了下相关的it行业规划,最后她学了…

Python实现ACO蚁群优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

关于摄影艺术欣赏分享(私密空间+玛丽娜·阿布拉莫维奇+世界十大最昂贵的摄影作品欣赏+《死亡路上的对话》+马良作品)

文章的内容灵感是旁听课而来的呀,搜了很多相关文章很喜欢 1. 出去遛狗,晚点回来 国外文化中国文化(国外不可以随意拍摄照片) 公共空间私密空间 艺术的价值在于可以给人们思考,颠覆常识 2. 行为艺术之母玛丽娜阿布拉…

YOLOv5【目录结构源码】超详细注释解读!!!建议收藏✨✨!

上一篇文章介绍了YOLOv5的网络的详细解读:直通车🚀 由于以后的学习及在进行的项目打算YOLOv5再仔细研究进行使用及改进,接下来会出相关于YOLOv5的代码逐行解读以及注释,废话不多说,让我们一起学习YOLOv5源码吧&#xf…

CTFshow pwn03

题目: 在做本道题前,我们先了解所必要的知识 Libc是什么? 英文名字:Standard C library,其翻译过来,C语言标准库 它是符合ANSI C标准的一个函数库 学过C语言会明白 ANSI C标准又是什么? 198…

Redo log

目录标题 前言为什么需要redo log redo log中的WAL(先写日志,再写磁盘)重要参数innodb_flush_log_at_trx_commit如何选择 redo log记录形式日志块(log block)redo log的格式 redo log何时刷入磁盘正常关闭服务器时事务提交时(inno…

【STL】string的使用

放在专栏【C知识总结】,会持续更新,期待支持🌹 STL简介 STL的诞生 STL为英文Standard Template Library的缩写,译为标准模板库。是C标准库的重要组成部分。 长久以来,软件届一直希望建立一种可重复运用的东西。所谓…

首个支持RWA交易的订单簿DEX-PoseiSwap,即将开启IEO

随着 DeFi 世界的发展,越来越多的链上协议支持以合成资产的方式,将传统金融资产以加密资产的形式映射至链上,包括美股、黄金期货等等,虽然这种方式进一步帮助投资者,以非许可的形式丰富了投资标的,但这种方…

GraphPad Prism 9.5.1 for Mac 操作简便功能强大且实用的医学绘图分析工具

GraphPad Prism简介 GraphPad Prism是一款非常实用的统计软件,其功能非常强大,能够帮助用户进行各类科研数据的处理和分析,快速绘制出各种专业的图像和数据报告。 GraphPad Prism软件的用户界面非常友好,易于学习和操作&#xf…

azkaban 安装 使用

目录 拷贝安装包 解压 改名 修改MySQL配置文件 创建数据库 导入数据表 修改配置文件 修改azkaban-exec下面文件 修改azkaban.properties文件 修改 commonprivate.properties 文件 修改MySQL的jar包 启动 azkaban-exec 修改azkaban-web下面文件 修改azkaban.prop…

Amazon EKS 上有状态服务启用存储加密

1.背景 用户通过 Deployment, Replication Controller 可以方便地在 Kubernetes 中部署一套高可用、可扩展的分布式无状态服务。这类应用不在本地存储数据,通过简单的负载均衡策略可实现请求分发。 Deployment 以及 Replication Controller 是为无状态服务而设计的…

关于Alibaba开发手册中提到的Manager层解析(对于传统MVC三层架构的改进)

Manager层的理解 MVC三层架构 MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面…

scanf函数的用法

有时候刷题经常遇到如下这种输入&#xff1a; 1 2 3 4 ...... 就是不知道什么时候结束输入&#xff0c;反正就是一直在输入&#xff0c;这个时候怎么写呢&#xff1f;我们知道 scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF. 看如下代码&#xff1a; #include<st…

mysqlbinlog 生产环境问题排查实践

binlog 简介 MySQL 的二进制日志是通过二进制文件形式记录的&#xff0c;可以通过以下方式设置其格式&#xff1a; 打开 MySQL 配置文件&#xff08;my.cnf&#xff09;&#xff0c;找到 [mysqld] 段&#xff0c;添加以下语句以开启二进制日志功能&#xff1a; log-bin /pat…

Git 工作原理和分支管理

Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理 Git工作原理 Git 会把仓库中的每次提交串成一条时间线&#xff0c;这条时间线就是一个分支。在 Git 里&#xff0c;每个仓库都会有一个主分支&#xff0c;即master分支。HEAD…

2023面试自动化测试面试题【含答案】,建议收藏

1、你做了几年的测试、自动化测试&#xff0c;说一下 selenium 的原理是什么&#xff1f; 我做了五年的测试&#xff0c;1年的自动化测试&#xff1b; selenium 它是用 http 协议来连接 webdriver &#xff0c;客户端可以使用 Java 或者 Python 各种编程语言来实现&#xff1b…

路径规划算法:基于蜻蜓算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于蜻蜓优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蜻蜓优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法蜻蜓…

MyBatis项目的创建和使用

什么是MyBatis? MyBaits是一个更简单的完成程序与数据库交互的工具。MyBatis将复杂的JDBC进行了封装&#xff0c;让使用者可以通过简单的xml和注解对数据库进行记录。 MyBatis的执行流程 创建MyBatis项目 添加依赖 还是SpringBoot的创建流程&#xff1a;SpringBoot项目创建…

SpringMvc笔记-教程-快速回忆

title: SpringMvc笔记 date: 2023-05-14 09:50:02 categories: 后端Java tags:JavaSpring 三层架构&#xff1a; web层主要由servlet来处理&#xff0c;负责页面请求和数据的收集以及响应结果给前端service层主要负责业务逻辑的处理dao层主要负责数据的增删改查操作 MVC设计…

点餐小程序实战教程03-店铺信息展示

目录 1 创建模型应用2 创建用户3 创建自定义应用4 创建页面5 页面搭建6 定义变量7 数据绑定8 绑定事件9 预览发布总结我们上一篇设计了店铺信息数据源,并且录入了测试数据,本篇我们就介绍一下店铺信息展示功能的开发。 1 创建模型应用 我们在上篇讲解的是通过数据源的管理数…