BEV视觉3D感知算法梳理

news2024/11/18 4:23:27

1. 基于BEV空间的自动驾驶感知任务

最近,基于BEV空间下的感知任务已经涌现出了众多优秀算法,并在多个自动驾驶公开数据集(KITTI,Waymo,nuScenes)上取得了非常不错的成绩。根据自动驾驶汽车上安装的传感器类型(视觉传感器:针孔/鱼眼相机传感器、激光雷达传感器、毫米波雷达传感器)对感知算法进行分类的话,可以大致分为以下三个类别:

  • 基于纯视觉/图像信息构建BEV空间特征实现自动驾驶感知任务
  • 基于纯激光雷达信息构建BEV空间特征实现自动驾驶感知任务
  • 基于多种传感器信息融合构建BEV空间特征实现自动驾驶感知任务

在这里,简单总结下不同传感器的优缺点,正是由于各个传感器之间可以取长补短,所以目前的自动驾驶汽车上通常都会配备不同类型的传感器。

激光雷达传感器(Lidar)

激光雷达传感器可以提供物体准确的深度信息以及结构信息;但激光雷达传感器提供物体信息的距离比较有限,同时其获得的点云数据与相机传感器采集到的图像信息相比更加稀疏

相机传感器(Camera)

相机传感器可以很好的捕捉图像中物体包含的丰富的色彩和纹理信息;但由于图像成像过程中的限制,得到的2D图像无法保留物体在深度方向的信息

毫米波雷达传感器(Radar)

毫米波雷达传感器采集到的数据相比于激光雷达传感器获取的数据更加稀疏;但其获取的物体信息范围相较于激光雷达传感器更远,同时可以更好的采集运动物体的信息

虽然激光雷达传感器可以提供自动驾驶感知任务中不可或缺的深度信息,但是给汽车配备一套激光雷达设备的价格远高于给汽车配备一套相机设备的价格。所以,近年来涌现出诸多基于纯视觉的自动驾驶感知算法。而本文也主要是对基于纯视觉的感知算法模型进行梳理。

在完成后续算法模型梳理之前,先简单概括下基于BEV空间实现感知任务所具有的一些优势。

2. 基于BEV空间实现感知任务的优势

  • 在各类算法模型得到BEV空间特征后,可以基于获得的BEV特征实现3D目标检测、车道线检测、地图语义分割等不同的感知任务,而且不同任务的感知结果可以很自然的应用到自动驾驶的后续模块(如:规划和控制);
  • 在BEV空间下,可以非常方便的将不同视角、不同时间序列(帧)、不同模态(传感器)的特征信息进行融合,输出更加准确的BEV空间特征,从而更好地实现自动驾驶感知任务;
  • 相较于基于Perpective View的纯视觉感知方法,基于BEV空间的感知算法以俯视的角度去实现感知任务,可以比较好的缓解不同物体间的遮挡问题;

既然基于BEV空间实现感知任务具有诸多优势,同时纯视觉的方法造价又相对低廉,所以基于BEV空间下的纯视觉感知算法应运而生。但正如前文所提到的,激光雷达设备虽然造价高昂,但是却可以为自动驾驶感知任务提供物体在深度方向上的准确的信息。而纯视觉的自动驾驶感知算法由于只利用了2D图像的特征,没有深度方向的信息可以利用,所以如何基于2D的图像特征去实现BEV空间特征的构建成为了这类方法的核心问题。这里根据当下比较主流的构建方式划分为两大类:

第一大类:自下而上的BEV空间特征构建方法(也被称为基于深度的方法)

这类方法大体的思路是利用人工设计的深度预测网络对图像像素的深度信息进行预测,进而实现将网络提取到的2D图像特征转换为3D的相机视锥特征,实现2D空间特征到3D空间特征的转换,然后,再利用后续的Voxel Pooling等操作实现BEV空间特征的构建。

第二大类:自上而下的BEV空间特征构建方法

