BEVDet---论文+源码解读

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

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

BEVDet这篇论文主要是提出了一种基于BEV空间下的3D目标检测范式,BEVDet算法模型的整体流程图如下:

整体流程如下:先对多视角图像进行特征提取(Image-view Encoder),再通过基于LSS的视角转换(View Transformer)将多视角特征投影到bev空间下,再用和第一步类似的backbone对bev特征进行编码,最后进行目标检测。这种方法虽然在LSS这一步存在不少冗余的计算,但好处是得到了显式的bev特征,可以做bev视角下的特征提取和数据增强,并且可以使用任意的目标检测头。

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

一、Image-View Encoder模块

利用主干网络和特征融合网络提取输入环视图片的图像特征。

论文中采用ResNet-50作为主干网络,首先主干网络会对输入的环视图像,记作Tensor([bs, N, 3, H, W]),提取多尺度特征;其中bs = batch size,N = 环视图像的个数,H, W = 输入图像的宽和高。

多尺度特征的分辨率如下:

L0 = Tensor([bs * N,1024,H / 16,W / 16])
L1 = Tensor([bs * N,2048,H / 32,W / 32])

然后,采用FPN、FPN-LSS来融合多尺度特征,融合后特征为:

Tensor([bs,N,512,H / 16,W / 16])

二、View Transformer模块

借鉴LSS算法的思想构建BEV空间特征。

2.1 深度估计网络构建3D视锥特征

与LSS算法相似,利用深度估计网络预测特征图每个单元格的离散深度信息和语义特征,用外积运算构建3D视锥特征,对应的逻辑用伪代码表示:

输入特征: Tensor([bs * N, 512, H / 16, W / 16])
输出特征: Tensor([bs * N, 139, H / 16, W / 16])1) 输出特征的前59维代表深度估计网络预测出来的59个离散深度, 然后用Softmax()函数获得概率分布;
2) 输出特征的后80维代表深度估计网络预测出来的80维的语义特征;
3) 对深度概率分布和语义特征利用外积运算得到3D视锥特征

2.2 生成视锥3D坐标点并完成向BEV空间的投影映射

1)生成3D视锥点(源码中的create_frustum()函数,与LSS一样)

需要注意的是,3D坐标中的横纵坐标是基于特征图每个单元格映射回原始图像的位置,深度是预先设置好的深度范围。

 def create_frustum(self):# 原始图片大小, ogfH:128    ogfW:352ogfH, ogfW = self.data_aug_conf['final_dim']# 下采样16倍后图像大小,fH: 8   fW: 22fH, fW = ogfH // self.downsample, ogfW // self.downsample# self.grid_conf['dbound'] = [4, 45, 1]# 在深度方向上划分网格,ds:D×fH×fW (41*8*22)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:D×fH×fW (41×8×22)xs = torch.linspace(0, ogfW - 1, fW, dtype=torch.float).view(1, 1, fW).expand(D, fH, fW)# 在0到127上划分8个格子  ys:D×fH×fW (41×8×22)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:D×fH×fW×3frustum = torch.stack((xs, ys, ds), -1)return nn.Parameter(frustum, requires_grad=False)

2)视锥点向BEV空间投影(源码中的get_lidar_coor()函数,对应LSS源码中的get_geometry()函数)

def get_geometry(self, rots, trans, intrins, post_rots, post_trans):"""    rots:相机外参旋转, trans:相机外参平移, intrins:相机内参, post_rots:数据增强旋转, post_trans:数据增强平移Determine the (x,y,z) locations (in the ego frame) of the points in the point cloud.Returns B x N x D x H/downsample x W/downsample x 3"""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):其物理含义# 每个batch中的每个环视相机图像特征点,其在不同深度下位置对应# 在ego坐标系下的坐标return points	#维度不变,坐标值从相机坐标系->世界坐标系

2.3 构建BEV空间特征

利用上述得到的投影后的3D坐标点以及预测出来的3D视锥特征,利用类似Voxel Pooling的方式得到BEV空间特征,BEV空间特征记作Tensor([bs, C=80, BEV_X=128, BEV_Y=128])。

注:此处与LSS的区别:

LSS中获取BEV feature,采用VoxelPooling操作,即:通过对每一个pillar中的feature进行 cumsum实现的sum_pooling,但是该操作的推理延迟与总体点数成正比,最后得到的feature越大,需要遍历的点就越多,LSS需要的时间也就越多。

BEVDet:引入了一个辅助索引来记录相同的体素索引之前出现过的次数
有了这个辅助索引和体素索引,将点分配到一个二维矩阵中,并通过单独的辅助轴的求和运算将同一体素内的特征组合起来。

