热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

3D目标检测深度学习方法中voxelrepresetnation内容综述(三)

作者:蒋天园来源:公众号@3D视觉工坊链接:3D目标检测深度学习方法中voxel-represetnation内容综述(三)前言前两篇文章:3D目标检测深度学习方法中vox

作者:蒋天园

来源:公众号@3D视觉工坊

链接:3D目标检测深度学习方法中voxel-represetnation内容综述(三)

 

前言

前两篇文章:3D目标检测深度学习方法中voxel-represetnation内容综述(一)、3D目标检测深度学习方法中voxel-represetnation内容综述(二)分别介绍了当前voxel-representation方法的backbone和主流的研究进展。即目前主要可以分为如下的几个方向做出研究内容的改进:
(1)refine(2)loss(3)fusion(4)backboe -structure(5)others。
前面的文章中已经介绍到了基于refine和loss研究工作,这一篇主要介绍剩下的在3D目标检测中做研究的思路。

1. Fusion

1.1多模态融合和单模态多特征融合

就研究中的Fusion工作,也可以分为多模态信息融合和单模态多特征的融合。可以按照如下图来理解这里二者的差异,下图表示的是如果采用多传感器信息融合则是多模态,这一部分研就目前受到一些限制,比如因为view角度的不同,多传感器的信息精准融合是需要准确的信息;其次,在多传感器信息融合时需要考虑到时间帧问题,如果具有时差的数据融合也是很具有难度的。值得一提的是,目前很多研究工作都热衷于基于lidar的单模态做研究,做融合的工作还有着很大的发展空间的。

单模态多特征信息融合可以用如下的特征框表示。即可以采取多特征提取的方式对lidar数据做不同的特征提取,然后通过特征融合模块得到融合后的特征,再通过RPN网络学习到bounding-box的七个维度信息。

1.2 多模态特征融合

这里分享比较近的两篇文章。第一篇是来自浙大和阿里的合作工作,发表在AAAI20上的PI-RCNN。文章地址是:https://arxiv.org/pdf/1911.06084.
具体的网络结构如下。可以理解为一个两阶段的方法,其中stage-1是利用了在综述(一)中的backbbone提取高质量的3D候选框;而stage-2则是一个信息融合和候选框优化的过程。该阶段会利用通过对二维图像进行语义分割得到的分割后的图像信息。

具体的融合模块如下图所示。

1.首选第一步是根据image和lidar的映射关系<下面括号是补充知识>(该映射关系根据图像到点云的投影矩阵计算得到,可以表示为下图所示的意思,每一个点实际上是可以和部分像素存在空间上的映射关系的,但是值得提到的是,由于KITTI数据中的相机存在多个,并且不同相机之间的数据是存在重叠的,也就是点云中一个点的数据可能是对应着不同相机在同一时刻拍摄到的图像中的某一块像素,所以选择哪个view拍摄到的图像也是需要做研究的,此外,这种通过映射关系的融合(目前也只有这种融合)存在image和point的尺度不对等问题,也就是说point的远近在图像中所对应的pix的数量也是不一致的,但是也都符合两种传感器的特性,即越远对应的细节信息越少)。

2.根据上面的索引关系可以得到每一个点对应到二维分割的特征信息,然后作者再采用了一个注意力模块将特征维度降维提取,最后做multi-feature的concat在一起做三维点云上的refine。本文的大概思路也就是如此,但是是第一个在将二维特征信息通过检索到三维点上的研究工作,之前的多模态融合的特征融合都是在feature上做融合,而本文的融合则是在refine模块做的融合,进一步的提高了检测的performance.第二篇分享的文章来自CVPR20的研究工作,pointpainting。文章地址:https://arxiv.org/pdf/1911.10150.pdf
也是一个将二维分割特征融合进三维点云的多模态信息融合工作,如下。作者给出的问题是在image中可以对小物体,例如杆子和行人清晰的辨认出,但是在Lidar模态中,看上去却很相似,因此作者想把这部分在image中可以清晰被辨认出的信息融合到在点云信息中,以提升目标检测的精度。

融合的方式和上文的PI-RCNN的又不一样,本文则是将分割得到的特征直接附加给点云,再送入到目标检测的框架中,而不是在refine阶段再做特征信息融合。可以简单的理解为“early-fusion”的概念,不做过多的处理直接把分割信息和点云最原始的特征叠加在一起。作者在多个baseline上做了实验对比,均显示这种多模态分割信息是有助于做3D目标检测任务的。

1.3 单模态多特征融合

