专栏名称: 新机器视觉
最前沿的机器视觉与计算机视觉技术
目录
相关文章推荐
湖北省教育厅  ·  开学就实施!该地中小学生每天综合体育活动时间 ... ·  21 小时前  
湖北省教育厅  ·  开学就实施!该地中小学生每天综合体育活动时间 ... ·  21 小时前  
科研大匠  ·  无限使用!ChatGPT学术中文版入口 ·  2 天前  
募格学术  ·  社科研究必学!Python文本分析课程来袭, ... ·  3 天前  
研之成理  ·  Angew. Chem. ... ·  5 天前  
51好读  ›  专栏  ›  新机器视觉

人工智能 | 逐行逐句从BEVFormer开始学起

新机器视觉  · 公众号  ·  · 2024-12-29 20:45

正文

0. 简介


随着Transformer爆火,也导致了许多以Transformer为主题框架的端到端网络的兴起,这也导致了传统自动驾驶模块化逐渐被取代,虽然已经发展得相当成熟,通常采用模块化串联的部署方式:其核心模块涵盖感知、定位、预测、决策和控制等,每个主要模块及其子模块都承担着特定的职责,且每个模块的输入通常来源于前一模块的输出。



这类模块化设计的优势在于能够将复杂的自动驾驶任务分解为更小、更易于管理的子任务,同时便于问题的追踪和定位;然而,随着自动驾驶技术向数据驱动的方向发展,模块化设计的某些局限性也逐渐显现,例如信息传递过程中可能出现的损耗、计算延迟以及累积误差等问题。



为此现在更多的工作开始瞄向“全局最优”。因为模块化自动驾驶系统面临信息丢失、计算效率低、累积误差以及维护成本等问题,这些问题难以回避,需要新的思路去解决。


端到端自动驾驶通过将传感器收集到的全面信息作为输入,在单一网络中直接生成车辆的控制指令或运动规划。这种设计使得整个系统针对最终目标进行优化,而非仅仅针对某个独立的子任务,从而实现自动驾驶性能的全局最优化。随着高质量数据的不断积累和模型的持续优化,端到端架构有望展现出比传统模块化架构更优越的自动驾驶性能。


目前,BEV+OCC+Transformer已经实现了感知模块的端到端架构,决策模块也在逐步从依赖手写规则向基于深度学习的模式转变,最终目标是实现模块化联合与单一模型的端到端自动驾驶



0.1 行为克隆(Behavior Cloning)


数据收集: 从专家(如人类驾驶员)处收集大量驾驶数据,这些数据包括传感器输入(如摄像头图像、雷达数据)和相应的控制输出(如方向盘转角、加速和制动)。


数据预处理: 对收集到的数据进行清洗和预处理,以确保数据质量。


模型训练: 使用预处理后的数据训练一个神经网络模型,使其能够从传感器输入预测出相应的控制输出。


验证和测试: 在不同的驾驶场景下验证和测试训练好的模型,确保其能够模仿专家的行为。


0.2 逆最优控制(Inverse Optimal Control)


数据收集: 类似行为克隆,从专家处收集驾驶数据。


推断奖励函数: 假设专家的行为是最优的,通过逆向推断专家的奖励函数。


模型训练: 使用推断出的奖励函数训练神经网络模型,使其能够从传感器输入中推断出最优的控制输出。


0.3 强化学习(Reinforcement Learning)


强化学习通过试错和奖励机制来学习策略。其关键在于设计一个合理的奖励函数,使得智能体能够通过不断的交互和学习来优化其行为。


0.3.1 环境设置


环境仿真: 创建一个逼真的驾驶模拟环境,使智能体能够在虚拟环境中进行训练和试错。


状态和动作空间定义: 定义智能体的状态空间(如车的位置、速度等)和动作空间(如转向、加速、制动)。


0.3.2 奖励函数设计


奖励函数: 设计一个奖励函数,以量化每个动作的好坏。奖励函数通常根据驾驶的安全性、效率、舒适度等因素来设计。


0.3.3 模型训练


初始策略: 初始化智能体的策略,可以是随机的或从模仿学习得到的初始策略。


策略迭代: 智能体在环境中进行试错,通过与环境的交互来收集经验。


价值函数估计: 根据收集到的经验,估计状态的价值函数或动作的优势函数。


策略更新: 根据价值函数或优势函数更新策略,使得智能体逐渐学会选择最优动作。


0.3.4 验证和测试


评估: 在不同的驾驶场景和环境下评估训练好的模型,确保其能够在真实世界中表现良好。




