【端到端】CVPR 2023最佳论文:UniAD解读

news2024/12/24 19:20:49

作者:知乎@一根呆毛授权发布

传统的端到端网络是用多个小model串起来,但这会有误差累积的问题,因此我们提出了UniAD,一个综合框架,把所有任务整合到一个网络。整一个网络都是为planner而进行设计的。

Introduction

a传统方案:单独部署各个小model

b共享同一个backbone,但是分了多个不同的head

c.1. 直接一步到位从2D图到planner。但明显可解释性比较差,且安全缺乏保证。

c.2. 串联的形式,但以往的做法都没有完整地从头预测到planner,都只做了整条pipeline里的部分模块。

c.3. 一共使用了5个模块来处理所有的任务,真正的端到端,不是直接串联的形式。

把所有模块搭建起来的核心是使用了query的形式,而所有模块都采用了transformer的model。query的形式拥有更广阔的视野,可以对各种物体进行query,也因此能减少累积的误差。

Methodology

使用BEVFormer进行多相机的特征提取,投影查询建立鸟瞰图每个体素的特征,方便之后的模块拿到环境信息。TrackFormer负责从BEV中提取出agent的检测结果(同时也是track结果),得到的query其实也包含了一部分历史信息。MapFormer则是进行了地图的语义分割。MotionFormer负责建立agent和map之间的交互,得到joint的预测,同时也会处理ego和agent之间的交互给后续使用。OccFormer则使用BEV为query,motion为KV,进行每个时刻的占用网格预测。最后Planner使用之前的ego和agent交互的特征和来得到轨迹,以及用占用网格来使轨迹避免碰撞。

Perception

感知部分包含了tracking(agent的检测与跟踪)和mapping(map元素的特征提取)。

TrackFormer

使用DETR的做法,K和V都是BEV的结果,一开始query是固定给的embedding,然后输出detection结果,这些检测结果作为下一个时刻的query,用于tracking上一帧检测出来的物体,同时还会有新的空query(和最开始的一样)加入,用于检测新出现的物体。这样输出的结果就是每个agent的feature Q A Q_A QA
。在此基础上,还会有一个新的query来负责ego,这个query会在planning中使用。

MapFormer

使用Panoptic SegFormer的做法,只是变成了3D版。以此来进行BEV每个稀疏像素的分割。包含了lane, divider, crossing, drivable area. 最后输出的是稀疏的地图像素feature
Q M Q_M QM

Prediction

预测部分包含了motion预测和occupancy预测。

MotionFormer

MotionFormer使用感知部分得到的  Q A Q_A QA 和  Q M Q_M QM 信息作为K和V,预测k个mode的行为,都是scene-centric的(不是在agent坐标系下融合的)。这样可以一口气出结果,避免了转坐标系的计算。同时trackFormer的ego query也会放进来进行ego和agent间的交互。

先来看对于每个agent而言的motion query是怎么定义的。

首先是query position  Q p o s Q_{pos} Qpos . 一共有4项,

Q p o s = MLP ⁡ ( PE ⁡ ( I s ) ) + MLP ⁡ ( PE ⁡ ( I a ) ) + MLP ⁡ ( PE ⁡ ( x ^ 0 ) ) + MLP ⁡ ( PE ⁡ ( x ^ T l − 1 ) ) \begin{aligned}Q_{\mathrm{pos}} & =\operatorname{MLP}\left(\operatorname{PE}\left(I^s\right)\right)+\operatorname{MLP}\left(\operatorname{PE}\left(I^a\right)\right) \\& +\operatorname{MLP}\left(\operatorname{PE}\left(\hat{\mathbf{x}}_0\right)\right)+\operatorname{MLP}\left(\operatorname{PE}\left(\hat{\mathbf{x}}_T^{l-1}\right)\right)\end{aligned} Qpos=MLP(PE(Is))+MLP(PE(Ia))+MLP(PE(x^0))+MLP(PE(x^Tl1))

I S I^S IS 是scene-level的anchor position。这个是全局坐标系中的ego的anchor轨迹(多mode)。
I a I^a Ia 是agent-level的anchor position。这个是agent坐标系中的anchor轨迹(多mode)。

