PointPillars算法解析

news2024/9/24 7:20:45

说明

本篇主要对基于LIDAR的3D目标检测算法PointPillars算法论文进行解析。
论文地址:https://arxiv.org/pdf/1812.05784.pdf
代码地址:https://github.com/open-mmlab/OpenPCDet
参考链接1:https://zhuanlan.zhihu.com/p/357626425
参考链接2:https://blog.csdn.net/Yong_Qi2015/article/details/119834000
参考链接3:https://blog.csdn.net/weixin_45080292/article/details/130217320

1.算法简介

核心思想: PointPillars算法从俯视图的角度将点云划分为一个个的柱状体(Pillar),等同于丢掉了高度信息,只保留水平方向上的xy坐标,每个柱状体(Pillar)等同于2D图像中的一个像素坐标。在得到伪图像之后使用常见2D网络进行特征的提取和学习,最后使用SSD检测头进行Bbox的回归。

PointPillar算法的网络框架如下图所示,算法的输入是原始点云数据,输出是3D目标检测框。整个算法包括以下几个模块:

  • Voxel Feature Encoding (VFE)模块
  • MAP_TO_BEV模块
  • BACKBONE_2D模块
  • 检测头(DENSE_HEAD)模块
  • POST_PROCESSING模块

在这里插入图片描述

2.网络框架和算法流程

2.1 VFE模块

参考链接:https://blog.csdn.net/Jack_Man_N/article/details/134613118

PillarVFE模块是OpenPCDet(Open Point Cloud Detection)中的一个特征编码模块,用于将点云数据转换为结构化的特征表示。它是PointPillars算法中的关键组件。

PointPillars是一种基于单张俯视图的点云目标检测算法,它将点云数据投影到二维的俯视图平面上,并使用PillarVFE模块对每个投影区域(称为pillar)进行特征编码。PillarVFE模块的主要功能包括:

  • 构建pillar:将点云数据投影到二维的俯视图平面,并将投影区域划分为多个小的正方形区域,称为pillar。每个pillar代表一个局部区域。
  • 特征编码:对每个pillar中的点云数据进行特征编码。PillarVFE模块使用一个卷积神经网络(通常是多层的3D卷积操作)对每个pillar提取pillar内部的点云的特征表示。这些特征表示捕捉了点云数据的局部结构信息。
  • 特征聚合:PillarVFE模块还执行特征聚合操作,将每个pillar的特征表示合并为一个全局的特征表示。这样可以利用全局特征进行目标检测和定位。

通过PillarVFE模块的特征编码和特征聚合操作,PointPillars算法能够有效地处理大规模点云数据并提取有用的特征表示,从而实现高效的点云目标检测。

2.1.1 构建pillar

通过激光雷达获取的一般是一个N*4的点云向量,N指云点的数量,4指点云有xyzi4个维度的信息。

第一步需要对点云进行张量化处理,将原始点云数据从俯视图的角度,根据点云的XY坐标信息将其划分为一个个垂直的网格。每个网格可以理解为一个长为n宽为n,高为h的体素。
在这里插入图片描述
图像参考链接:https://blog.csdn.net/ChuiGeDaQiQiu/article/details/118675912

每个点云用一个9维的向量表示: ( x , y , z , r , x c , y c , z c , x p , y p ) (x,y,z,r,x_c,y_c,z_c,x_p,y_p) (x,y,z,r,xc,yc,zc,xp,yp)。其中x,y,z指原始的点云坐标,r表示反射率信息,x_c,y_c,z_c为该点云所处Pillar中所有点的几何中心,x_p,y_p分别为x-x_cy-y_c反应了点与几何中心的相对位置。

假定每个点云样本中有P个非空pillar,每个pillar有N个点,则该帧点云可以用张量 ( D , P , N ) (D, P, N) (D,P,N)进行表示,即图中的Stacked Pillars。其中,D指每个pillars的维度即D=9;P指pillars的数量;N指每个pillars中云点的数量,如果pillar中的云点数大于N则对其进行采样得到N个点,如果云点数量小于N则用0补齐。

pillars转换的代码在pcdet/datasets/processor/data_processor.py

2.1.2 pillar内部点云特征提取

在得到pillars表示的点云张量后,使用简化版本的PointNet对张量化的点云数据进行处理和VFE特征提取,即对每个点都运用线性层+BatchNormalization层+ReLU层学习9维的云点特征,生成(C,P,N)的张量,再对于通道上使用最大池化操作,输出一个(C,P)的张量。

特征提取可以理解为对点云的维度进行处理,原来的点云维度为 ( D , P , N ) (D,P,N) (D,P,N),处理后的维度为 ( C , P , N ) (C,P,N) (C,P,N)。按照Pillar所在维度进行Max Pooling操作,即获得了(C,P)维度的特征图。这一步应指其特征聚合操作。

2.1.3 MAP_TO_BEV模块

