自动驾驶---感知模型之BEVFormer

1 前言

        在自动驾驶领域,传统的感知方法通常基于图像或点云的局部视角,这会导致信息的遮挡和理解的局限性。而鸟瞰图(BEV)视角可以提供全局的场景信息,更适合于自动驾驶中的目标检测、轨迹预测等任务。然而,将不同视角的传感器数据转换到BEV空间并进行有效融合是一个挑战。BEVFormer的提出旨在解决这一问题,通过Transformer架构实现高效的多传感器数据融合和BEV特征表示学习。

        BEVFormer是用于自动驾驶感知任务的一个重要模型,在2022年的CVPR会议上被提出。它创新性地采用了基于鸟瞰图(BEV)视角的Transformer架构,在多个自动驾驶感知任务中取得了出色的效果。下面从多个方面详细介绍BEVFormer。

        细心的读者朋友可以发现,其实BEVFormer的架构(解码器之前的部分)和理想汽车的E2E架构有着非常相似的地方《自动驾驶大模型---理想汽车智驾端到端方案》。

        因此,笔者比较推荐想接触端到端或者自动驾驶大模型的读者朋友,认真看看BEVFormer的相关内容,因为它的结构和E2E非常相似,并且论文和代码仓库全部开源,非常适合入门。

2 整体架构

        在介绍BEVFormer的整体架构之前,笔者先给读者朋友们普及一个深度学习的知识,在深度学习中,通常将模型分为三个部分:backbone、neck 和 head。

  • Backbone:backbone 是模型的主要组成部分,通常是一个卷积神经网络(CNN)或残差神经网络(ResNet)等。backbone 负责提取输入图像的特征,以便后续的处理和分析。backbone 通常具有许多层和许多参数,可以提取出图像的高级特征表示。
  • Neck:neck 是连接 backbone 和 head 的中间层。neck 的主要作用是对来自 backbone 的特征进行降维或调整,以便更好地适应任务要求。neck 可以采用卷积层、池化层或全连接层等。
  • Head:head 是模型的最后一层,通常是一个分类器或回归器。head 通过输入经过 neck 处理过的特征,产生最终的输出。head 的结构根据任务的不同而不同,例如对于图像分类任务,可以使用 softmax 分类器;对于目标检测任务,可以使用边界框回归器和分类器等。

        BEVFormer是由传统的深度学习模型三部分构成。BEVFormer的整体架构主要由以下几个部分组成:

  • 多传感器编码器:可以处理多种传感器数据,如摄像头图像和激光雷达点云。对于图像数据,通常使用卷积神经网络(CNN)进行特征提取;对于点云数据,可以使用基于点的网络进行处理。

  • BEV查询(BEV Queries):这是BEVFormer的核心概念之一。BEV查询是一组可学习的向量,它们代表了BEV空间中的不同位置。这些查询向量在整个模型中起到了桥梁的作用,用于从多传感器编码器提取的特征中聚合信息。

  • 时空交叉注意力模块(Spatial-Temporal Cross-Attention Module):该模块用于将多传感器编码器提取的特征与BEV查询进行交互。通过交叉注意力机制,BEV查询可以从不同视角的特征中选择性地聚合信息,从而生成BEV空间中的特征表示。此外,该模块还考虑了时间维度的信息,通过引入时间注意力机制,融合不同时刻的传感器数据,提高了模型对动态场景的感知能力。

  • 任务头:在得到BEV空间的特征表示后,使用不同的任务头来完成具体的感知任务,如目标检测、地图分割等(还可增加Occpuancy head以及Trajectory head)。

自动驾驶---感知模型之BEVFormer_第1张图片

3 关键组成部分

3.1 BackBone

        BEVFormer的BackBone结构如下所示,类型是ResNet,深度为50层。(图像一般使用50层,激光雷达点云一般采用18层)

img_backbone = dict(
    # 指定骨干网络的类型为 ResNet
    type='ResNet',
    # 选择 ResNet 的深度为 50 层,常见的还有 18、34、101、152 层等
    depth=50,
    # 表示使用 ResNet 的 4 个阶段(stage),ResNet 通常由多个阶段组成,每个阶段包含多个残差块
    num_stages=4,
    # 输出特征图的索引,这里只输出第 3 个阶段的特征图(索引从 0 开始)
    out_indices=(3,),
    # 冻结第 1 个阶段的参数,即不参与训练,这样可以减少训练的参数量,加快训练速度,同时也可以避免过拟合
    frozen_stages=1,
    # 归一化配置,使用批量归一化(Batch Normalization, BN),并且不要求计算梯度,因为参数在训练过程中不会更新
    norm_cfg=dict(type='BN', requires_grad=False),
    # 开启归一化评估模式,在推理时使用全局统计信息进行归一化
    norm_eval=True,
    # 采用 PyTorch 风格的实现方式
    style='pytorch'
)