以上两个anchor都是从数据gt中用k-means获得的。
x ^ 0 \hat{x}_0 x^0 是agent的当前位置。
x ^ T l − 1 \hat{x}_T^{l-1} x^Tl1 代表上一个transformer结构得到的预测 goal points(会有多层transformer结构进行不断微调预测轨迹) 。而一开始的这项则使用 I S I^S IS 的goal points。

以上feature都经过positional embedding和MLP后再加起来一起作为一个agent的query。

后面还会讲到query context是怎么算的,这个 Q p o s Q_{pos} Qpos Q c t x Q_{ctx} Qctx 共同组成多重交互的query Q。

然后来看多重交互的框架。

整个交互模块由多个transformer组成,分为3种交互融合:agent和agent之间,agent和map之间,agent和goal之间。进行多次这样的模块,以实现先粗后细地不断调整轨迹到准确的轨迹。

对于agent间,agent和map的交互,都采用多头cross-attention。其中Q采用的是上面提到的再经过self attention. K和V则是 Q A Q_A QA Q M Q_M QM.

Q a / m = MHCA ⁡ ( MHSA ⁡ ( Q ) , Q A / Q M ) Q_{a / m}=\operatorname{MHCA}\left(\operatorname{MHSA}(Q), Q_A / Q_M\right) Qa/m=MHCA(MHSA(Q),QA/QM)

agent和goal之间的话,目标时学出朝着目标goal前进的能力。用deformable attention来处理,Q是上文提到的, K是上一个模块预测出的轨迹的最后一个点,V是整个BEV的feature。朝目标前进时需要看的V的feature一般不会只停留在固定的某个点上(只看goal那就不知道路上会不会有别的阻碍了),需要让它能动态学出到底取哪个位置的feature效果更好。

Q g = DeformAttn ⁡ ( Q , x ^ T l − 1 , B ) Q_g=\operatorname{DeformAttn}\left(Q, \hat{\mathbf{x}}_T^{l-1}, B\right) Qg=DeformAttn(Q,x^Tl1,B)

以上3个attention模块是并行的,最后得到 Q a Q_a Qa, Q m Q_m Qm Q g Q_g Qg.
。将它们concat在一起后经过MLP得到一个query context Q c t x Q_{ctx} Qctx
. 这个东西会传递到下一个transformer模块里,或者说在最后一个模块后加上decoder得到最后的轨迹。

由于用于监督的gt本身可能存在noise(因为所谓的gt也是用感知model得到的,自然会有noise),因此还加上了Non-linear Optimization来让gt变得更平滑,这样拿来监督的话就会更符合现实。

定义优化轨迹的cost function:被smooth的轨迹和gt之间,需要有3项限制,轨迹之间点点的距离,轨迹的goal之间的距离,以及smooth的轨迹本身的物理量之间的运动学关系。希望这个函数最小。

c ( x , x ~ ) = λ x y ∥ x , x ~ ∥ 2 + λ goal  ∥ x T , x ~ T ∥ 2 + ∑ ϕ ∈ Φ ϕ ( x ) c(\mathbf{x}, \tilde{\mathbf{x}})=\lambda_{\mathrm{xy}}\|\mathbf{x}, \tilde{\mathbf{x}}\|_2+\lambda_{\text {goal }}\left\|\mathbf{x}_T, \tilde{\mathbf{x}}_T\right\|_2+\sum_{\phi \in \Phi} \phi(\mathbf{x}) c(x,x~)=λxyx,x~2+λgoal xT,x~T2+ϕΦϕ(x)

而被优化出来的轨迹就是能让上面这个函数最小的轨迹,其中优化过程中采用了multiple-shooting的方法,应该是分段进行优化,而不是一口气把所有点都优化了。

x ~ ∗ = arg ⁡ min ⁡ x c ( x , x ~ ) \tilde{\mathbf{x}}^*=\arg \min _{\mathbf{x}} c(\mathbf{x}, \tilde{\mathbf{x}}) x~=argxminc(x,x~)

OccFormer

