作者 | Malignus 编辑 | 自动驾驶之心
原文链接:https://zhuanlan.zhihu.com/p/15362624581
点击下方
卡片
,关注“
自动驾驶之心
”公众号
>>
点击进入→
自动驾驶之心
『
BEV感知
』
技术交流群
本文只做学术分享,如有侵权,联系删文
许久没有更新了,自从开始工作以后愈发的困在了Corner Case和各种各样的琐事,闲言少叙,这篇文章将用尽可能简洁的语言,帮助各位大佬了解地平线的Sparse 4D系列工作。(PS:对于Sparse4D中,不同帧间的信息不再依赖各自帧内的ego2global部分就不做介绍了,大佬工作的代码写的很清晰,有这样一个概念即可~)
Summary
-
环视障碍物的检测,将不依赖显式的稠密BEV特征进行学习。
-
基于K-Means的初始化Anchor, 让模型拥有更快的收敛速度,且Query的可解释性更好
-
-
-
以检测结果为基础,可出Tracking结果,不依赖BEV下的多目标追踪后处理
Methods
接下来,我们将分开两部分介绍模型结构部分;分开两部分的原因,是因为Denoising并不影响整体模型训练的pipeline,拆开两部分,可更好帮助各位大佬理解整体工作。
-
介绍模型整体的forward流程,包括Loss的设计
-
Overall Pipeline
一言以蔽之:模型将基于query_based的instance_feature和anchor,进行整体的稀疏BEV感知;图像特征将不进行显式的深度信息编码,模型基于anchor的中心点,通过offset的学习,将图像特征引入至instance_feature。
接下来将基于开源的代码,进行尽可能简短的模型forward pipeline介绍。
-
instance_feature和anchor起始存储于instance_bank内。anchor(
,11)的初始化,是基于GT的kmeans计算得到。对应的11维信息:[x,y,z,l,w,h,
,
,
,
,state]. 其中, 所有anchor的
速度为0
,
yaw角为0,最后一维信息可不关注,仅与denoise相关
。模型在训练过程中,
anchor会伴随着模型的学习更新。但
在每一个iter的forward开始,instance_bank内
取到的初始化当前帧instance_feature都是全0(即instance_feature永远依赖于当前图像特征的提取,和后续的注意力计算)。
-
在通过Transformer进行forward过程中,operation主要包括:deformable, ffn, norm, refine, temp_interaction, interaction在内的六部分。其中,ffn, norm很好理解,重点介绍deformable, refine, temp_interaction, interaction四部分。
-
单帧decoder: deformable+FFN+Norm+Refine
-
多帧decoder: temp_interaction+interaction+norm+deformable+ffn+norm+Refine
-
其中,Deformable模块负责将图像特征引入;Refine模块负责基于instance_feature获取感知结果;temp_interaction负责对当前帧特征信息与历史特征信息进行融合; interaction负责将当前帧特征进行自注意力计算。
-
deformable(图像特征引入):前面提到,Sparse4D中,模型将不在学习稠密的显式BEV特征。图像特征的使用主要依赖该module。该模块的作用,
是将图像特征基于anchor和采样点,对instance_feature进行更新(即引入图像特征)。
-
deformable依赖的输入包括instance_feature, anchor, anchor_embed, feature_maps与projection_mat. 最终输出的结果将用于更新instance_feature.
-
instance_feature[B,
,256]: 当前帧的instance feature, 模型在每一轮forward时,第一次进入deformable中的instance_feature结果都是全0,是通过若干次调用deformable module的过程中,图像特征的不断引入堆叠才得到最终的instance_feature.
-
anchor:[B,
,11]当前帧的anchor,即可能会存在于当前帧的框体的位置和对应大小的预设。
-
anchor_embed:[B,
,256]当前帧anchor对应的position_embedding。
图像特征引入模块的forward流程五步走:
-
获取key_points[B,
,
,3]:基于anchor_embed求解anchor中心点的对应位置偏移量,与anchor相加后得到key_points。此处的
指代的是anchor中心点对应采样在图像中采样点的个数,论文中
=8.
-
获取多尺度图像特征采样的权重weights[B,
,
,
]:对已有的instance_feature分别引入框体的位置编码信息(anchor_embed)和相机参数的编码信息(基于ego2img的全连接层进行的编码信息). 并通过全连接层和softmax层,以及15%的随机掩码,得到weights。论文中
=8,
=8(
的引入理解为multi-head attention就好)。
-
获取采样后的图像特征features[B,
,
,256]: 基于ego2img, 将key_points的点投影到图像特征中的归一化位置(在[0, 1]位置内)。通过grid_sample采样每个key_points在图像上的对应特征。对于采样点经ego2img投影后不在图像范围内的情况,对应features为0。
-
refine(基于instance_feature和anchor,基于全连接层得到感知结果):
-
整体输入依赖instance_feature, anchor与anchor_embed,最终的输出结果包括:经过refine后的anchor[B,
,11],对应anchor的类别分类[B,
,
],质量分析(quality)[B,
,2] (值范围在[0,1]区间内)
-
-
基于已有instance_feature和对应的anchor位置编码信息相加, 得到instance_feature
-
instance_feature通过全连接层得到anchor的偏移量,相加后更新anchor。
-
quality, cls全连接层得到对应的质量结果和分类结果。
-
temp_interaction(基于当前帧特征和历史特征,进行交叉注意力学习):输入包括instance_feature(当前帧特征[B,
,256]), temp_instance_feature(历史帧特征[B,
,256]), 对应的位置编码信息anchor_embed&temp_anchor_embed。
-
interatcion(基于当前帧特征,进行自注意力学习):输入包括instance_feature(当前帧特征[B,
,256])。对应位置编码信息anchor_embed
-
历史特征(temp_instance_feature),历史anchor(temp_anchor)及当前帧anchor、当前帧特征的
获取
(get),是从instance_bank内获取,在Det_head
每一轮forward的起始
去做,获取的过程中,会基于历史特征和当前帧特征的时间间隔,进行mask判断;历史帧的anchor会基于ego2global信息进行基础的运动补偿,统一至当前帧下。
-
基于历史特征,历史anchor和当前帧的anchor,当前帧的特征及对应confidence对当前帧特征和anchor的更新,是在模型经过单帧decoder forward后进行的,是通过concat当前帧的top