当前位置:   article > 正文

3D检测入门知识梳理

3D检测入门知识梳理

Brief

 昨晚组会师兄把我分配到了做3D检测,所以接下来的一段时间先对3D检测的研究做一下梳理。先挖一个坑,后续慢慢填。

1 基本处理方法

1.1 激光

 CVPR2018年的一篇文章Voxlnet,直接处理激光点云,将点云在空间上划分为均匀的voxel,再把不同的voxel点云提取Voxel Feature Encoding对物体进行分类和位置回归。具体的研读看这里

1.2单目相机

YOLO3D将3D检测通过2D的YOLOV2模型来扩展延伸。

1.3 激光+单目相机

2 研究问题

2.1 3DBBox

 理论上3DBBox会含有9个自由度。分别是:
描 述 形 状 : { L , W , H } 描 述 位 置 : { X , W , Z } 描 述 旋 转 角 : { Y a w , p i t c h , r o l l } 描述形状:\{L,W,H\}\\描述位置:\{X,W,Z\}\\描述旋转角:\{Yaw,pitch,roll\} {L,W,H}{X,W,Z}:{Yaw,pitch,roll}
但是我们存在先验知识:地面是水平的,所以一般就可以少去描述位置的Z的变量和旋转角的 p i t c h 和 r o l l pitch和roll pitchroll,因此变成如下的6个自由度:
描 述 形 状 : { L , W , H } 描 述 位 置 : { X , W , 0 } 描 述 旋 转 角 : { Y a w , 0 , 0 } 描述形状:\{L,W,H\}\\描述位置:\{X,W,0\}\\描述旋转角:\{Yaw,0,0\} {L,W,H}{X,W,0}:{Yaw,0,0}所以3D检测的位置回归是一个6D的预测回归问题。

2.2 目前存在的数据集

  • Jura
  • Pascal3D+
  • LINEMOD
  • KITTI

2.3主要难点

  • 遮挡问题:目标相互遮挡或者目标被背景遮挡。
  • 截断: 只有物体的一部分
  • 小目标
  • 旋转角度的学习:物体的朝向不同,但是对应的特征相同。

2.4 主要方法

2.4.1 SSD-6D

待填坑

2.4.2 3D Bounding Box Estimation Using Deep Learning and Geometry

2.4.3 Implicit 3D Orientation Learning for 6D Object Detection from RGB Images

上面的几篇文章都是重点在2D图像或者单目结合激光学习6D的姿态,数据来源和我要做的貌似有点出入,我要做的是基于点云的3D检测,因此后续继续挖坑。

3 Survey of object classification and detection based on 2D/3D data

Brief

 这是CVPR-wrokshop上的一篇总结。站在大佬的肩膀上看世界,看看最新的研究进展和发展。文章指出5点3D视觉比2D视觉更加复杂的原因:

  • 3D数据的表达多种形式,例如电云和mesh结构,但是2D只有像素格子。
  • 计算和内存复杂度都要求更多,更复杂
  • 室内,室外的数据分布特征使得一个统一的结构很难运作
  • 3D数据,尤其是室外场景,其具有的稀疏性使得检测任务很难做。
  • 3D有监督的数据很少,使得学习任务非常困难

3.1 3D data-sets for object detection

  • NYU Depth Dataset V2 : has 1449 densely labeled pairs of aligned RGB and depth images from Kinect video sequences for a variety of indoor scenes.
  • SUN-RGBD dataset: RGB-D images
  • KITTI

3.2 阶段性方法对比

如下图所示的内容,除去19年薪的内容,经典的文章可以如下:
在这里插入图片描述
主要可以分为two-stage和three-stage,果然维度提升一维,难度加大的不是一点点。

3.2.1 3D bounding box 编码方式

在这里插入图片描述
按照输入的数据,把目前3D-detection的文章分类如下;一般来讲,只使用2维数据(单目和立体的数据)的效果并没有结合3维数据的好。
在这里插入图片描述
下图表示了目前几种主流(除去19年)的3D检测的方法的Bbox和proposals 生成方法的对比:
在这里插入图片描述

4 较新论文阅读

4.1 [19年8月10号-19年8月24号]学习填坑总结

由于明天要做小组汇报,所以今天先总结一下这两周在3D检测方面的进展,除去一些帮娜姐和师兄做事的时间,真正在点云上花的功夫估计只有8天左右,趁还没开学,下次加油。那么我把这次的总结按照如下两部分进行吧。

  • 论文阅读和总结
  • 思考与探索

4.1.1 论文阅读与总结

主要有voxelnetF-pointnetpointRCNNpointpollars 这四篇文章。下面分别贴一些主要的图来说明其主要做法和问题。

