智能家居网站模板,外贸中东哪些产品好卖,泛微oa手机版,网站建设怎么做呢#x1f351;个人主页#xff1a;Jupiter. #x1f680; 所属专栏#xff1a;传知代码 欢迎大家点赞收藏评论#x1f60a; 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心… 个人主页Jupiter. 所属专栏传知代码 欢迎大家点赞收藏评论 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心逻辑模型总体框架模型主干网络 使用方式准备数据集训练和验证模型 部署方式 概述
雷达和相机是自动驾驶系统用于检测3D物体常用的手段雷达数据能够产生可靠的三维检测结果而多相机视角由于其较低的成本受到了越来越多的关注。尽管LSS的方法使多视角3D目标检测方法具有可行性但是它关于深度的估计很差。BEVDepth是一种利用深度监督的多视角3D检测器它利用点云的深度信息来指导深度学习。除此之外BEVDepth创新性的提出了将相机内参和外参编码到深度学习模块中使检测器对各种相机设置具有鲁棒性。同时进一步引入了深度细化模块来细化学习到的深度。
参考文献需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版地址
问题分析
Making Lift-splat work is easy
Making Lift-splat work well is hard
隐式深度监督虽然取得了合理的结果但现有的性能远不能令人满意。在这一部分中BEVDepth揭示了Lift-splat现有工作机制的三个不足之处包括深度不准确、深度模糊过拟合和BEV语义不准确。BEVDepth比较了两个基线一个是基于LSS的朴素探测器名为Base detector另一个是利用Dpred上的点云数据得出的额外深度监督将其命名为增强型探测器。
深度不准确
在Base Detector中深度模块上的梯度来自检测损失这是间接的。BEVDepth使用常用的深度估计度量来评估nuScenes上的学习深度Dpred值包括尺度不变对数误差(SILog),平均绝对相对误差(Abs-Rel)均方相对误差(SqRel)和均方根误差(RMSE)。BEVDepth根据两种不同的配置评估两个探测器:针对每个对象的所有像素进行评估和针对每个对象的最佳预测像素进行评估。 在最佳匹配设置下BaseDetector的性能几乎与全区域设置下的增强型探测器相当。这进一步证实了当检测器在没有深度损失的情况下进行训练时它只通过学习部分深度来检测物体。
深度过拟合
基础检测器只学习预测部分区域的深度大多数像素没有被训练来预测合理的深度这引发了我们对深度模块泛化能力的担忧。检测器以这种方式学习深度可能对图像大小、相机参数等超参数非常敏感。 如上图所示当图像大小发生改变时基础模型下降的更厉害这意味着它可能对相机内参、外参或其他超参数的噪声敏感。
不准确的BEV语义
一旦图像特征使用学习到的深度反投影到截锥特征上就会使用体素/柱池化操作将他们聚合到BEV中。 模型总体框架 BEVDepth由四个基本组件构成
一个图像编码器用于从N个输入视图中提取2D特征信息 一个深度网络用于估计网络的深度 一个视图转换器将2D信息转换为3D信息,其中利用了深度信息进行矩阵相乘并且将他们转为一个整体的BEV表示 3D检测头用于推测种类3D边界框和其他特征
显性深度监督
在基本的检测头中关于深度模块的监督主要来自于检测头的损失函数但由于单目深度估计估计深度信息具有一定的困难唯一的检测损失远远不足以监督深度模块因此BEVDepth提出了采用中间层产生的深度信息D pred 并且采用点云信息产生的GT值Dgt作为监督信号来进行计算为了得到GT值BEVDepth首先需要将点云坐标系转换为图像坐标系并且还要通过相机的内参转换到2.5D信息。 如上图公式所示其中u,v表示图像坐标系下的坐标Rt分别表示旋转矩阵和平移矩阵K表示相机的内参。然后为了对齐投影点云和预测深度之间的形状在P iimg 上采用了最小池化和独热编码。将这两个操作定义为ΦDigtϕ(Piimg)
深度细化模块 演示效果
模型参数大小
核心逻辑
模型总体框架
def forward(self,x,mats_dict,timestampsNone,):Forward function for BEVDepthArgs:x (Tensor): Input ferature map.mats_dict(dict):sensor2ego_mats(Tensor): Transformation matrix fromcamera to ego with shape of (B, num_sweeps,num_cameras, 4, 4).intrin_mats(Tensor): Intrinsic matrix with shapeof (B, num_sweeps, num_cameras, 4, 4).ida_mats(Tensor): Transformation matrix for ida withshape of (B, num_sweeps, num_cameras, 4, 4).sensor2sensor_mats(Tensor): Transformation matrixfrom key frame camera to sweep frame camera withshape of (B, num_sweeps, num_cameras, 4, 4).bda_mat(Tensor): Rotation matrix for bda with shapeof (B, 4, 4).timestamps (long): Timestamp.Default: None.Returns:tuple(list[dict]): Output results for tasks. # 判断模型是否需要返回深度信息if self.is_train_depth and self.training:x, depth_pred self.backbone(x,mats_dict,timestamps,is_return_depthTrue)preds self.head(x)return preds, depth_predelse:x self.backbone(x, mats_dict, timestamps)preds self.head(x)return preds模型主干网络
def forward(self,sweep_imgs,mats_dict,lidar_depth,timestampsNone,is_return_depthFalse):Forward function.Args:sweep_imgs(Tensor): Input images with shape of (B, num_sweeps,num_cameras, 3, H, W).mats_dict(dict):sensor2ego_mats(Tensor): Transformation matrix fromcamera to ego with shape of (B, num_sweeps,num_cameras, 4, 4).intrin_mats(Tensor): Intrinsic matrix with shapeof (B, num_sweeps, num_cameras, 4, 4).ida_mats(Tensor): Transformation matrix for ida withshape of (B, num_sweeps, num_cameras, 4, 4).sensor2sensor_mats(Tensor): Transformation matrixfrom key frame camera to sweep frame camera withshape of (B, num_sweeps, num_cameras, 4, 4).bda_mat(Tensor): Rotation matrix for bda with shapeof (B, 4, 4).lidar_depth (Tensor): Depth generated by lidar.timestamps(Tensor): Timestamp for all images with the shape of(B,num_sweeps, num_cameras).Return:Tensor: bev feature map.batch_size, num_sweeps, num_cams, num_channels, img_height, \img_width sweep_imgs.shape# 获得雷达的深度值lidar_depth self.get_downsampled_lidar_depth(lidar_depth)key_frame_res self._forward_single_sweep(0,sweep_imgs[:, 0:1, ...],mats_dict,lidar_depth[:, 0, ...],is_return_depthis_return_depth)if num_sweeps 1:return key_frame_reskey_frame_feature key_frame_res[0] if is_return_depth else key_frame_resret_feature_list [key_frame_feature]for sweep_index in range(1, num_sweeps):with torch.no_grad():feature_map self._forward_single_sweep(sweep_index,sweep_imgs[:, sweep_index:sweep_index 1, ...],mats_dict,lidar_depth[:, sweep_index, ...],is_return_depthFalse)ret_feature_list.append(feature_map)if is_return_depth:return torch.cat(ret_feature_list, 1), key_frame_res[1]else:return torch.cat(ret_feature_list, 1)使用方式
准备数据集
从如下网站 nuScenes数据集 下载数据集并且把放入 data/nuscenes文件夹下形成的文件夹如下图所示
data/nuscenes
├── maps
├── samples
├── sweeps
├── v1.0-test
└── v1.0-trainval使用下列代码生成pkl文件
python scripts/gen_info.py从如下路径中选取自己需要的权重文件
训练和验证模型
# train
python [EXP_PATH] --amp_backend native -b 8 --gpus 8# eval
python [EXP_PATH] --ckpt_path [CKPT_PATH] -e -b 8 --gpus 8部署方式
# 克隆代码
git clone https://github.com/Megvii-BaseDetection/BEVDepth.git# 创建环境
conda create -n bevdepth python3.7# 激活环境
conda activate bevdepth# cd到该文件夹中
cd BEVDepth/# 用pip下载要求的pytorch版本
pip install torch1.9.0cu111 torchvision0.10.0cu111 torchaudio0.9.0 -f https://download.pytorch.org/whl/torch_stable.html# 下载mmcv,注意两个地方本地的cuda版本和pytorch版本(
pip install mmcv-full1.5.2# 下载mmdet,不需要加版本号,自动匹配
pip install mmdet2.24.0# 下载mmsegemtation
pip install mmsegmentation0.20.0# 克隆mmdetection3d
git clone https://github.com/open-mmlab/mmdetection3d.git# cd到mmdetection3d中
cd mmdetection3d# 确定版本
git checkout v1.0.0rc4# 安装
pip install -v -e . # 返回上一级目录
cd ..# 安装相关依赖
pip install -r requirements.txt
python setup.py developpip install pytorch-lightning1.7
pip install mmengine# 其他修改
将python3.7/site-packages/nuscenes/eval/detection/data_classes.py中的
self.class_names self.class_range.keys()改为self.class_names list(self.class_range.keys())参考文献需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版地址