在推理时相机内外参数固定的前提下,辅助索引和体素索引固定,可以在初始化阶段计算;

(如上加黑部分,没有理解,有理解的朋友可留言交流。)

值得注意的是,这种修改需要额外的内存,该内存由体素的数量和辅助索引的最大值决定。在实践中,我们将辅助指标的最大值限制为300,并删除剩余的点。该操作对模型精度的影响可以忽略不计。

三、BEV Encoder模块

该模块的作用是对View Transformer模块输出的BEV空间特征进行进一步的多尺度特征提取和融合,包括BEV主干网络和BEV特征融合网络,得到增强的BEV特征。

尽管该结构类似于Image-View Encoder模块,但它可以高精度地感知一些关键信息,比如大小、方向和速度,因为这些信息都是在BEV空间中定义的。BEV编码器的主干网络采用ResNet,颈部网络采用FPN-LSS

BEV主干网络:

BEV主干网络是对输出的BEV特征提取多尺度特征,多尺度特征的分辨率如下:

B0 = Tensor([bs,160,64,64])
B1 = Tensor([bs,320,32,32])
B2 = Tensor([bs,640,16,16])

BEV特征融合网络:

BEV特征融合网络主要是对BEV主干网络输出的多尺度特征进行融合,特征融合网络输出的特征对应Tensor([bs, 256, 128, 128])。

四、3D Object Detection Head模块

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

需要注意的是,BEVDet对不同的检测类别会设置有独立的检测头,每组独立的检测头都会有六个分支来预测物体的不同属性,同时在检测头前又添加一个

共享卷积层提取特征。具体信息如下:

BEVDet一共设置了六个互不共享的检测头,对应六个检测分支:tasks=[
1)dict(num_class=1, class_names=['car']),
2)dict(num_class=2, class_names=['truck', 'construction_vehicle']),
3)dict(num_class=2, class_names=['bus', 'trailer']),
4)dict(num_class=1, class_names=['barrier']),
5)dict(num_class=2, class_names=['motorcycle', 'bicycle']),
6)dict(num_class=2, class_names=['pedestrian', 'traffic_cone']),
]

4.1 共享卷积层

共享卷积层的结构如下:

ConvModule((conv): Conv2d(256, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True)
)

4.2 3D检测头

针对每个检测分支头,分别设置如下六个检测属性:

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

每个类别的检测头检测的内容都是一样的,如下:

