PETR/PETRv2/StreamPETR论文阅读

news2024/11/14 5:15:16

1. PETR

PETR网络结构如下,主要包括image-backbone,3D Coordinates Generator,3D Position Encoder,transformer Decoder四个模块。

把N 个视角的图像输入到骨干网络中以提取 2D 多视图特征。在 3D 坐标生成器中,首先将相机视锥体空间离散化为 3D 网格。然后,通过相机参数对网格的坐标进行变换,并生成 3D 世界空间中的坐标。3D 坐标与 2D 多视图特征一起被输入到 3D 位置编码器,生成 3D 位置感知特征。3D 特征进一步被输入到 Transformer 解码器中,并与从查询生成器生成的对象查询进行交互。更新后的对象查询用于预测对象类别以及 3D 边界框。

1.1. Images Backbone

采用resnet 或者 vovNet,下面的x表示concatenate

1.2. 3D Coordinates Generator

坐标生成跟ISS类似,假设一系列深度值,再有相机内存进行坐标转换

1.3. 3D Position Encoder

将多视图2D图像特征输入到1×1卷积层以进行降维。这个由三维坐标生成器生成的三维坐标被转换为通过多层感知的3D位置嵌入。3D位置嵌入与同一视图的2D图像特征相加,生成3D位置感知功能。最后,3D位置感知特征被展平并且用作变换器解码器的输入。

这里2D部分是经过三角函数编码后与3DpositionEmb相加作为K,原始的image feature作为V 输入transformer Decoder。

1.4. Transformer Decoder

​DET Query Generator

为了缓解在3D场景中的收敛困难,类似于Anchor DETR,我们首先在均匀分布的3D世界空间中初始化一组可学习的锚点从0到1。然后将3D锚点的坐标输入到小MLP具有两个线性层的网络,并生成初始对象查询Q0。在我们的实践中,在三维空间中使用锚点可以保证收敛在采用DETR中的设置或生成锚点的同时在BEV空间中不能实现令人满意的检测性能。

1.5. Head and Loss

检测头主要包含用于分类和回归的两个分支。来自解码器的更新后的对象查询被输入到检测头,以预测对象类别的概率以及 3D 边界框。请注意,回归分支相对于锚点的坐标预测相对偏移量。为了与 DETR3D 进行公平比较,我们在分类中也采用了焦点损失,在 3D 边界框回归中采用了 L1 损失。令 y = (c, b) 和\hat{y} = (\hat{c}, \hat{b})分别表示真实值和预测值的集合。匈牙利算法用于在真实值和预测值之间进行标签分配。假设 σ 是最优分配函数,那么 3D 对象检测的损失可以总结为:

这里L_{cls}表示分类的焦点损失,L_{reg}是回归的 L1 损失。\lambda_{cls}是一个超参数,用于平衡不同的损失。 

1.6. 实验

训练资源如下:

​代码执行图:

​可视化效果

​时延测试:

extract_feat_time0.0166
positional_encod_time0.0150
transformer_time0.0074
fnn_time0.0031
get_bboxes_time0.0015

2. PETRv2

PETRv2的整体框图如下,与PETR不同的地方在于加入了时序模块,分割头,以及改变了 3D Position Encoder。

2.1. Temporal Modeling

对于某一个view的相机来说,t时刻和t-1时刻构建的视锥模型(坐标值)是一模一样的,通过内外参变换到lidar/ego坐标系后的值也是一模一样的。但是不管从哪个坐标系来说,如果自车运动,上一时刻的坐标和当前时刻的坐标一定是不同的,因此需要进行坐标对齐。

全局坐标系作为一个桥梁可以很好的将t时刻和t-1时刻进行连接。本文以lidar坐标系为基础进行计算。t-1时刻到t时刻坐标的变换就是将t-1时刻的坐标从lidar坐标系变到ego坐标系,再到global坐标系(固定不变),再从global坐标系到t时刻的ego坐标系,再到t时刻lidar坐标系,这就完成了t-1时刻lidar坐标系坐标到t时刻lidar坐标系坐标的变换。

公式2中表示的就是在t-1时刻的lidar坐标系中的坐标变换到t时刻的lidar坐标系中的坐标。左侧的P就是t-1时刻的lidar坐标系中的坐标在t时刻lidar坐标系中的坐标值。t时刻的lidar坐标系和t-1时刻的lidar坐标系是不同的,是变化了的,所以需要一个不会变化的global坐标系作为桥梁。