voxelNet

在这里插入图片描述

如图所示,voxelNet的过程分为3的步骤,分别是:VFE特征提取,3D卷积和RPN预测。本文第一篇使用自学特征做检测,不是采用的手工特征。并且仅仅只用了点云输出。
(1)文章最大的亮点在VFE层,其实结构就是Pointnet,但是却采用了一个voxel中所有数据的整合。最后得到每一个voxel都具有128维度特征的voxel-wise结构。后续就是一个3D卷积和维度融合成二维卷积,再在二维上做RPN操作。
(2)另外一个亮点是在VFE层中计算时先进行升维操作(很多在这篇文章上的后续工作都跟进了这一操作,也就是局部信息和全局坐标结合变成7个维度的特征)。
(3)但是需要提出的问题依旧是两点:第一点,3D卷积的操作实则是一个很鸡肋的东西,在voxel中对每个voxel的特征的提取实则不能做到很好的效果。第二点,anchor-based的方法还是比较耗时间的,而且3D卷积尤其如是。这里的proposals没有任何先验就提来了,而后续的两片文章呢则是在proposal上做了不少文章。

F-pointnet

在这里插入图片描述

先说下一大体流程:
(1)采用2D优秀的检测方法对深度图的RGB进行检测出物体。
(2)根据检测出来的物体可以确定视锥,文章说的是根据投影关系确定的,所以也不用去考虑什么viewpoint这个无聊的问题。
(3)在视锥内的点进行实例分割,实际上也就是语义分割而已。采用的是一个pointnet的变种结构。这样就算是得到了对应的点。然后在做一次坐标变换,把中心点变换到坐标原点上去。
(4)采用一个T-NET对姿态进行调整,也就是旋转到gt类似的姿态;然后进行的是对size和angel的回归,作者采取了anchor的形式,多个size,多个angel。进行回归。值得注意的一点在于文章的corner-loss的使用。没有细看这个损失。

讲一下文章的贡献点吧:

  • 采用原数据输入。。。文章的意思是没有使用voxel的方式吧。是anchor_free的方法。
  • 坐标转化的使用,很重要,这一点也不算亮点,但是是个trick,后续的PointRCNN也是如此,多次坐标变换得到一个好的结果,我觉得后者就是借鉴了本文的坐标变换,如下图的第三个和第四个所示:

在这里插入图片描述
这里提前给一下pointRCNN的变换,下图所示,是不是也是移到中心,然后再正交对其。
在这里插入图片描述

  • 贡献点,第三个是采用了一种策略去缩小proposal的范围,这就是那个voxel的存在的问题,满屏的anchor就很蠢。

那么依旧不足如下:

  • F-PointNet假设一个frustum中只存在一个instance,这对一些密集区域的segmentation是不利的。
  • 受到串行结构的影响,F-PointNet中3d box estimation的结果严重依赖于2d detection,并且RGB信息对整个结构是至关重要的。然而,图像受到光照以及前后遮挡的影响,会导致2d detector出现漏检的情况。
  • 有的结构可能只能在3D中才能被看到,一些小的被遮挡住的。
  • 阶段性过强,对2D的依赖太大。
PointRCNN

在这里插入图片描述
依旧先讲一下过程,两阶段法,很明确的proposals和RCNN两个阶段。
阶段一的过程:

(1)采用pointnet对每个点进行编码得到point-wise特征,随后同时进行两步操作,分割和生成候选框。
(2)分割。采用的方式也就是pointnet,不多说,这里会生成前景mask。
(3)generate proposals。每一个点首先都会生成一个box,但是不会去使用它,而是判断这个点是否在Gt的内部,如果是,那么我们就可以使用这个点的box做proposals;
(4)NMS删选出一些候选的BOX

阶段二:

(1)整合上述的特征,包括有point-wise features,坐标和深度补偿,mask。
(2)进一步对BOX筛选和回归。

优势点:

  • 标准的两阶段,Pointnet+RCNN这个名字就是致敬。不过是anchor_free的方法。
  • proposals也是相当于经过一定的先验再得到的,会比voxel满屏的anchor好很多。
  • bin损失的使用,文章说了这样会比直接使用smoothL1要准确。
  • 只采用点云作为输入,完完全全的使用了点云特征,也就是存在Pointnet-wise这个feature。以及各种的feature的大杂烩,但是没有使用局部算数平均值和offest是不是会更好一些。
  • 变换坐标这个key-point吧。

