PETRv2 论文学习

news2025/4/6 6:53:41

1. 解决了什么问题?

过去,一般使用基于单目视觉进行 3D 目标检测。现在进行 3D 任务的方法大致分两类。一类是基于 BEV,将多视角图像映射为 BEV 表征,然后使用 3D 目标检测方法。另一类是基于 DETR,如 DETR3D 和 PETR,定义了 3D 空间的 object queries,在 transformer decoder 中 object queries 与多视角的图像互相作用。像 BEVFormer 和 BEVDet4D 都使用了时域建模,在 BEV 空间对齐连续帧的特征,改进速度预测。因此,本文的 PETRv2 也尝试在 PETR 中加入时域建模,在时域里对齐 3D position embedding。

2. 提出了什么方法?

基于 PETR,PETRv2 尝试对时域建模,使用之前帧的时域信息来优化 3D 目标检测和 BEV 分割。PETRv2 拓展了 PETR 的 3D position embedding,用于时间建模。在不同帧之间,3D PE 在时域内对齐目标位位置。

如下图,PETRv2 使用主干网络从多视角图像中提取 2D 特征,从相机视锥空间生成世界坐标系的 3D 坐标。考虑到车自身的运动,为了实现时域对齐,首先通过姿态变换,将第 t − 1 t-1 t1帧的 3D 坐标转换为第 t t t帧的坐标系。然后将相邻帧的 2D 特征和 3D 坐标 concat 起来,输入 feature-guided position encoder,生成 transformer decoder 所需的 keys 和 values。Det queries 和 seg queries 分别用 learnable 3D anchor points 和 fixed BEV points 初始化,然后在 transformer decoder 中与多相机视角的图像特征(keys 和 values)发生作用。更新完成的 queries 用于预测 3D 边框和 BEV 分割。 A ◯ \textcircled{\text{A}} A是将第 t − 1 t-1 t1帧到第 t t t帧的 3D 坐标对齐操作。 C ◯ \textcircled{\text{C}} C是 batch 维度的 concat 操作。
在这里插入图片描述

2.1 Temporal Modeling

通过 3D coordinate alignment(CA) 和 feature-guided position encoder(FPE) 实现时域建模,让定位和速度预测更加准确。

2.1.1 3D Coordinate Alignment

如下图 (a) 所示,时域对齐操作将第 t − 1 t-1 t1帧的 3D 坐标变换到第 t t t帧的坐标系。在第 t t t帧,我们共有 4 个坐标系:相机坐标系 c ( t ) c(t) c(t),激光雷达坐标系 l ( t ) l(t) l(t),车辆自身(ego)坐标系 e ( t ) e(t) e(t),世界坐标系 g g g T s r c d s t T_{src}^{dst} Tsrcdst是从 src 坐标系到 dst 坐标系的变换矩阵。
我们将 l ( t ) l(t) l(t)作为默认的 3D 空间,生成多相机带有 3D 位置的特征。第 i i i个相机投影的 3D 点 P i l ( t ) ( t ) P_i^{l(t)}(t) Pil(t)(t)可以表示为:
P i l ( t ) ( t ) = T c i ( t ) l ( t ) ∗ K i − 1 ∗ P m ( t ) P_i^{l(t)}(t)=T_{c_i(t)}^{l(t)}\ast K_i^{-1}\ast P^m(t) Pil(t)(t)=Tci(t)l(t)Ki1Pm(t)

P m ( t ) P^m(t) Pm(t)是一个点集合,代表第 t t t帧相机视锥空间 meshgrid。 K i ∈ R 4 × 4 K_i\in \mathcal{R}^{4\times 4} KiR4×4是第 i i i个相机的内参矩阵。将第 t − 1 t-1 t1帧的 3D 点坐标对齐到第 t t t帧中:
P i l ( t ) ( t − 1 ) = T l ( t − 1 ) l ( t ) ∗ P i l ( t − 1 ) ( t − 1 ) P_i^{l(t)}(t-1)=T_{l(t-1)}^{l(t)}\ast P_i^{l(t-1)}(t-1) Pil(t)(t1)=Tl(t1)l(t)Pil(t1)(t1)