1. 沿着x,y轴方向的偏移量(reg分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)2. z轴也就是预测物体的高度信息(height分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)3. 物体的尺寸大小信息(长-宽-高)(dim分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 3, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)4. 物体偏航角的正、余弦(一般车辆在行驶过程中不会涉及俯仰角和滚动角)(rot分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)5. 物体沿x,y轴方向的速度(vel分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 2, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)6. 分类置信度(heatmap分支)
Sequential((0): ConvModule((conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(activate): ReLU(inplace=True))(1): Conv2d(64, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)

五、数据增强

具体参照如下链接,此处不作详细解释:

BEVDet_ High-performance Multi-camera 3D Object Detection in Bird-Eye-View - rock_swc - 博客园 (cnblogs.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车总线之---- LIN总线

Introduction LIN总线的简介,对于传统的这种点对点的连接方式,我们可以看到ECU相关的传感器和执行器是直接连接到ECU的,当传感器和执行器的数量较少时,这样的连接方式是能满足要求的,但是随着汽车电控功能数量的不断增…

基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC,采用两个按键替代指纹,一个按键按下,LCD12864显示比对成功,则 采用ULN2003驱动步进电机转动,表示开门,另一个…

RTMP、RTSP直播播放器的低延迟设计探讨

技术背景 没有多少开发者会相信RTMP或RTSP播放器,延迟会做到150-300ms内,除非测试过大牛直播SDK的,以Android平台启动轻量级RTSP服务和推送RTMP,然后Windows分别播放RTSP和RTMP为例,整体延迟如下: 大牛直播…

深度学习后门攻击分析与实现(二)

前言 在本系列的第一部分中,我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式,现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。 深度学习与网络空间…

探索甘肃非遗:Spring Boot网站开发案例

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…

SpringBoot框架下体育馆管理系统的构建

1引言 1.1课题背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其…

工具介绍---效率高+实用

Visual Studio Code (VS Code) 功能特点: 智能代码提示:内置的智能代码提示功能可以自动完成函数、变量等的输入,提高代码编写速度。插件丰富:支持成千上万的扩展插件,例如代码片段、主题、Linting等,能够…

通信工程学习:什么是CSMA/CD载波监听多路访问/冲突检测

CSMA/CD:载波监听多路访问/冲突检测 CSMA/CD(Carrier Sense Multiple Access/Collision Detect),即载波监听多路访问/冲突检测,是一种用于数据通信的介质访问控制协议,广泛应用于局域网(特别是以…

vue仿chatGpt的AI聊天功能--大模型通义千问(阿里云)

vue仿chatGpt的AI聊天功能–大模型通义千问(阿里云) 通义千问是由阿里云自主研发的大语言模型,用于理解和分析用户输入的自然语言。 1. 创建API-KEY并配置环境变量 打开通义千问网站进行登录,登陆之后创建api-key,右…

李宏毅机器学习2023-HW10-Adversarial Attack

文章目录 TaskBaselineFGSM (Fast Gradient Sign Method (FGSM)I-FGSM(Iterative Fast Gradient Sign Method)MI-FGSM(Momentum Iterative Fast Gradient Sign Method)M-DI2-FGSM(Diverse Input Momentum Iterative Fast Gradient Sign Method) Reportfgsm attackJepg Compress…

Iceberg 基本操作和快速入门

安装 Iceberg 是一种适用于大型分析表的高性能工具,通过spark启动并运行iceberg,文章是通过docker来进行安装并测试的 新建一个docker-compose.yml文件 文件内容 version: "3" services: spark-iceberg: image: tabulario/spark-iceberg co…

数据结构之链表(2),双向链表

目录 前言 一、链表的分类详细 二、双向链表 三、双向链表的实现 四、List.c文件的完整代码 五、使用演示 总结 前言 接着上一篇单链表来详细说说链表中什么是带头和不带头,“哨兵位”是什么,什么是单向什么是双向,什么是循环和不循环。然后实…

微信小程序map组件自定义气泡真机不显示

最近遇到一个需求需要使用uniapp的map自定义气泡 ,做完之后发现在模拟器上好好的,ios真机不显示,安卓页数时好时不好的 一番查询发现是小程序的老问题了,网上的方法都试了也没能解决 后来看到有人说用nvue可以正常显示&#xff0c…

word2vector训练代码详解

目录 1.代码实现 2.知识点 1.代码实现 #导包 import math import torch from torch import nn import dltools #加载PTB数据集 ,需要把PTB数据集的文件夹放在代码上一级目录的data文件中,不用解压 #批次大小、窗口大小、噪声词大小 batch_size, ma…

《深度学习》卷积神经网络CNN 实现手写数字识别

目录 一、卷积神经网络CNN 1、什么是CNN 2、核心 3、构造 二、案例实现 1、下载训练集、测试集 代码实现如下: 2、展示部分图片 运行结果: 3、图片打包 运行结果: 4、判断当前使用的CPU还是GPU 5、定义卷积神经网络 运行结果&a…

后端-对表格数据进行添加、删除和修改

一、添加 要求: 按下添加按钮出现一个板块输入添加的数据信息,点击板块的添加按钮,添加;点击取消,板块消失。 实现: 1.首先,设计页面输入框格式,表格首行 2.从数据库里调数据 3.添加…

LPDDR4芯片学习(二)——Functional Description

一、LPDDR4寻址表 以每个die容量为4GB为例: Memory density(per channel) 2Gb:每个通道大小为2Gb,一个die有两个通道Configuration 16Mb 16DQ 8 banks 2 channels :16Mb的寻址空间16位每个channels8个bank*每个die两channels。1…

Java基础(Arrays工具类)(asList()方法)(详细)

目录 一、Arrays工具类 (1)引言 (2)基本介绍 (3)主要功能(提供的方法) (I)排序(Arrays.sort()) (II)搜索(查找…

ECCV 2024 现场:参会者付高价、跨万里,却无法入场?

ECCV(European Conference on Computer Vision,欧洲计算机视觉国际会议)是计算机视觉领域的重要国际会议之一,与CVPR和ICCV并称为计算机视觉的三大顶级会议。 ECCV2024是该系列会议的第18届会议,2024年9月29日至10月4…

第3篇:常见的Webshell查杀工具----应急响应篇

当网站服务器被入侵时,我们需要一款Webshell检测工具,来帮助我们发现webshell,进一步排查系统可能存在的安全漏洞。 本文推荐了10款Webshll检测工具,用于网站入侵排查。当然,目前市场上的很多主机安全产品也都提供这种…