MVX-Net Multimodal VoxelNet for 3D Object Detection 论文学习

论文链接:MVX-Net Multimodal VoxelNet for 3D Object Detection

1. 解决了什么问题?

2D 目标检测取得了显著成效,但由于输入模态的本质区别,CNN 无法直接应用在 3D 检测任务。LiDAR 能准确地定位到 3D 空间的物体,基于 LiDAR 数据的检测方法通常优于 2D 方法。

一些方法将 3D 点云转换为特征表示,如 BEV maps,然后用 2D-CNN 方法来做检测和分类。但这些方法对于点云稀疏或几何变化大的物体效果就不太好。另一些方法则在体素网格中表示 3D 点云,然后用 3D CNN 来做预测。这类方法通常受限于内存占用,尤其是处理全场景时。

VoxelNet 将 LiDAR 点云体素化,用一组 Voxel Feature Encoding(VFE) 层来编码这些体素。这样,VoxelNet 就可以使用 3D RPN 来做检测。

与点云相比,图像能提供更加稠密的纹理信息,我们可以将图像和点云结合使用,提升检测的表现。

2019 年前后,涌现了诸多基于 LiDAR 点云的 3D 目标检测方案。这些方法表现不错,但它们一般只依赖于某一种模态,无法利用其它模态的信息,如相机。另一些方法则尝试通过复杂的流程或是后融合的方式来处理多模态数据,无法在早期阶段学习各模态间的交互。

2. 提出了什么方法?

本文基于 VoxelNet 架构提出了多模态的 VoxelNet。为了融合图像和点云数据的信息,首先从 2D 检测网络的最后一个卷积层提取特征。该 2D 网络是在 ImageNet 上预训练,然后对 2D 检测任务做微调得到。高层级的图像特征编码了语义信息,可作为先验来帮助推理目标。

本文扩展了 VoxelNet,提出了两种融合技术:

  • PointFusion:前融合方法,将点云投影到图像平面,然后用预先训练好的 2D 检测器来提取图像特征。然后将图像特征和对应的点云 concat,输入 VoxelNet。
  • VoxelFusion:将 VoxelNet 产生的非空 3D 体素投影到图像平面,然后对于每个体素的投影,用预先训练好的 CNN 提取出相应的图像特征。随后对这些图像特征做池化,添加到每个体素的 VFE 特征编码后面,然后用 3D RPN 来输出 3D 边框。

2D 检测网络

与激光雷达点云相比,RGB 图像能捕捉到丰富的色彩和纹理信息。为了提升 3D 检测准确率,本文方法将提取得到的高层级语义特征,融合到 VoxelNet 算法中。2D 检测网络 Faster RCNN 包括一个 RPN 和一个 RCN。基线模型是在 ImageNet 上预训练的 VGG16,然后用 2D 检测数据集对 Faster RCNN 微调。推理时,提取出 VGG16 网络的 conv5 \text{conv5} conv5层的特征,与点云或体素做融合。

VoxelNet

将 VoxelNet 作为 3D 检测的基线模型有两个原因:

  • 输入是原始点云,无需人为设计特征;
  • 提供了一个 3D 空间内有效的接口(点云或体素),方便融合不同细粒度的图像特征。

