论文阅读笔记 | 三维目标检测——VoxelNet算法

news/2024/5/20 7:48:53/文章来源:https://blog.csdn.net/weixin_44751294/article/details/128044746

如有错误,恳请指出。


文章目录

  • 1.背景
  • 2. 网络结构
    • 2.1 体素特征表示
    • 2.2 卷积特征提取
    • 2.3 RPN网络
  • 3. 实验结果

paper:《VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection》

1.背景

以往的3d检测器都难免利用了手工设计特征(hand-crafted),不够智能不能实现end-to-end地自动提取特征,而如果利用全部点云输入,处理点云可能搞到100k个点的数据可能会带来极大的计算量(其实这里是可以对输入进行采样的,不过对于一个大场景来说数据点确实有点大,这时候对点云量化确实是一个比较好的选择,具体需要结合特定的场景和数据量)。为此,VoxelNet提出一个端对端的3d检测器,对点云数据进行量化,避免复杂场景带来的高计算。

具体来说,VoxelNet将点云划分为等间距的3D体素,通过堆叠的VFE层对每个体素进行编码,然后3D卷积进一步聚合局部体素特征,将点云转换为高维体积表示。最后在RPN结构利用高维体积的特征表示来产生检测结果。

此外,在related work中,介绍了对中体素(voexl)的编码方法。比如,每个非空体素Voexl导出6个统计量进行特征编码;融合多个局部统计对体素进行编码;计算体素网格中的截断带距离(truncated signed distance)进行编码;或者对3d体素网格进行二进制(binary encoding)编码等等。

ps:这里稍微介绍一下什么是Truncated Signed Distance,简写为TSDF(Truncated Signed Distance Function)
在这里插入图片描述

详细参考资料见:三维建模中基于体素的TSDF模型是什么


2. 网络结构

VoxelNet是一个anchor-based、one-stage的网络,其整体的网络结构大致可以分为体素特征表示,卷积特征提取以及RPN提取候选框三个部分。结构图如下所示。
在这里插入图片描述

2.1 体素特征表示

这里以对kitti数据集中的车辆检测为例进行说明。首先这里对点云场景进行区域划分,只考虑分别沿着Z、Y、X轴在[−3,1] × [−40,40] × [0,70.4]米范围内的点云。设置点云体素的体积为0.4x0.2x0.2,那么即可获得10x400x352数量的体素集合,在每个体素中设置T=35为最大考虑点。也就是分配在每个体素中的点为一组,在当前体素中采样35个点来表征当前的体素。由于T是最大采样点,所以每个体素中的点数量是不平衡的,此时需要对这些数量不平衡的体素表征点做处理来编码成voxel feature。

对于每个体素中的点,具有xyzr是个特征(位置特征xyz+反射强度r),计算出体素的质心位置为vx,vy,vz,将每个点位置与质心位置相减,提取到相对坐标位置重新添加到每个点的特征上。那么,现在体素中的每个点具有7个特征:[xi, yi, zi, ri, xi −vx, yi −vy, zi −vz]。随后,将每个体素通过Voxel feature encodeing layer(VFE)结构处理,具体的操作如下所示。
在这里插入图片描述

这里原始的点特征作为point-wise input,逐点进行全连接层编码操作(这里的FCN包含MLP+BN+ReLU三个部分),获得point-wise feature,将其进行max pooling操作之后再拼接回去每一个点特征上。那么,现在每一个点的特征包括了原始特征进行MLP操作后的feature,以及进行max pooling聚合了局部信息的feature两个部分。当前层的VFE的输出作为下一层VFE的输入,point-wise feature的维度会不断增加,因为每一个VFE层都有两部分特征进行拼接。在具体实现上,这里会有2层VFE,参数为:VFE-1(7, 32)、VFE-2(32, 128),对于最后每一个点的特征都编码成128维度。对于最后一层VFE的输出,再使用FCN层编码处理,随后进行max pooling聚合当前所有点的特征,作为最后的voxel-wise feature。

2.2 卷积特征提取

经过上个步骤的处理,现在对每一个体素都进行了编码,获得其voxel-wise feature。那么,按刚开始所说的对车辆的采样方式具有10x400x352个体素,现在的特征维度即为128x10x400x352。现在利用3d卷积进行特征提取,扩大其感受野进行聚合体素特征。对车辆检测具体的3d卷积设置为:Conv3D(128, 64, 3, (2,1,1), (1,1,1)),、Conv3D(64, 64, 3, (1,1,1), (0,1,1))、Conv3D(64, 64, 3, (2,1,1), (1,1,1))。每一层3d卷积都包含BN层和ReLU层。那么,128 x 10 x 400 x 352的特征输入现在经过3层卷积处理后变成了64 × 2 × 400 × 352的特征输出。

2.3 RPN网络

RPN网络的具体参数与结构如下所示(图以及画得很清晰,这里就不再作过多的解释)。
在这里插入图片描述