3D坐标在对齐之后,前后帧直接cat起来,同时前后帧的2D特征也直接cat起来。个人感觉可以这样理解,对于一个视锥模型(D*4, H, W),变换到lidar坐标系后也是这样的tensor结构,也就是空间上看,还是这样一个视椎体。前后帧如果单独来看没有区别,数值都是一样的。但是在对t-1时刻的坐标进行变换后,这些坐标的值发生了变化,但是tensor结构没有发生变化依旧是(D*4, H, W),那么对于H, W的某个位置x和y来说,t时刻是一条射线上的若干点坐标,t-1时刻变换到t时刻,同样的位置x和y处是上一时刻的一一对应的坐标,这表示的就是坐标的变化,这条射线上每个点在△t内坐标的变化。而2D特征的cat就是t时刻和t-1时刻特征的组合,用来增强特征表达。

2.2. Multi-task Learning

不同的任务使用task-specific的queries,anchor points的选择不同。

3d目标检测的检测头和PETR中是一样的,learnable anchors通过mlp形成queries。

分割是把高分辨率的bev map分成小的patch,每个query负责一个特定的patch,比如bev map中左上25*25像素的patch。在bev空间中使用固定的anchor points初始化queries,然后通过一个2层的MLP生成seg queries,这些queries在decoder中不断更新最后输入到分割头,和CVT中的decoder相似,预测最终的分割结果。

车道线的表达使用的是一系列的3D坐标,比如在深度方向(y)上均匀采样100个点,每条车道线如果在y上的某个点可见就有相对应的x和z值,如果不可见就不关注,说明这个y值的地方没有车道线,一般可见性都是连续的,某一段y值区域连续可见,有对应的x和z,这样通过散点的形式表示一条线。

定义anchor lane平行于y轴,选择anchor points生成lane quereis,最后预测类别,相对于anchor lane的x和z轴的offsets和每个位置的可见性。

3. StreamPETR

StreamPETR的总体架构。内存队列存储历史对象查询。在Propagation Transformer中,最近的对象查询依次与历史查询和当前图像特征交互,以获得时间和空间信息。输出查询被进一步用于生成检测结果,并且前K个非背景目标查询被推送到存储器队列中。通过存储器队列的循环更新,长期时间信息被逐帧传播。

3.1. Propagation Transformer模块

Propagation Transformer和MLN 的细节。在PT中,object查询与混合查询和图像特征进行迭代交互。运动感知层规范化对运动属性进行编码(姿态、时间戳、速度),并隐式地执行补偿。不同色调的矩形象征着来自不同帧,灰色矩形表示当前帧的初始化查询,虚线矩形对应于背景查询。

3.2. Hybrid Attention

Hybrid Attention在这里用于取代原生的self-attention。首先它起到self-attention的作用,对于当前帧的重复框进行抑制。其次,当前帧的object query还需要和历史帧object query做类似cross attention操作,进行时序的交互。 由于hybrid queries远小于cross attention中 image token的数量,因此所带来的额外计算量可以忽略不计。此外历史object query也会传递到当前帧为当前帧提供更好的初始化(propagate query)。

参考文献

https://zhuanlan.zhihu.com/p/660293688

https://zhuanlan.zhihu.com/p/689481109

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

PETR: Position Embedding Transformation for Multi-View 3D Object Detection 

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

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

相关文章

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性,其免费版提供的功能相对有限,而付费版的定价可能对小团队或个人开发者而言显得偏高。此外,Postman 的访问速度有时较慢,这可能严重影响使用体验。 鉴于这些限制,Apifox 成为了一…

程序员做自媒体,你所不了解的提词器,原来还有这么多大用处

程序猿的出路,不只是外卖员! 你或许以为提词器只是个“背词神器”?实际上,它的应用范围早已超出你的想象。从直播到会议,从视频拍摄到户外采访,每一种场景都有对应的提词神器,帮你提升效率、避…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

JS 实现WebSocket通讯和什么是WebSocket

WebSocket 介绍: WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信。它允许服务器主动向客户端推送信息,客户端也能实时接收服务器的响应。 客户端 这里实现了将input内的内容发送给客户端,并将接收到的服务器的…

前端 JS面向对象 继承

目录 一、ES5通过prototype来继承 二、ES6 class实现 一、ES5通过prototype来继承 const Person{eyes:2,head:1}function Woman(){}Woman.prototypePersonconst ladynew Woman()console.log(lady)function Man(){}Man.prototypePersonconst mannew Man()console.log(man) 打…