不足:

  • 每一个点都会开始存在一个proposals,而不是只对前景点。作者当然有考虑到这个问题,只是这样子会比较好计算吧,毕竟一个统一的batch。这倒可以结合voxel的那个采样的思想试一试。
  • 大规模的输入,固定到16384个点,点多有点慢。没有采样之类的操作,当然这也是为了得到一个比较高的召回率。
  • 一个两阶段法都要去思考的问题,时间比较长。
PointPillars

在这里插入图片描述
很清晰的三个阶段:

  • 特征提取和转化到二维
  • 2D CNN骨架网络提取2D特征
  • 2D 检测

只说一下第一步:

如何把3D特征转化为2D图片呢?
(1)分柱子。把俯视图分成 H × W H \times W H×W个小方格子,再沿着z轴向上拉就成了柱体。
(2)提特征。每个柱体中的点作为一个集合,采用和voxel一样的方式提取特征,最后采用最大池化为 [ T , 1 , C ] [T,1,C] [T,1,C]
(3)转化为二维。因为 T = H × W T=H\times W T=H×W,所以我们最后可以变化成 [ H , W , C ] [H,W,C] [H,W,C],这是啥,这不就是2D卷积的东西了吗。

优势:

  • 又快又好,结构简单优雅。
  • 利用了2D成熟的CNN
  • anchor-free的方法,借鉴了前人voxelnet的方法,改进了他的3D卷积部分和后续。
  • 巧妙的转换到2维度。

不足:

  • Z轴的存在的特征缺失。

4.1.2 思考与探索

2D CNN的使用方法:
  • 类似mv那种,使用对3D的投影得到其2维的图像,再使用2D CNN,这样做无疑是会出现信息损失的,另外呢,先把3D点云分割成若干个体素小块,再把点个数当做二维像素值,再使用2D CNN结构,这又只使用了密度信息,没有局部几何信息。都是不太好的。
  • 第二种呢就是先对点的局部提取点特征(这都要归功于pointnet),然后在利用卷积进行处理;这里呢需要说的是voxelnet是第一篇提取局部特征后去做检测的,但是使用了3D voxel检测,后续再把深度信息和通道结合成一个维度,采用二维的RPN。这里最大的鸡肋就是这个3D CNN,后续有一篇sensors上的文章只改了这个3D CNN变成了 稀疏3D卷积的形式;这一篇PointPillars则是在这两篇文章的基础上做的,直接把3DCNN取消了,采用二维CNN接手后面的操作,虽然创新点不算特别亮眼,不过也着实巧妙。
就点云输入的研究热点
  • anchor_free的方法,也就是研究如何经过一定的处理再提出proposals,就像是F-pointnet首先经过视锥缩小范围,PointRCNN首先进行一下前景分割,不过实际上每个点也是anchor;
  • 把二维成熟的方法向着3维上靠。F-pointnet和voxelnet和pointpillars。PointRCNN的名字就来自二维。
一些重要的trick
  • 旋转对其和坐标变换。在pointRCNN和F-pointnet都使用了的。
  • 首先进行pointent编码,我觉得这个才是正确的点云使用方式,F-pointnet的后续开展肯定不多,而pointliarrs和voxelNet肯定会有更好的发展。
  • 局部结构特征的使用,这里讲的是中心坐标和中心偏移量的使用。
可能有发展的Idea
  • 各向异性卷积核的使用。

4.2汇报总结【19年9月9日——19年9月21日】

4.2.1 论文总结

4.2.1.1 GSPN

在这里插入图片描述

  • 怎么生成ins的预测框

(1)预测一个对目标ins的中心
(2)对每一个预测的中心采取一个多尺度特征提取的方式进行特征提取。
(33)对提取到的特征和近似的分布进行采样联合生成一个bbox。

  • 运用在检测中会有什么样的问题:

(1) 在训练时,展现的内容是KL-loss不收敛。
(2)研究了生成预测中心的loss,在实例分割中,随机采样的128个点都是有所属实例,因此存在着对应的GT,但是在Kitti数据集中,并不是所有点都有实例。因此网络需要密集采样,但是目前采样点数过多就会导致无法训练。

  • 运用到目标检测上的尝试

(1)想要解决的问题:

  • 根据提取到的特征结合分布信息(已经被嵌入了gt的分布信息)生成这样大小的size,就不用了根据不同大小设置不同size的anchor了。
  • 可以同时做到多分类检测

(2)网络整体结构图可以如下所示:

在这里插入图片描述

(3)对代码中5中LOSS的理解,看个人理解的博客。

4.2.1.2 Attention pointnet