可以看见,最后的feature map回有两个head,一个用来分类,一个用来回归。这里需要解释下为什么score map的channels是2,而regression map的channels是14。对于feature map上的每个特征点,VoxelNet只对车辆检测设计了一种先验框(prior box):la = 0.8, wa = 0.6, ha = 1.73 meters centered at za = −0.6 meters,同时对反向设置了0°和90°两个方向。也就是每个特征点上配置2中尺度相同但是方向垂直的两个先验框,所以score map的channels是2。而VoxelNet用(xa, ya, za, la, wa, ha, θa)一组7个的参数来表示3d候选框,所以一个piror预测7组参数,2x7=14,所以regression map的channels是14。

此外,VoxelNet的7个回归参数采用的是直接回归不分bin的方法,来直接回归ground truth的参数。非常的简洁明了,但是由于过于简单感觉后续可以改进其损失函数来提升精度。损失函数如下所示。对于车辆检测来说,在俯视图上最高置信度以及iou>0.6的anchor设置为正样本,iou<0.45的anchor设置为负样本,剩余阈值中的直接排除。
在这里插入图片描述
在这里插入图片描述

在训练过程中,VoexlNet还使用了一些数据增强的方法。
(1)随机平移与旋转,并且平移之后不同目标在俯视图上不存在重叠,即不发生碰撞。
(2)随机旋转,对点云坐标和真实检测框8个顶点坐标进行随机旋转。
(3)随机缩放,对点云坐标和真实检测框8个顶点坐标进行随机缩放。

对于kitti的行人和直行车配置等其他细节,可以查看论文。


3. 实验结果

验证集上的结果如下所示:
在这里插入图片描述

在网络的具体处理中,由于点云的稀疏性导致90%的体素中完全没有点数据,为了使用GPUs来进行并行加速训练,VoxelNet设置了一个Efficient Implementation操作如下所示。
在这里插入图片描述

其中K是非空体素的最大数目,T是每个体素的最大点数,并且7是每个点的输入编码维度。在构建体素输入缓冲区之后,这些操作可在GPU上并行计算,实现稀疏体素结构重组为密集体素网格。


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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何根据不同需求给Word文档设置保护?

Word文档可以设置不同的保护模式&#xff0c;我们可以根据不同需求选择合适的方法&#xff0c;下面介绍一下常用的3种方法。 方法一&#xff1a; 如果不想Word文档被随意打开&#xff0c;我们可以设置打开密码&#xff0c;只有输入正确的密码才能打开文件。 首先&#xff0c…

python面向对象(上)

python面向对象上命名规则对象的创建创建类对象创建实例对象修改增加类属性构造方法构造实例方法不带变量带变量构造方法小例子构造类方法构造静态方法运算符的重载比较运算符重载字符串重载索引或切片重载索引或切片重载检查成员重载重载小结持续更新中~~~~~~~~先上个例子&…

古人的名与字、号、讳、谥有什么区别

古人复杂的名字 这个世界上想来是不存在没有名字的人&#xff0c;即便真的有人没名字&#xff0c;也会被外人赠予姓名&#xff0c;比如说一些古人典籍里的“无名氏”&#xff0c;就是专门用来形容那些没有名字也不清楚根脚的人&#xff0c;即便是现如今一些作品不知道作者是谁…

国外服务器采取数据备份和灾难恢复的重要性

在国外服务器的使用中&#xff0c;数据的安全性和完整性是任何组织都不能忽视的问题。丢失数据可能会对业务造成毁灭性的影响&#xff0c;因此必须有一个完善的数据备份和灾难恢复计划。 什么是备份? 备份将数据复制到辅助形式&#xff0c;如存档文件&#xff0c;在灾难发生时…

C++:函数指针进阶:看完还不用std::function来捶我

1&#xff1a;函数指针的背景 我们先简单聊一下函数指针的背景&#xff0c;具体使用请参考我的这篇博客 C &#xff1a;函数&#xff1a; 函数指针_hongwen_yul的博客-CSDN博客 假设现在有这样一段代码&#xff1a;C/C中可以使用指针指向一段代码&#xff0c;这个指针就叫函…

【外卖项目实战开发一】

文章目录1、软件开发整体介绍2、外卖项目介绍3、环境搭建数据库环境搭建创建数据库执行SQL脚本数据表maven项目搭建添加依赖:application.yml配置application启动类4、后台登录功能开发需求分析代码开发5、后台退出功能开发1、软件开发整体介绍 软件开发流程 角色分工 软件…

Quasar搭建教程初体验

文章目录一、Quasar框架介绍二、搭建一个简单的Quasar程序1、Quasar CLI安装2、创建Quasar应用程序3、运行Quasar三、使用Quasar开发SSR四、使用Quasar开发桌面应用(Electron)1、添加Quasar Electron模式2、运行开发五、使用Quasar移动应用(Capacitor)1、下载安装AndroidStudio…

Scrapy基本概念——Item Pipeline