VoxelNet 包括三个模块:Voxel Feature Encoding 层、卷积中间层、3D RPN。VFE 是一个特征学习网络,在单个体素层级编码原始点云。给定一个点云,3D 空间被划分为大小相同的体素,将点划分到体素中。然后用一组 VFE 层来编码各个体素。首先,体素内的每个点 p i = [ x i , y i , z i , r i ] T \mathbf{p}_i=[x_i,y_i,z_i,r_i]^T pi=[xi,yi,zi,ri]T(包括 XYZ \text{XYZ} XYZ坐标以及反射值)用它的坐标和相对于体素内质心(centroid)的相对偏移量表示,即 p ^ i = [ x i , y i , z i , r i , x i − v x , y i − v y , z i − v z ] T ∈ R 7 \hat{\mathbf{p}}_i=[x_i,y_i,z_i,r_i,x_i-v_x,y_i-v_y,z_i-v_z]^T\in \mathbb{R}^7 p^i=[xi,yi,zi,ri,xivx,yivy,zivz]TR7,其中 x i , y i , z i , r i x_i,y_i,z_i,r_i xi,yi,zi,ri p i \mathbf{p}_i pi的坐标和反射值, v x , v y , v z v_x,v_y,v_z vx,vy,vz p i \mathbf{p}_i pi所属的体素内点的 centroid 坐标。然后,每个 p ^ i \hat{\mathbf{p}}_i p^i都通过 VFE 层(一个全连接网络)变换到特征空间,聚合 3D 点特征的信息,编码体素内的表面形状。全连接网络包括一个线性层、BN 层和一个 ReLU 层。使用逐元素的 max-pool \text{max-pool} max-pool操作来聚合每个体素内的特征,再将 max-pool \text{max-pool} max-pool后的特征向量与点特征 concat \text{concat} concat起来,得到最终的特征 embedding。所有的非空体素编码过程是相同的,共享全连接网络的参数。VFE 层将输入的点云数据变换成高维特征。

VFE 层的结果会输入进一组卷积中间层,用 3D 卷积来聚合体素特征。这些层会融入额外的上下文信息,提升检测表现。
卷积中间层后面跟着一个 RPN 网络,做 3D 检测。该网络包括三个全卷积层组成的模块。每个模块的第一层是通过步长为 2 2 2的卷积,对特征图做下采样,随后是步长为 1 1 1的卷积。每个卷积层后是一个 BN 和 ReLU 层。每个模块的输出会被上采样到固定大小,然后 concat \text{concat} concat起来构建一个高分辨率的特征图。最后,将该特征图映射成概率得分图和回归图。

Multimodal Fusion

VoxelNet 基于单模态,将其适配到多模态输入可以提升其表现。本文提出了两个简单的融合方法。

PointFusion

属于前融合方法,每个 3D 点都会与图像特征融合,获取稠密的语义信息。该方法首先使用一个预先训练好的 2D 检测网络提取高层级特征图,编码图像的语义。然后利用标定参数,将每个 3D 点投影到图像上,将投影位置索引的特征添加到该点的后面。注意,图像特征来自于 VGG16 网络的 conv5 \text{conv5} conv5层。先用一个全连接层将其从 512 512 512维降至 16 16 16维,然后 concat \text{concat} concat到点特征后。用一组 VFE 层来处理这个新的特征,最后用于检测。

下图是 MVX-Net PointFusion 方法,使用预先训练好的 2D Faster RCNN 计算图像特征图,RPN 和 RCN 并不用于 3D 推理流程。使用标定参数将 3D 点投影到图像,把对应的图像特征添加到 3D 点的后面。随后,VFE 层和 3D RPN 处理聚合后的特征,输出 3D 结果。
在这里插入图片描述

优点:图像特征很早就被 concat \text{concat} concat到一起,网络通过 VFE 层能学到两个模态有用的信息。

VoxelFusion

PointFusion 在早期阶段融合特征,而 VoxelFusion 则在较后面才做融合,图像特征添加到体素里面。VoxelNet 的第一阶段是将 3D 空间划分为相同大小的体素。根据 3D 点的位置将它们划分到各个体素里面,然后用一组 VFE 层来编码。将每个非空体素投影到图像平面,得到 2D ROI。使用 2D 预训练检测器的特征图(VGG16 的 conv5 \text{conv5} conv5层),池化 ROI 特征,输出 512 512 512维的特征向量,然后进一步降维成 64 64 64维,添加到 VFE 层输出的每个体素的特征向量的后面。这个过程编码了 2D 图像上每个体素的先验信息。

