首页 > 其他分享 >目标检测 | Point Cloud RoI Pooling

目标检测 | Point Cloud RoI Pooling

时间:2024-01-11 15:25:07浏览次数:26  
标签:prime RoI Point times Pooling 池化 Cloud

目录

目标检测 | Point Cloud RoI Pooling

Point Cloud RoI Pooling 概述

Points Cloud RoI Pooling(点云RoI池化)是3d点云目标检测中一个相对重要的机制,RoI Pooling Layer是two-stage detector(二阶段检测网络)中最为核心的模块之一,使其与one-stage detector(一阶段检测网络)区别。据调研,其最早出自于Shaoshuai Shi等人的文章PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud,在文章中被称为Point cloud region pooling(点云区域池化)

Point Cloud RoI Pooling机制顾名思义,是为了处理点云而在RoI Pooling基础上进行改进得到的,与RoI Pooling的目的和原理基本一致。

Pooling

首先,我们先从深度学习中,最基础且最熟悉不过的Pooling说起。Pooling最早是使用在LeNet,其用于减少特征图的尺寸并提取最显著的特征,从而降低模型复杂性并减少计算量,有助于防止过拟合,相对于是一个对特征subsampling的过程。

一般常用的有Max Pooling和Average Pooling,在某些做global descriptor的网络中还会使用Global Pooling

  • Max Pooling(最大池化):对每个池化窗口内的特征取最大值作为该区域的代表特征。
  • Average Pooling(平均池化):对每个池化窗口内的特征取平均值作为该区域的代表特征。
  • Global Pooling(全局池化):将整个特征图进行池化,通常是全局平均池化或全局最大池化,将整个特征图降为一个单一的值或向量。

就以Max Pooling为例,其实现是通过滑动固定大小的\(N\times N\)窗口(图中是\(2\times 2\))在特征图上移动,对每个窗口内的特征进行汇总或提取,产生一个新的特征图。这个过程可以减小特征图的尺寸,保留最重要的特征信息,并减少参数数量和计算量。

此外如果是Average Pooling,还可以看作是卷积核为\(N\times N\)的全\(1\)矩阵,\(\text{stride}=N\)的卷积操作。

RoI Pooling

RoI Pooling最早出现Ross Girshick等人的文章Fast R-CNN。这篇文章提出了一种称为Fast R-CNN的目标检测方法,其中RoI Pooling被用于从卷积特征图中提取固定大小的特征表示,以用于后续的分类和边界框回归任务。

RoI Pooling机制的引入,使得网络可以将不同尺寸的RoI映射到固定大小的特征图上,这样就可以通过一个固定维度的全连接层处理所有的RoI了。

我们首先回顾一下two-stage detector的结构,如下图所示,其一共可以被分为三个部分:

  • Backbone Network (骨干网络)

    Backbone Network负责从原始输入图像中提取特征。通常是一系列的卷积层、池化层和其他操作的堆叠,用于捕获图像的低级到高级特征。

    其输出一般为比原始图像要小且通道数更高的\(B\times C^\prime\times W^\prime\times H^\prime\)矩阵

  • Region Proposal Network(RPN,区域建议网络)

    RPN 是用于提出RoI(Region of Interest,感兴趣区域)的神经网络组件。它在骨干网络的基础上,通过滑动窗口或锚框技术,生成可能包含物体的RoI。

    其输出一般为\(B\times N \times 4\)的矩阵,每一个RoI由\((x,y,w,h)\)的四维向量所表示,\((x,y)\)表示该RoI的中心点坐标,\((w,h)\)表示该RoI的长与宽,共有\(N\)个。

  • Classification Head(分类头)与Regression Head(回归头)

    Classification Head用于对候选框内的目标物体进行分类,而Regression Head用于对候选框进行细化。Classification Head和Regression Head一般都是由固定大小的全连接层组成,通过RoI提取特征之后输入其中得到最终的目标检测结果。

如果我们关注RPN与Classification Head之间的连接,我们就会发现一个问题:得到的每一张RoI区域形状不一(长与宽不是固定的),那么其中包含的feature也将不是固定维度的,无法输入固定大小的Classification Head进行处理。

为此,我们需要通过一种机制将所有不同的\(W^\prime\times H^\prime\)的特征图处理为固定长度为\(M\)的特征,这就是RoI Pooling机制在发挥的作用了。

RoI Pooling任意的大小为\(C\times W^\prime \times H^\prime\)的RoI特征映射为固定大小为\(M=C\times W^{\prime\prime} \times H^{\prime\prime}\)的RoI特征,其中RoI Pooling可以被分为三步。

  • 对齐RoI区域
  • 划分RoI区域
  • 池化RoI区域

下图简单地描述了RoI Max-pooling中的三个步骤

此外,还有一种称为RoI Align的机制是在RoI Pooling的基础上通过爽线性插值进行池化,因为与本随笔主题关系不大就不在此赘述了。

Point Cloud RoI Pooling

Point Cloud RoI Pooling顾名思义,是点云3d目标检测版本的RoI Pooling,据调研,最早见于Shaoshuai Shi等人的文章PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud,在文章中被称为Point cloud region pooling(点云区域池化)