三菱FX5UPLC以太网Socket通信功能Passive开放的程序示例

Passive开放的通信流程如下所示。 参数设置 示例程序中使用的参数设置如下所示。 [CPU模块】 导航窗口↔[参数]↔[模块型号]↔[模块参数]-[以太网端口]-[基本设置]-[对象设备连接配置设置]↔[详细设置]→[以太网配置(内置以太网端口)]画面 【以太网模块】 [导航]中「参数]→[模…

UniApp 应用、页面与组件的生命周期详解

UniApp 应用、页面与组件的生命周期详解 在uni-app中包含了 应用生命周期、页面生命周期、和组件生命周期&#xff08; Vue.js的&#xff09;函数。 应用生命周期 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 <script>export default {onLaunc…

Optimism掀起发链热潮,还有哪些发链 平台值得关注?

继电子巨头索尼在OP上发布L2 Soneium之后&#xff0c;10月29日&#xff0c;再质押协议巨头Swell宣布迁移至Optimism超级链&#xff0c;通过OP Stack构建Rollup加入OP生态系统。据DeFilama数据显示&#xff0c;Swell的TVL最高曾超过30亿美元&#xff0c;目前为13.4亿美元&#x…

0. 0:《跟着小王学Python·新手》

《跟着小王学Python新手》系列 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的核心概念。通过开发游戏、构…

如何优化Kafka消费者的性能

要优化 Kafka 消费者性能&#xff0c;你可以考虑以下策略&#xff1a; 并行消费&#xff1a;通过增加消费者组中的消费者数量来并行处理更多的消息&#xff0c;从而提升消费速度。 批量消费&#xff1a;配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…

Golang | Leetcode Golang题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…

AscendC从入门到精通系列(一)初步感知AscendC

1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者…

unity基础,点乘叉乘。

简单记录下点乘叉乘&#xff0c;要不每次用完就忘&#xff0c;忘了又查。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestCrossDot : MonoBehaviour {/// <summary>/// 原点/// </summary>public Transform t…

AI写作(二)NLP:开启自然语言处理的奇妙之旅(2/10)

一、NLP 的基本概念与任务 &#xff08;一&#xff09;自然语言处理的研究对象 自然语言处理&#xff08;NLP&#xff09;处于计算机科学、人工智能和语言学的交叉领域。它所聚焦的人类社会语言信息是无比丰富和复杂的&#xff0c;包括口语、书面语等各种形式。这种语言信息在…

Windows 局域网IP扫描工具:IPScaner 轻量免安装

IPScaner是一款258KB的工具&#xff0c;具备快捷修改IP、批量扫描、地址计算等功能&#xff0c;自动识别本机IP网段&#xff0c;快速查看IP使用情况&#xff0c;适用于监控维护、企业IT运维等场 软件功能介绍&#xff1a; 1&#xff09;快捷修改本地IP、IP批量扫描、IP地址计算…

【3D Slicer】的小白入门使用指南二

3D Slicer中DICOM数据加载和三维可视化 任务 数据集下载和解压缩 加载和查看DICOM数据 1)将第一个数据集文件夹,整个往3Dslicer左侧拖动即可 得到 2)选中右侧patient 1就可显示出该患者的基本信息 (第二行蓝色是研究信息;第三行蓝色是序列信息)

在移动硬盘中创建vue项目 报错

如图所示&#xff0c;在U盘或者移动硬盘当中 创建vue项目&#xff0c;报错 如图所示&#xff0c; 这个问题与 Git 的安全设置有关&#xff0c;尤其是在跨用户或跨文件系统的环境下&#xff08;例如&#xff0c;移动硬盘或不同账户&#xff09;。Git 检测到当前项目的文件夹 的…

qt QDockWidget详解

1、概述 QDockWidget是Qt框架中的一个窗口部件&#xff0c;它提供了一个可停靠的面板&#xff0c;该面板可用于显示和编辑各种内容。QDockWidget可以在主窗口中创建并停靠在不同的位置&#xff0c;如左侧、右侧、顶部或底部。此外&#xff0c;QDockWidget还具备浮动功能&#…

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一&#xff0c;为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南&#xff0c;帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…

每日小练:Day2

1.乒乓球筐 题目链接&#xff1a;乒乓球筐__牛客网 题目描述&#xff1a; 这道题主要考察B盒是不是A盒的子集&#xff0c;我们可以通过哈希表来做 单哈希表 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…