下图是 MVX-Net VoxelFusion 方法,使用预先训练好的 2D Faster RCNN 计算图像特征图,RPN 和 RCN 并不用于 3D 推理流程。使用标定参数将非空体素投影到图像,提取 ROIs。然后池化每个 ROI 内的特征,添加到 VFE 层计算出的体素特征后面。随后,3D RPN 处理聚合后的特征,输出 3D 结果。

在这里插入图片描述

尽管 VoxelFusion 的融合相对靠后一些,输出的结果略逊于 PointFusion。但其优点如下:

  • 降低了对高分辨率 LiDAR 点云的依赖,可以将图像信息融合到空体素里面,这些空体素可能是 LiDAR 点缺失造成或者远距离目标。
  • VoxelFusion 在内存占用上更加高效。

训练细节

2D 检测器

使用 Faster RCNN 网络,该双阶段检测架构包括一个 RPN 和一个 RCN。基线模型是 VGG16 架构,使用 RoIAlign \text{RoIAlign} RoIAlign操作来池化特征,再输入进 RCNN。在 conv5 \text{conv5} conv5层,使用了四组大小是 { 4 , 8 , 16 , 32 } \{4,8,16,32\} {4,8,16,32}的 anchors,以及三个宽高比 { 0.5 , 1 , 2 } \{0.5,1,2\} {0.5,1,2}。如果与 ground-truth 框的 IoU ≥ 0.7 \text{IoU}\geq 0.7 IoU0.7,anchors 则为正样本;如果与 ground-truth 框的 IoU < 0.3 \text{IoU}< 0.3 IoU<0.3,则是负样本。训练时,图像的短边缩放为 600 600 600个像素,用翻转和随机噪声对数据集做增广。RCNN 阶段,batch size 为 128 128 128 25 % 25\% 25%的样本留作前景 ROIs。网络用 SGD 训练,学习率为 5 × 1 0 − 4 5\times 10^{-4} 5×104 momentum = 0.9 \text{momentum}=0.9 momentum=0.9

Multimodal VoxelNet

保留了 VoxelNet 的大部分设定。将 3D 空间划分为大小 v D = 0.4 , v H = 0.2 , v W = 0.2 v_D=0.4,v_H=0.2,v_W=0.2 vD=0.4,vH=0.2,vW=0.2的体素。使用了两组 VFE 层和三个卷积中间层。根据融合方式不同,这些层的输入和输出维度也不同。

  • 对于 PointFusion,VFE 层的配置为 VFE-1 ( 7 + 16 , 32 ) \text{VFE-1}(7+16, 32) VFE-1(7+16,32) VFE-2 ( 32 , 128 ) \text{VFE-2}(32, 128) VFE-2(32,128) VFE-1 \text{VFE-1} VFE-1的输入是将 3D 点特征和图像特征 concat \text{concat} concat起来,点特征有 7 7 7个维度,图像特征有 16 16 16个维度。2D 检测网络的 conv5 \text{conv5} conv5层的特征有 512 512 512个维度,然后降维至 96 96 96,最终用两个全连接层降至 16 16 16维。
  • 对于 VoxelFusion,VFE 层的配置为 VFE-1 ( 7 , 32 ) \text{VFE-1}(7, 32) VFE-1(7,32) VFE-2 ( 32 , 64 ) \text{VFE-2}(32, 64) VFE-2(32,64)。2D 检测网络的 conv5 \text{conv5} conv5层的特征有 512 512 512个维度,然后用两个全连接层降维至 128 128 128维和 64 64 64维。然后将降维后的特征与 VFE-2 \text{VFE-2} VFE-2的输出 concat \text{concat} concat起来,每个体素就得到 128 128 128维的向量。

为了降低内存占用,在 RPN 中只使用一半个数的 ResNet blocks。对于这两个融合方法,网络用 SGD 训练,前 150 150 150个 epochs 的学习率为 0.01 0.01 0.01,然后学习率除以 10 10 10。尽管 RPN 变小了,也没有用特殊的数据增强,本文方法取得的准确率仍要明显高于原来只用激光雷达数据的 VoxelNet。