点云的RoI Pooling相比于RGB图像的RoI Pooling发生了如下的改变:

  • RoI和目标框由2d变为3d,这就意味着其参数由四维的\((x,y,w,h)\)上升为七维的\((x,y,z,l,w,h,\theta)\),其中\(\theta\)是目标框的yaw(偏航角)。虽然是3d目标检测,但是一般来说很少会有超过两个自由度的任务,所以使用一个七个参数就足以表示了。
  • RGB图像是有序的点阵图,可以直接通过坐标查询,而点云的结构化程度低,无法直接通过坐标查询。其中点云是通过大小为\(B\times N\times(3+C)\)的矩阵进行表示,\(N\)是点云数量,\(3+C\)表示每个点云的特征(\(x,y,z\)坐标以及提取特征)。

同样的,给定采样数量\(S^\prime\),Point Cloud RoI Pooling也可以被划分为以下几个步骤:

  • pts assign,计算出每个点所属的RoI区域,输出大小为\(B\times M \times N\)的布尔矩阵pts assign,如果第\(B\)个batch中第\(M\)个点处于第\(N\)个RoI,那么\([B][M][N]=\textbf{true}\),反之\([B][M][N]=\textbf{false}\)。
  • pts pool,通过第一步得到的布尔矩阵pts assign,计算出每个RoI区域中所拥有的点,并通过随机采样的方式将点的数量由\(S\)对齐为固定大小的\(S^\prime\),输出大小为\(B\times M \times S^\prime\)的index矩阵pts pool,其中每个元素都是点在点云中的index。
  • feature forward,,将从第二步得到的大小为\(B\times M \times S^\prime\)的index矩阵pts pool映射成大小为\(B\times M \times S^\prime \times (3+C)\)的pooled feature(池化特征)

最后我们所得到固定大小为\(B\times M \times S^\prime \times (3+C)\)的池化特征,输入到分类头中,其输入大小为\(I=S^\prime \times (3+C)\),这样就完成了Point cloud pooling的操作。

Point Cloud RoI Pooling 实现细节

(未完待续)

标签:prime,RoI,Point,times,Pooling,池化,Cloud
From: https://www.cnblogs.com/uzuki/p/17958640

相关文章

  • Android架构测试 套小记
    Android架构测试主要是为了确保Android应用程序在不同设备和系统版本上的兼容性、性能和稳定性。这需要对应用程序的各个组件进行测试,包括活动、服务、广播接收器、内容提供程序等。以下是进行Android架构测试时可以采取的一些步骤:单元测试:对应用程序的各个组件进行测试,确保它......
  • RP4VM 如何更改 RecoverPoint 产品系列系统中的默认 root 密码
    最佳做法是将默认系统密码更改为强且唯一的值。与其他Linux应用装置相似,root是RPA/vRPA中权限最高的用户。Root级别用户有权访问RPA/vRPA上的所有命令和文件,并且只能将其分配给组织中的受信任用户。默认情况下,在RecoverPoint中禁用root帐户的远程登录,DellEMC建议根据......
  • nuxt构建失败:if (codePoint 》= 0x3_00 && codePoint (= 0x3_6F) { SyntaxError: In
     错误消息指的是在Node.js中使用了数字分隔符,12.8.1之前的Node版本不支持这种做法。0x3_00此处使用数字分隔符_。如果没有它,符号看起来就像0x300。有关支持此功能的Node.js版本的列表,请参阅https://node.green/#ES2021-features--numeric-separators。需要将node:10-alpin......
  • 【Android】深入Binder拦截
    ☞Github☜☞Gitee☜说明Binder作为Android系统跨进程通信的核心机制。网上也有很多深度讲解该机制的文章,如:Android跨进程通信详解Binder机制原理Android系统核心机制Binder【系列】这些文章和系统源码可以很好帮助我们理解Binder的实现原理和设计理念,为拦截做准备......
  • MySQL Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoin
    错误信息:2023-12-12T09:32:31.383149Z0[ERROR]InnoDB:IgnoringtheredologduetomissingMLOG_CHECKPOINTbetweenthecheckpoint5777611209andtheend5777612857.2023-12-12T09:32:31.384149Z0[ERROR]InnoDB:PlugininitializationabortedwitherrorGeneri......
  • Android——2个activity之间的数据传递返回
    老版本2个activity之间传递反回数据,实例如:https://www.cnblogs.com/xiaobaibailongma/p/16440432.html 新版本如下:https://blog.csdn.net/freezingxu/article/details/124953918?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBl......
  • Cognex 的 CogFitCircle 和 CogNPointToNPoint 类的简单测试
    privatevoidbtn_Test_Click(objectsender,RoutedEventArgse){CogFitCirclecogFitCircle=newCogFitCircle();cogFitCircle.AddPoint(0,10);cogFitCircle.AddPoint(10,0);cogFitCircle.AddPoint(0,-10);cogFitCircle.AddPoint(-10,0);......
  • 迅为RK3568开发板Android11/12/Linux编译驱动到内核
    在平时的驱动开发中,经常需要在内核中配置某种功能,为了方便大家开发和学习,本小节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。Android11源码如果想要修改内核,可以运行以下命令进行修改:cdkernel/makeARCH=arm64rockchip_defconfigmakeARCH=arm64men......
  • Mac M1芯片安装android-platform-tools
    brewinstallCaskroom/cask/android-platform-tools遇见的报错解决办法brewupdate-reset......
  • 【设计模式】建造者模式——建造者模式在Android SDK源码中的应用
    建造者模式在AndroidSDK源码中也有广泛的应用,本文挑两个典型的类讨论一下:AlertDialog.Builder在Android源码中最常用到的建造者模式非AlertDialog.Builder莫属,代码如下:AlertDialogalertDialog=newAlertDialog.Builder(mContext) .setTitle("系统提示:").setMessage("请......