系统框架
网络结构
Transformer 网络的输入为以下 3 部分:
- query: query_embed
- key: None
- value: mlvl_feats
经历以下 6 层,除了 cross_attn 其他均为默认操作。
['self_attn', 'norm', 'cross_attn', 'norm', 'ffn', 'norm']
注意在 self_attn 中,由于 key
为 None,默认赋值为 query,所以是 self 的加权,同时叠加了 value 中的值。
CrossAttention 的实现
整个Cross-Attention 的计算过程如下。
- 首先 query_pos 随机数经过一个【子网络】构造 3D 空间中的参考点 ref points,
- 根据外参计算参考点在图像上的投影关系,
- 基于图像 2D 坐标采样得到对应图像的多级特征
output
, - query_embed 本身与随机位置编码 query_pos 融合形成新的 query
- 然后对 query 进行【子网络编码】动态学习得到一个注意力权重,
- 将特征与注意力权重【乘积】累加得到 query 和 feature 的 CrossAttention 表达,
- 最终的输出是上述融合 feature + query_embed + ref points 的位置编码
问题1: 模型训练完成后,每次推理 ref points 都是一样的吗? query 每次取的 nn.Embedding.weight,后续的权重固定,ref points 应该是一样的。 只要保证 query 个数远大于场景中目标个数,则基本能保证召回。
问题2: 目标的位置信息是如何编码的? query 是随机生成的,本身不具有位置信息,但是与 ref points 位置是对应的; value 为主干网络提取的多级图像特征, 关键点是 key 并没有使用,不是标准定义的 Cross Product Attention。
query 和 ref points 两个信息之间应该有一定的内在关系, 即 3D 目标与对应的 ref points 通过外参关系是确定的,同时 query 包含生成 ref points 的 pos 信息。
讨论的点是 query 如何与一个真实的目标产生最大响应呢?
考虑 LSS 方法,在 BEV 特征表达的时候就根据学习到的估计深度, 对同一图像投影但不同深度的特征有区分,可能这样的表达能降低3D位置学习难度,
参考链接
- https://arxiv.org/abs/2110.06922
- https://github.com/open-mmlab/mmdetection3d/blob/main/projects/DETR3D/detr3d/detr3d_transformer.py