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)中的橙色框。第 i i i个精选框标记为 b i = ( x i , y i , z i , h i , w i , l i , θ i ) b_i=(x_i,y_i,z_i,h_i,w_i,l_i,\theta_i) bi​=(xi​,yi​,zi​,hi​,wi​,li​,θi​)。对所有的框无差别地优化显然是非常耗费计算量的,效率低下。而只针对精选框做优化,效率则会非常高。这是非极大值抑制的目的。


图1:非极大值抑制和区域池化示意图(我从原论文截图剪裁而成)

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

A. 建立局部坐标系

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

B. 3D框精细优化

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


图2: 3D框精细优化流程图

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


图3: Point Cloud Encoder的大概网络架构,图中global feature是判别式的特征向量。图摘自F-PointNet

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

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

在 b i b_i bi​框下的局部坐标系下, b ~ i = ( 0 , 0 , 0 , h i , w i , l i , 0 ) \widetilde {b}_i=(0,0,0,h_i,w_i,l_i,0) b i​=(0,0,0,hi​,wi​,li​,0),而 b ~ i g t = ( x i g t − x i , y i g t − y i , z i g t − z i , h i g t , w i g t , l i g t , θ i g t − θ 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) b igt​=(xigt​−xi​,yigt​−yi​,zigt​−zi​,higt​,wigt​,ligt​,θigt​−θi​)。一些符号记为:

Δ x = x i g t − x i \Delta x = x_i^{gt}-x_i Δx=xigt​−xi​
Δ y = y i g t − y i \Delta y = y_i^{gt}-y_i Δy=yigt​−yi​
Δ z = z i g t − z i \Delta z = z_i^{gt}-z_i Δz=zigt​−zi​
Δ h = h i g t − h i \Delta h = h_i^{gt}-h_i Δh=higt​−hi​
Δ w = w i g t − w i \Delta w = w_i^{gt}-w_i Δw=wigt​−wi​
Δ l = l i g t − l i \Delta l = l_i^{gt}-l_i Δl=ligt​−li​
Δ θ = θ i g t − θ i \Delta \theta = \theta_i^{gt} - \theta_i Δθ=θigt​−θi​

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


如果你弄不懂上式的构造,可以回过头来看我的上一篇博客讲解Bin-Based的误差函数原理和示例。3D框精细优化的损失函数跟Stage-One过程的损失函数一样。用 L ~ b i n \widetilde L_{bin} L bin​表示参数 Δ x , Δ z , Δ θ \Delta x,\Delta z,\Delta \theta Δx,Δz,Δθ的Bin-Based的损失函数。用 L ~ r e s \widetilde L_{res} L res​表示七个 Δ \Delta Δ参数的res的损失函数。

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

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

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

D. RCNN的输出

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

3. 结束语

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

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

  1. 小白科研笔记:深入理解SA-SSD中的Part-sensitive Warping机制

    1. 前言 这篇博客将细致分析3D目标单阶段检测方法SA-SSD中的Part-sensitive warping机制(简称PS Warping). 2. 代码上对PS Warping理解 论文上对PS ...

  2. 小白科研笔记:理解PointConv和对此类方法感想

    1. 引言 2018年之后出现较多新的处理点云的深度学习算法.这些文章从面向点云的卷积运算(Convolution for point cloud)着手,试图从更底层理解点云.这篇博客主要参考下面这篇 ...

  3. 小白科研笔记:简析图神经网络收敛性的理论证明

    1. 前言 这篇博客主要简析一篇ICLR2020的论文What Graph Neural Network Cannot Learn: Depth vs Width.这篇论文是很有理论深度的.不过这篇博 ...

  4. 小白科研笔记:简析SOTA目标检测算法3D-CVF

    1. 前言 最近KITTI的3D目标检测榜刷出了一个新的Top One双阶段算法3D-CVF.做算法,有时间需要跟紧新的网络架构.所以这篇博客主要分析这篇论文3D-CVF: Generating Jo ...

  5. MySQL笔记3:深入理解MySQL中的NULL

    深入理解MySQL中的NULL NULL:表示没有值,无法比较两个没有值的量.

  6. 【阅读笔记】机器阅读理解(中)——架构篇

    文章目录 一.MRC模型架构 总体架构 编码层 词表向量 字符编码 上下文编码 交互层 互注意力 自注意力 上下文编码 输出层 多项式选择答案生成 区间式答案 自由式答案生成 注意力机制的应用 拷贝生 ...

  7. 【读书笔记 | 自动驾驶中的雷达信号处理(第7章 目标滤波与跟踪)】

    本文编辑:调皮哥的小助理 大家好,又和大家见面了,时间过得很快,到目前为止,如下面的目录所示,我们已经阅读过汽车雷达目标检测的一些基本的原理了,特别是距离.速度和角度.虽然这些表示瞬时目标状态的信息可 ...

  8. 深度学习Deep learning小白入门笔记——PanGu模型训练分析

    书接上回 深度学习Deep learning小白入门笔记--在AI平台上训练LLM--PanGu 对训练模型重新认知与评估. 模型评估 在训练过程中或训练完成后,通常使用验证集或测试集来评估模型的性能 ...

  9. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

最新文章

  1. jenkins环境搭建
  2. 产销对接行动倡议书-丰收节交易会·万祥军:贫困地区农品
  3. BASISI系统中如何配置web service
  4. 利用python同步windows和linux文件
  5. Spine 2D animation for games
  6. python_激光点云变换到图像平面
  7. 如何在windows下把硬盘格式化成EXT3格式?
  8. mysql数据库软件 国产_国产数据库发展情况如何?
  9. 机器学习的通俗讲解!
  10. 开票服务器管理系统默认密码,税控盘初始密码和口令是多少-百旺税控盘初始密码和口令-牛账网...
  11. c语言错误1083,没有混音设备可用,启动Windows Audio服务时错误1083
  12. Photoshop中裁剪工具的使用及扩展
  13. 【校招VIP】前端校招考点之页面转换算法
  14. sdio wifi 移植
  15. 计算机内存的安装方法,内存条怎么装?内存条安装与拆卸方法
  16. Bitmap高效加载
  17. linux中常见的校验用正则表达式
  18. 前端开发基础——常用处理函数
  19. JavaScript实现简单的打字游戏
  20. linux 命令打开u盘,Linux下U盘使用教程详解

热门文章

  1. 电子信息工程与计算机网络技术,电子信息工程与计算机网络技术探析
  2. 超实数进校园,,迈向现代数学的一大步
  3. matlab实现数字图像的加减乘除运算
  4. Conflux商务技术总监:区块链技术革命最重要的是回归初心
  5. Adobe系列在安装时,出现安装程序检测到计算机重新启动的过程中可能暂停、安装失败
  6. 重温FPGA开发29
  7. 9.多态(P a1=new B();)重写与重载、instanceof关键字
  8. 转 : Squareup刷卡器,音频读卡识别android/iOS源码API
  9. 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作问题2017
  10. IQC跳捡 T-SQL