DETR3D 论文学习

news2024/11/24 5:32:34

1. 解决了什么问题?

对于低成本自动驾驶系统,仅凭视觉信息进行 3D 目标检测是非常有挑战性的。目前的多相机 3D 目标检测方法有两类,一类直接对单目图像做预测,没有考虑 3D 场景的结构或传感器配置。这类方法需要多步后处理,融合不同相机输出的预测结果,去除冗余边框。另一类方法则使用了 3D 重建,从图像信息构造 pseudo-LiDAR 数据或场景的深度信息,然后应用 3D 目标检测方法。但是这类方法会面临复合性错误,若深度信息估计错了,则 3D 目标检测就会很受影响。

2. 提出了什么方法?

本方法针对 2D 现有信息和 3D 预测任务提出了一个 top-down 的方案,不需要预测深度信息。它从多个相机的图像中提取 2D 特征,使用一组稀疏的 3D object queries 索引 2D 特征,通过相机变换矩阵将 3D 坐标和多视角图像关联起来。对每个 object query 都会预测一个边框,然后使用 set-to-set 损失函数计算预测框和 ground-truth 的距离。
本方法包括 3 个部分。

  • 首先是一个 ResNet 主干网络,用于提取特征。
  • 其次是一个检测 head,通过几何的方式将 2D 特征和 3D 边框预测联系起来。每个 object query 编码一个 3D 坐标,映射到相机平面,通过双线性插值获取图像特征。然后使用 multi-head attention 层计算目标之间的关系,再用于优化 object queries。这一层会重复多次,交替地采样特征和优化 object query。
  • 最后计算一个 set-to-set 损失,训练网络。

在这里插入图片描述

2.1 特征学习

模型的输入是一个图像集合, I = { im 1 , . . . , im K } ⊂ R H i m × W i m × 3 \mathcal{I}=\lbrace \text{im}_1,...,\text{im}_K \rbrace \subset \mathbb{R}^{H_{im}\times W_{im}\times 3} I={im1,...,imK}RHim×Wim×3,相机参数矩阵 T = { T 1 , . . . , T K } ⊂ R 3 × 4 \mathcal{T}=\lbrace T_1,...,T_K \rbrace \subset \mathbb{R}^{3\times 4} T={T1,...,TK}R3×4,ground-truth 边框 B ⊂ { b 1 , . . . , b j , . . . , b M } ⊂ R 9 \mathcal{B}\subset \lbrace b_1,...,b_j,...,b_M \rbrace \subset \mathbb{R}^9 B{b1,...,bj,...,bM}R9,以及类别标签 C ⊂ { c 1 , . . . , c j , . . . , c M } ⊂ Z \mathcal{C}\subset \lbrace c_1,...,c_j,...,c_M \rbrace \subset \mathbb{Z} C{c1,...,cj,...,cM}Z。每个 b j b_j bj包括鸟瞰视角(BEV)的位置、大小、航向角、速度。模型从图像中预测出它们的边框和标签。

使用了一个 ResNet 和 FPN 来编码这些图像特征,得到 4 个特征集合 F 1 , F 2 , F 3 , F 4 \mathcal{F}_1,\mathcal{F}_2,\mathcal{F}_3,\mathcal{F}_4 F1,F2,F3,F4。每个集合 F k = { f k 1 , . . . , f k 6 } ⊂ R H × W × C \mathcal{F}_k=\lbrace f_{k1},...,f_{k6}\rbrace \subset \mathbb{R}^{H\times W\times C} Fk={fk1,...,fk6}RH×W×C对应 6 张输入图像的一个特征层级。这些多尺度信息为识别不同大小的目标提供了丰富的信息。

2.2 检测 Head

DETR3D 是迭代进行的,从 2D 特征图上预测边框,共有 L L L层。每一层的操作如下:

  • 关于 object queries 预测一组 3D 边框中心点坐标;
  • 通过相机变换矩阵,将这些中心点映射到特征图上;
  • 通过双线性插值采样特征,并融入 object queries;
  • 用 multi-head attention 计算出目标之间的关系。