occupancy grid map是一个离散的BEV,但是一个表示未来是否被占用的BEV。之前的做法使用RNN结构来建模。但这样依赖于手工处理每个agent的未来占用,因为在压缩整个BEV的特征时,里面有很多和agent无关的信息,因此很难预测agent的行为。因此提出了OccFormer,来兼顾scene和agent的feature。对于scene而言,在预测未来的时刻的信息时,需要agent的feature来进行attention,使用矩阵相乘的方法来融合agent的feature和scene的feature,这么做不需要太多的后处理。

OccFormer一共有 T o T_o To 个连续的block形成RNN的结构, T o T_o To 代表的是预测的时刻,一般来说比 motion任务的丁更小。每个block的输入是agent的feature G t G^t Gt 和上一个block的state F t − 1 F^{t-1} Ft1 ,输出是 F t F^t Ft ,包含了t时刻的instance和scene的信息. 从MotionFormer的结果里在模态维度进行 max-pool得到agent的motion预测query Q X ∈ R N a × D Q_X \in R^{N_a \times D} QXRNa×D ,同时还有上游的track query Q A Q_A QA ,以及当前位置的position embedding + P A { }^{+} P_A +PA ,一起concat后用MLP处理得到每个时刻的agent feature G t G^t Gt.

G t = MLP ⁡ t ( [ Q A , P A , Q X ] ) , t = 1 , … , T o G^t=\operatorname{MLP}_t\left(\left[Q_A, P_A, Q_X\right]\right), t=1, \ldots, T_o Gt=MLPt([QA,PA,QX]),t=1,,To

而对于场景信息,使用BEV特征B,作为初始的state F 0 F^0 F0, 实际使用时先下采样到1/4(为了运算快)输入,输出前再上采样,以此来节省算力。

Pixel-agent interaction

Instance feature G t G^t Gt 作为K和V,而下采样的 F t F^t Ft(写为 F d s t F_{ds}^t Fdst)经过一次self-attnetion作为Q,然后进行cross-attention,以此来不断获得每个时刻的BEV的占用。这个cross-attention会使用mask,这个mask时确保了每个像素只能看到占据这个像素的物体所占据的所有像素(考虑其他物体的像素并没有太大意义,因为一个像素不可能被两个物体霸占)。

D d s t = MHCA ⁡ ( MHSA ⁡ ( F d s t ) , G t ,  attn mask  = O m t ) D_{\mathrm{ds}}^t=\operatorname{MHCA}\left(\operatorname{MHSA}\left(F_{\mathrm{ds}}^t\right), G^t, \text { attn mask }=O_m^t\right) Ddst=MHCA(MHSA(Fdst),Gt, attn mask =Omt)

Instance-level occupancy

对于agent level的占用,是需要判断每一个agent的占用情况。使用一个decode网络,提取出一个scene-level的BEV占用 F d e c t ∈ R C × H × W F_{d e c}^t \in R^{C \times H \times W} FdectRC×H×W. 然后用之前的mask输出过一个MLP得到的 U t ∈ R N a × C U^t \in R^{N_a \times C} UtRNa×C 和这个占用进行矩阵相乘,以提取出每个agent的占用。

O ^ A t = U t ⋅ F d e c t \hat{O}_A^t=U^t \cdot F_{\mathrm{dec}}^t O^At=UtFdect

Planning

此paper不使用高精地图以及route,而是使用导航的信号 (比如左转,右转,前进)。把这些信号embed进learnable embeddings。由于在MotionFormer中已经有了ego的多mode的输出 Q c t x e g o Q_{c t x}^{e g o} Qctxego ,并且trackFormer里也提取出了ego的的feature Q A ego  Q_A^{\text {ego }} QAego  ,于是可以把他们三者组合在一起,成为plan query。以此query可以在BEV feature里取周遭的特征,然后decode为未来的 waypoints τ ^ \hat{\tau} τ^.

而为了避免碰撞,则是采用了优化控制的办法,使用了Newton法来找出能使碰撞函数最小的轨迹。它的输入是规划的轨迹 τ ^ \hat{\tau} τ^ ,新的轨迹 τ \tau τ ,以及占用网格 O ^ \hat{O} O^.