下图展示了在 KITTI 验证集上的可视化效果。(a) 是 VoxelNet,(b) 是用了 VoxelFusion 的 MVX-Net,© 是用了 PointFusion 的 VoxelNet。绿色框表示检测结果,红色框表示漏检和误检的结果。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28450.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Batch之读数据库——JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

electron+vue3全家桶+vite项目搭建【23】url唤醒应用,并传递参数

文章目录 引入实现效果实现步骤测试代码 引入 demo项目地址 很多场景下我们都希望通过url快速唤醒应用&#xff0c;例如百度网盘&#xff0c;在网页中唤醒应用&#xff0c;并传递下载链接&#xff0c;在electron中要实现这样的效果&#xff0c;就需要针对不同的平台做对应的处…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…

3天学会Ascend C编程 | Day1 Ascend C基本概念及常用接口

本文分享自《【2023 CANN训练营第一季】——Ascend C算子开发入门——第一次课》&#xff0c;作者&#xff1a;weixin_54022960 。 Ascend C是华为昇腾面向算子开发场景的编程语言&#xff0c;使用C/C作为前端语言的算子开发工具&#xff0c;通过四层接口抽象、并行编程范式、…

微服务系列文章 之 Nginx状态监控日志分析详解

1、Nginx状态监控 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况&#xff0c;这个功能由ngx_http_stub_status_module模块进行实现。 使用nginx -V 2>&1 | grep -o with-http_stub_status_module命令检测当前Nginx是否有status功能&#xff0c…

OpenMMLab MMTracking目标跟踪官方文档学习(一)

介绍 MMTracking 是PyTorch的开源视频感知工具箱。它是OpenMMLab项目的一部分。 它支持 4 个视频任务&#xff1a; 视频对象检测 (VID) 单目标跟踪 (SOT) 多目标跟踪 (MOT) 视频实例分割 (VIS) 主要特点 第一个统一视频感知平台 我们是第一个统一多功能视频感知任务的开源工…

数据结构day4(2023.7.18)

一、Xmind整理&#xff1a; 链表的插入和删除&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;顺序表去重 33 22 22 11 11 i jfor(int i0;i<list->len-1;i){for(int ji1;j<len;j){if(list->data[i]list->data[j]){delete_by_sub(j,list); …

WebRTC基础

有用的网址&#xff1a; https://webrtc.org/ WebRTC API - Web API 接口参考 | MDN Browser APIs and Protocols: WebRTC - High Performance Browser Networking(OReilly) 浏览器中查看webrtc运行的实时信息&#xff1a; Chrome浏览器&#xff1a;chrome://webrtc-inter…

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素&#xff0c;包括空值&#xff0c;任何元素&#xff0c;且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector&#xff0c;除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…

依赖注入三种方式,以及传统xml文件传参,还包括@Bean方式传参,还有Resource注入(详细版,每步都有提及)

获取bean对象&#xff0c;也称为对象装配&#xff0c;对象注入&#xff0c;依赖注入。 对象装配的实现方法有3种&#xff1a; 1.属性注入&#xff1b; 2.构造方法注入&#xff1b; 3.Setter注入。 再讲本节内容之前&#xff0c;我们先来提两个传参的方式&#xff0c;首先呢…

新手如何自学PostgreSQL(PG)

如果你是一个新手&#xff0c;想要自学PostgreSQL&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你入门&#xff1a; ①了解数据库基础知识&#xff1a;在开始学习PostgreSQL之前&#xff0c;建议你先了解一些数据库的基础概念和术语&#xff0c;例如表、列、行、SQL查…

什么是芯片组,南桥与北桥芯片的作用与区别

主板是连接计算机所有部件的PCB。在老式计算机中&#xff0c;所有芯片都分布在主板上。在现代计算机中&#xff0c;芯片数量减少并集中在特定位置。因此&#xff0c;将多个芯片组合起来形成一个芯片。这种可以替代大量芯片的芯片称为芯片组。主板上有一个芯片组。芯片组处理CPU…