每一层 l ∈ { 0 , . . . , L − 1 } \mathcal{l}\in \lbrace 0,...,L-1 \rbrace l{0,...,L1}都在一个 object queries 集合 Q l = { q l 1 , . . . , q l M ∗ } ⊂ R C \mathcal{Q}_l=\lbrace q_{l1},...,q_{lM^*} \rbrace \subset \mathbb{R}^C Ql={ql1,...,qlM}RC上操作,输出一个新的集合 Q l + 1 \mathcal{Q}_{l+1} Ql+1。从 object query q l i q_{li} qli解码出一个 reference point c l i ∈ R 3 c_{li}\in \mathbb{R}^3 cliR3
c l i = Φ ref ( q l i ) c_{li}=\Phi^{\text{ref}}(q_{li}) cli=Φref(qli)

其中 Φ ref \Phi^{\text{ref}} Φref是一个神经网络。 c l i c_{li} cli可以假定为 第 i i i个边框的中心点。接下来,通过相机矩阵,将 c l i c_{li} cli映射到图像上:
c l i ∗ = c l i ⊕ 1 c l m i = T m c l i ∗ c_{li}^*=c_{li}\oplus 1\quad \quad c_{lmi}=T_m c^*_{li} cli=cli1clmi=Tmcli

⊕ \oplus 表示 concat, c l m i c_{lmi} clmi是 reference point 映射到第 m m m个相机画面的位置,对其做了归一化 c l m i ∈ [ − 1 , 1 ] c_{lmi}\in [-1,1] clmi[1,1]。通过双线性插值获取图像特征:

f l k m i = f bilinear ( F k m , c l m i ) f_{lkmi}=f^{\text{bilinear}}(\mathcal{F}_{km},c_{lmi}) flkmi=fbilinear(Fkm,clmi)

f l k m i f_{lkmi} flkmi是第 l l l个网络层、第 m m m个相机、第 i i i个引用点、第 k k k个特征层的特征。
一个 reference point 并不会出现在所有的相机画面中,我们需要过滤掉无效的点。根据 reference point 是否映射到某图像平面之外,定义了一个 binary value σ l k m i \sigma_{lkmi} σlkmi

f l i = 1 ∑ k ∑ m σ l k m i + ϵ ∑ k ∑ m f l k m i σ l k m i and q ( l + 1 ) i = f l i + q l i f_{li}=\frac{1}{\sum_k \sum_m \sigma_{lkmi}+\epsilon}\sum_k \sum_m f_{lkmi}\sigma_{lkmi} \quad \text{and} \quad q_{(l+1)i} = f_{li} + q_{li} fli=kmσlkmi+ϵ1kmflkmiσlkmiandq(l+1)i=fli+qli

ϵ \epsilon ϵ防止除数为0。最终,对于每个 q l i q_{li} qli,用神经网络 Φ l reg \Phi_l^{\text{reg}} Φlreg Φ l cls \Phi_l^{\text{cls}} Φlcls预测一个边框 b ^ l i \hat{b}_{li} b^li和类别标签 c ^ l i \hat{c}_{li} c^li

b ^ l i = Φ l reg ( q l i ) and c ^ l i = Φ l cls ( q l i ) \hat{b}_{li}=\Phi_l^{\text{reg}}(q_{li}) \quad \text{and}\quad \hat{c}_{li}=\Phi_l^{\text{cls}}(q_{li}) b^li=Φlreg(qli)andc^li=Φlcls(qli)

训练时,计算每一层预测的边框 B ^ l = { b ^ l 1 , . . . , b ^ l j , . . . , b ^ l M ∗ } ⊂ R 9 \hat{\mathcal{B}}_l=\lbrace \hat{b}_{l1},...,\hat{b}_{lj},...,\hat{b}_{lM^*} \rbrace\subset \mathbb{R}^9 B^l={b^l1,...,b^lj,...,b^lM}R9 C ^ l = { c ^ l 1 , . . . , c ^ l j , . . . , c ^ l M } ⊂ Z \hat{\mathcal{C}}_l=\lbrace \hat{c}_{l1},...,\hat{c}_{lj},...,\hat{c}_{lM} \rbrace \subset \mathbb{Z} C^l={c^l1,...,c^lj,...,c^lM}Z。推理时,只使用最后一层的输出。