τ ∗ = arg ⁡ min ⁡ f ( τ , τ ^ , O ^ ) \tau^*=\arg \min f(\tau, \hat{\tau}, \hat{O}) τ=argminf(τ,τ^,O^)

而对cost函数的定义如下

f ( τ , τ ^ , O ^ ) = λ coord  ∥ τ , τ ^ ∥ 2 + λ obs  ∑ t D ( τ t , O ^ t ) D ( τ t , O ^ t ) = ∑ ( x , y ) ∈ S 1 σ 2 π exp ⁡ ( − ∥ τ t − ( x , y ) ∥ 2 2 2 σ 2 ) \begin{gathered}f(\tau, \hat{\tau}, \hat{O})=\lambda_{\text {coord }}\|\tau, \hat{\tau}\|_2+\lambda_{\text {obs }} \sum_t \mathcal{D}\left(\tau_t, \hat{O}^t\right) \\\mathcal{D}\left(\tau_t, \hat{O}^t\right)=\sum_{(x, y) \in \mathcal{S}} \frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{\left\|\tau_t-(x, y)\right\|_2^2}{2\sigma^2}\right)\end{gathered} f(τ,τ^,O^)=λcoord τ,τ^2+λobs tD(τt,O^t)D(τt,O^t)=(x,y)Sσ2π 1exp(2σ2τt(x,y)22)

这个cost函数的目标是和规划的轨迹尽可能接近,同时碰撞尽可能少。cost函数里的碰撞loss则是在对应时刻选择网格内和轨迹点距离小于一定阈值的,且被占用的网格,去计算这些网格和这个轨迹点之间的差异之和(采用高斯分布来算,应该能起到一定的平滑效果)。

Learning

训练过程是两阶段的,第一阶段训练感知部分,训练几个epoch后,再把所有模块一起训练,这样会更加stable

🏎️自动驾驶小白说官网:https://www.helloxiaobai.cn

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

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

相关文章

SQL性能优化指南:如何优化MySQL多表join场景

目录 多表join问题SQL 这里解释下 Using join buffer (Block Nested Loop): 对性能产生的影响: 三种join算法介绍 join操作主要使用以下几种算法: (1)Nested Loop Join (2)Block Nested …

生信服务器配置:优化生物信息学数据处理的最佳实践

介绍 在生物信息学研究中,处理和分析大规模数据集(如基因组、转录组和蛋白质组数据)需要强大的计算资源和精确的服务器配置。生信服务器配置的优化可以显著提高数据处理的效率和结果的准确性。本文将探讨生信服务器配置的关键要素&#xff0…

【LeetCode热题100】分治-快排

本篇博客记录分治快排的4道题目&#xff1a;颜色分类、排序数组、数组中的第K个最大元素、数组中最小的N个元素&#xff08;库存管理&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,right n;for(int…