(C,P)维度的特征图表示通道数为C,长度为P,维度为1的张量,在经过简化版的pointnet网络提取出每个pillar的特征信息后,就需要将每个的pillar数据重新放回原来的坐标中,也就是二维坐标,组成 伪图像 数据,将其转换为HxW的2维张量,即伪图像信息,对应算法结构图中的Pseudo Image,代码中的PointPillarScatter模块。

2.2 BACKBONE_2D模块

在初步得到“伪图像”对应的特征之后,需要进一步提取图片特征。
在这里插入图片描述PointPillars使用类似VGG的结构来构建二维CNN主干。通过堆叠几个卷积层,主干将在每个阶段产生具有不同解决方案的特征图。来自几个阶段的特征图将被融合在一起,形成最终的特征表示。在特征融合过程中,去卷积层被引入,对具有较小分辨率的高水平特征图进行上采样。在去卷积之后,所有具有相同分辨率的输出特征图可以连接在一起,形成一个综合张量,用于最终的预测。

之所以选择这样架构,是因为不同分辨率的特征图负责不同大小物体的检测。比如分辨率大的特征图往往感受野较小,适合捕捉小物体(在KITTI中就是行人)。

2.3 检测头模块

在本文中,我们使用单击检测器(SSD)[18]设置来执行3D目标检测。与SSD类似,我们使用2D联合交叉(IoU)[4]将先验框与真值相匹配。边界框高度和标高未用于匹配;而不是给定2D匹配,高度和高程成为额外的回归目标。

类似于SSD的检测头被用于PiontPillars中,在OpenPCDet的实现中,直接使用一个网络对车、人、自行车三个类别进行训练,而没有像原论文中对车和人使用不同的网络结构。因此,在检测头中,一共有三个类别的先验框,每个先验框都有两个方向,分别是BEV视角下的0度和90度。每个类别的先验框只包含一种尺度信息。

车 [3.9, 1.6, 1.56]
人[0.8, 0.6, 1.73]
自行车[1.76, 0.6, 1.73](单位:米)

在进行anchor和GT的匹配过程中,PointPillars采用了2D IOU匹配方式,直接从BEV视角的特征图中进行匹配。这种匹配方式不需要考虑物体的高度信息,主要是因为在Kitti数据集中,所有物体都在同一个平面内,不存在一个物体在另一个物体上面的情况,并且所有类别物体的高度差异不大。因此,直接使用SmoothL1回归就可以得到较好的匹配结果。

每个anchor都需要预测七个参数:中心坐标的 (x, y, z) 以及长宽高 (w, l, h) 以及旋转角度 θ。此外,为了解决两个完全相反的box的角度预测问题,PointPillars的检测头还添加了一个基于softmax的方向分类来预测box的两个朝向信息。对于车、人和自行车这三个类别,每个anchor的正负样本匹配阈值不同,具体而言:

  • 对于车辆,匹配IOU阈值大于等于0.65的anchor被视为正样本,小于0.45的被视为负样本,阈值在两者之间的样本不会被计算损失。
  • 对于行人和自行车,匹配IOU阈值大于等于0.5的anchor被视为正样本,小于0.35的被视为负样本,阈值在两者之间的样本不会被计算损失。

3.损失函数

作者采用了SECOND中类似的损失函数,每个3D BBox用一个7维的向量表示,分别为 ( x , y , z , w , h , l , θ ) (x,y,z,w,h,l,\theta) (x,y,z,w,h,l,θ),其中 ( x , y , z ) (x,y,z) (x,y,z)为中心坐标,w,h,l为尺寸数据, θ \theta θ为方向角,检测框回归任务中要学习的参数为这7个变量的偏移量

真值和锚之间的定位回归残差定义如下:
在这里插入图片描述作者采用了Smooth L1损失函数进行训练:
在这里插入图片描述
和SECOND中相同,为了避免方向判别错误,作者引入了个Softmax损失学习物体的方向。该损失记做 L d i r L_{dir} Ldir.

有关分类损失,作者仍然采用了Focal Loss,定义如下:
在这里插入图片描述
整体的损失函数如下:
在这里插入图片描述

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

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

相关文章

探索数据结构:红黑树的分析与实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 红黑树的介绍 1.1. 红黑树的引入 我们前面学习了AVL树,…

re正则模块

正则是一个十分重要且基础的模块 学习正则模块就要了解正则的一些基本字符 正则的基本方法有很多 但是大体上分为三种匹配 分割 替换 匹配有match search fullmatch findall finditer 注意finditer得到结果是一个可迭代类型需要遍历才能得到结果 使用group方法就可以查看返回…

【安全】XSS

文章目录 xss1.反射型XSS Payload的一些情况010203040506070809101112131415 HTML文档处理过程0x01 HTML解析0x02 URL解析0x03 JavaScript 解析 2.DOM型Ma Spaghet!JefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafia 3.存储型 xss 用户的输入没有进行很好的过滤&…

对比新旧两个数据库表之间的差异

