首页 / 资讯中心 / 文章详情

【自动驾驶】Sparse4D 时序输入和 Feature Queue 详解

【自动驾驶】Sparse4D 时序输入和 Feature Queue 详解 ★ FEATURED ARTICLE
Sparse4D 时序输入和 Feature Queue 详解Sparse V3论文https://arxiv.org/pdf/2311.11722源码地址https://github.com/linxuewu/Sparse4D概述Sparse4D 使用时序融合机制来处理多帧数据通过InstanceBank类管理时序实例和 feature queue。本文将详细解释时序输入和 feature queue 的结构。1. 时序输入结构1.1 输入组件Sparse4D 的输入主要包含三个部分当前帧的多视角图像(img)Shape:[batch_size, num_cams, C, H, W]例如:[1, 6, 3, 256, 704](batch1, 6个相机, RGB, 256x704)新初始化的实例(instance_feature,anchor)instance_feature:[batch_size, num_anchor, embed_dims]anchor:[batch_size, num_anchor, anchor_dims](通常是10维: x,y,z,w,l,h,yaw,vx,vy,vz)例如:[1, 900, 256]和[1, 900, 10]从前一帧传播的实例(temp_instance_feature,temp_anchor)temp_instance_feature:[batch_size, num_temp_instances, embed_dims]temp_anchor:[batch_size, num_temp_instances, anchor_dims]例如:[1, 600, 256]和[1, 600, 10]1.2 时序信息timestamp: 当前帧的时间戳time_interval: 与前一帧的时间间隔T_global: 全局变换矩阵用于坐标变换2. Feature Queue 结构2.1 InstanceBank 中的缓存InstanceBank类维护以下缓存变量在instance_bank.py中定义# 缓存的时序实例特征self.cached_feature:[batch_size,num_temp_instances,embed_dims]# 缓存的时序 anchorself.cached_anchor:[batch_size,num_temp_instances,anchor_dims]# 缓存的置信度self.confidence:[batch_size,num_temp_instances]# 时间掩码用于过滤过期实例self.mask:[batch_size,num_temp_instances]# 元数据包含时间戳、变换矩阵等self.metas:dict2.2 Feature Queue 的工作流程步骤 1: 获取实例 (get方法)defget(self,batch_size,metasNone,dn_metasNone):# 1. 初始化当前帧的实例instance_feature[batch_size,num_anchor,embed_dims]anchor[batch_size,num_anchor,anchor_dims]# 2. 如果有缓存的时序实例ifself.cached_anchorisnotNone:# 计算时间间隔time_intervalmetas[timestamp]-self.metas[timestamp]# 3. 坐标变换将前一帧的 anchor 变换到当前帧坐标系T_temp2curT_global_inv T_global_prev self.cached_anchoranchor_projection(self.cached_anchor,T_temp2cur,time_intervals[-time_interval])# 4. 时间掩码过滤掉时间间隔过大的实例self.mask|time_interval|max_time_interval# 5. 返回当前实例和时序实例return(instance_feature,# 当前帧实例特征anchor,# 当前帧 anchorself.cached_feature,# 时序实例特征 (可能为 None)self.cached_anchor,# 时序 anchor (可能为 None)time_interval# 时间间隔)步骤 2: 更新实例 (update方法)在单帧解码器之后更新实例defupdate(self,instance_feature,anchor,confidence):# 1. 从当前帧中选择 top-N 个高置信度实例Nnum_anchor-num_temp_instances# 例如: 900 - 600 300_,(selected_feature,selected_anchor)topk(confidence,N,instance_feature,anchor)# 2. 将选中的实例与缓存的时序实例拼接selected_featureconcat([self.cached_feature,selected_feature],dim1)selected_anchorconcat([self.cached_anchor,selected_anchor],dim1)# 3. 根据时间掩码决定使用时序实例还是新实例instance_featurewhere(self.mask,selected_feature,instance_feature)anchorwhere(self.mask,selected_anchor,anchor)returninstance_feature,anchor步骤 3: 缓存实例 (cache方法)在解码完成后缓存当前帧的实例用于下一帧defcache(self,instance_feature,anchor,confidence,metasNone):ifnum_temp_instances0:return# 1. 计算置信度confidenceconfidence.max(dim-1).values.sigmoid()# 2. 应用置信度衰减对已缓存的实例ifself.confidenceisnotNone:confidence[:,:num_temp_instances]max(self.confidence*confidence_decay,# 例如: 0.6confidence[:,:num_temp_instances])# 3. 选择 top-K 个实例进行缓存self.confidence,(self.cached_feature,self.cached_anchor)topk(confidence,num_temp_instances,instance_feature,anchor)# 4. 保存元数据self.metasmetas3. 时序融合机制3.1 Temporal GNN 操作在 decoder 中使用temp_gnn操作进行时序融合# 在 sparse4d_head.py 的 forward 方法中elifoptemp_gnn:instance_featureself.graph_model(i,instance_feature,# query: 当前帧实例temp_instance_feature,# key: 时序实例temp_instance_feature,# value: 时序实例query_posanchor_embed,# 当前帧 anchor 编码key_postemp_anchor_embed,# 时序 anchor 编码attn_maskattn_maskiftemp_instance_featureisNoneelseNone,)这是一个 Multi-Head Attention 操作让当前帧的实例关注时序实例。3.2 坐标变换时序实例的 anchor 需要从上一帧坐标系变换到当前帧坐标系# 计算变换矩阵T_temp2curT_global_inv T_global_prev# 投影 anchor考虑时间间隔和运动cached_anchoranchor_projection(cached_anchor,[T_temp2cur],time_intervals[-time_interval])4. 配置参数在配置文件中sparse4dv3_temporal_r50_1x8_bs6_256x704.pyinstance_bankdict(typeInstanceBank,num_anchor900,# 总实例数embed_dims256,# 特征维度anchornuscenes_kmeans900.npy,# anchor 初始化文件anchor_handlerdict(typeSparseBox3DKeyPointsGenerator),num_temp_instances600,# 时序实例数feature queue 大小confidence_decay0.6,# 置信度衰减系数feat_gradFalse,# 是否对特征求梯度max_time_interval2.0,# 最大时间间隔秒)5. 数据流示例Frame t-1: └─ cache: [1, 600, 256] features [1, 600, 10] anchors └─ confidence: [1, 600] Frame t: ├─ 当前帧图像: [1, 6, 3, 256, 704] ├─ 新实例: [1, 900, 256] features [1, 900, 10] anchors ├─ 时序实例: [1, 600, 256] features [1, 600, 10] anchors (从 t-1 传播) │ ├─ 坐标变换: 将时序 anchor 变换到当前帧坐标系 ├─ 时间掩码: 过滤过期实例 │ ├─ Temporal GNN: 当前实例 ← 关注 → 时序实例 ├─ 解码器处理... │ └─ 更新 cache: 选择 top-600 个实例缓存到下一帧6. 关键特性自适应时间掩码: 根据时间间隔过滤过期实例置信度衰减: 对缓存的实例应用置信度衰减默认 0.6坐标变换: 自动将时序实例变换到当前帧坐标系Top-K 选择: 只保留高置信度的实例用于时序融合可配置大小:num_temp_instances控制 feature queue 的大小7. 代码位置InstanceBank类:projects/mmdet3d_plugin/models/instance_bank.pySparse4DHead类:projects/mmdet3d_plugin/models/sparse4d_head.py配置文件:projects/configs/sparse4dv3_temporal_r50_1x8_bs6_256x704.pyTutorial:tutorial/tutorial.ipynb
阅读完成 · 觉得有帮助?
咨询建站