这类方法大体的思路是先在BEV空间下,根据点云的感知范围以及体素大小预先构建一组3D空间网格,然后利用相机内外参变换矩阵将3D空间网格点投影到图像坐标系下,接着对相应位置处的二维图像特征(通常为环视图像特征)进行采样,最终实现BEV空间特征的构建。或者利用最近比较火的Transformer中的的Query思想,在3D空间下初始一组Object Query,通过Cross-Attention的思想将Object Query与图像特征进行交互,得到BEV特征从而预测感知结果。

3. 自下而上的BEV空间特征构建方法

自下而上的感知算法如前文所说,主要利用深度预测网络预测出图像像素的离散深度信息,实现2D图像特征向3D空间特征的转换,下面主要梳理下比较经典的LSSBEVDet算法模型。

3.1 LSS:Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D

论文链接:https://arxiv.org/pdf/2008.05711.pdf;

Github仓库源码:https://github.com/nv-tlabs/lift-splat-shoot;

LSS是发表在ECCV 2020上的一篇论文,其主要是解决感知中的地图分割任务的,但其利用深度估计网络预测像素的离散深度,从而利用2D图像特征构建3D特征的思想被大多数感知算法借鉴。LSS算法模型的整体流程图如下
在这里插入图片描述

LSS算法模型的前向过程主要包括以下五个部分:

  • 构建相机视锥坐标下的3D空间网格,并利用相机的内外参变换矩阵将3D空间网格点投影到到BEV空间下;
  • 利用主干网络和特征融合网络提取输入环视图片的2D图像特征;
  • 利用深度估计网络预测特征图中每个单元格的语义信息和深度概率分布,通过外积运算构建相机视锥特征;
  • 对投影到BEV空间下的坐标点以及相机视锥特征,利用体素池化(Voxel Pooling)构建BEV空间特征;
  • 对输出的BEV特征利用BEV Encoder模块完成多尺度特征的提取和融合,将融合后的特征用于完成地图分割任务;

构建相机视锥下的3D网格 + 空间点投影到BEV空间

  • 构建相机视锥下的3D网格(源码中的creat_frustum()函数)
def create_frustum():
    ogfH, ogfW = self.data_aug_conf['final_dim']  # 原始图片大小  ogfH:128  ogfW:352
    fH, fW = ogfH // self.downsample, ogfW // self.downsample  # 下采样16倍后图像大小  fH: 8  fW: 22
     
    # self.grid_conf['dbound'] = [4, 45, 1]  # 在深度方向上划分网格 ds: DxfHxfW (41x8x22)
    ds = torch.arange(*self.grid_conf['dbound'], dtype=torch.float).view(-1, 1, 1).expand(-1, fH, fW)
    D, _, _ = ds.shape # D: 41 表示深度方向上网格的数量
    
    # 在0到351上划分22个格子 xs: DxfHxfW(41x8x22)
    xs = torch.linspace(0, ogfW - 1, fW, dtype=torch.float).view(1, 1, fW).expand(D, fH, fW)  
    
    # 在0到127上划分8个格子 ys: DxfHxfW(41x8x22)
    ys = torch.linspace(0, ogfH - 1, fH, dtype=torch.float).view(1, fH, 1).expand(D, fH, fW)  

    # D x H x W x 3
    # 堆积起来形成网格坐标, frustum[i,j,k,0]就是(i,j)位置,深度为k的像素的宽度方向上的栅格坐标   frustum: DxfHxfWx3
    frustum = torch.stack((xs, ys, ds), -1)  
    return nn.Parameter(frustum, requires_grad=False)
  • 利用相机内外参将相机视锥下的3D网格投影到BEV空间(源码中的get_geometry()函数)