3.2 时空交叉注意力机制

        BEVFormer的时空交叉注意力机制是其核心点之一。它允许模型在空间和时间维度上对不同传感器的特征进行自适应的融合。具体来说,该机制包括以下几个步骤:

  • 空间交叉注意力:BEV查询通过与当前时刻的多传感器特征进行交叉注意力计算,从不同视角的特征中聚合信息,生成当前时刻的BEV特征表示。

  • 时间注意力:在处理多帧数据时,BEVFormer引入了时间注意力机制,允许模型根据当前时刻的BEV查询,从历史时刻的BEV特征中选择性地聚合信息,从而捕捉场景的动态变化。

3.3 BEV query

        BEV query是一组可学习的向量,它们在模型训练过程中不断更新。这些查询向量代表了BEV空间中的不同位置,通过与多传感器特征的交互,能够自适应地学习到每个位置的特征表示。这种方式使得模型能够灵活地适应不同的场景和任务需求。

3.4 multi-head

(1)目标检测任务头

  • 工作原理

        目标检测任务头的主要目标是从BEV特征中识别出场景中的目标物体(如车辆、行人、自行车等),并预测它们的位置、大小和类别。它通常基于回归和分类的思想,通过对BEV特征进行处理,输出目标的边界框信息(如中心坐标、长、宽、高、朝向等)以及对应的类别概率。

  • 设计要点

    • 网络结构:常见的目标检测任务头采用卷积层和全连接层的组合。例如,先通过一系列卷积层对BEV特征进行特征提取和特征增强,然后使用全连接层将特征映射到目标的输出空间,包括边界框回归和类别分类。

    • 损失函数:一般使用多部分损失函数,包括分类损失和回归损失。分类损失通常采用交叉熵损失(Cross - Entropy Loss),用于衡量预测类别与真实类别的差异;回归损失可以使用平滑L1损失(Smooth L1 Loss),用于优化边界框的预测。

import torch
import torch.nn as nn

class DetectionHead(nn.Module):
    def __init__(self, in_channels, num_classes, num_anchors):
        super(DetectionHead, self).__init__()
        self.conv1 = nn.Conv2d(in_channels, 256, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.classification_head = nn.Conv2d(256, num_classes * num_anchors, kernel_size=1)
        self.regression_head = nn.Conv2d(256, 4 * num_anchors, kernel_size=1)

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        cls_output = self.classification_head(x)
        reg_output = self.regression_head(x)
        return cls_output, reg_output

(2)占用网格(Occupancy Grid)预测任务头

  • 工作原理

        占用网格预测任务头用于将BEV空间划分为一个个网格单元,并预测每个网格单元是否被物体占用。这对于自动驾驶车辆的路径规划和避障非常重要。它通过对BEV特征进行处理,输出每个网格单元的占用概率。

  • 设计要点

    • 网络结构:通常采用反卷积层或上采样层来提高特征图的分辨率,使其与BEV空间的网格分辨率相匹配。然后使用卷积层输出每个网格单元的占用概率。

    • 损失函数:由于占用网格预测是一个二分类问题(占用或未占用),常用的损失函数是二元交叉熵损失(Binary Cross - Entropy Loss)。

    • 后处理:可以使用一些后处理方法,如形态学操作,来平滑占用网格的预测结果,去除噪声。

import torch
import torch.nn as nn

class OccupancyGridHead(nn.Module):
    def __init__(self, in_channels, grid_size):
        super(OccupancyGridHead, self).__init__()
        self.deconv1 = nn.ConvTranspose2d(in_channels, 128, kernel_size=2, stride=2)
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(128, 1, kernel_size=1)
        self.sigmoid = nn.Sigmoid()
        self.grid_size = grid_size

    def forward(self, x):
        x = self.deconv1(x)
        x = self.relu(x)
        x = self.conv2(x)
        x = self.sigmoid(x)
        x = nn.functional.interpolate(x, size=self.grid_size, mode='bilinear', align_corners=True)
        return x

(3)目标头实现的功能

  • 目标检测:BEVFormer可以准确地检测出自动驾驶场景中的各种目标,如车辆、行人、障碍物等,并提供目标的位置、尺寸和类别信息。

  • 轨迹预测(可增加一个任务头):通过对动态目标的历史轨迹和当前场景信息的分析,BEVFormer可以预测目标的未来运动轨迹,为自动驾驶的决策和规划提供重要依据。

  • 占用网格预测:BEVFormer可以生成BEV空间中的占用网格,用于表示场景中各个位置的占用情况,帮助自动驾驶车辆更好地规划行驶路径。

5 总结

        BEVFormer是一种基于鸟瞰图(BEV)视角的Transformer架构,用于解决自动驾驶感知任务的挑战。它通过多传感器编码器处理摄像头和激光雷达数据,利用BEV查询向量作为桥梁,结合时空交叉注意力机制实现多视角特征融合。该模型包含ResNet骨干网络、核心的时空注意力模块以及多种任务头(如目标检测、占用网格预测等),能够有效处理遮挡问题并提供全局场景理解。

        尽管效果显著,BEVFormer仍面临计算复杂度高、数据依赖性强等挑战。该模型为自动驾驶的感知、预测和规划任务提供了创新的解决方案框架。

你可能感兴趣的:(聊聊自动驾驶技术,自动驾驶,人工智能,机器学习)