参考:
3D检测入门知识梳理
基于单目摄像头的物体检测(YOLO 3D)
目前主要是综合利用单目相机、双目相机、多线激光雷达来进行3D目标检测,从目前成本上讲,激光雷达>双目相机>单目相机,从目前的准确率上讲,激光雷达>双目相机>单目相机。
CVPR2018年的一篇文章Voxlnet,直接处理激光点云,将点云在空间上划分为均匀的voxel,再把不同的voxel点云提取Voxel Feature Encoding对物体进行分类和位置回归。具体的研读看这里
Voxelnet把激光点云在空间中均匀划分为不同的voxel,再把不同voxel中的点云通过提出的VFE(Voxel Feature Encoding)层转换为一个统一的特征表达,最后使用RPN(Region Proposal Network)对物体进行分类和位置回归,整体流程如图Fig.2所示。
Fig.2 Voxelnet Architecture, figure from reference[2]
如图所示,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上做了不少文章。
YOLO3D将3D检测通过2D的YOLOV2模型来扩展延伸。
以开源的Apollo为例,Apollo中使用的YOLO 3D,在Apollo中通过一个多任务网络来进行车道线和场景中目标物体检测。其中的Encoder模块是Yolo的Darknet,在原始Darknet基础上加入了更深的卷积层同时添加反卷积层,捕捉更丰富的图像上下文信息。高分辨多通道特征图,捕捉图像细节,深层低分辨率多通道特征图,编码更多图像上下文信息。和FPN(Feature Paramid Network)类似的飞线连接,更好的融合了图像的细节和整体信息。Decoder分为两个部分,一部分是语义分割,用于车道线检测,另一部分为物体检测,物体检测部分基于YOLO,同时还会输出物体的方向等3D信息。
Fig.3 Multi-Task YOLO 3D in Apollo, figure from reference[3]
通过神经网络预测3D障碍物的9维参数难度较大,利用地面平行假设,来降低所需要预测的3D参数。1)假设3D障碍物只沿着垂直地面的坐标轴有旋转,而另外两个方向并未出现旋转,也就是只有yaw偏移角,剩下的Pitch和Roll均为0。障碍物中心高度和相机高度相当,所以可以简化认为障碍物的Z=0;2)可以利用成熟的2D障碍物检测算法,准确预测出图像上2D障碍物框(以像素为单位);3)对3D障碍物里的6维描述,可以选择训练神经网络来预测方差较小的参数。
Fig.4 Predictparameters in Apollo YOLO 3D, figure from reference[3]
在Apollo中,实现单目摄像头的3D障碍物检测需要两个部分:
1、训练网络,并预测出大部分参数:
图像上2D障碍物框预测
障碍物物理尺寸
不被障碍物在图像上位置所影响,并且通过图像特征可以很好解释的障碍物yaw偏转角
2、通过图像几何学计算出障碍物中心点相对相机坐标系的偏移量X分量和Y分量
AVOD,AVOD输入RGB图像及BEV(Bird Eye View),利用FPN网络得到二者全分辨率的特征图,再通过Crop和Resize提取两个特征图对应的区域进行融合,挑选出3D proposal来进行3D物体检测,整个流程如图Fig.5所示。
Fig.5 AVOD Architecture, figure from reference[4]
在KITTI 3D object Detection的评测结果如下图Fig.6,目前领先的算法主要集中于使用激光数据、或激光和单目融合的方法,纯视觉做3D目标检测的方法目前在准确度上还不能和上述两种方法相提并论,在相关算法上还有很大的成长空间,在工业界有较大的实用性需求,本次分享主要集中在目前比较新的纯视觉单目3D目标检测。
Fig.6 KITTI 3D object detection competition ranking for car, figure from reference[5]
理论上3DBBox会含有9个自由度。分别是:
但是我们存在先验知识:地面是水平的,所以一般就可以少去描述位置的Z的变量和旋转角的pitch和roll,因此变成如下的6个自由度:
所以3D检测的位置回归是一个6D的预测回归问题。
以KITTI数据集为例,如图Fig.7是KITTI数据集中对于一个3D障碍物的标注:
,旋转角的有效学习有较大难度,如图Fig.8所示
Fig.8 Rotation angle confusion, figure from reference[4]5)缺失深度信息,2D图片相对于激光数据存在信息稠密、成本低的优势,但是也存在缺失深度信息的缺点
目前基于单目相机的3D目标检测的方法主要是复用2D检测中的一系列方法,同时加入多坐标点的回归、旋转角的回归或分类,同时也有采用自编码器的方法来进行姿态学习。
Making RGB-Based 3D Detection and 6D Pose Estimation Great Again
Fig.9 SSD-6D Architecture, figure from reference[6]
SSD-6D的模型结构如上图Fig.9所示,其关键流程介绍如下:
输入为一帧分辨率为299x299的三通道RGB图片
输入数据先经过Inception V4进行特征提取和计算
分别在分辨率为71x71、35x35、17x17、9x9、5x5、3x3的特征图上进行SSD类似的目标值(4+C+V+R)回归,其中目标值包括4(2D包围框)、C(类别分类得分)、V(可能的视点的得分)和R(平面内旋转)
对回归的结果进行非极大抑制(NMS),最终得到结果
关键点:
Viewpoint classification VS pose regression:
作者认为尽管已有论文直接使用角度回归,但是有实验证明对于旋转角的检测,使用分类的方式比直接使用回归更加可靠,特别是使用离散化的viewpoints比网络直接输出精确数值效果更好
Dealing with symmetry and view ambiguity:
给定一个等距采样的球体,对于对称的目标物体,仅沿着一条弧线采样视图,对于半对称物体,则完全省略另一个半球,如图Fig.10所示
Fig.10 discrete viewpoints, figure from reference[6]
效果:
Tab.1 F1-scores for each sequence of LineMOD, table from reference[6]
作者提出一种从单帧图像中进行3D目标检测和姿态估计的方法,该方法首先使用深度神经网络回归出相对稳定的3D目标的特性,再利用估计出来的3D特征和由2D bounding box转换为3D bounding box时的几何约束来产生最终的结果。论文中,作者提出了一个严格的假设,即一个3D bounding box应该严格地被2D bounding box所包围,一个3D bounding box由中心点的(x, y, z)坐标、和三维尺度(w, h, l)和三个旋转角所表示。要估计全局的物体姿态仅仅通过检测到的2D bounding box是不可能的,如下图Fig.11所示,尽管汽车的全局姿态一直没有变,但是在2D bounding box中的姿态一直在变。因此,作者选用回归2D bounding box中的姿态再加上在相机坐标系中汽车角度的变化的综合来进行汽车全局姿态的估计。
Fig.11 Left: Cropped image of car, Right: Image of whole scene, figure from reference[7]
同时,作者还提出了MultiBin的结构来进行姿态的估计,首先离散化旋转角到N个重叠的Bin,对个每一个Bin,CNN网络估计出姿态角度在当前Bin的概率,同时估计出角度值的Cos和Sin值。网络整体结构如下图Fig.12所示,在公共的特征图后网络有三个分支,分别估计3D物体的长宽高、每个Bin的置信度和每个Bin的角度估计。
Fig.12 MultiBin estimation for orientation and dimension estimation, figure from reference[7]
效果:
Tab.2.Comparison of the average orientation estimation, average precision andorientation score for KITTI car, table from reference[7]
Tab.3. Comparisonof the average orientation estimation, average precision and orientation scorefor KITTI cyclist,, table from reference[7]
Fig.13 Top:codebook from encodings of discrete object views; Bottom: object detection and3D orientation estimation with codebook, figure from reference[8]
作者主要是提出了一种新型的基于去噪自编码器DA(Denoising Autoencoder)的3D目标朝向估计方法,使用了域随机化(Domain Randomization)在3D模型的模拟视图上进行训练。在进行检测时,首先使用SSD(Single Shot Multibox Detector)来进行2D物体边界框的回归和分类,然后使用预先训练的深度网络3D目标朝向估计算法对物体的朝向进行估计。在模型的训练期间,没有显示地从3D姿态标注数据中学习物体的6D pose,而是通过使用域随机化训练一个AAE(Augmented Autoencoder)从生成的3D模型视图中学习物体6D pose的特征表示。
这种处理方式有以下几个优势:
可以有效处理有歧义的物体姿态,尤其是在物体姿态对称时
有效学习在不同环境背景、遮挡条件下的物体3D姿态表示
AAE不需要真实的姿态标注训练数据
Fig.14 Training process for AAE, figure from reference[8]
效果:
Tab.4 LineMOD object recall with different training and testing data, table from reference[8]
https://zhuanlan.zhihu.com/p/41790888
2D图像的目标检测算法我们已经很熟悉了,物体在2D图像上存在一个2D的bounding box,我们的目标就是把它检测出来。而在3D空间中,物体也存在一个3D bounding box,如果将3D bounding box画在2D图像上,那么长这样子:
这个3D bounding box可以表示一个物体的姿态。那什么是物体的姿态?实际上就是物体在3D空间中的空间位置xyz,以及物体绕x轴,y轴和z轴旋转的角度。换言之,只要知道了物体在3D空间中的这六个自由度,就可以唯一确定物体的姿态。
知道物体的姿态是很重要的。对于人来说,如果我们想要抓取一个物体,那么我们必须知道物体在3D空间中的空间位置xyz,但这个还不够,我们还要知道这个物体的旋转状态。知道了这些我们就可以愉快地抓取了。对于机器人而言也是一样,机械手的抓取动作也是需要物体的姿态的。因此研究物体的姿态有很重要的用途。
Real-Time Seamless Single Shot 6D Object Pose Prediction这篇文章提出了一种使用一张2D图片来预测物体6D姿态的方法。但是,并不是直接预测这个6D姿态,而是通过先预测3D bounding box在2D图像上的投影的1个中心点和8个角点,然后再由这9个点通过PNP算法计算得到6D姿态。我们这里不管怎么由PNP算法得到物体的6D姿态,而只关心怎么预测一个物体的3D bounding box在2D图像上的投影,即9个点的预测。
1. 思想
上面已经讲到,我们把预测6D姿态问题转为了预测9个坐标点的问题。而在2D的目标检测中,我们实际上也是需要预测坐标点xy的。那么,我们能不能把目标检测框架拿来用呢? 很显然是可以的。所以这篇文章就提出基于yolo的6D姿态估计框架。
2. 网络架构
整个网络结构图如下:
从上图可以看到,整个网络采用的是yolo v2的框架。网络吃一张2D的图片(a),吐出一个SxSx(9x2+1+C)的3D tensor(e)。我们会将原始输入图片划分成SxS个cell(c),物体的中心点落在哪个cell,哪个cell就负责预测这个物体的9个坐标点(9x2),confidence(1)以及类别(C),这个思路和yolo是一样的。下面分别介绍这些输出的意义。
3. 模型输出的意义
上面已经提到,模型输出的维度是13x13x(19+C),这个19=9x2+1,表示9个点的坐标以及1个confidence值,另外C表示的是类别预测概率,总共C个类别。
3.1 confidence的意义
confidencel表示cell含有物体的概率以及bbox的准确度(confidence=P(object) *IOU)。我们知道,在yolo v2中,confidence的label实际上就是gt bbox和预测的bbox的IOU。但是在6D姿态估计中,如果要算IOU的话,需要在3D空间中算,这样会非常麻烦,因此本文提出了一种新的IOU计算方法,即定义了一个confidence函数:
其中D(x)是预测的2D点坐标值与真实值之间的欧式距离,dth是提前设定的阈值,比如30pixel, alpha是超参,作者设置为2。从上图可以看出,当预测值与真实值越接近时候,D(x)越小,c(x)值越大,表示置信度越大。反之,表示置信度越小。需要注意的是,这里c(x)只是表示一个坐标点的c(x),而一个物体有9个点,因此会计算出所有的c(x)然后求平均。
另外需要注意的是,图上的那个公式是错的,和函数图对应不起来,真正的公式应该是:
通过以上定义的confidence函数,就可以代替IoU的计算。
3.2 坐标的意义
上面讲到网络需要预测的9个点的坐标,包括8个角点和一个中心点。但是我们并不是直接预测坐标值,和yolo v2一样,我们预测的是相对于cell的偏移。不过中心点和角点还不一样,中心点的偏移一定会落在cell之内(因为中心点落在哪个cell哪个cell就负责预测这个物体),因此通过sigmoid函数将网络的输出压缩到0-1之间,但对于其他8个角点,是有可能落在cell之外的,所以我们没有对8个角点预测添加任何限制。因此坐标偏移可以表示为:
其中cx,cy表示cell的坐标。对于中心点而言,f(.)表示sigmoid函数,对于角点而言,f(.)表示恒等函数。
3.3 类别的意义
类别代表的意义很简单,就是指预测的类别概率,不过这是一个条件概率P(class/object),因为我们在训练的时候,只会在有物体的情况下才计算概率损失,这个和yolo是一样的。
3.4 多目标检测
以上讲的只是对于单目标的情况,如果是多目标的话,某个cell可能会落入多个物体,这个时候就需要使用anchor了,引入anchor之后,网络的输出相应地变为:13x13x(19+C)×anchors,这篇文章使用的anchor数目为5。引入anchor就需要考虑一个问题,如果一个物体落入了某个cell,那么这个cell中的哪个anchor去负责这个物体?这篇文章中的做法和yolo一样,就是去表物体的2D bounding box和anchor的尺寸,最匹配的那个anchor就负责这个物体。
6. 总结
这篇文章实际上将6d姿态问题转为了2D图像中坐标点检测的问题,而2D坐标点的检测问题可以很好地利用目标检测框架来做。当然,这种做法会有一个问题,就是即使你在2D上坐标的检测误差很小,但映射到3D空间中可能会存在较大的误差。当然,这可能是2D图像作为输入的6D姿态估计算法都会面临的问题。不过这篇文章的这个思路还是很值得借鉴的。
上面的几篇文章都是重点在2D图像或者单目结合激光学习6D的姿态,数据来源和我要做的貌似有点出入,我要做的是基于点云的3D检测,因此后续继续挖坑。
https://zhuanlan.zhihu.com/p/45583685
在上篇yolo-6d
stone:基于YOLO的3D目标检测:YOLO-6Dzhuanlan.zhihu.com
中已经讲了如何通过物体的3D bounding box在2D图像上投影的8个角点和一个中心点来评估物体的6d姿态,这是一种将3d问题转化为2d问题来解决的思路。但deep6d(https://arxiv.org/abs/1802.10367)这篇文章提供了另外一种思路,直接回归6d pose,非常简单暴力。下面详细介绍这种方法。
在正式讲deep6d之前,我们先思考一个问题:很多6d姿态估计的方法都是基于2D图像的目标检测框架,为什么要这么做?
我的看法是:目前主流的目标检测方法都是基于多目标检测设计的,而6d姿态估计也涉及多目标,并且也是基于2D图像来进行预测的,只是目标检测预测的目标是xywh,而6d姿态估计预测的是xyzuvw(平移和旋转),因此基于目标检测框架来进行姿态估计也是非常自然的选择。
这部分是立体视觉的知识。如果对这部分不了解的可以跳过,只要知道,一个物体的旋转可以用一个三维向量来表示就好了。
3D空间中物体的姿态可以用旋转矩阵R和平移向量t来表示。直接回归t没有问题,但是直接回归旋转矩阵R就比较麻烦,因为旋转矩阵需要满足单位正交的条件,网络回归的结果很难满足这种限制,因此需要考虑用其他方式来表示旋转。
表示旋转有几个选择:
欧拉角的表示最为简单,也很容易理解,用一个三维向量来表示旋转就好了。但欧拉角有一个问题,同一个角度可以有多种表示,比如1度和361度实际上是同一个角度。除此之外还有万向锁的问题。所以欧拉角不是一个好的选择。
旋转矩阵也是一个选择,但是旋转矩阵的自由度实际上是3,用一个3x3的矩阵来表示旋转显然是多余的。除此之外,旋转矩阵需要满足单位正交的限制,如何在训练目标中加入这个限制条件也是一件难事。所以直接回归旋转矩阵也不是一个好的选择。
四元数就是用一个四维向量来表示旋转,具体什么是四元数这里就不讲了,有兴趣的请查阅其他资料。但是四元数需要满足一个限制,就是这个四维向量必须是一个单位向量。你很难让网络吐出来的结果满足这种限制,因此四元数也不是一个很好的选择。
总之,以上表示方法都有缺点,因此作者就考虑使用一种新的表示方法:旋转向量。旋转向量用一个三维向量的方向来表示旋转轴,用该三维向量的模来表示旋转的角度,所以没有上面的问题。
以上讲解了如何表示旋转,现在还要关心的是如何表示平移xyz。直接预测xy是不容易的,考虑这样一种情况,如果两个物体的z大小一致,但是xy不太一样,这样将3D物体投影到2D图像上之后,从图像上看表面非常相似,大小也相似,只是会在图片中的不同位置。因此很难通过2D图像中的物体来预测xy。因此作者提出通过目标检测得到2D bounding box的中心坐标,由这个中心坐标映射到相机的坐标系就可以得到xy坐标。具体如下:
其中 , (u0,v0)是2d边界框的中心点坐标, (cx,cy)是相机内参。注意:上面原图的第2个公式中写错了,应该是cx->cy
知道了如何表示旋转和平移,实际上就知道了模型的训练目标,基于此就可以设计模型了。
模型的架构和mask RCNN是一致的,如下图,只是多了一个pose预测分支。我们先来分别看每个分支。
class和box分支:这两个分支是公用一个head的,共用一个head代表分类和回归任务之间的gap比较小,本质上做的事情很像,所以可以共用一个分支。
Mask分支:mask分支和MaskRCNN的网络设计是一样的,唯一不同的是,输出的mask是与类别无关的,只是一个二值mask。而Mask RCNN中,mask的预测是和类别相对应起来的。为什么要这么做?我觉得这是因为mask预测在6d pose预测中是一个很必要的东西,但作者仍然保留下来。既然没什么用,但还保留下来,好吧,那就减少mask预测的复杂度,不管对于哪一类物体,只要预测mask就好了。
Pose分支:pose分支是本文新增的分支。与mask分支不同的是,pose预测是和类别有关的。也就是说每个类别的物体,都会对应一个pose预测。因此pose预测的输出维度是4×num_class。为什么这么做?我觉是因为pose我们的最根本任务就是预测pose,那么我pose预测针对每个类别来做,会更专业化,效果也会更好。这种做法在很多论文里都有这么做。
那么,网络的损失计算就包括了四个方面,总结如下:
分别包括分类,box回归,mask和pose损失。其中需要特别注意的是pose分支的loss:
这里将rotation和z分开算了,前面的系数表示它们的权重,言下之意就需要分别对待旋转和平移。
具体的实验结果这里不多说了,这里看一下实验的一个可视化结果:
这种通过直接回归6D姿态的方法非常直觉,也很简单,但这类方法想要很好地work的一个重要条件就是,2D图像的变化和6D姿态的变化要能够match,比如说,一个2D图像只有一个轻微的变化,但6D姿态可能变化很大,这种情况是很难让网络学习好的,除非我们有足够的数据进行训练,否则很容易过拟合。直接回归6D姿态应该此前就有人想过,但是可能效果不太好,而这篇文章则验证了直接回归6d姿态也是一个可行的方法,可以说是提供了一种新的思路。
这是CVPR-wrokshop上的一篇总结。站在大佬的肩膀上看世界,看看最新的研究进展和发展。文章指出5点3D视觉比2D视觉更加复杂的原因:
如下图所示的内容,除去19年薪的内容,经典的文章可以如下:
主要可以分为two-stage和three-stage,果然维度提升一维,难度加大的不是一点点。
按照输入的数据,把目前3D-detection的文章分类如下;一般来讲,只使用2维数据(单目和立体的数据)的效果并没有结合3维数据的好。
下图表示了目前几种主流(除去19年)的3D检测的方法的Bbox和proposals 生成方法的对比:
该方法使用三维滑动窗口的方法。首先将点云栅格化,然后使用固定大小的三维窗口,使用CNN判断该窗口的区域是否为车辆。由于栅格化的稀疏性质,该文章使用了稀疏卷积的操作,将卷积核做中心对称,将卷积操作变为投票操作,使得该投票操作只用在不为0的栅格点进行投票即可,减少了大量空卷积的操作。具体投票方式见下图。
具体投票为将中心对称过后的卷积核的中心与非零点对齐,然后相乘,即可得到改点的投票。将多点投票的重叠的区域相加,得到输出。
MVNet使用点云和图像作为输入。点云的处理格式分为两种:第一种是构建俯视图(BV),构建方式是将点云栅格化,形成三维栅格,每一个栅格是该栅格内的雷达点最高的高度,每一层栅格作为一个channel,然后再加上反射率(intensity)和密度(density)的信息;第二种是构建前视图(FV),将雷达点云投影到柱坐标系内,也有文章叫做range view,然后栅格化,形成柱坐标系内的二维栅格,构建高度、反射率和密度的channel。
使用俯视图按照RPN的方式回归二维proposal,具有(x, y, w, l)信息,角度只分成0和90度两种,z和h的信息在这一步被设置为常量。然后将三维的proposal进行多个角度的ROI pooling,fusion过程可使用concatenation或summation。最后加上经典的分类头和回归头。
文章中强调使用俯视图的好处
“We use the bird’s eye view map as input. In 3D object detection, The bird’s eye view map has several advantages over the front view/image plane. First, objects preserve physical sizes when projected to the bird’s eye view, thus having small size variance, which is not the case in the front view/image plane. Second, objects in the bird’s eye view occupy different space, thus avoiding the occlusion problem. Third, in the road scene, since objects typically lie on the ground plane and have small variance in vertical location, the bird’s eye view location is more cru- cial to obtaining accurate 3D bounding boxes. Therefore, using explicit bird’s eye view map as input makes the 3D location prediction more feasible.”
本文提出的俯视图的构建过程非常有参考价值,是后续多篇文章所参考的依据。
用R-FCN检测车辆。详细解读传送门
该方法使用图像和激光雷达检测障碍物。
先说下一大体流程:
(1)采用2D优秀的检测方法对深度图的RGB进行检测出物体。
(2)根据检测出来的物体可以确定视锥,文章说的是根据投影关系确定的,所以也不用去考虑什么viewpoint这个无聊的问题。
(3)在视锥内的点进行实例分割,实际上也就是语义分割而已。采用的是一个pointnet的变种结构。这样就算是得到了对应的点。然后在做一次坐标变换,把中心点变换到坐标原点上去。
(4)采用一个T-NET对姿态进行调整,也就是旋转到gt类似的姿态;然后进行的是对size和angel的回归,作者采取了anchor的形式,多个size,多个angel。进行回归。值得注意的一点在于文章的corner-loss的使用。没有细看这个损失。
讲一下文章的贡献点吧:
采用原数据输入。。。文章的意思是没有使用voxel的方式吧。是anchor_free的方法。
坐标转化的使用,很重要,这一点也不算亮点,但是是个trick,后续的PointRCNN也是如此,多次坐标变换得到一个好的结果,我觉得后者就是借鉴了本文的坐标变换,如下图的第三个和第四个所示:
其中包含三次坐标变换如下图:
相比于Pointnet,T-net的训练是受监督的。
“However, different from the original STN that has no direct supervision on transformation, we explicitly supervise our translation network to predict center residuals from the mask coordinate origin to real object center.”
在回归3D box时,该文还提出同时使用Smooth_L1和Corner loss,以提升回归的准确性
"While our 3D bounding box parameterization is compact and complete, learning is not optimized for final 3D box accuracy – center, size and heading have separate loss terms. Imagine cases where center and size are accurately predicted but heading angle is off – the 3D IoU with ground truth box will then be dominated by the angle error. Ideally all three terms (center,size,heading) should be jointly optimized for best 3D box estimation (under IoU metric). To resolve this problem we propose a novel regularization loss, the corner loss:
"
这里提前给一下pointRCNN的变换,下图所示,是不是也是移到中心,然后再正交对齐。
那么依旧不足如下:
利用Anchor grid作为感兴趣区域进行Crop和Resize到同一大小,然后将两者的特征进行element-wise sum,然后进行3D proposals的第一次回归。然后进行NMS,使用proposals对feature map再次进行Crop和Resize, 然后再次回归,修正proposals,通过NMS得到Object Bounding Boxes。
上图中左边的Fully Connected Layers回归车辆位置的尺寸,右边的Fully Connected Layers回归车辆的朝向角。
该文章提出了使用PointNet++作为主干网络使用two-stage的方法进行目标检测的方法。该方法首先使用PointNet++得到point-wise的feature,并预测point-wise的分类和roi。然后扩大roi,使用上一步得到的feature再使用PointNet++优化3D Box。具体的网络结构可以参考我的另一篇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筛选和回归。
优势点:
不足:
详细解读传送门
详细解读传送门
详细解读传送门
详细解读传送门
[详细解读传送门(https://blog.csdn.net/wqwqqwqw1231/article/details/100565150)
[详细解读传送门(https://blog.csdn.net/wqwqqwqw1231/article/details/100541138)
本文更偏重于讲一些数据增广的方法和小技巧。
详细解读传送门
本文主要的贡献是解决跨线数激光雷达的训练和检测的鲁棒性问题。
详细解读传送门
本文提出了不使用神经网络生成proposal的方法,该方法的另外一个先进性在于inference过程和train过程的使用点云的数量可以不同,使得部署更方便。
详细解读传送门
目前KITTI榜首。
详细解读传送门
该文章是3D Object Detection的早期之作,使用的方法就是3D卷积,pytorch中有对应的函数torch.nn.Conv3D。方法简单,与YOLOv1思路类似。进行三维卷积和池化,提取高维特征,然后反卷积得到分辨率适中的feature map然使用分类头和回归头预测Bounding Box。
相比后来的方法,该方法显得粗糙一些,但是本论文是将3D Object Detection从传统方法过度到深度学习的文章之一,还是有值得学习之处。
两篇文章作者来自同一个机构,姑且认为两篇文章有联系。这两篇文章用的方法也如出一辙,都是使用MVNet俯视图的构建方法,然后利用YOLO在俯视图上做Object Detection,只不过是回归变量多了一个维度和角度,就解决了3D Object Detection的问题。
方法没有什么创新之处,文章中提到了Frustum Pointnet的不足之处。
“This approach has two drawbacks: i). The models accuracy strongly depends on the camera image and its associated CNN. Hence, it is not possible to apply the approach to Lidar data only; ii). The overall pipeline has to run two deep learning approaches consecutive, which ends up in higher inference time with lower effciency.”
说出了Frustum Pointnet在构建proposal的时候依赖CNN这个问题。
PIXOR思路非常简单,容易理解。计算过程如上图:
类似于MVnet,将点云转为俯视图表示。
使用resnet进行特征提取,然后upsample至原图1/4的大小。
然后加入分类头和回归头。
整个网络框架如下图
我认为这个方法类似于YOLO的思想,One Shot将box分类和回归。Feature Map上采样至俯视图尺寸的1/4,相当于YOLO中的每个格子为4*4个像素。该方法回归的变量均是2维变量:俯视图中的中心点、长宽和方向角。
该论文是PIXOR的延续之作,使用了PIXOR的网络框架,加入了高精地图的信息,使得检测更准。该论文首先假设高精地图是存在的,那么对于俯视图中,就有道路的的mask和路面的高度。该论文对PIXOR的改进之处体现在将点云转为俯视图过程中,将雷达点的高度z减去对应的高精地图中储存的该点的高度,做此变换之后然后栅格化地图,之后就与PIXOR相同。这样做的目的,论文中提到是减小道路坡度影响,因为PIXOR在进行车辆的Bounding Box的回归时没有考虑高度这个轴,所以这样做直观感觉确实可以提高精度。然后该论文提出了不存在高精度地图的情况,那么就先栅格化点云,然后用U-net在俯视图中做road segmentation和ground estimation(这一步就可以认为是在线地估计高精地图)。
详细解读传送门
PointPillars
很清晰的三个阶段:
只说一下第一步:
如何把3D特征转化为2D图片呢?
(1)分柱子。把俯视图分成[Math Processing Error]H \times WH×W个小方格子,再沿着z轴向上拉就成了柱体。
(2)提特征。每个柱体中的点作为一个集合,采用和voxel一样的方式提取特征,最后采用最大池化为[Math Processing Error][T,1,C][T,1,C]
(3)转化为二维。因为[Math Processing Error]T=H\times WT=H×W,所以我们最后可以变化成[Math Processing Error][H,W,C][H,W,C],这是啥,这不就是2D卷积的东西了吗。
优势:
不足:
另一种分类方式,是从网络的输入和网络结构来分。对这种分类的详细的解释,可以参考我的另一篇博客三维激光雷达点云处理分类。
这种分类方式由于输入的不同,数据本身就有独自的优势和劣势:
2D CNN的使用方法:
就点云输入的研究热点
一些重要的trick
可能有发展的Idea
4.2.1.1 GSPN
(1)预测一个对目标ins的中心
(2)对每一个预测的中心采取一个多尺度特征提取的方式进行特征提取。
(33)对提取到的特征和近似的分布进行采样联合生成一个bbox。
(1) 在训练时,展现的内容是KL-loss不收敛。
(2)研究了生成预测中心的loss,在实例分割中,随机采样的128个点都是有所属实例,因此存在着对应的GT,但是在Kitti数据集中,并不是所有点都有实例。因此网络需要密集采样,但是目前采样点数过多就会导致无法训练。
(1)想要解决的问题:
(2)网络整体结构图可以如下所示:
(3)对代码中5中LOSS的理解,看个人理解的博客。
上面一篇GSPN的文章重点是在于对实例点的生成ins,但是运用到det的任务时就不能够采样到很多的gt的点,导致需要密集采样才可完成,这一篇文章是采用了GRU的attention,能够从[Math Processing Error]12\times 1212×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 [email protected]
,然后在本地对应的浏览器上输入网址:http://127.0.0.1:16666/