参考代码:translating-images-into-maps
1. 概述
介绍:在这篇文章中提出了一种新的bev特征抽取方法,其思想是在图像特征的w维度上进行展开,对每个在w维度上展开的特征通过非线性映射的关系建立其到对应bev区域的映射,只不过这里的bev上的映射区域是从原点出发的一个扇形区域(文章也将其称之为polar ray),也就通过这样类似扫描的方式建立起w维度展开序列特征到bev特征的对应关系。此外,对于最终映射bev特征会根据距离的远近划分到不同stage的图像特征上去,也就是说对于越远的的地方使用的图像特征分辨率也就越大。除了对当前时间戳上的多帧图像映射到bev下,还通过关联时序特征的方式引入时序信息,从而提供更加丰富的感知表达。
使用该工程下的GIF动图更加能形象表达序列映射的对应关系:
2. 方法设计
2.1 网络pipeline
文章的主体结构见下图所示:
通过分析上图中数据的流向可以将网络的处理流程划分为如下几个步骤:
- Step1:通过如CNN或者Transformer这样的特征抽取网络抽取输入图像特征 S I ∈ R C ∗ H ∗ W S^I\in R^{C*H*W} SI∈RC∗H∗W;
- Step2:按照距离的远近将不同距离段的bev划分到不同stage的图像特征上去,并通过非线性形映射得到对应bev特征 S ( ϕ ( B E V ) ) S^{(\phi(BEV))} S(ϕ(BEV));
- Step3(optional):这一步是可选的,主要用于去关联时序信息,对应上面的DYNAMICS操作;
- Step4 :在得到的bev特征上完成下游任务,比如分割;
2.2 图像特征到BEV的特征转换
文章中提到的bev特征(polar ray)转换是通过在w维度上进行序列预测的方式得到的,也就是下图中的形式:
输入的一列图像特征会经过非线性映射得到特征 h ∈ R H ∗ C h\in R^{H*C} h∈RH∗C,之后通过attention的映射得到bev特征 y ∈ R r ∗ C y\in R^{r*C} y∈Rr∗C,其中 r r r就是代表bev特征(polar ray)表达的长度(或者理解为场景深度)。此外,这里是通过queries的形式表达需要表达的bev特征,其构建过程不仅考虑了bev特征长度,还考虑了角度信息,也就是这两者统一参与了queries的构建过程。参考:
# src/model/positional_encoding.py#L69
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1) # 角度信息
div_term = torch.exp(
torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)
)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.sin(position * div_term)
2.2.1 基于标准attention的特征转换
这里的attention包含两个部分:图像特征上的attention和polar-ray上的attention。这两个分别完成的是图像特征到bev特征(polar ray)映射和polar ray特征的表达优化。这里虽然没有显式去使用depth信息,其实是depth隐式编码在了attention的操作中了。
图像特征上的attention:
这里输入是在w维度上进行划分之后的图像特征,其经过非线性层之后得到memory特征 h h h,之后会与query做attention,从而得到polar ray特征表达。首先对输入的图像特征和query做映射:
Q ( y i ) = y i W Q , K