其他都好理解,可能queue和cam不好理解 比如你当前时刻是tt,那么queuequeue我想设置成3,就意味着,除了当前时刻以外,t−1和t−2时刻的信息我要一并拿来计算cam:可以简单理解成摄像头的数量,比如按我前几章的逻辑图画的 样子,那么cam<=6



1. BEVformer Backbone以及设计思想


在BEV之前,大概三四年前吧,其实就出现了前后融合


后融合:或者叫结果融合,就是假如有6个摄像头,把6个摄像头的检测结果进行融合


前融合:或者叫数据融合,就是把6个摄像头拼成一个大图,然后对大图进行处理


看了我前后融合的解释,其实不难理解,前后融合都有各自的问题,目前看只有22年底出来的BEV,通过CNN,或者是Transformer(ViT)来提取特征,才能做到真正的特征级别的融合,也是代表未来的方向。



如图所示:BEVFormer主体部分有 6层结构相同的BEVFormer encoder layers, 每一层都是由以transformer为核心的modules(TSA+SCA),再加上FF、Add和Norm组成。BEVFormer encoder layer结构中有3个特别的设计:BEV Queries, Spatial Cross-attention(SCA)和Temporal Self-attention(TSA)。 其中BEV Queries是栅格形可学习参数,承载着通过attention机制在multi-camera views中查询、聚合的features。SCA和TSA是以BEV Queries作为输入的注意力层,负责实施查询、聚合空间features(来自multi-camera images)和时间features(来自历史BEV)的过程。



这里我们可以将 BEV可以想象成一个Tensor。假设我画的下面这个图是200*200的矩阵



这个每一个对应的小方块(在现实世界一般是米为单位的,1米或0.5米完全取决于你要求的细致程度),每一个方块我们其实可以把它理解为一个向量。特征空间你可以给它想象成一个网络,特征空间的大小,也就是网格的间隔决定了你的精度,你可以弄200*200200∗200,那就得到了4万个向量组成的在高维空间上融合的tensor。在特征空间里,我们可以以全局视角来进行预测,整个空间的长和宽(比如200*200200∗200)都给出来了,只需要来计算每个方块的具体特征是啥就可以了。


如果在任务中把每个点的特征都做出来了,你在高维空间中做物体检测啥的,这就是已经现成了(传统比如Yolo,DETR,还得先构建特征空间和向量)。


按照图说,比如我要求橙色箭头上对应的这个点的特征,那如果我想求出这个点的特征,要和其他6个矩阵中的哪几个矩阵去做乘法呢(没错其实就可以简单理解成矩阵乘),如果我要全做,那这个框架等于没意义



然后我们判断一下,这个点对应的实际上在物理世界里是前面和左前方摄像头的位置,跟其他额外的四个不发生关系



矩阵去做运算就可以了,这样一下子显存节省了百分之66,TFLOPs的消耗也节省了百分之66



这个就是特征简化,BEVformer就直接帮你做了。在BEVformer里面有一个很重要的概念就是时间注意力模块,时间注意力模块的用途,就是做时间对齐的,因为不同帧里面的车和周围物体都会有偏移



首先是原论文里的图,可以看到在做物体检测的时候实际上又外挂了两个Linear,就是全连接层。我们可以将上图每一个格子可以认为一个向量,那这个向量的特征咋算呢,它是跟这个矩阵中所有点都做self-attention吗,那就是N的平方的计算量了。如果说跟周边几个做?比如我就跟周边4个点做,那么算法是不是就从N方变成4N了,一下省了好多资源。


这就引申出通过这个全连接层,你算出来4个绿色的点。这就立马不一样了,不但不用每个向量你都去求解(省时省力),而且,每个橙色的点,对应算出来的4个绿色的点,是不一样的(有针对性,其实是时序针对性,不过复杂对被框架给屏蔽了),这就是可变attention机制的由来



摘取的更多,我的结果越和现实拟合呢?-------当然不是,因为这和数据采样有关,因为你的BEV高维空间上的点(向量),在计算attetion的时候,实际上跟你有关的可能就那么几个点,如果你把所有的点都引入,也许带来了不必要的噪音,使结果反而没有就几个点的计算方式好。


对于BevFormer而言,整体流程大致为:


1、有一个backbone,确定自己有几个视角,当中有提取特征的网络。啥网络都行,最好要速度快,比如Resnet,也可以VIT(带Transformer的都得优化)


2、其次,抽6个摄像头的特征,生成一个BEV的3D(4D加入了时间的概念)特征空间。BEV的特征空间里面的每个点,都要在这些特征里采样,这里可以使用特征简化并通过可变注意力机制实现筛选


3、再次,做基于时间的attention,主要一定是先做基于时间的,因为有了先验数据(比如t-2t−2,t-1t−1)







请到「今天看啥」查看全文