ServerDatabaseVersionUpdateHelper 一个对比不同数据库之间表数据差异的开源软件,欢迎大家到github上点赞 应用下载地址 功能介绍 对比表结构差异和表数据之间的差异 并根据查询生成新的更新sql语句 使用 1. 填写新旧数据库配置 server数据库地址;port数据库端…

报错:xx in xx cannot be applied to ‘()‘ @Data注解的无参构造方法不生效(原因及解决办法)

问题描述 创建User类时,添加了Data注解和User的构造方法 import lombok.Data;Data public class User {private Long id;private String name;private Integer age;private String email;public User(Long id, String name, Integer age, String email) {this.id …

机器学习--常见算法总结

有监督学习算法 1. 线性回归算法 概念:线性回归是一种统计方法,用于预测一个变量(因变量)与一个或多个自变量(特征变量)之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…

vertical-align: bottom;

问: 这个弹框中, "张三" 文字在某些ios手机中会上升到顶部, 图片也会移动, 西方二维码也会向下移动, 请问什么原因? 回答: 我们在 "张三" 这个元素dt上, 加上了vertical-align: bottom;这个属性, 让这个在顶部的元素在最下面, 就解决了样式错乱的问题.

SCC-F 23212-0-110310控制器abb面价

SCC-F 23212-0-110310控制器面价 SCC-F 23212-0-110310控制器面价 SCC-F 23212-0-110310控制器面价 SCC-F 23212-0-110310控制模块接线图 SCC-F 23212-0-110310控制模块电路图 SCC-F 23212-0-110310控制模块线路图 SCC-F 23212-0-110310伺服电机控制器是数控系统及其他相…

【C语言】最详细的单链表(两遍包会!)

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 🎁代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、单链表的概念 1. 单链表的特点 2. 单链表的基本…

Aqua使用记录

Java Kotlin Groovy Python 建议使用Poetry环境 Poetry executable:/Users/wan/Library/Application Support/pypoetry/venv/bin/poetry 安装依赖包 poetry add package 或者在.toml文件添加依赖包信息 Selenium with Python Selenium 生成html测试报告&#x…

Linux驱动——杂项驱动GPIO子系统

一:内核层框架 在介绍linux驱动之前先介绍一下系统。 系统分为两层: 1.系统层 2.内核层 对于内核层就要说一下其中的内核层运行的框架了 代码如下: //头文件 #include "linux/kernel.h" #include "linux/module.h" …

git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

1、创建仓库 2、克隆仓库到本地(首次拉取需要输入用户名和密码,用户名用邮箱,密码用登录gitee的密码,后面配置密钥后可以直接clone) 在命令行输出两行指令配置git才能克隆: username:gitee账号…

2D Inpainting 与NeRF 3D重建的多视角一致性问题

一 问题: NeRF依赖于输入图像的一致性。NeRF(Neural Radiance Fields)在生成三维场景时,依赖于从多个视角拍摄的输入图像之间的一致性来准确地推断场景的三维结构和颜色信息。 具体来说: 多视角一致性: Ne…

宝塔面板一键部署Inis博客网站结合内网穿透为本地站点配置公网地址

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

Day42 | 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

语言 Java 739. 每日温度 每日温度 题目 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该…

计算机网络基础详解:从网络概述到安全保障的全面指南

目录 网络基础详细概述 1. 网络概述 1.1数据通信 1.2资源共享 1.3分布式处理 1.4负载均衡 2. 网络分类 2.1按覆盖范围: 2.1.1局域网 (LAN): 2.1.2城域网 (MAN): 2.1.3广域网 (WAN): 2.2按拓扑结构: 2.2.1…

IEEE802网络协议和标准

IEEE802网络协议和标准 802委员会IEEE 802介绍现有标准 IEEE 802.3介绍物理媒介类型MAC子层与LLC子层主要内容通讯标准POE供电标准802.3af、802.3at、802.3btIEEE802.3af的工作过程:IEEE802.3af主要供电参数:IEEE802.3af的分级参数:为什么会有…

C++的序列容器——数组

前言: 这篇文章我们就开始新的章节,我们之前说的C/C的缺陷那部分内容就结束了。在开始新的章之前我希望大家可以先对着题目思考一下,C的容器是什么?有什么作用?下面让我们开始新的内容: 目录 前言&#x…

从数据类型到变量、作用域、执行上下文

从数据类型到变量、作用域、执行上下文 JS数据类型 分类 1》基本类型:字符串String、数字Number、布尔值Boolean、undefined、null、symbol、bigint 2》引用类型:Object (Object、Array、Function、Date、RegExp、Error、Arguments) Symbol是ES6新出…

S7协议转HTTP协议

如下来源成都纵横智控-https://www.iotrouter.com/ 需求概述 本章要实现一个流程:EG8200采集西门子S7-200Smart的数据,并组装成JSON格式通过HTTP上报应用平台。 要采集的PLC点位表如下: PLC S7-200 Smart IP 192.168.0.34/102 点表(DB1…