目标检测 | Point Cloud RoI Pooling
目标检测 | 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目标检测,但是一般来说很少会有超过一个轴自由度的任务(BEV任务),所以使用七个参数就足以表示了。
- 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 实现细节
-
pts assign
-
判定是否在RoI内
由于3d的RoI存在一个yaw(即\(\theta\)),所以必须将点转换到RoI的坐标系中才方便判断。
根据一些小小的数学知识,我们可以写出其变换的齐次坐标系矩阵表示,假设RoI为\((t_x,t_y,t_z,l,w,h,\theta)\),点坐标为\((x,y,z)\),变换后的坐标为\((x^\prime,y^\prime,z^\prime)\)
\[\begin{bmatrix} x^\prime \\ y^\prime \\ z^\prime \\ 1 \\ \end{bmatrix} = \begin{bmatrix} \cos(-\theta) & -\sin(-\theta) & 0 & 0 \\ \sin(-\theta) & \cos(-\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -t_x \\ 0 & 1 & 0 & -t_y \\ 0 & 0 & 1 & -t_z \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix} \]展开之后可得:
\[\begin{bmatrix} x^\prime \\ y^\prime \\ z^\prime \\ 1 \\ \end{bmatrix} = \begin{bmatrix} (x-t_x)\cos(-\theta) -(y-t_y)\sin(-\theta) \\ (x-t_x)\sin(-\theta) + (y-t_y)\cos(-\theta) \\ z-t_z \\ 1 \\ \end{bmatrix} \]随后判定是否在RoI内
\[\textbf{flag}=(|x^\prime|\leq\frac{l}{2})\and(|y^\prime|\leq\frac{w}{2})\and(|z^\prime|\leq\frac{h}{2}) \]
-
-
pts pool
pts pool阶段的采样对齐存在两个问题:
-
RoI内的点数不足
通过复制进行补齐
-
RoI内的点数超过采样数目
在已有的点中进行采样,将最终数目降为采样数目
-
-
feature forward
- 将第二步建立的映射转换为特征图即可