2.3 Loss

使用了 set-to-set 损失来计算预测集合 ( B ^ l , C ^ l ) (\hat{\mathcal{B}}_l, \hat{\mathcal{C}}_l) (B^l,C^l)和 ground-truth 集合 ( B , C ) (\mathcal{B},\mathcal{C}) (B,C)的距离。损失包括两个部分:类别标签的 focal loss、边框回归的 L 1 L_1 L1损失。Ground-truth 边框个数 M M M一般要小于预测框的个数 M ∗ M^* M,用 ∅ \varnothing 来补充 ground-truth 集合,使其元素个数等于 M ∗ M^* M。通过二分匹配,在 ground-truth 和预测框之间建立对应关系: σ ∗ = arg min ⁡ σ ∈ P ∑ j = 1 M − I { c j ≠ ∅ } p ^ σ ( j ) ( c j ) + I { c j ≠ ∅ } L b o x ( b j , b ^ σ ( j ) ) \sigma^* = \argmin_{\sigma\in\mathcal{P}} \sum_{j=1}^M -\mathbb{I}_{\lbrace c_j\neq \varnothing \rbrace} \hat{p}_{\sigma(j)}(c_j) + \mathbb{I}_{\lbrace c_j\neq\varnothing \rbrace}\mathcal{L}_{box}(b_j, \hat{b}_{\sigma(j)}) σ=argminσPj=1MI{cj=}p^σ(j)(cj)+I{cj=}Lbox(bj,b^σ(j)) P \mathcal{P} P表示所有排列组合的集合, p ^ σ ( j ) ( c j ) \hat{p}_{\sigma(j)}(c_j) p^σ(j)(cj)是索引为 σ ( j ) \sigma(j) σ(j)的预测框类别是 c j c_j cj的概率。 L b o x \mathcal{L}_{box} Lbox是边框的 L 1 L_1 L1损失。使用 Hungarian 算法解决这个分配问题,得到 set-to-set 损失:

L s u p = ∑ j = 1 N [ − log ⁡ p ^ σ ∗ ( j ) ( c j ) + I { c j ≠ ∅ } L b o x ( b j , b ^ σ ∗ ( j ) ) ] \mathcal{L}_{sup}=\sum_{j=1}^N\left[ -\log \hat{p}_{\sigma^*(j)}(c_j) + \mathbb{I}_{\lbrace c_j\neq\varnothing \rbrace} \mathcal{L}_{box}(b_j, \hat{b}_{\sigma^*(j)})\right] Lsup=j=1N[logp^σ(j)(cj)+I{cj=}Lbox(bj,b^σ(j))]

2.4 实验

2.4.1 数据集

作者使用了 nuScenes 数据集,包括 1000 个帧序列,每个序列约 20 秒,帧率是 20 FPS。每个样本包括从 6 个相机采集的画面 [front left, front, front right, back left, back, back right]。nuScenes 提供了相机的内参和外参。每 0.5 秒提供一个标注,总共有 2.8 万个训练样本、6000 个验证样本、6000 个测试样本。

2.4.2 Metrics

使用的 nuScenes 官方评价标准: average translation error (ATE), average scale error (ASE), average orientation error (AOE), average velocity error (AVE), 以及 average attribute error (AAE)。这些度量都是 true positive metrics(TP metrics),nuScenes 提供了 nuScenes Detection Score(NDS):
NDS = 1 10 [ 5 mAP + ∑ mTP ∈ T P ( 1 − min ⁡ ( 1 , mTP ) ) ] \text{NDS}=\frac{1}{10}\left[ 5\text{mAP} + \sum_{\text{mTP}\in \mathbb{TP}}(1-\min(1, \text{mTP})) \right] NDS=101[5mAP+mTPTP(1min(1,mTP))]

2.4.3 Model