T l ( t − 1 ) l ( t ) T_{l(t-1)}^{l(t)} Tl(t1)l(t)的计算如下,世界坐标系 (global) 将第 t t t帧和第 t − 1 t-1 t1帧关联起来:

T l ( t − 1 ) l ( t ) = T e ( t ) l ( t ) ∗ T g e ( t ) ∗ T g e ( t − 1 ) − 1 ∗ T e ( t − 1 ) l ( t − 1 ) − 1 T_{l(t-1)}^{l(t)}=T_{e(t)}^{l(t)} \ast T_g^{e(t)}\ast {T_g^{e(t-1)}}^{-1}\ast {T_{e(t-1)}^{l(t-1)}}^{-1} Tl(t1)l(t)=Te(t)l(t)Tge(t)Tge(t1)1Te(t1)l(t1)1

对齐后的点 [ P i l ( t ) ( t − 1 ) , P i l ( t ) ( t ) ] \left[P_i^{l(t)}(t-1), P_i^{l(t)}(t)\right] [Pil(t)(t1),Pil(t)(t)]将用于生成 3D position embedding。
在这里插入图片描述

2.1.2 Feature-guided Position Encoder

在 PETR 中,3D PE 的生成过程如下:
P E i 3 d ( t ) = ψ ( P i l ( t ) ( t ) ) PE_i^{3d}(t)=\psi(P_i^{l(t)}(t)) PEi3d(t)=ψ(Pil(t)(t))
其中 ψ ( ⋅ ) \psi(\cdot) ψ()是 MLP。3D PE 是独立于输入图像特征的。但是,作者认为图像特征能提供一些有用的信息,如深度值。于是提出了 feature-guided position encoder,引入视觉先验知识。
P E i 3 d ( t ) = ξ ( F i ( t ) ) ∗ ψ ( P i l ( t ) ( t ) ) PE_i^{3d}(t)=\xi(F_i(t))\ast \psi(P_i^{l(t)}(t)) PEi3d(t)=ξ(Fi(t))ψ(Pil(t)(t))
ξ \xi ξ也是一个 MLP。 F i ( t ) F_i(t) Fi(t)是第 i i i个相机的 2D 图像特征。如上图 (b),先用 1 × 1 1\times 1 1×1卷积映射 2D 特征,然后输入 ξ \xi ξ和 sigmoid 函数,得到注意力权重。用 ψ \psi ψ对 3D 坐标进行变换,与注意力权重相乘得到 3D PE。将 3D PE 和 2D 特征相加,即 transformer decoder 的 key。 1 × 1 1\times 1 1×1卷积映射的 2D 特征作为 transformer decoder 的 value 使用。

2.2 BEV Segmentation

在这里插入图片描述

本文提出用 seg queries 实现高质量的 BEV 分割。一个高分辨率的 BEV map 可以划分为若干个小 patches。每个 seg query 对应着 BEV map 上的一个 patch( 16 × 16 16\times 16 16×16像素)。如上图,用 BEV 空间中固定的 anchor points 初始化 seg queries。然后通过 MLP 将 anchor points 映射为 seg queries。随后,seg queries 输入进 transformer decoder,与图像特征相互作用。更新后的 seg queries 输入进 segmentation head (MLP + sigmoid) 预测 BEV embeddings。将每个 BEV embedding 变形为 BEV patch ( 16 × 16 16\times 16 16×16大小), R ◯ \textcircled{\text{R}} R是 reshape 操作。最后将所有的 BEV patches 连接起来,产生分割预测结果 ( 256 × 256 256\times 256 256×256大小)。分割分支使用交叉熵损失:

l s e g = 1 N ∑ j = 0 C ∑ i = 0 N [ ω y ^ i log ⁡ ( y i ) + ( 1 − y ^ i ) log ⁡ ( 1 − y i ) ] \mathcal{l}_{seg}=\frac{1}{N}\sum_{j=0}^C \sum_{i=0}^N \left[\omega \hat{y}_i \log(y_i) + (1-\hat{y}_i)\log(1-y_i)\right] lseg=N1j=0Ci=0N[ωy^ilog(yi)+(1y^i)log(1yi)]
其中 N N N是 ground-truth 像素个数, C C C是目标类别数。 y ^ \hat{y} y^是分割标签, y y y是预测 BEV map。 ω \omega ω是正样本权重,计算 ground-truth 中正负样本比例得到。

2.3 实验

2.3.1 Datasets and Metrics

使用 nuScenes 基准,本文只关注 3D 目标检测和 BEV 分割。

对于 3D 检测,每个场景包含 20 秒视频帧,每 0.5 秒标注一帧画面的 3D 边框。与官方评测标准一样,报告了 NDS, mAP, mATE, mASE, mAOE, mAVE 指标。

对于 BEV 分割,使用 IoU 得分作为度量。Ground-truth 包括 3 个不同的类别:可行驶区域、车道线和 vehicle。车道线类别由 2 个 map layers 组成:Lane-Divider 和 Road-Divider。对于 vehicle 分割,将 3D ground-truth 边框投影到 BEV 平面,得到 BEV ground truth。Vehicle ground-truth 分割包括所有 Vehicle 类别的边框:自行车、巴士、汽车、建筑卡车、摩托车、导轨电车、一般卡车。

2.3.2 实现细节

主干网络是 ResNet 和 VoVNetV2。P4 特征(将 C4 和 C5 特征融合起来,分辨率为输入图像的 1 / 16 1/16 1/16)作为 2D 特征使用。3D 坐标的生成保持和 PETR 一致。使用了 AdamW 训练模型,weight decay 是 0.01 0.01 0.01。初始学习率为 2.0 × 1 0 − 4 2.0\times 10^{-4} 2.0×104,使用余弦退火策略。所有试验在 8 张 Tesla A100 上训练了 24 个 epochs,batch size 为 8。

对于 3D 检测,在 nuScenes 测试集上使用了 1500 个 det queries 进行试验。在 3D 世界坐标系初始化一组 learnable anchor points,通过一个 MLP 生成 det queries。分类损失使用 focal loss,3D 边框回归使用 L1 损失。使用 Hungarian 算法匹配 ground-truths 和预测框。

对于 BEV 分割,用 nuScenes 数据集提供的 map layers 生成 256 × 256 256\times 256 256×256 ground-truth BEV map。Patch size 为 16 × 16 16\times 16 16×16,共有 256 个 seg queries 来预测最终的 BEV 分割结果。

为了模拟外参噪声,作者对相机外参随机应用 3D 旋转,3D 旋转在真实场景中很常见。随机选择一个相机进行 3D 旋转。 α , β , γ \alpha,\beta,\gamma α,β,γ 分别是 X , Y , Z X,Y,Z X,Y,Z轴的角度,研究了多种旋转设定,最大的幅度是 α m a x , β m a x , γ m a x ∈ { 2 , 4 , 6 , 8 } \alpha_{max},\beta_{max},\gamma_{max}\in\lbrace 2,4,6,8 \rbrace αmax,βmax,γmax{2,4,6,8} α m a x = 2 \alpha_{max}=2 αmax=2表示 α \alpha α是从 [ − 2 , 2 ] \left[-2,2\right] [2,2]之间均匀采样。

2.4 Ablation

使用 VoVNet-99 为主干网络。主干网络在 DDAM15M 数据集和 nuScenes 上预训练。输入尺寸是 800 × 320 800\times 320 800×320,训练 24 个 epochs。Det queries 设为 900。