def get_geometry(self, rots, trans, intrins, post_rots, post_trans):
    B, N, _ = trans.shape  # B: batch size N:环视相机个数

    # undo post-transformation
    # B x N x D x H x W x 3
    points = self.frustum - post_trans.view(B, N, 1, 1, 1, 3)
    points = torch.inverse(post_rots).view(B, N, 1, 1, 1, 3, 3).matmul(points.unsqueeze(-1)
    
    points = torch.cat((points[:, :, :, :, :, :2] * points[:, :, :, :, :, 2:3],
                        points[:, :, :, :, :, 2:3]
                        ), 5) 
                        
    combine = rots.matmul(torch.inverse(intrins))
    points = combine.view(B, N, 1, 1, 1, 3, 3).matmul(points).squeeze(-1)
    points += trans.view(B, N, 1, 1, 1, 3)
    
    # (bs, N, depth, H, W, 3)
    return points

利用主干网络和特征融合网络提取环视图像的2D图像特征

  • 其中LSS原论文中采用的主干网络是EfficientNet-B0,其输出的多尺度特征如下:
level0 = Tensor([bs * N, 16, H / 2, W / 2])
level1 = Tensor([bs * N, 24, H / 4, W / 4])
level2 = Tensor([bs * N, 40, H / 8, W / 8])
level3 = Tensor([bs * N, 112, H / 16, W / 16])
level4 = Tensor([bs * N, 320, H / 32, W / 32])
  • 对提取后的多尺度特征利用特征融合网络实现不同尺度特征的融合
Step1: 对最后一层特征升采样到倒数第二层大小
level4 -> Up -> level4' = (bs * N, 320, H / 16, W / 16)

Step2:对主干网络输出的后两层特征进行concat
cat(level4', level3) -> output = (bs * N, 432, H / 16, W / 16)

Step3:对concat后的特征,利用卷积层进一步拟合
ConvLayer(output) -> output' = (bs * N, 512, H / 16, W / 16)

其中ConvLayer = 
"""Sequential(
  (0): Conv2d(432, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU(inplace=True)
  (3): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (4): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (5): ReLU(inplace=True)
)"""
  • 利用深度估计网络预测特征图中每个单元格的语义信息和深度概率分布,通过外积运算构建相机视锥特征

这一部分是LSS算法的核心:其主要思想是设计了一个深度估计网络对特征图每个单元格的语义信息(通道维度)和深度信息(深度方向的概率分布)进行预测,通过外积运算的方式,将2D的图像特征投影到3D的视锥特征,从而完成2D特征到3D特征的视角转换。

2D到3D部分的转换实现逻辑如下图所示(其中α ,c分别代表深度估计网络预测出来的深度概率密度以及语义特征信息);
在这里插入图片描述
利用体素池化根据BEV空间下的坐标点以及视锥特征构建BEV空间特征

这里在原始论文中主要采用了quick sum的方式计算BEV特征,其实现逻辑的图例如下(图例来自https://zhuanlan.zhihu.com/p/567880155)
在这里插入图片描述
对输出的BEV特征利用BEV Encoder模块完成多尺度特征的提取和融合,融合后的特征用于完成地图分割任务;

BEV Encoder提取BEV特征后输出的多尺度特征如下:

evel0:Tensor([bs, 64, 100, 100])
level1: Tensor([bs, 128, 50, 50])
level2: Tensor([bs, 256, 25, 25])
  • 对输出的多尺度特征进行融合,得到最终的BEV特征,完成最后的地图分割任务
Step1: level2 -> Up (4x) -> level2' = (bs, 256, 100, 100)
Step2: concat(level2', level0) -> output = (bs, 320, 100, 100)
Step3: Conv1(output) -> output' = (bs, 256, 100, 100)

''' Conv1
Sequential(
  (0): Conv2d(320, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU(inplace=True)
  (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (5): ReLU(inplace=True)
)'''

Step4: Up2(output') -> final = (bs, 1, 200, 200)
'''Sequential(
  (0): Upsample(scale_factor=2.0, mode=bilinear)
  (1): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
  (2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (3): ReLU(inplace=True)
  (4): Conv2d(128, 1, kernel_size=(1, 1), stride=(1, 1))
)'''

3.2. BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View

论文链接:https://arxiv.org/pdf/2112.11790.pdf;

Github仓库源码:https://github.com/HuangJunJie2017/BEVDet;

BEVDet这篇论文主要是提出了一种基于BEV空间下的3D目标检测范式,BEVDet算法模型的整体流程图如下:
在这里插入图片描述
BEVDet算法模型的前向过程主要包括以下五个部分:

  • 利用主干网络和特征融合网络提取输入环视图片的图像特征(对应上图中的Image-View Encoder模块);
  • 借鉴LSS算法的思想将提取到的2D图像特征变换为3D相机视锥空间特征(对应上图中的View Transformer模块);
  • 利用体素池化根据相机视锥特征和映射后的3D相机视锥空间构建BEV空间特征(对应上图中的View Transformer模块);
  • 利用BEV Encoder模块对输出的BEV空间特征实现多尺度特征的提取和融合,得到增强的BEV特征(对应上图中的BEV Encoder模块);
  • 对增强的BEV特征接3D检测头实现3D检测任务(对应上图中的3D Object Detection Head模块);

Image-View Encoder模块:利用主干网络和特征融合网络对环视图像进行提取

论文中利用ResNet-50主干网络提取输入环视图片的多尺度特征,输出多尺度特征如下:

l0 = Tensor([bs * N, 1024, H / 16, W / 16])
l1 = Tensor([bs * N, 2048, H / 32, W / 32])
  • 利用特征融合网络对提取出来的多尺度特征进行融合
l0 = Tensor([bs * N, 1024, H / 16, W / 16])
l1 = Tensor([bs * N, 2048, H / 32, W / 32])
利用特征融合网络对提取出来的多尺度特征进行融合
Python
Step1:分别对输出的两个尺度的特征利用Conv1x1卷积降通道
l0 -> Conv1x1 -> l0_ = Tensor([bs * N, 512, H / 16, W / 16]);
l1 -> Conv1x1_ -> l1_ = Tensor([bs * N, 512, H / 32, W / 32]);

Step2: 将降采样后的特征图进行element-wise融合
Up(l1_) + l0_ = Tensor([bs * N, 512, H / 16, W / 16]);

Step3:融合后的特征利用Conv3x3完成进一步拟合,最后输出特征为Tensor([bs * N, 512, H / 16, W / 16])

View Transformer模块:根据得到的相机视锥特征及映射后的3D坐标点利用体素池化构建BEV空间特征

View Transformer模块的逻辑与LSS论文中构建相机视锥特征、3D坐标点的投影转换以及体素池化的逻辑基本一致,用于获得BEV空间特征。这里就不再展开介绍啦。

**BEV Encoder模块:**对View Transformer模块输出的BEV空间特征实现多尺度特征的提取和融合,增强BEV特征表达

  • BEV主干网络用于实现BEV空间特征的多尺度特征提取,输出多尺度特征如下:
la = Tensor([bs, 160, 64, 64]);
lb = Tensor([bs, 320, 32, 32]);
lc = Tensor([bs, 640, 16, 16])

BEV特征融合网络用于对多尺度BEV特征进行融合,实现逻辑如下:

Python
Step1. 对lc特征进行上采样到la大小 
Tensor([bs, 640, 16, 16]) -- Up --> Tensor([bs, 640, 64, 64]);

Step2. 将la特征与lc特征进行concat,并利用Conv1x1卷积降维
Tensor([bs, 800, 64, 64]) -- Conv1x1 --> Tensor([bs, 512, 64, 64]);

Step3. 降维后的特征利用Up进行升采样,最后输出的BEV特征为Tensor([bs, 512, 128, 128])

对增强的BEV特征接3D检测头实现3D检测任务

需要注意的是,BEVDet对不同的检测类别会设置有独立的检测头,每组独立的检测头都会有六个分支来预测物体的不同属性,具体信息如下

  • reg分支:用于预测BEV下物体相对于每个单元格左上角的xy偏移量;
  • height分支:用于预测物体的高度信息;
  • dim分支:用于预测物体的尺寸大小信息;
  • rot分支:用于预测物体偏航角的正、余弦值;
  • vel分支:用于预测物体沿xy方向的速度;
  • heatmap分支:用于预测不同物体的类别概率;

4、自上而下的BEV空间特征构建方法

自上而下的这类算法通常是利用点云的感知范围以及体素大小预先构建一组BEV空间下的3D网格坐标,然后利用相机的内外参变换矩阵将3D空间坐标投影到图像坐标系下,并对相应位置的图像特征进行采样,或者借鉴Transformer中的Query思想,利用在3D空间下构建的Object Query与图像特征进行交互,最终实现BEV特征的构建。下面主要梳理下CaDDN、BEVFormer以及PETR算法模型;

4.1. CaDNN:Categorical Depth Distribution Network for Monocular 3D Object Detection

论文链接:https://arxiv.org/pdf/2103.01100.pdf;

Github仓库源码:https://github.com/TRAILab/CaDDN;

CaDDN是发表在CVPR 2021上的一篇论文,该论文主要是基于单目相机实现3D目标检测任务。CaDDN算法模型的整体流程图如下:
在这里插入图片描述
CaDDN算法模型的前向过程主要包括以下四个部分:

  • 利用主干网络提取输入单目图像的多尺度特征(对应上图的Image Backbone);
  • 利用提取到的多尺度特征预测特征图每个单元格上的语义表达和深度方向的概率估计,从而构建相机视锥特征(对应上图的Frustum Features);
  • 将BEV空间下构造的3D网格点根据相机的内外参变换矩阵投影到相机视锥坐标系,进行特征采样(对应上图的Voxel Features),并利用Voxel Collapse形成最终的BEV空间特征;
  • 对得到的BEV特征先经过BEV Backbone实现多尺度特征的提取,然后接Detection Head实现3D目标检测;

利用主干网络提取输入单目图像的多尺度特征
论文中采用的是ResNet-101主干网络提取图像的多尺度特征,多尺度特征如下:

Tensor([bs, 2048, H / 8, W / 8])# 降采样8倍的特征图用于后续预测深度方向的离散信息;
Tensor([bs, 256, H / 4, W / 4])# 降采样4倍的特征图用于后续预测语义特征;

利用提取到的多尺度特征预测特征图单元格的语义特征和深度方向的离散概率估计,从而构建相机视锥特征

CaDDN构建视锥特征的方式整体与LSS算法相近,二者算法主要的区别是CaDDN中深度预测网络是靠显式监督,而LSS算法中的深度预测网络是隐式监督的。

  • 对降采样4倍的特征图,论文中采用ASPP模块,通过不同大小的卷积来扩大感受野,用于预测特征图上每个单元格的语义特征;
  • 对降采样8倍的特征图,论文中利用深度预测网络预测深度方向的离散概率分布;
  • 最后根据预测的语义特征以及深度方向的离散概率分布利用外积运算得到相机视锥特征;

将BEV空间下构造的3D网格点根据相机内外参投影到相机视锥坐标系,并进行采样,利用Voxel Collapse构建最终BEV特征

  • 根据点云感知范围以及体素大小构建BEV空间下的3D网格点(源码中的create_meshgrid3d()函数)
def create_meshgrid3d(width, height, depth):
    xs: Tensor = torch.linspace(0, width - 1, width, device=device, dtype=dtype)
    ys: Tensor = torch.linspace(0, height - 1, height, device=device, dtype=dtype)
    zs: Tensor = torch.linspace(0, depth - 1, depth, device=device, dtype=dtype)
    # generate grid by stacking coordinates
    base_grid = stack(torch_meshgrid([zs, xs, ys], indexing="ij"), dim=-1)  # DxWxHx3
    return base_grid.permute(0, 2, 1, 3).unsqueeze(0)  # 1xDxHxWx3
  • 根据得到的3D网格点,利用相机内外参投影回相机的视锥空间得到相机视锥网格。其中视锥的横纵坐标的计算方式与正常投影过程的计算方式相同。需要注意的是,论文中对网格点的深度大小利用LID算法进行了处理,其中LID的示意图和公式如下:

LID示意图:
在这里插入图片描述
LID公式:
在这里插入图片描述
在得到相机视锥特征以及相机视锥网格后,通过F.grid_sample()函数进行采样,从而得到图中的Voxel Features,再利用Voxel Collapse操作去掉Voxel Features的高度信息,得到最终的BEV空间特征。

对得到的BEV特征经过BEV Backbone特征提取后,接Detection Head实现3D目标检测

这里Detection Head所预测的内容与BEVDet中检测头预测的内容基本保持一致,就不再重复介绍啦 ~

4. 2. BEVFormer:Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers

论文链接:https://arxiv.org/pdf/2203.17270.pdf;

Github仓库源码:https://github.com/fundamentalvision/BEVFormer;

BEVFormer是发表在ECCV 2022上的一篇论文,该论文主要是基于环视图像实现感知中的3D目标检测和地图分割任务的。BEVFormer算法模型的整体流程图如下:
在这里插入图片描述
BEVFormer算法模型的前向过程主要包括以下三个部分:

  • 主干网络和特征融合网络提取环视图像的多尺度特征;
  • 利用上图中的Encoder模块(由Temporal Self-Attention模块和Spatial Cross-Attention模块组成)实现空间BEV特征的构建;
  • Object Query与BEV特征利用Decoder模块进行交互得到Output Embedding,进而接3D检测头或者语义分割头完成3D目标检测和地图分割任务;

主干网络和特征融合网络提取环视图像的多尺度特征,输出的多尺度特征如下:

[0]: Tensor([bs, cam, 256, h / 8, w / 8])
[1]: Tensor([bs, cam, 256, h / 16, w / 16])
[2]: Tensor([bs, cam, 256, h / 32, w / 32])
[3]: Tensor([bs, cam, 256, h / 64, w / 64])

利用Temporal Self-Attention模块和Spatial Cross-Attention模块完成BEV特征的构建

由论文中的流程图可知,Encoder模块由Temporal Self-Attention模块以及Spatial Cross-Attention模块组成实现BEV特征构建。两个模块的功能描述如下:

  • Temporal Self-Attention模块

该模块的主要作用是通过引入之前时序帧的信息特征(图中的History BEV)并与当前时刻的BEV Query利用Self-Attention机制实现融合,然后将融合后的BEV Query送入到后面的Spatial Cross-Attention模块中。将时序信息引入到模型里的好处是可以使算法模型更好的解决感知中存在的遮挡问题,也可以比较准确的预测周围物体的速度信息。

  • Spatial Cross-Attention模块

Spatial Cross-Attention模块利用Temporal Self-Attention模块输出的BEV Query,对主干网络和特征融合网络提取到的多尺度环视图像特征进行查询,生成BEV空间下的BEV Embedding特征;

BEVFormer这里的实现方式与CaDDN算法类似,都是采用了自上而下的构建方式;根据点云感知范围和体素大小构建BEV下的3D空间网格,通过相机内外参变换矩阵将3D空间点映射到图像特征上,BEVFormer算法借鉴了Deformable Transformer的局部注意力机制的思想对图像特征进行采样完成最终的BEV特征构建。

Object Query与BEV特征利用Decoder模块进行交互得到Output Embedding,进而接3D检测头或者语义分割头完成3D目标检测和地图分割任务

由于官方代码只提供了3D目标检测的实现方式,所以这里主要介绍3D目标检测的实现方式。

算法中将Object Query与BEV特征借鉴Deformable DETR中局部注意力的思想输出Output Embedding。利用FFN网络充当3D目标检测头预测相关的感知参数(预测内容与BEVDet算法相似),实现最终的3D目标检测任务。

4.3. PETR:Position Embedding Transformation for Multi-View 3D Object Detection

论文链接:https://arxiv.org/pdf/2203.05625.pdf;

Github仓库源码:https://github.com/megvii-research/PETR;

PETR是发表在ECCV 2022上的一篇论文,该论文的主要思想是希望类似于DETR算法一样实现完全端到端的3D目标检测任务;PETR算法模型的整体流程图如下
在这里插入图片描述
PETR算法模型的前向过程主要包括以下三个部分:

  • 利用主干网络和特征融合网络提取图像的2D特征;
  • 利用3D位置编码器输出具有3D空间位置的特征;
  • 利用Decoder获得Output Embedding,最后接3D检测头实现3D目标检测;

利用主干网络和特征融合网络提取图像的2D特征,实现流程如下

Python
# 主干网络输出的多尺度特征如下
l0 = Tensor([bs * N, 1024, H / 16, W / 16])
l1 = Tensor([bs * N, 2048, H / 32, W / 32])

# 特征融合网络对主干网络输出的多尺度特征进行融合,输出图像的2D特征
out[0] = Conv1x1(l1) --> Tensor([bs * N, 256, H / 32, W / 32]);
out[1] = Conv1x1(l0) + Up(Tensor([bs * N, 256, H / 32, W / 32]) --> Tensor([bs * N, 256, H / 16, W / 16]);

利用3D位置编码器输出具有3D空间位置的特征,3D位置编码器整体流程图如下

  • 对主干网络和特征提取网络输出的2D图像特征利用1x1卷积进行拟合得到图像语义特征;
  • 生成视锥网格点,并利用相机内外参转换到3D空间(对应上图中的3D Coordinates),利用3D Position Embedding进行3D位置编码
  • 最后将3D位置编码 + 1x1卷积拟合后的图像语义特征进行相加,得到具有空间位置的语义特征(对应上图中的3D Position-aware Features)

利用Decoder获得Output Embedding,最后接3D检测头实现3D目标检测

这部分的实现逻辑与传统的Transformer的Decoder的逻辑类似,利用Cross-Attention模块将生成的3D空间下的Object Query和具有3D空间位置的语义特征进行交互,得到Output Embedding,然后利用FFN网络充当3D检测头实现最终的3D检测结果。

参考文章

[1] https://arxiv.org/pdf/2208.02797.pdf
[2] https://arxiv.org/pdf/2209.05324.pdf
[3] https://arxiv.org/pdf/2008.05711.pdf(LSS)
[4] https://arxiv.org/pdf/2112.11790.pdf(BEVDet)
[5] https://arxiv.org/pdf/2103.01100.pdf(CaDDN)
[6] https://arxiv.org/pdf/2203.17270.pdf(BEVFormer)
[7] https://arxiv.org/pdf/2203.05625.pdf(PETR)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始学习深度学习】37. 深度循环神经网络与双向循环神经网络简介

目录1. 深度循环神经网络2. 双向循环神经网络总结1. 深度循环神经网络 之前介绍的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。下图演示了一个有LLL个隐藏层的…

数字化时代,全方位解读商业智能BI

商业智能BI是一种通用的数据类技术解决方案,不会因为行业BI没有进行针对性开发而出现不适配、无法使用的情况。同时,也正因为商业智能BI核心是数据,只要企业有数据沉淀,不管是哪些行业BI商业智能都能发挥出作用。 不过考虑到不同…

文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128438303 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

portraiture2023智能磨皮修饰滤镜插件中文版

在人像后期修图的时候免不了需要进行磨皮处理,很多人在挑选磨皮软件的时候都不知道该如何选择,今天的文章就来带大家看看磨皮软件哪个好,能磨皮的修图软件和插件!借助磨皮软件即使是新手也能做出高级的人像图片,下面挑选了几款好用…

Java 并发编程知识总结【五】

6. 线程中断与 LockSupport 6.1 线程中断机制 大厂(蚂蚁金服)面试题: 什么是中断? 首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.…

Exynos_4412——中断控制器

目录 一、中断控制器 中断控制器的作用: 二、Exynos_4412下的中断控制器 它支持三种类型的中断 可以编程设置: 三、中断控制器详解 四、中断控制器编程 一、中断控制器 外设产生的中断信号,先要经过中断控制器,中断是异常…

如何解决软件项目管理中的冲突?

1、项目干系人间的良好沟通 项目干系人之间保持良好的沟通交流,是减少项目管理中冲突的重要手段。甲乙双方签订合同后,为保障项目的成功,在项目发生矛盾和困难时,需要双方相互理解和沟通,共同协商解决问题。 为了及时解…

Git(八) - IDEA 集成 GitHub

一、设置 GitHub 账号 二、分享工程到 GitHub 来到GitHub中发现已经帮我们创建好了git-test的远程仓库。 三、push 推送本地库到远程库 注意:push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致, push的操作是会被拒绝的…

go 性能分析pprof和trace

runtime/pprof:采集程序(非 Server)的运行数据进行分析,用于可结束的代码块,如一次编解码操作等net/http/pprof:采集 HTTP Server 的运行时数据进行分析。用于不可结束的代码块,如 web 应用等 使…

​工程师如何对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师,亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践,也看到了很多 Bad Cases,所以想把自己的一些心得体会写在这里,供工程师进行…

linux的shell的概述

Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ke…

各种颜色的代码

颜色代码对照表如下: 关于16进制颜色代码: 这有必要了解一颜色系统的概念: RGB:RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的&a…

MySQL的一些有意思的指令和函数

这个里面我准备记录一些比较有意思的MySQL的指令和函数,当然使用函数的时候我们要注意,会不会因为函数导致不走索引,走全表扫描的情况。 因为对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树…

文本分类(LSTM+PyTorch)

本文的配套代码已上传至github,链接在文末,同时附带中文数据集。 一、传统方法的基本步骤 预处理:首先进行分词,然后是除去停用词;将文本表示成向量,常用的就是文本表示向量空间模型;进行特征…

回调函数、qsort函数、sort函数与lambda表达式

目录 目录 1、回调函数 2、sort函数 3、lambda表达式 4、qsort与sort函数使用lambda表达式 1、回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函…

凝心聚力 开源共建 | 统信软件参与成立OpenKunlun开源固件社区

11月22日,统信软件携手国内固件厂商、处理器厂商、外设板卡厂商等数十家产业同仁参与共建的OpenKunlun开源固件社区正式成立! OpenKunlun社区是在自愿、开源、平等和协作的基础上,由基础软硬件企业、高等院校、个人开发者共同参与的非营利性开…

STM32——STM32中断系统与EXTI外部中断

文章目录一、中断系统二、STM32中断系统三、NVIC(嵌套中断向量控制器)NVIC基本结构NVIC优先级分组四、EXTI(外部中断)EXTI简介EXTI基本结构AFIO复用IO口EXTI框图五、对射式红外传感器计次电路设计关键函数EXTI库函数文件&#xff…

SpringMVC与SpringBoot响应请求的流程

SpringMVC是基于Servlet的MVC模型,Model:一个或多个javabean对象,用于存储数据和业务逻辑;View:一个或多个jsp页面,拿到控制器提交的数据为模型提供数据显示;Controller:一个或多个s…

【消息中间件】RabbitMQ的工作模式

前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:深入、全面、系统的介绍消息中间件 🌰 文章简介:本文将介绍RabbitMQ的工作模式 &#x1f353…

cubeIDE开发, stm32的CRC计算CubeMX配置及HAL库底层实现分析

一、stm32的CRC 1.1 CRC的简介及MCU关联说明 STM32的CRC(Cyclic Redundancy Check,循环冗余校验)计算单元使用一个固定的多项式发生器,从一个32位的数据字产生一个CRC码。在业务开发应用中,会基于CRC的技术用于验证数据传输或存储完整性。在E…