作者:钟娟 ,复睿微电子自动驾驶算法专家,毕业于中国科学院,曾就职于清华大学联合研究所,先后担任资深算法专家、系统架构专家,长期从事图像算法和人工智能领域科学研究工作。
(资料图片)
根据台湾《联合报》及《环球报》消息,7月22日上午,台湾艺人林某某驾驶特斯拉行驶时发生交通事故,引起了网友关注。事故发生在台湾省桃园市中正北路,当时林某某驾驶一台特斯拉Model X在路口完成了掉头,之后车辆原本在三车道中间车道正常行驶,在接近分支点时,由于不明原因突然偏离车道,撞向了马路中间的分离岛导致车辆起火。所幸事故发生时,附近工地的工人们第一时间赶去救援,将林某某父子拉出并转移到了安全地带,避免了更严重的人员伤亡,但林某某全身多处受伤、骨折,紧急送往林口长庚医院治疗。
从现场视频来看,撞击路段的路况、视野和天气都较为良好,由于刚完成掉头,车速看起来也不快。有人对视频进行了详尽的分析,车辆从掉头点到撞击点的直线距离大约180多米,行驶总用时12秒,平均速度为55公里时速,在前10秒的时间都在中间车道正常行驶,最后2秒时开始偏离车道,以接近60公里的时速撞向分离岛。据救援人员描述,林某某被救时安全带是解开状态,但是事故前解开还是事故后解开并未得到证实。
事故原因尚在调查中,发生撞击的事故车前半部分被烧毁,林某某目前意识清醒,由于脑部发生撞击对于车祸发生时的记忆部分失忆,事发经过需要等林某某完全康复之后才有可能被完整的呈现。大家对事故原因的分析主要有两类猜测:
1
有人认为是车辆系统的问题,在辅助驾驶开启的情况下,特斯拉Autopilot极有可能没识别出前方带V字型的导流带和匝道口,导致碰撞。和这起事故特别相似的一起发生在2018年3月,当时苹果工程师黄伟伦驾驶的Model X,在Autopilot启动的情况下,撞上了美国加州高速公路的匝道隔离栏,导致车辆起火,不幸遇难。
2
也有人认为是人为的因素,因为被救时林某某安全带是解开状态,特斯拉解开安全带会强制退出自动辅助驾驶,车辆交给人控制,以林某某赛车手的经验,偏离车道2秒时间应该是足够人工干预进行避让的,但从车辆运行轨迹可以看出并没有避让动作发生,极有可能是分神了。
这次事故的Model X配备L2级别自动驾驶,L2级别自动驾驶就是通过驾驶环境对方向盘和加减速中的多项操作提供驾驶支援,需要驾驶者在整个行驶过程中,密切关注和实时观察周围环境情况,并准备随时接管车辆。L2阶段,目标和事件的探测与响应任务由驾驶员和系统一起承担,驾驶员和自动驾驶系统之间的责权不清晰,或者说驾驶员对自动驾驶的过度信任,是L2级别自动驾驶车辆事故的潜在原因。目前,L2级别的大多数车辆都是纯视觉或者以视觉为主,雷达为辅,且传感器各自做识别任务后做基于权重的后融合。如果视觉发现障碍物,不管雷达有没有发现,车辆都会做出反应,反过来就不行。视觉对于没有见过的物体存在盲区,只有长期积累相关的数据才能逐渐提高模型的鲁棒性,但新生事物例如奇形怪状的车衣可能又会引起视觉的误判,因此,在未来车型的自动驾驶方案中,很多采用雷达和视觉的组合进行感知。
现在国内很多车辆处在L2+阶段,向L3/L4级别过渡面临巨大挑战。除了硬件的升级,基于硬件的各种演进算法层出不穷,Transformer在这一轮的算法迭代中被深入研究,特斯拉基于纯视觉的Transformer将多摄像头特征有效融合到BEV空间进行感知,更是引起了大家对Transformer的广泛关注。近期,我们对Transformer模型进行了深度剖析,对于模型的应用场景、算法原理、算子以及硬件加速做出了多方位思考。
Transformer原理
Transformer是由Google提出用来进行机器翻译的神经网络模型,最早是针对NLP(自然语言处理)中RNN(循环神经网络)难以并行计算的问题,想寻找一个类似CNN(卷积神经网络)的网络来实现并行化处理。
Transformer使用Attention机制,Attention机制中的Q、K、V对应Query、Key、Value,Query、Key、Value的概念取自于信息检索系统。举例来说,当你在某个电商平台搜索一个商品,引擎上输入的内容便是Query,然后搜索引擎根据Query为你匹配Key(商品的属性),然后根据Query和Key的相似度得到匹配的内容Value。
Self-Attention中的Q,K,V也是起着类似的作用,在矩阵计算中,点积是计算两个矩阵相似度的方法之一,使用Q、K进行相似度计算,接着根据相似度与V进行加权匹配,权值就是Query和Key的相似度。经过Self-Attention层后,输入信息互相之间建立了联系,这种联系是可以由并行计算(矩阵运算)完成的,但这种矩阵计算对位置信息一无所知(没有顺序),因此,Transformer对输入进行了位置编码(Positional Encoding),输入的序列位置和顺序信息被一起送入网络,保留了输入图像的位置信息和音频的时序信息。Self-Attention的输出会再经过归一化和前馈网络,完成一次Encoder Layer工作,在Transformer中会级联多个Encoder Layer来完成编码工作,在输入信息之间建立更强的联系。
Transformer的解码器也包含多个Decoder Layer, Decoder Layer和Encoder Layer在机构上非常相似,最大的不同之处在于,Decoder Layer采用Cross-Attention机制,即Query来自于Decoder,Key和Value来自于Encoder。Encoder的输出尺寸和原始信号的尺寸保持一致,而Decoder的输出尺寸根据不同的需求进行自定义,和原始信号尺寸无关。例如,在做自动驾驶图像处理时Encoder的输出都是图像特征金字塔某一层的输入尺寸(240x135x256),而Decoder的输出可以是自定义鸟瞰图(BEV视角)的特征图尺寸(100x100x256),也可以是自定义的检测框(100x3x256)。这也是Transformer的神奇之处,网络将物体从一个特征空间转换到另外一个特征空间,你不用考虑两个空间如何去匹配,Transformer自动帮你完成。
Transformer模型在视觉领域发展历程
基于Transformer的BERT算法在NLP的11项任务中取得了效果的大幅提升,堪称2018年深度学习领域最振奋人心的消息,2020年Google团队提出将Transformer应用到图像分类领域。有人认为CNN是Transformer的一个子集,Transformer可以做图像的全局关注,而CNN是对周边像素的局部关注,Transformer的全局关注包含了CNN局部关注的特殊情况(把除周边像素外的关注权重都设成0)。Transformer在图像领域主要有如下几个关键模型:
1
ViT,ViT将图像拆分成多个patch(16x16 块),从而拼成一个序列向量(256 个向量),将图像的二维结构转换成一维,输入到Transformer网络中进行编解码,完成图像分类任务。ViT完全使用Transformer即可得出结果。
2
DETR,DETR先用CNN完成图像的特征提取,然后将特征图的每个像素(通道方向)作为一个向量,从而拼成HxW个序列向量,从而将图像的二维结构转换成一维,输入到Transformer网络中进行编解码,完成目标检测任务。DETR使用CNN和Transformer结合,是第一个完全端到端的目标检测器。由于其注意力机制为像素级,计算量非常大,在实际应用中有难以接受的计算复杂度。
3
Swin-Transformer,Swin-Transformer提出了基于windows计算注意力的方法,将像素之间注意力机制限制在局部窗内,并且采用类似CNN的层级结构,每层开不同的窗,来加强像素之间的联系。Swin-Transformer的这种结构,使得它可以替代CNN成为视觉任务的主干网络来提取图像特征。
4
Deformable DETR,Deformable DETR采用Deformable Attention(变形注意力机制),模块思想源于Deformable CNN。Deformable DETR沿用DETR的思想,不同的是仅从特征图中Query的邻域内预测固定数量(4个)的采样点计算Attention,邻域内采样点的位置偏移量是模型训练学习出来的。由于采用了稀疏的注意力模式,计算量大幅度下降。其Deformable Attention的机制能够让模型自动学习到感兴趣的区域(像素点)来进行关注,这种机制在多摄像机BEV特征融合、特征金字塔多层融合以及多传感器特征融合中得到广泛应用。
Transformer在自动驾驶算法演进中的应用
Transformer在自动驾驶中的应用已经成为一种趋势,除了在基于BEV特征的前融合中广泛应用外,Transformer还可替代CNN和RNN实现图像特征提取、金字塔特征融合以及时序特征提取的应用。近年来,国内外基于Transformer的主要研究如下:
1
BEVSegFormer,在Resnet提取特征图后,采用类似于Deformable DETR的结构对每个相机多尺度特征进行编码,然后将多相机特征在BEV特征空间进行解码得到基于BEV视觉的特征图,继而输出BEV语义分割结果。
2
BEVFormer,在Resnet提取特征图后,同样采用类似于Deformable DETR的结构。先利用Temporal Self-Attention对前一时间戳进行查询,将历史时刻信息融合进来,然后利用Spatial Cross-Attention将多个相机在BEV特征空间进行投影,融合多相机信息,得到BEV特征,继而用对应Head完成3D目标检测和语义分割。
3
DETR3D,用Resnet提取特征,然后用FPN融合特征金字塔,获得多层金字塔特征后,输入到Deformable DETR的解码器中。与BEVFormer和BEVSegFormer不同的是,DETR3D的解码器输入和输出的不是BEV的特征图,而是BEV视角下包含9个维度(位置3、大小3、航向角2、速度1)的检测框Object Queries。DETR3D的解码器Self-Attention模块将Object Query进行全局交互避免多个Query收敛到同个物体,与此同时将每个Object Query的边界框中心送到一个子网络对多个相机多层金字塔特征进行特定的投影计算后获得投影特征。然后将投影特征和Self-Attention层的输出做Cross-Attention,更新Object Query的检测框和类别。
4
FUTR3D,FUTR3D采用类似于DETR3D的结构,不同的是FUTR3D融合了相机、激光雷达和毫米波雷达的多传感器信息。用Resnet进行相机特征提取,用PointPilar进行激光雷达特征提取,毫米波雷达直接采用雷达点云。在特征投影时,雷达直接用BEV下的三维参考点投影,相机采用DETR3D类似投影,然后将所有传感器投影特征进行级联,最后使用MLP网络对级联特征进行编码得到融合的投影特征,编码器结构与DETR3D一样,输出也是3D检测框和类别。
5
MUTR3D,MUTR3D是一个端到端的目标跟踪框架。用Resnet和FPN分别提取特征并进行多尺度特征融合。然后MUTR3D对于每一帧进行了两种类型的查询,新生查询用类似DETR3D的方式获得3D检测框Object Query,旧查询Old Query是来自先前帧成功检测或跟踪到的目标。旧查询负责跟踪当前帧中之前出现的目标(第一次成功检测到就被分配),新生查询负责当前帧中检测新出现的目标(和旧查询没有匹配的目标),两个查询一起完成跟踪任务。MUTR3D采用和DETR3D类似的Transformer结构,可以完成3D目标检测跟踪。
此外,VectorMapNet用Transformer进行了高精地图端到端学习;BEVerse和BEVDet用Swin Transformer做主干网进行多相机特征提取;PETR是对DETR3D的改进,将相机图像投影到3D视锥空间后,采用类似DETR3D的方法获得3D目标检测和类别,此外PETR也采用了Swin Transformer进行特征提取。
Transformer在硬件加速中的需求
从近期的算法演进应用中可以看出,在自动驾驶领域用得较多的Transformer模型主要集中在用Swin Transformer做图像特征提取以及用Deformable Attention做多尺度、多相机、多传感器的特征融合。对这两个模型进行算法结构拆解,对比CNN网络可以得到以下硬件加速的变化:
1
矩阵运算(Matrix Multiply)
2
大量1x1卷积计算,CNN网络中以3x3卷积为主
3
位置编码带来的sin/cos计算
4
Swin Transformer中各层中不同window对于数据tile的影响以及片内存储的需求
5
Deformable Attention机制中,多采样点的位置偏移量对数据tile和片内存储的需求
6
大模型(量化前的Transformer模型动作几百M,甚至上G)在加速单元里的部署
Transformer在GPU上已经实现了落地,但功耗较高。为了获得更低的功耗,我们进行了新的NPU架构设计来同时满足CNN和Transformer模块的加速。