上面一篇GSPN的文章重点是在于对实例点的生成ins,但是运用到det的任务时就不能够采样到很多的gt的点,导致需要密集采样才可完成,这一篇文章是采用了GRU的attention,能够从 12 × 12 12\times 12 12×12的区间中划分感兴趣的区域,这就可以解决上诉的采样的问题,作者把这个叫做attention的机制,是属于大场景下的找到目标的方式,结合 博客理解。
在这里插入图片描述

  • 可以给我带来什么?

(1)上面的idea正是由于密集采样而导致了生成的问题,但是如果可以先粗略的attention这个所检测的物体上,那么我们就可以在这个小区域上进行采样生成
(2)难点:该文章的代码结合了ROS的rospy,需要进行一定的修改(小事情),不知道实际的效果如何。需要测试。

4.2.1.3 MEGV

这一篇 博客
在这里插入图片描述

  • 文章主要做什么

(1)文章主要在nusense上做多目标检测,先分size再细每一个类别,目前还没有开源。
(2)算是第一篇做anchor-free的文章。

  • 可以给我带来什么

(1)多分类的参考
(2)文章是属于标准的pointpillars那一套做法,划分网格,然后通过voxel提取特征,再转到二维进行RPN和多目标检测。

4.2.1.4 Fast Point R-CNN

也是很新的文章,同样是贾佳亚组的工作(上一篇的PointRCNN),写在博客这里

在这里插入图片描述

  • 主要优点:

(1)在转到二维的时候采用的多尺度联合的方式。
(2)粗回归后又进行了原始点云的细回归。因为voxel会出现roi pooling的精度定位到网格上,因此网格个大小直接导致了回归的精度,作者就此采用了原始点云的输入进行refine。

4.2.2 思路整理

  • 3D检测就是要就解决两个问题:定位和分类。

(1)第一个问题,分类,目前做了多目标检测的文章只有19年8月才放上arxiv上的class_blanced的MEGV,采用nuscence检测数据集,具体实现是采用了一个voxelnet的anchor方式,但是最后通过了对二维上的每一个voxel粗分类大致确定其size,然后再细分类得到对应的类别;此外其他我见过只采用lidar数据输入的文章只有单次训练一个类别,能不能通过voxelnet特征提取后,在最后的每一个二维的anchor上根据对应的特征生成一个box而不是回归,做到分类和回归同时做。
(2)第二个问题,回归,怎么定位一个目标在平面的区域呢?目前的3D的方法有一个系列(voxelnet)是通过满屏的anchor来把三维的降到二维,再对没也给二维中每一个voxel回归一个7维的定位信息(实际上就不是定位问题,而是一个回问题,这里并没有失去一个遍历的方式,全场景的anchor只有背景和不是背景,是前景的就在每一个anchor的位置回归7个维度的定位信息),这个系列的文章包括了(voxelnet,Second,pointpillars,包括pointrcnn和fastpointRCNN)后面两种方法实际上是采用了voxel特征提取的方式,但是自己的anchor是基于每一个中心点来提的,而faster_rcnn则更加回到voxelnet的方式,采用的结构更加类似,文章还采用所谓的attention(非常简单);但是19年CVPR上有一篇文章:attention-pointnet,这一篇文章,采用GRU的方式直接对输入的点云块采取注意力的形式得到去想要得到的块,再通过坐标变换得到相应的旋转回归矩阵。还有一些不入流的方法,比如我觉得F-pointnet就算是一个,采用一种先减少候选区域的方法去生成proposals的方法,PointRCNN也有一点这样的想法,先通过场景语义分割得到对应的一些粗略的点。目前按照论文的数量来说,voxelnet系列是绝对占有的一种,其首先提取每一个anchor的三维特征,再通过网络降为成二维的anchor去预测训练的前景的概率和对应的回归的7个量,但是不得不说的一点是这样会存在信息的丢失,如何使得信息较少的丢失是一个问题?这里在fast_point_rcnn的多尺度结合应该会存在这个效果;但是依旧很大的问题,定位太依赖anchor,而不是区域中比较突出的特征去直接attention上,分类由于anchor在三维空间上的变化太大,这个系列都是通过固定size的形式,而不是采用生成的方式。

4.2.3 其他工作

  • pointpillars 的kittiviewer:
    在web上的界面已经联通了,具体操作:

(1)在服务器端运行gui界面的代码:cd ./kittiviewer/frontend && python -m http.server
(2)在服务器运行后端加载处理程序:python main.py main(目前还有问题)
(3)在本地上连接并监听对应的端口:ssh -L 16666:127.0.0.1:8000 jty@192.168.190.212,然后在本地对应的浏览器上输入网址:http://127.0.0.1:16666/
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/658080
推荐阅读
相关标签
  

闽ICP备14008679号