当前位置: 首页 > news >正文

用点云信息来进行监督目标检测

🍑个人主页: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表示图像坐标系下的坐标,R,t分别表示旋转矩阵和平移矩阵,K表示相机的内参。然后,为了对齐投影点云和预测深度之间的形状,在P iimg 上采用了最小池化和独热编码。将这两个操作定义为ΦDigt=ϕ(Piimg)
在这里插入图片描述

深度细化模块

在这里插入图片描述

演示效果

模型参数大小
在这里插入图片描述
在这里插入图片描述

核心逻辑

模型总体框架

def forward(self,x,mats_dict,timestamps=None,):"""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_depth=True)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,timestamps=None,is_return_depth=False):"""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_depth=is_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_depth=False)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)

使用方式

准备数据集

  1. 从如下网站 nuScenes数据集 下载数据集,并且把放入 data/nuscenes文件夹下
  2. 形成的文件夹如下图所示
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 python=3.7# 激活环境
conda activate bevdepth# cd到该文件夹中
cd BEVDepth/# 用pip下载要求的pytorch版本
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html# 下载mmcv,注意两个地方本地的cuda版本和pytorch版本(
pip install mmcv-full==1.5.2# 下载mmdet,不需要加版本号,自动匹配
pip install mmdet==2.24.0# 下载mmsegemtation
pip install mmsegmentation==0.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-lightning==1.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())
  • 参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址

相关文章:

用点云信息来进行监督目标检测

🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心…...

Navicat连接服务器MySQL

Navicat连接服务器MySQL 1. Navicat连接服务器MySQL2. 如何查看MySQL用户名和密码3. 修改MySQL登录密码4. 安装MySQL(Centos7)遇到错误和问题 1. error 1045 (28000): access denied for user ‘root’‘localhost’ (using password:yes) 1. Navicat连接服务器MySQL 选择数据…...

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码:管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码,涵盖了常见的 HTTP 状态码分类,如信息响应(1xx)、成功状态(2xx)、客户端错误&a…...

【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算

矩阵及其运算:人工智能入门数学基础的深入解读 引言 线性代数是人工智能(AI)和机器学习的数学基础,而矩阵作为其核心概念之一,承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用,更是神经网…...

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现,它继承了Nacos的所有核心功能,并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务,RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能,还支持单机和集…...

JAVA |日常开发中JSTL标签库详解

JAVA &#xff5c;日常开发中JSTL标签库详解 前言一、JSTL 概述1.1 定义1.2 优势 二、JSTL 核心标签库2.1 导入 JSTL 库2.2 <c:out>标签 - 输出数据2.3 <c:if>标签 - 条件判断2.4 <c:choose>、<c:when>和<c:otherwise>标签 - 多条件选择 结束语优…...

Apache HttpClient 4和5访问没有有效证书的HTTPS

本文将展示如何配置Apache HttpClient 4和5以支持“接受所有”SSL。 目标很简单——访问没有有效证书的HTTPS URL。 SSLPeerUnverifiedException 在未配置SSL的情况下&#xff0c;尝试消费一个HTTPS URL时会遇到以下测试失败&#xff1a; Test void whenHttpsUrlIsConsumed…...

Lighthouse(灯塔)—— Chrome 浏览器性能测试工具

1.认识 Lighthouse Lighthouse 是 Google 开发的一款开源性能测试工具&#xff0c;用于分析网页或 Web 应用的性能、可访问性、最佳实践、安全性以及 SEO 等关键指标。开发人员可以通过 Lighthouse 快速了解网页的性能瓶颈&#xff0c;并基于优化建议进行改进。 核心功能&…...

扫二维码进小程序的指定页面