包括一个 ResNet-101、一个 FPN、一个 DETR3D 检测 head。在 ResNet-101 的第 3 和第 4 阶段,使用了 deformable conv。FPN 输出 4 个特征图,大小分别是输入图像大小的 1 / 8 , 1 / 16 , 1 / 32 1/8,1/16,1/32 1/8,1/16,1/32 1 / 64 1/64 1/64。DETR3D 检测 head 有 6 层,每一层都由一个特征优化步骤和一个 multi-head 注意力层组成。DETR3D 检测 head 的隐藏维度是 256。最后是两个子网络,分别预测每个 object query 的边框的坐标信息和类别标签,每个子网络包含 2 个全连接层,隐藏层维度是 256。在检测 head 中也使用了 layer norm。

2.4.4 训练

训练时使用 AdamW 策略,weight decay 是 1 0 − 4 10^{-4} 104,初始学习率是 1 0 − 4 10^{-4} 104,在第 8 和第 11 个 epoch 学习率降为 1 0 − 5 10^{-5} 105 1 0 − 6 10^{-6} 106。在 8 张 3090 GPUs 上总共训练 12 个 epochs,mini-batch 为 1。

2.4.5 分析

下图中,作者可视化了每一层中 object queries 解码出的边框。随着层越来越深,预测边框越来越接近 ground-truth 框,证明迭代式的优化策略能大幅度提升检测表现。
在这里插入图片描述

如下图所示,作者将预测边框投影到相机画面和 BEV 视角。本方法能够给出合理的结果,甚至能检测出小目标。
在这里插入图片描述

3. 有什么优点?

  • 本方法无需根据图像信息进行点云重建或者深度估计,对深度预测造成的错误更加鲁棒。
  • 本方法无需任何后处理步骤如 NMS。
  • 在多相机的重叠区域,本方法显著优于其它方案。

4. 有什么问题?

DETR3D 从 2D 到 3D 的变换可能带来严重的问题:

  • 预测的 reference point 坐标可能不够准确,采样的特征位于目标区域之外;
  • 只有映射点附近的特征会被选取,无法从全局角度学习特征;
  • 特征采样过程复杂,使检测器很难应用。

因此构建一个端到端的、无需 2D 到 3D 变换的 3D 目标检测框架仍是一个问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tcpdump 抓包和记录、tshark 过滤抓包

目录 tcpdump 一、包名 二、可用参数 tcpdump -nn tcpdump -nn -i 网卡名 —— 指定显示的网卡 tcpdump -nn -i 网卡名 port 端口名 —— 指定显示的端口 tcpdump -nn -i 网卡名 not port 端口名 —— 排除指定的端口不显示 tcpdump -nn -i …

JavaWeb15 - web 应用常用功能 -文件上传下载

1. 基本介绍 文件的上传和下载,是常见的功能。后面项目就使用了文件上传下载。如果是传输大文件,一般用专门工具或者插件文件上传下载需要使用到两个包 , 需要导入说明: 2. 文件上传 2.1 文件上传的基本原理 ● 文件上传原理示意图, 一图胜千言 …

进程调度策略

1 先进先出 FIFO 2 最短任务优先 SJF https://blog.51cto.com/u_13064014/5079546?btotalstatistic

机器学习和大数据:如何利用机器学习算法分析和预测大数据

第一章:引言 近年来,随着科技的迅速发展和数据的爆炸式增长,大数据已经成为我们生活中无法忽视的一部分。大数据不仅包含着海量的信息,而且蕴含着无数的商机和挑战。然而,如何从这些海量的数据中提取有价值的信息并做…

【CANN训练营0基础赢满分秘籍】昇腾AI入门课(PyTorch)