2.4.1 时域建模

研究了 3D coordinate alignment 和 feature-guided position encoder 的作用。如下表所示,没有 CA,PETRv2 只会提升 2.7 % 2.7\% 2.7%NDS, 0.5 % 0.5\% 0.5%mAP;加入了 CA,会进一步提升 2.1 % 2.1\% 2.1%NDS 和 0.9 % 0.9\% 0.9%mAP。对于 FPE,作者将 PETR 中的 3D PE 替换为 FPE,NDS 提升了 1.5 % 1.5\% 1.5%,mAP 却只提升 0.2 % 0.2\% 0.2%,而将 FPE 应用在 PETRv2 中,mAP 提升了 0.8 % 0.8\% 0.8%,说明 FPE 对时域建模有帮助。
在这里插入图片描述

2.4.2 Seg Query

研究了 seg query 的作用,以及每个 query 分配的 patch size 的影响。分割分支的损失权重为 1。如下面左边表格,当 patch size × 2 \times 2 ×2 时,queries 的个数就会相应地 × 1 / 4 \times 1/4 ×1/4。实验表明,当 query 个数为 256,patch size 为 32 × 32 32\times 32 32×32时表现最好。
在这里插入图片描述

2.4.3 多任务学习

作者也研究了多任务学习的影响。可以发现,3D 检测和 BEV 分割任务不能相互提升。当检测和分割分支的权重都是 1.0 1.0 1.0,BEV 分割在 IoU-lane 的表现会比只有分割分支时下降 3.1 % 3.1\% 3.1%。当分割分支的权重为 2 时,表现还算不错。
在这里插入图片描述

3. 有什么优点?

PETRv2 为 3D 感知任务提供了一个强大而统一的基线方案。

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

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

相关文章

xhs-xs webmsxywx分析

近期又更新了,先是改了x-s生成,然后又加上了a1校验。 后面可能会全参校验,比如再加上gid、deviceId、profileData、x-s-common、smidV2之类。 估计以后不能写xhs了,大家且看且珍惜吧。之前相关的文章都被下架了 危!…

K8s日志组件-Loki是如何存储数据的?

文章目录 为什么需要loki为什么不是EFK?Loki是如何存储数据的?底层的LSM treeB tree 和LSM tree的区别?Ref参考链接 为什么需要loki 日志记录本质上是一个事件。大多数语言、应用程序框架或库都支持日志,表现形式可以是字符串这样…

安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

前言 在我之前的文章 羡慕大劳星空顶?不如跟我一起使用 Jetpack compose 绘制一个星空背景(带流星动画) 中,我们使用 Compose 实现了星空背景效果。 并且调用非常方便,只需要一行代码就可以给任意 Compose 组件添加上…

30多家投递石沉大海,总算上岸了

大家好,我是帅地。 今年的行情,无论是暑假实习还是春招校招,都比往年要难一些,很多人在三月份要嘛简历石沉大海,要嘛面试一轮游,但也有部分人最后都拿到了不错的 Offer,包括我 训练营 里&#…

企业级信息系统开发——初探Spring-采用Spring配置文件管理Bean

初探Spring 一、Spring框架(一)Spring框架优点(二)Spring 框架因何而来(三)Spring框架核心概念 二、采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Sp…

在C++中,怎么把string转换成char*?

2023年5月21日,周日中午: 今天在写项目的时候遇到了这个问题,也解决了,所以记录一下 通过string类的copy成员函数就可以解决这个问题 copy函数的函数原型: string& copy(char* s, size_t n, size_t pos 0); 其…

【框架源码】SpringBoot核心源码解读之启动类源码分析

首先我们要先带着我们的疑问,spring boot是如何启动应用程序?去分析SpringBoot的启动源码。 我们在新建SpringBoot项目时,核心方法就是主类的run方法。 SpringApplication.run(ArchWebApplication.class, args) 我们点击run方法进入到源码中…