【实战项目】——Boost搜索引擎(五万字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、项目的相关背景 1.1、什么是Boost库&#xff1f; 1.2、什么是搜索引擎&#xff1f; 1.3、为什么要做Boost库搜索引擎&#xff1f; 二、搜索引擎的宏观原…

VirtualBOX虚拟机提高速度,鼠标卡顿解决——未来之窗数据恢复

一、刚安装完操作系统&#xff0c;鼠标操作不灵敏 需要安装系统增强 二、系统增强作用 1.鼠标丝滑 2.文件共享 3.可以共享剪贴板 三、安装步骤-设备-安装增强 四、安装步骤-设备-选择光驱 五、安装增强软件然后重启 六、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进…

【算法】动态规划:从斐波那契数列到背包问题

【算法】动态规划&#xff1a;从斐波那契数列到背包问题 文章目录 【算法】动态规划&#xff1a;从斐波那契数列到背包问题1.斐波那契数列2.爬楼梯3.零钱转换Python代码 4.零钱兑换 II5.组合数dp和排列数dp6.为什么动态规划的核心思想计算组合数的正确方法代码实现 为什么先遍历…

【C++打怪之路Lv8】-- string类

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

智能汽车智能网联

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

深入理解线性表--顺序表

目录 顺序表- Seqlist -> sequence 顺序 list 表 顺序表的概念 问题与解答 顺序表的分类 静态顺序表 动态顺序表 问题与解答(递进式) 动态顺序表的实现 尾插 头插 尾删 头删 指定位置插入 指定位置删除 销毁 总结 前言&#xff1a;线性表是具有相同特性的一类数据结构…

【exceljs】纯前端如何实现Excel导出下载和上传解析?

前段时间写过一篇类似的文章&#xff0c;介绍了sheetjs。最近发现了一个更好用的库ExcelJS&#xff0c;它支持高级的样式自定义&#xff0c;并且使用起来也不复杂。实际上sheetjs也支持高级自定义样式&#xff0c;不过需要使用付费版。 下面对比了Exceljs和Sheetjs&#xff1a…

Linux的习题+一道回溯类型的算法题

Linux的习题 Linux环境与版本 1.linux 2.6.* 内核默认支持的文件系统有哪些&#xff1f;[多选] A.ext3 B.ext2 C.ext4 D.xfs E.ufs 正确答案&#xff1a;ABCD A 全称Linux extended file system, extfs,即Linux扩展文件系统&#xff0c;ext2为第二代 D XFS一种高性能的日…

使用频率最高的 opencv 基础绘图操作 - python 实现

以下是 opencv-python 基本操作绘制示例&#xff0c;绘制&#xff1a; 1&#xff09;圆&#xff0c;2&#xff09;矩形&#xff0c;3&#xff09;线段&#xff0c;4&#xff09;文本。 安装 opencv-python pip install opencv-python 在图上绘制圆的操作&#xff0c;示例如…

HCIP-HarmonyOS Application Developer 习题(五)

1、以下哪种原子化布局能力属于自适应变化能力? A. 拉伸 B.占比 C. 隐藏 D.拆行 答案&#xff1a;A 分析&#xff1a;划分为“自适应变化能力”和“自适应布局能力”两类。 其中&#xff0c;自适应变化能力包含了缩放能力和拉伸能力&#xff0c;自适应布局能力包含了隐藏、折…

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…

Spring学习——SpringAOP

0. IOC思想(DI)1. 关键注解Repositorypublic class DeptDaoImpl1 implements DeptDao{}RepositoryPrimarypublic class DeptDaoImpl2 implements DeptDao{}Servicepublic class DeptServiceImpl implements DeptService{AutowiredQulifier("deptDaoImpl2")private De…

UE5学习笔记24-添加武器弹药

一、给角色的武器添加弹药 1.创建界面&#xff0c;根据笔记23的界面中添加 2.绑定界面控件 UPROPERTY(meta (Bindwidget))UTextBlock* WeaponAmmoAmount;UPROPERTY(meta (Bindwidget))UTextBlock* CarriedAmmoAmount; 3.添加武器类型枚举 3.1创建武器类型枚举头文件 3.2创建文…

C++容器:map

1.铺垫 1.1map和unorder_map&#xff0c;两者的实现思想不同&#xff0c;但是用法是相同的&#xff1b;map的思想是平衡二叉树&#xff1b;unorder_map的思想是哈希&#xff1b; 1.2在现实及做题中&#xff0c;百分之99&#xff0c;都在使用unorder_map&#xff0c;接下来的讲…

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…

P20机型HW睡眠省电-调研

摘要 AI睡眠场景识别 不激进的智能管控 睡眠省电 UI 以前有单独的睡眠开关选项&#xff0c;现在没有了&#xff0c;但是智能充电模式是使用AI睡眠模式 睡眠识别 华为专利上提到的论文《BTP-A Bedtime Predicting Algorithm》 各种事件状态&#xff08;亮灭屏、alarm、主动…

《数字信号处理》学习08-围线积分法(留数法)计算z 逆变换

目录 一&#xff0c;z逆变换相关概念 二&#xff0c;留数定理相关概念 三&#xff0c;习题 一&#xff0c;z逆变换相关概念 接下来开始学习z变换的反变换-z逆变换&#xff08;z反变化&#xff09;。 由象函数 求它的原序列 的过程就称为 逆变换。即 。 求z逆变换…