由于这个系列都在介绍lidar的研究工作,那么仅仅依靠lidar特征,做特征信息融合应该怎么做;这里把之前稍微有介绍到的文章再做另外的角度的理解。
第一篇文章是来这CVPR20的HV-Net,文章地址为:https://arxiv.org/pdf/2003.00186
如下图所示,本文的核心思想是改变多组voxel划分的参数大小,对不同尺度的信息做提取,然后再多Multi-scale的特征融合。也就是说在对每一组不同的voxel参数做特征提取时,会采用一个同样的方法做多尺度的信息提取。最后也就会对应着一组特征,再利用类似二维图像中FPN的结构对multi-scale的特征进行融合即可。

第二篇在单模态上做特征融合的工作可以是CVPR20上表现最为出色的工作PV-RCNN。之前也有很多笔者写了很多的解读。文章地址是:https://arxiv.org/pdf/1912.13192.pdf。
同时最近笔者也看了原作者在B站上关于3D目标检测的一些内容讲解,地址分享:https://www.bilibili.com/video/BV1E741177wr/
强烈推荐做相关研究的同学去看一下。
回到正文,如下图所示,PV-RCNN是一个两阶段的方法,其中stage-1也是用在综述(一)中所介绍的稀疏backbone,通过该backbone提出高质量的候选框,然后通过二阶段的优化进一步得到最终的回归框,但是在文章的refine阶段是多特征voxel特征在点上的融合,如下图所示的内容,multi-scale的voxel的特征经过索引回到point-representation,最后通过作者提出的ROI-Pooling模块得到经过融合后的key-points在grid-points上的特征表示。最后通过grid-poits做进一步候选框的优化。

可以说,本文的研究工作不仅仅是一个multi-scale的voxel的特征信息融合,同时也是point和voxel的融合。point的方法具有可变多尺度感受野的特征,而voxel的方法的高效性在本文中也得到了很好的体现。

2.Backbone-Structure

在网络结构上做出创新的工作目前都需要在representation上做出创新,比如今年CVPR20上的PointGCN通过对point-cloud做建图然后设计图卷积网络作为backbone,在笔者之前的博客中有细致的讲到过这一篇文章,按分类也不能再分为voxel-represntation的表示形式。
这里笔者也介绍两篇在voxel领域中的新的backbone-structure。

2.1 cube voxels和sphere voxels

如下图所示,为两种不同的voxel表达形式,笔者之前综述中也介绍到了cube-voxels的表达形式,但是实际上在ICCV19上的一篇文章提出了通过划分sphere来做为voxel对局部的点做特征提取。对比cube形式,sphere最大的好处在于没有朝向问题,我们知道假如目标检测的一个car在一个cube的anchor中,那么需要对该朝向首先设置一个标准值(目前是90度和180度,也有更多的,比如在文章fast-point-rcnn中设置的是45,90,135和180四个角度),但是在sphere的anchor中则不需要这样的设置,这样可以减少倍数的anchor占用。

2.2 对应研究工作

作为介绍性文章,只对文章做主要内容介绍,不做过多的探究。要想获得深刻的认识需要阅读原文和对应的代码。
第一篇文章是上面提到的ICCV19的STD,文章地址为:https://arxiv.org/pdf/1907.10471
来自腾讯优图和港科大的研究工作,是一年前的工作了。为一个两阶段的方法,如下图所示。
(1)第一个阶段PGM是通过一个man-made的球形anchor生成一个proposal(这就和voxelnet系列不一样了,voxelnet系列都是预先定义一个anchor每个anchor一个proposals,而不是要生成一个proposal,最大的区别是:voxelnet系列的特征是以小size的anchor为单位的,而这一篇文章则是以一个“proposal”提取的),作者是先通过语义信息对每一个点生成一个球形anchor,再通过nms得到最终的分类proposals,接下来是pointpool层得到每一个proposals的特征,采用的是VFE。
(2)第二阶段则是作者的IOU Branch和Box Prediction Branch的结合。(感觉这才是巨大的创新)

STD在KITTI上的表现在当时是很好的,下面这一篇是最近才放在arxiv上的研究工作,可以说是STD的后续研究,来自电子科技大学,目前就其在论文中展示的精度,超过了PV-RCNN,获得了新的冠军,按照投稿的单栏形式,应该是NIPS20。
文章地址:https://arxiv.org/pdf/2006.04043
主要网络结构如下图所示,如果说它是一个fusion的研究工作也是可以的,作者提出了新的voxel-graph的表示形式来进一步优化在voxel表示中存在的问题。voxel-based的方法对Local-pointnets的局部之间不能建立联系。所以本文从这个点出发建立了Voxel-GraphAttention Network。该网络首先在球型体素内构造局部graph,然后再通过voxels构造全局global KNN。这里的局部的graph和全局的graph用于注意力机制去强化提取到的特征。可以看出在sphere-voxel-graph的模式下特征通过图得到了更好的提取和融合。

