小白科研笔记:理解PointRCNN中的Stage-Two细节

1. 前言

博客写作的这天是清明节。致敬那些抗击新馆病毒的医护人员。

我的上一篇博客分析了PointRCNN框中中预选3d框的生成和基于区间(对Bin的翻译)的3d框误差函数。讨论了基于区间的3d框误差函数的思想源于F-PointNet。这篇博客讨论PointRCNN的后续操作,即如何从一大堆3d预选目标框中回归出精度更高的检测结果呢?这对应PointRCNN中的RCNN部分。RCNN是属于Regions with CNN Features的缩写,译为预选框内的特征。在PointRCNN中,作者希望使用3d预选框内的点云特征回归出更加精确的结果。RCNNTwo-stage Detection Network中的Stage-2的主要内容。

2. PointRCNN中RCNN的细节

2.1 非极大值抑制和区域池化

前文已经说过,每一个前景点都会用于回归一个预选3d框,因此预选框的数量是远远大于实际3d目标的。如图1(a)所示,一个目标周围有好多框框。经过非极大值抑制(NMS)后,从众多框框中选出一个精选框作为该目标的唯一预选框,如图1(b)中的橙色框。第ii个精选框标记为bi=(xi,yi,zi,hi,wi,li,θi)b_i=(x_i,y_i,z_i,h_i,w_i,l_i,\theta_i)。对所有的框无差别地优化显然是非常耗费计算量的,效率低下。而只针对精选框做优化,效率则会非常高。这是非极大值抑制的目的。

小白科研笔记:理解PointRCNN中的Stage-Two细节
图1:非极大值抑制和区域池化示意图(我从原论文截图剪裁而成)

作者认为实际情况下,这个精选的预选框是不准确的(如果准就不会有RCNN操作啦),会存在个别属于该目标点云没有被这个框覆盖。为了解决这个问题,作者把预选框的长宽高增大一点,改进后的框标记为bie=(xi,yi,zi,hi+η,wi+η,li+η,θi)b_i^e=(x_i,y_i,z_i,h_i+\eta,w_i+\eta,l_i+\eta,\theta_i),见图1(b)中的黑框。符号eeenlarge,增大的含义。但是这种增大的框也会把本不属于该目标的点覆盖进去,比如地面点,见图1(b)中的地面点。在Foreground Point Segmentation,已经对前景点/背景点做了分割。所以杂点还是能被识别出来。记框bieb_i^e内的任意一点为ppm(p)=(0,1)m^{(p)}=(0,1)表示它是背景点/前景点。pos(p)=(x(p),y(p),z(p))pos^{(p)}=(x^{(p)},y^{(p)},z^{(p)})表示该点的位置。r(p)r^{(p)}表示该点雷达的反射率。f(p)RCf^{(p)} \in \mathbf{R}^C表示该点在Point Cloud Encoder-Decoder中提取的特征,文中称之为全局语义特征Global Semantic Features(从整体点云中学习出来的特征,这是取名为global的含义)。因此,对于一个精选框中的点,它的特征包括m(p),pos(p),r(p),f(p)m^{(p)}, pos^{(p)}, r^{(p)}, f^{(p)}

上述的操作都不难理解。但是貌似跟区域池化(对Region Pooling的翻译)没什么关系。接下来就讲解池化。经过非极大值抑制后,会存在一些精选的预选3d框,它们内部没有包含任何点云。作者把这些“空”的预选3d框都扔掉,这样的操作称为区域池化。个人感觉,是不是用Proposal Pooling更好呢?总之理解了就好。

2.2 理解RCNN

经过2.1节的操作,我得到了一批精选的预选3d框,记为Bine={bie}i=1MB^e_{in}=\{b_i^e\}_{i=1}^MRCNN意义就是让框框集合BineB^e_{in}更加精确。

A. 建立局部坐标系

对于每一个3d框bieb_i^e,都以该框的中心点centericenter_i建立一个局部的坐标系OXYZO'-X'Y'Z'。这个局部坐标系的轴方向跟雷达坐标系的轴方向是一致的。在OXYZO'-X'Y'Z'下,该框内所有点云的位置是pos~(p)=pos(p)centeri\widetilde{pos}^{(p)} = {pos}^{(p)}-center_i。当然,这个建立局部坐标系的套路也是主流方法。文中把建立局部坐标系的过程称之为Canonical Transformation

B. 3D框精细优化

建立局部坐标系的原因是想提取局部空域特征(对Local spatial feature的翻译)l(p)l^{(p)}。作者认为,只有结合全局特征f(p)f^{(p)}和局部特征l(p)l^{(p)},学习器才能回归出精度高的3d框。那么局部特征l(p)l^{(p)}是什么呢?它是局部距离d(p)=pos~(p)2d^{(p)}=\Vert \widetilde{pos}^{(p)} \Vert_2,雷达反射率r(p)r^{(p)},和前景/背景分割m(p)m^{(p)},拼接的特征经过MLP层输出的点云特征向量。然后把l(p)l^{(p)}f(p)f^{(p)}拼接起来获得拼接特征(Merged Feature)。在框bieb_i^e内,每一个点都有它自己的拼接特征。把拼接特征喂入Point Cloud Encoder,可以得到一个判别式的特征向量(Discriminative feature vector)。该特征向量用于回归更精细的3d框和置信度(Confidence)。流程图如下所示:

小白科研笔记:理解PointRCNN中的Stage-Two细节
图2: 3D框精细优化流程图

其中Point Cloud Encoder的具体网络架构应该是跟F-PointNet很相似的:

小白科研笔记:理解PointRCNN中的Stage-Two细节
图3: Point Cloud Encoder的大概网络架构,图中global feature是判别式的特征向量。图摘自F-PointNet

C. 3D框精细优化的损失函数

总之,按照上述AB两个部分的操作,RCNN网路回归出更加精细的3d框,简记为bi=(xi,yi,zi,hi,wi,li,θi)b_i=(x_i,y_i,z_i,h_i,w_i,l_i,\theta_i)。为了指导RCNN正确回归,需要设计一个误差函数。对bib_i的真值3d框bigt=(xigt,yigt,zigt,higt,wigt,ligt,θigt)b_i^{gt}=(x_i^{gt},y_i^{gt},z_i^{gt},h_i^{gt},w_i^{gt},l_i^{gt},\theta_i^{gt})bigtb_i^{gt}的选型准则是iou(bi,bigt)0.55iou(b_i,b_i^{gt})\geq0.55

bib_i框下的局部坐标系下,b~i=(0,0,0,hi,wi,li,0)\widetilde {b}_i=(0,0,0,h_i,w_i,l_i,0),而b~igt=(xigtxi,yigtyi,zigtzi,higt,wigt,ligt,θigtθi)\widetilde{b}_i^{gt}=(x_i^{gt}-x_i,y_i^{gt}-y_i,z_i^{gt}-z_i,h_i^{gt},w_i^{gt},l_i^{gt},\theta_i^{gt}-\theta_i)。一些符号记为:

Δx=xigtxi\Delta x = x_i^{gt}-x_i
Δy=yigtyi\Delta y = y_i^{gt}-y_i
Δz=zigtzi\Delta z = z_i^{gt}-z_i
Δh=higthi\Delta h = h_i^{gt}-h_i
Δw=wigtwi\Delta w = w_i^{gt}-w_i
Δl=ligtli\Delta l = l_i^{gt}-l_i
Δθ=θigtθi\Delta \theta = \theta_i^{gt} - \theta_i

这里的误差函数是基于区间的(Bin-Based)。参考我的上一篇博客,可以得到binΔx(p),binΔz(p)bin_{\Delta x}^{(p)}, bin_{\Delta z}^{(p)}resΔx(p),resΔz(p)res_{\Delta x}^{(p)}, res_{\Delta z}^{(p)}用于对x,zx,z的回归。binΔx(p)bin_{\Delta x}^{(p)}目标是趋于第零个类别,用one_hot编码,使用交叉熵函数。resΔx(p)res_{\Delta x}^{(p)}目标是趋于零,使用平滑L1L1范数。使用resΔh(p),resΔw(p),resΔl(p)res_{\Delta h}^{(p)}, res_{\Delta w}^{(p)}, res_{\Delta l}^{(p)}用于对h,w,lh,w,l的回归,直接使用平滑L1L1范数。作者认为Δθ\Delta \theta误差范围小,在[14π,14π][-\frac{1}{4}\pi, \frac{1}{4}\pi]内。在这个区间内划分为若干小区间,区间长度为ω\omega。于是binΔθ(p)bin_{\Delta \theta}^{(p)}resΔθ(p)res_{\Delta \theta}^{(p)}可以定义为(博主懒这次就截个图吧):

小白科研笔记:理解PointRCNN中的Stage-Two细节
如果你弄不懂上式的构造,可以回过头来看我的上一篇博客讲解Bin-Based的误差函数原理和示例。3D框精细优化的损失函数跟Stage-One过程的损失函数一样。用L~bin\widetilde L_{bin}表示参数Δx,Δz,Δθ\Delta x,\Delta z,\Delta \thetaBin-Based的损失函数。用L~res\widetilde L_{res}表示七个Δ\Delta参数的res的损失函数。

除此之外,3D框精细优化过程中还预测了3d框目标的类别置信度probiprob_iprobiprob_i应该是一个类似于One-hot的向量。目标的类别真值记为labelilabel_i。分类误差可以使用交叉熵误差函数,即Fcls(probi,labeli)F_{cls}(prob_i,label_i)

总之,3D框精细优化过程中总的误差函数是:

小白科研笔记:理解PointRCNN中的Stage-Two细节

其中B\Vert B \Vert表示非极大值抑制和区域池化之前的预选特征框数目。Bpos\Vert B_{pos} \Vert表示非极大值抑制和区域池化之后的预选特征框数目。

D. RCNN的输出

通过3D框精细优化可以输出一批高质量的3d目标框,对这些3d框在BEV视图下再次进行非极大值抑制,最终得到PointRCNN的输出。

3. 结束语

总体而言,PointRCNN算法受2D目标检测RCNN算法的影响,同时也受到F-PointNetBin-Based框架影响。但是它并没有生搬硬套,而是在RCNN架构上和Bin-Based误差函数上有自己的独到的见解。