A survey of Large Lanuage models

一.引言 语言建模的四个阶段,统计语言模型(SLM):基于马尔科夫假设建立词预测模型,n-gram,神经语言模型(NLM):word2vec,预训练语言模型(PLM&#…

Godot引擎 4.0 文档 - 入门介绍 - 学习新功能

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Learning new features — Godot Engine (stable) documentation in English 学习新功能 Godot 是一个功能丰富的游戏引擎。有很多关于它的知识。本页介绍了如何使用…

English Learning - L3 作业打卡 Lesson2 Day11 2023.5.15 周一

English Learning - L3 作业打卡 Lesson2 Day11 2023.5.15 周一 引言🍉句1: Sometimes a person may be upset because he does not have something as nice as a friend has, like a fast new car.成分划分弱读连读爆破语调 🍉句2: That person may say…

【wifi-app 任意泄露】

一、fofa 搜索 title“Wi-Fi APP Login” # Date: 2022-06-12 # Exploit Author: Ahmed Alroky # Author Company : AIactive # Version: M30HG4.V5030.191116 # Vendor home page : wavlink.com # Authentication Required: No # CVE : CVE-2022-34047 # Tested on: Windows…

day2 I/O多路复用select函数

目录 思考一个问题: I/O多路复用select函数 代码实现 net.h server.c: socket.c 思考一个问题: 我们还是把视角放到应用B从TCP缓冲区中读取数据这个环节来。如果在并发的环境下,可能会N个人向应用B发送消息,这种情况下我们的…

java+springboot留学生新闻资讯网的设计与实现

Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架,和控制翻转容器的实现。Spring框架的一些核心功能理论,可以用于所有Java应用,Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…

nodejs进阶(5)—接收请求参数

1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword地球。通过前面的进阶3教程《nodejs进阶(3)—路由处理》重介绍的url模块,我们知道接收方法如下这…

cpp11实现线程池(六)——线程池任务返回值类型Result实现

介绍 提交任务函数submitTask中返回的Result类型应该是用Result类包装当前的task,因为出函数之后task即如下形式:return Result(task); Result和Task都要互相持有对方的指针,Task要将任务执行结果通过Result::setVal(run()) 调用传给其对应…

RestCloud新一代(智能)全域数据集成平台发布

5月18日,RestCloud在其成立六周年的当天,发布了“新一代(智能)全域数据集成平台”。 5月18日,RestCloud在其成立六周年的当天,发布了“新一代(智能)全域数据集成平台”。 根据业内专…

【Linux环境基础开发工具】软件包管理器-yum

写在前面 今天我打算介绍如何在Linux环境下载软件, Linux作为一个操作系统,就像windows一样,当然是存在软件的。 目录 写在前面 怎么在Linux环境安装软件 源代码安装 rpm安装包安装 yum安装 如何理解Linux的生态 如何使用yum安装软…

【LLM大模型】模型和指令微调方法

note Hugging Face 的 PEFT是一个库(LoRA 是其支持的技术之一,除此之外还有Prefix Tuning、P-Tuning、Prompt Tuning),可以让你使用各种基于 Transformer 结构的语言模型进行高效微调。AIpaca羊驼:让 OpenAI 的 text-…

今年测试工程师正遭【革命】,“点点工”如何破局?

近几年来的特殊情况,综合过去的大形势变化,所有行业都会自下而上的进行一轮技术“大清洗”,技术停滞不前的“点工”或将被逐步取代。 软件测试现状 测试行业在十几年间发生了翻天覆地的变化,从早期站在风口上的快速发展&#xff…

fastapi基础篇

文章目录 简介环境搭建安装基础文件自动文档 基础使用POST请求传递参数返回定制信息jinja2返回html 简介 FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6 并基于标准的 Python 类型提示。 关键特性 快速&#…