最后看一下该文章在KITTI-test数据集上的表现,如下。可以看出比高居榜首长达半年的PV-RCNN还要推进了1个点。非常好的工作,开源后一定要研读一番。

3. 补充知识

3.1 3D-Bbox可视化

也是因为笔者最近参加了一个训练营,其中有一个赛题是和该项目相关,所以在对场景可视化方面做了一下工作。
如下图,可以看出128线的数据具有以下的几个特点:

  • 点云场景稠密

  • 场景中的object比较多,相对KITTI而言多很多,场均有50+,而kitti一帧能有10个已经是很多的了

  • 全场景的数据标注(对于KITTI而言仅仅在FOV视角下的点才得以保留,原因是KITTI的标注只有FOV内)

  • 点云数据Z轴朝上(对于KITTI是Y轴朝上,因此旋转轴是Y轴)

  • 以右手系建立,其中z轴指向上方(在KITTI中y轴指向上方),读取的文件信息(****.bin)包含了(x,y,z,intensity),也是分别和三轴位置对应。

bbox可视化

读取到的信息是Bbox的中心(x,y,z)和对应的长宽高(l,w,h分别对应着坐标轴的x,y,z三个轴),以及对应的z轴顺时针旋转角(yaw)
所以可视化的想法就是从上面的label信息得到bbox的八个角点,然后通过把对应的角点连线画出bbox即可。解决思路可以分解为两步:1.在不考虑旋转角度情形下计算八个角点的x,y,z的坐标。

2.在得到的每一个角点的基础上加入旋转角度,这里的数据考虑的是沿着z轴的顺时针旋转。笔者以一个点为例展示三维旋转矩阵的求取。

所以最终坐标转换代码为:
defboxes3d_to_corners3d_camera(boxes3d, bottom_center=False):    boxes_num = boxes3d.shape[0]    l,w,h=boxes3d[:, 3], boxes3d[:, 4],boxes3d[:, 5]    x_corners = np.array([l / 2., l / 2., -l /2., -l / 2., l / 2., l / 2., -l / 2., -l / 2], dtype=np.float32).T    y_corners = np.array([w / 2., -w / 2., -w /2., w / 2., w / 2., -w / 2., -w / 2., w / 2.], dtype=np.float32).T    z_corners = np.array([h / 2., h / 2., h /2., h / 2., -h / 2., -h / 2., -h / 2., -h / 2.], dtype=np.float32).T    ry = boxes3d[:, 6]    zeros, Ones= np.zeros(ry.size,dtype=np.float32), np.ones(ry.size, dtype=np.float32)   rot_list = np.array([[np.cos(ry), np.sin(ry),zeros ],                         [-np.sin(ry),  np.cos(ry), zeros],                         [zeros,      zeros,       ones]]) # (3, 3, N)    temp_corners =np.concatenate((x_corners.reshape(-1, 8, 1), y_corners.reshape(-1, 8, 1),                                  z_corners.reshape(-1, 8, 1)), axis=2) # (N, 8, 3)    rotated_corners = np.matmul(temp_corners,R_list)  # (N, 8, 3)    x_corners, y_corners, z_corners =rotated_corners[:, :, 0], rotated_corners[:, :, 1], rotated_corners[:, :, 2]    x_loc, y_loc, z_loc = boxes3d[:, 0],boxes3d[:, 1], boxes3d[:, 2]    x = x_loc.reshape(-1, 1) +x_corners.reshape(-1, 8)    y = y_loc.reshape(-1, 1) +y_corners.reshape(-1, 8)    z = z_loc.reshape(-1, 1) + z_corners.reshape(-1,8)    corners = np.concatenate((x.reshape(-1, 8,1), y.reshape(-1, 8, 1), z.reshape(-1, 8, 1)), axis=2)    return corners.astype(np.float32)通过mayavi可视化如下:

推荐阅读

[1] PI-RCNN: An EfficientMulti-sensor 3D Object Detector with Point-based Attentive Cont-conv FusionModule
[2] Multi-view 3d object detection network for autonomous driving
[3] PointPainting: Sequential Fusion for 3D Object Detection
[4] HVNet: Hybrid Voxel Network for LiDAR Based 3D Object Detection
[5] STD: Sparse-to-Dense 3D Object Detector for Point Cloud本文仅做学术分享,如有侵权,请联系删文。


推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
author-avatar
life-death-swallow_204
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有