一、Item Pipeline介绍 蜘蛛抓取的每一个Item都会被发送到Item Pipeline。根据ITEM_PIPELINES的优先级设置&#xff0c;不同的Item Pipeline依次处理每一个Item&#xff0c;最后可删除该Item不做处理&#xff0c;也可将该Item发送到下一个Item Pipeline。Item Pipeline的主要用…

【Shell 脚本速成】05、Shell 运算详解

目录 一、赋值运算 二、算术运算[四则运算] 2.1 运算符与命令 2.2 整形运算 expr 命令&#xff1a;只能做整数运算&#xff0c;格式比较古板&#xff0c;运算符号两边注意空格 let命令&#xff1a;只能做整数运算&#xff0c;且运算元素必须是变量&#xff0c;无法直接对…

11.14-11.21

1.线性蒙皮 1.1 线性蒙皮定义 线性蒙皮&#xff1a;是由一系列骨骼驱动的。每个顶点会根据顶点权重图和相应的骨骼关联。根据骨骼在当前位置相对于静止位置的变换矩阵以及此顶点相对于该骨骼的权重&#xff0c;我们可以计算出该顶点在该骨骼影响下的位置。 假设Wij是第j个骨…

OpenGL原理与实践——核心模式(五):颜色、基础光照、Phong模型、材质与光

目录 颜色相关理论 什么是颜色 如何计算颜色&#xff1f; 简单实现 Phong光照模型——局部光照模型 环境光 ​编辑 漫反射 镜面反射 材质与光 材质与纹理的关系 材质在shader的体现 材质属性与光属性 光在shader的体现 整体源码实现及渲染结果 关键代码 shade…

【Kubernetes | Pod 系列】Pod的 YAML 清单文件详解

目录3. Pod的 YAML 清单文件3.1 获取资源对象 YAML3.2 解析 YAML 清单文件&#xff08;1&#xff09;apiVersion查看 Kubernetes API 中全部的 API 组&#xff08;2&#xff09;kind查看 Kubernetes 中全部的对象资源类型&#xff08;3&#xff09;metadata&#xff08;4&#…

cron表达式,结构、字段说明、特殊字符说明、常用表达式

1.cron表达式的结构 Cron表达式是一个字符串&#xff0c;结构非常简单。Cron表达式从左到右分为6或7个字段&#xff0c;每个字段代表一个含义&#xff0c;用空格隔开。如下图所示&#xff1a; 2.cron表达式中各个字段的说明和规则 Cron一共有7位&#xff0c;最后一位是年份&…

C语言既然可以自动为变量分配内存,为什么还要用动态分配内存呢?

一、前言 不知道大家在学习C语言动态分配内存的时候有没有过这样的疑问&#xff0c;既然系统可以自动帮我们分配内存&#xff0c;为什么还需要我们程序员自己去分配内存呢&#xff1f; 如果想要弄清楚这些问题&#xff0c;我们首先就要了解静态内存和动态内存有什么区别&…

Pycharm开发环境下创建python运行的虚拟环境(自动执行安装依赖包)

问题&#xff1a;基于Django开发的后台程序涉及到很多依赖的开发包&#xff0c;将该项目迁移到其它电脑环境下运行需要搭建环境&#xff0c;由于项目中有requirement.txt&#xff0c;该文件内包含了运行该项目所需的依赖&#xff1b;最简便的方式是执行命令自动安装requirement…

【App自动化测试】(九)移动端复杂测试环境模拟——来电、短信、网络切换

目录1. 发送短信2. GSM电话3. 设置模拟信号强弱4. 设置网速5. 设置网络连接类型前言&#xff1a; 本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ &#x1f618; 当我们使用模拟器来…

CUDA——向量化内存

许多 CUDA 内核受带宽限制&#xff0c;新硬件中触发器与带宽的比率增加导致更多带宽受限内核。 这使得采取措施缓解代码中的带宽瓶颈变得非常重要。 在本文中&#xff0c;我将向您展示如何在 CUDA C/C 中使用矢量加载和存储来帮助提高带宽利用率&#xff0c;同时减少执行指令的…

kafka消息的序列化与反序列化

一、前言 在使用kafka发送消息时&#xff0c;producer端需要序列化&#xff0c;在大多数场景中&#xff0c; 需要传输的是与业务规则相关的复杂类型&#xff0c; 这就需要自定义数据结构。 Avro是一种序列化框架&#xff0c; 使用JSON来定义schema&#xff0c; sh cema由原始类…

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]

PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八] 原项目链接&#xff1a;fork一下即可&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType1 相关项目参考&#xff1a;&#xff08;其余图神经网络相关项目见主页&#xff09; …

留学生怎么正确应对Paper写作?

留学生很多都是对Paper比较抗拒的&#xff0c;因为Paper写作的频率是很高的&#xff0c;平时的课程也是比较紧凑的。相信对于初到英国留学的小伙伴们而言Paper将很长时间都是大家的痛。多少留学生被Paper折磨&#xff0c;其实英文Paper写不好的原因在于&#xff0c;对于中国留学…