1 昇腾AI全栈架构 昇腾计算产业是基于昇腾系列处理器和基础软件构睫的全栈Al计算基础设施.行业应用及服务,包括昇腾系列处理器、Atlas系列硬件、CANN (Compute Architecture for Neural Networks,异构计算架构》、Al计算框架、应用使能、全流…

LeetCode_Day4 | 好有难度的一个环形链表啊(在最后)!

LeetCode_链表 24. 两两交换链表中的节点1.题目描述2.虚拟头节点法1.思路2.代码实现 3.递归法1.思路2.代码实现 19. 删除链表的倒数第n个节点1.题目描述2.思路:双指针法3.代码实现 面试题 02.07. 链表相交1.题目描述2.思路3.代码实现 142. 环形链表 II1. 题目描述2.…

【SNAT和DNAT的原理与应用】

目录 一、SNAT原理与应用1、SNAT概述2、SNAT的应用环境3、进行SNAT转换后的情况 二、SNAT实验三、DNAT1、DNAT策略概述2、DNAT 实验 一、SNAT原理与应用 1、SNAT概述 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet(私有不能早Internet中正常…

网络知识点之-静态路由

静态路由(英语:Static routing)是一种路由的方式,路由项(routing entry)由手动配置,而非动态决定。与动态路由不同,静态路由是固定的,不会改变,即使网络状况已…

进程控制(总)

目录 进程创建 fork函数初识: 写时拷贝: fork常规用法: fork调用失败的原因: 进程终止 进程退出场景: 进程常见退出方法: _exit函数 exit函数 return退出: 进程等待 进程等待的必…

UE5实现模型压平效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 蓝图实现2.3 闪面问题与压平精度3.参考资料1.实现目标 模型压平功能是GIS系统中的一个常用功能,可以用于模型的替换,数据的对比等。本文在UE5中通过修改材质的方式实现,实现模型压平的功能,包括常规建模的StaticMesh,以及C…

2023年网络安全竞赛——Windows操作系统渗透测试Server2124

任务五:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2124(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景Server2124进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Fla…

【C++ 学习 ⑥】- C++ 动态内存管理详解

目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中,new 和 delete 既是关键字&…

Linux系统c语言socket实现TCP通信

socket通信用到的函数 int socket( int af, int type, int protocol); af:一个地址描述。仅支持AF_INET格式,也就是说ARPA Internet地址格式。 type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM&#…

IMX6ULL裸机篇之DDR3参数配置分析

一. DDR3L 初始化简介 上一篇博文进行了 DDR参数的初始化,通过一个 execl表进行配置,生成脚本文件。文章网址如下: IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 "Register Configur…

前端026_菜单模块_新增功能

菜单模块_新增功能 1、需求分析2、新增组件实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 菜单管理中有两处有 新增 按钮: 条件区域的是新增一级菜单,传递的参数是0。列表…

java多线程同步技术基础

说明 当程序中出现多个进程对同一资源进行操作时,因为对数据的操作非常密集,可能会对资源过度操作,这时就需要用到线程的同步技术。 以一个抢红包程序为例,红包数量为3个,开启5个线程来模拟抢红包行为,红…

[MAUI]在.NET MAUI中复刻苹果Cover Flow

文章目录 原理3D旋转平行变换 创建3D变换控件绘制封面图片应用3D旋转应用平行变换绘制倒影创建绑定属性 创建绑定数据创建布局计算位置计算3D旋转 创建动效项目地址 Cover Flow是iTunes和Finder中的一个视图选项,允许用户使用水平滚动的图像查看他们的音乐库或文件。…

使用Qt Creator编写窗体程序并打包发布

1、设置编辑器显示语言为中文(个人习惯) 2、新建窗体应用程序 3、简单修改一下代码 3.1 双击ui文件进入设计模式 3.2 从左侧组件中直接将需要使用的组件拖拽到窗体中 3.3 添加槽函数 选中按钮,右键菜单中 点击 转到槽,头文件和.cpp文件会自动添加对…

中间件_RabbitMQ五种消息模型

文章目录 1.简单消息队列模型2.Work工作队列模型3.发布订阅模型3.1.Fanout广播3.2.Direct路由3.3.Topics通配符 RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。 1.简单消息队列模型 简单消息队…

C语言入门篇——编译篇

目录 1、程序环境 1.1 ANSI C 标准 1.2程序的翻译环境和执行环境 1.3运行环境 2、预处理详解 2.1、预定义符号 2.2、#define 2.2.1#define定义表示符 2.2.2#define定义宏 2.2.3#define替换规则 2.4#和## 2.2.5带副作用的宏参数 2.2.6宏和函数对比 3、#undef 4、…