赞
踩
昨晚组会师兄把我分配到了做3D检测,所以接下来的一段时间先对3D检测的研究做一下梳理。先挖一个坑,后续慢慢填。
CVPR2018年的一篇文章Voxlnet,直接处理激光点云,将点云在空间上划分为均匀的voxel,再把不同的voxel点云提取Voxel Feature Encoding对物体进行分类和位置回归。具体的研读看这里
YOLO3D将3D检测通过2D的YOLOV2模型来扩展延伸。
理论上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
pitch和roll,因此变成如下的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的预测回归问题。
待填坑
上面的几篇文章都是重点在2D图像或者单目结合激光学习6D的姿态,数据来源和我要做的貌似有点出入,我要做的是基于点云的3D检测,因此后续继续挖坑。
这是CVPR-wrokshop上的一篇总结。站在大佬的肩膀上看世界,看看最新的研究进展和发展。文章指出5点3D视觉比2D视觉更加复杂的原因:
如下图所示的内容,除去19年薪的内容,经典的文章可以如下:
主要可以分为two-stage和three-stage,果然维度提升一维,难度加大的不是一点点。
按照输入的数据,把目前3D-detection的文章分类如下;一般来讲,只使用2维数据(单目和立体的数据)的效果并没有结合3维数据的好。
下图表示了目前几种主流(除去19年)的3D检测的方法的Bbox和proposals 生成方法的对比:
由于明天要做小组汇报,所以今天先总结一下这两周在3D检测方面的进展,除去一些帮娜姐和师兄做事的时间,真正在点云上花的功夫估计只有8天左右,趁还没开学,下次加油。那么我把这次的总结按照如下两部分进行吧。
主要有voxelnet,F-pointnet,pointRCNN 和 pointpollars 这四篇文章。下面分别贴一些主要的图来说明其主要做法和问题。
如图所示,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上做了不少文章。
先说下一大体流程:
(1)采用2D优秀的检测方法对深度图的RGB进行检测出物体。
(2)根据检测出来的物体可以确定视锥,文章说的是根据投影关系确定的,所以也不用去考虑什么viewpoint这个无聊的问题。
(3)在视锥内的点进行实例分割,实际上也就是语义分割而已。采用的是一个pointnet的变种结构。这样就算是得到了对应的点。然后在做一次坐标变换,把中心点变换到坐标原点上去。
(4)采用一个T-NET对姿态进行调整,也就是旋转到gt类似的姿态;然后进行的是对size和angel的回归,作者采取了anchor的形式,多个size,多个angel。进行回归。值得注意的一点在于文章的corner-loss的使用。没有细看这个损失。
讲一下文章的贡献点吧:
这里提前给一下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筛选和回归。
优势点:
不足:
很清晰的三个阶段:
只说一下第一步:
如何把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卷积的东西了吗。
优势:
不足:
(1)预测一个对目标ins的中心
(2)对每一个预测的中心采取一个多尺度特征提取的方式进行特征提取。
(33)对提取到的特征和近似的分布进行采样联合生成一个bbox。
(1) 在训练时,展现的内容是KL-loss不收敛。
(2)研究了生成预测中心的loss,在实例分割中,随机采样的128个点都是有所属实例,因此存在着对应的GT,但是在Kitti数据集中,并不是所有点都有实例。因此网络需要密集采样,但是目前采样点数过多就会导致无法训练。
(1)想要解决的问题:
(2)网络整体结构图可以如下所示:
(3)对代码中5中LOSS的理解,看个人理解的博客。
上面一篇GSPN的文章重点是在于对实例点的生成ins,但是运用到det的任务时就不能够采样到很多的gt的点,导致需要密集采样才可完成,这一篇文章是采用了GRU的attention,能够从
12
×
12
12\times 12
12×12的区间中划分感兴趣的区域,这就可以解决上诉的采样的问题,作者把这个叫做attention的机制,是属于大场景下的找到目标的方式,结合 博客理解。
(1)上面的idea正是由于密集采样而导致了生成的问题,但是如果可以先粗略的attention这个所检测的物体上,那么我们就可以在这个小区域上进行采样生成
(2)难点:该文章的代码结合了ROS的rospy,需要进行一定的修改(小事情),不知道实际的效果如何。需要测试。
这一篇 博客
(1)文章主要在nusense上做多目标检测,先分size再细每一个类别,目前还没有开源。
(2)算是第一篇做anchor-free的文章。
(1)多分类的参考
(2)文章是属于标准的pointpillars那一套做法,划分网格,然后通过voxel提取特征,再转到二维进行RPN和多目标检测。
也是很新的文章,同样是贾佳亚组的工作(上一篇的PointRCNN),写在博客这里
(1)在转到二维的时候采用的多尺度联合的方式。
(2)粗回归后又进行了原始点云的细回归。因为voxel会出现roi pooling的精度定位到网格上,因此网格个大小直接导致了回归的精度,作者就此采用了原始点云的输入进行refine。
(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的形式,而不是采用生成的方式。
(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/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。