草料二维码解码器 微信开发者工具 获取二维码解码的参数->是否登陆->跳转 options.q onLoad: function (options) {// console.log("options",options.q)if (options && options.q) {// 解码二维码携带的链接信息let qrUrl decodeURIComponent(optio…...

如何用IntelliJ IDEA开发Android Studio用自定义Gradle插件

博主所用软件版本为&#xff1a; IntelliJ IDEA 2024.1.4 (Community Edition) Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1 1、制作gradle插件&#xff08;IntelliJ IDEA 2024.1.4&#xff09; 新建groovy工程&#xff0c;File–>New–>Project… 右键点…...

YOLOv8实战道路裂缝缺陷识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对道路裂缝数据集进行训练和优化&#xff0c;该数据集包含丰富的道路裂缝图像样本…...

RPC一分钟

概述 微服务治理&#xff1a;Springcloud、Dubbo服务通信&#xff1a;Grpc、Trift Dubbo 参考 Dubbo核心功能&#xff0c;主要提供了&#xff1a;远程方法调用、智能容错和负载均衡、提供服务自动注册、自动发现等高效服务治理功能。 Dubbo协议Dubbo支持dubbo、rmi、http、…...

Elasticsearch ILM 故障排除:常见问题及修复

作者&#xff1a;来自 Elastic Stef Nestor 大家好&#xff01;我们的 Elasticsearch 团队正在不断改进我们的索引生命周期管理 (index Lifecycle Management - ILM) 功能。当我第一次加入 Elastic Support 时&#xff0c;我通过我们的使用 ILM 实现自动滚动教程快速上手。在帮…...

Unity 设计模式-策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一系列算法&#xff0c;并将每种算法封装到独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化&#xff0c;客户端通过与这些策略对象进…...

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中&#xff0c;项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中&#xff0c;Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具&#xff0c;主要…...

微信小程序之简单的数据中心管理平台(1)

微信小程序之简单的数据中心管理平台&#xff08;1&#xff09; 引言 随着微信小程序的广泛应用&#xff0c;越来越多的企业开始探索如何利用这一技术开发高效、便捷的管理平台。数据中心管理作为信息化建设的重要组成部分&#xff0c;需要一个灵活、可扩展的界面来实现资源的…...

sqlmap --os-shell的原理(MySQL,MSSQL,PostgreSQL,Oracle,SQLite)

1. MySQL 条件 数据库用户需要具备高权限&#xff08;如 FILE 权限&#xff09;。数据库服务运行用户需要对目标目录有写权限。Web 服务器有可写目录&#xff0c;且支持执行上传的脚本&#xff08;如 PHP、JSP 等&#xff09;。 原理 利用 MySQL 的 SELECT ... INTO OUTFIL…...

2024年认证杯SPSSPRO杯数学建模C题(第一阶段)云中的海盐解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现&#xff1a; 巴黎气候协定提出的目标是&#xff1a;在2100年前&#xff0c;把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平&#xff0c;并为1.5摄氏度而努力。但事实上&#xff0c;许多之前的…...

三维扫描检测在汽车制造中的应用

三维扫描&#xff0c;通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 三维扫描…...

【NoSQL数据库】Hbase基本操作——数据库表的增删改查

目录 一、Hbase原理 二、HBase数据库操作 三、遇到的问题和解决方法 一、Hbase原理 HBase的数据模型&#xff1a; 行键 时间戳 列族&#xff1a;contents 列族&#xff1a;anchor 列族&#xff1a;mime “com.cnn.www” T9 Achor:cnnsi.com”CNN” T8 Achor:…...

【C++】格式化输出详解:掌握 cout 的进阶用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;格式化输出的理论概述&#x1f4af;控制输出宽度和填充字符setw 操作符setfill 操作符 &#x1f4af;控制浮点数的显示格式fixed 与 scientificsetprecision &#x1f4af;…...

设计模式学习思路二

设计模式的学习思路_设计模式必须按顺序进行吗-CSDN博客 以下是一些方法和思路可以帮助你更清晰地识别使用了哪种设计模式。 1. 确定模式时的思考步骤 以下是分析代码时&#xff0c;你可以遵循的一些思路和步骤&#xff0c;帮助你识别可能使用的设计模式&#xff1a; a. 识别…...

什么是等级保护

1.为什么要实施等级保护: •国家信息安全形势严峻(敌对势力),针对基础信息系统的违法犯罪持续上升(网上诈骗、入侵、网上盗窃) •维护国家安全的需求(基础信息网络【互联网、电信网、广电网】及重要信息系统【银行、铁路、电力、海关】已经成为国家的关键基础设施) •信息安全是…...

k8s api对象,CRD

在Kubernetes项目中&#xff0c;一个API对象在Etcd里的完整资源路径&#xff0c;是由&#xff1a;Group&#xff08;API组&#xff09;、Version&#xff08;API版本&#xff09;和Resource&#xff08;API资源类型&#xff09;三个部分组成 apiVersion: batch/v2alpha1 kind:…...

【C++指南】C++内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、C 内存管理概述 二、C内存区域划分 三、C 内存管理方式 &#x1f343;1.自动内存管理…...

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…...

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…...

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/04

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Remote Communication Kit

1.问题描述&#xff1a; DynamicDnsRule有没有示例&#xff1f;这个地址是怎么解析出来 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/remote-communication-rcp-0000001770911890#section8160554134811 解决方案&#xff1a; ‘DynamicDnsRule’&a…...

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…...