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

四. 基于环视Camera的BEV感知算法-BEVDepth

目录

    • 前言
    • 0. 简述
    • 1. 算法动机&开创性思路
    • 2. 主体结构
    • 3. 损失函数
    • 4. 性能对比
    • 总结
    • 下载链接
    • 参考

前言

自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考

本次课程我们来学习下课程第四章——基于环视Camera的BEV感知算法,一起去学习下 BEVDepth 感知算法

课程大纲可以看下面的思维导图

在这里插入图片描述

0. 简述

本节内容和大家一起学习一个非常好的工作叫 BEVDepth 是旷世研究院的工作

我们还是从以下四个方面展开,算法动机&开创性思路、主体结构、损失函数和性能对比

1. 算法动机&开创性思路

其实 BEV 感知算法我们讲了这么多,核心内容我们也强调了很多次是怎么去构建这个 BEV 空间的表征,我们怎么得到 BEV 呢,输入图像通过图像处理可以得到 BEV,输入点云通过点云处理可以得到 BEV,核心内容是我们怎么把图像特征,怎么把点云特征转换到 BEV 空间当中

在这里插入图片描述

那这个表征我们也讲过有很多方式,我们把它分为两类,一类是从 2D 到 3D 的方式,也有从 3D 到 2D 的方式,BEVDepth 是属于从 2D 到 3D 的方式,我们来复习一下,从 2D 到 3D 的映射离不开图像生成原理,如果我们已知相机的内参和外参矩阵且已知 2D 图像像素点 p p p,我们将 2D 点 p p p 投影到 3D 空间是什么呢,是一条射线,如果我们想要做到 2D 点 p p p 和 3D 点 P P P 唯一确定关系的话怎么做呢,需要深度值

2D 像素坐标加深度加转换矩阵我们就可以计算得到 3D 世界坐标 P P P,所以深度值非常重要,那深度信息要怎么得到呢,现有方法主要可以分为两类,有一类是离散深度分布(例如 LSS),我们将这条射线划分成很多个深度网格,我们去判断我们要映射的像素点 p p p 落在哪个深度段上的概率最大,是一种概率分布的概念;另外一种叫连续深度估计(例如伪点云),网络会预测我们当前像素点的深度值,是一个确定值,那比如 p p p 它有一个唯一确定深度 D D D,是一个确定的深度估计值

所以按照离散深度分布我们最后做出的映射是什么呢,是从点到线的映射;按照连续深度分布我们做的是什么呢,是从点和点的映射关系,2D 和 3D 空间唯一确定的点与点的关系

OK,那我们想一下上面说的 2D 到 3D 无论是离散分布也好还是连续深度估计也好有没有什么问题呢,是有的,它其实主要问题是深度的不可靠,那也就是说我们这个 D D D 无论是离散深度分布也好还是连续深度估计也好,我们的 D D D 值很容易算错,那一旦深度算错了我们的映射其实也就错了,那我们最终构造的 BEV 空间是不是也就错了,我们检测呢也自然不可能对

那这种深度不可靠的原因是什么呢,作者认为呢主要缺少的是没有一个合适的监督信息,我们可以先不讨论伪点云的方式,我们主要还是针对离散深度分布的方法,那也就是说没有真值去告诉网络我们对应的 pixel 应该落在哪个深度。所以第一点那作者认为由于缺乏明确的深度监督很难做出很准确的深度感知结果,那第二点是什么呢,是网络不能充分利用相机的内外参数所以没有办法有效推断像素深度,我们输入深度预测网络的是什么,是图像特征,通过网络我们可以估计深度分布 D D D,我们输入的是特征我们没有告诉网络我们当前的相机型号是什么,相机和激光雷达相对应的关系是什么,是没有告诉这个信息的,所以网络仅仅依靠特征去进行深度推断而没有充分利用相机的内外参数,作者认为它也是导致没有办法准确推断像素深度的原因之一,那我们所说的第三点还有一个什么原因呢,效率问题,那比如像基于伪点云的思路需要引入额外的深度估计网络,这个网络其实一般而言比较庞大也比较耗时

因此我们简单总结下现有 2D 到 3D 方式的缺点:

  • 没有明确的深度监督,很难输入准确的深度感知
  • 深度子网络不能充分利用相机的内外参数,无法有效推断像素深度
  • 相同的分辨率输入,相同的主干网络,基于深度的目标检测器速度较慢

所以说 BEVDepth 作者尝试能否使用一种轻量化的结构提供准确的监督,一个是监督另外一个是内外参数从而实现深度准确的预测

所以从动机出发我们也能想到 BEVDepth 关注的核心问题是什么呢,其实是深度估计,那我们怎么将深度估计去做得更准确呢,引入深度监督信息,引入相机内外参矩阵

在这里插入图片描述

那 OK 我们再来看看 BEVDepth 的预测和之前讲的 LSS 的结构有什么不同呢,首先从上面的示意图我们能看出来,我们说的 LSS 结构是一种离散深度估计结构,所以呢我们看到的深度图呈现的是网格的模式,都是一小块一小块的网格;而 BEVDepth 看起来是更连续的也更丰富一点

此外 BEVDepth 一个很显著的好处是对于前景位置很明显,那比如从上面的 LSS 图上很难分辨出行人轮廓和车辆轮廓,但相反我们在 BEVDepth 上能够明显的看出车在那哪在哪,那说完动机之后我们再来看一看 BEVDepth 主体结构是怎么做的,是具体怎么设计这个网络的

2. 主体结构

BEVDepth 主体结构如下图所示:

在这里插入图片描述
在这里插入图片描述

我们看网络还是老套路从输入输出看起,输入是 Multi-view Images 多视角图像,输出预测结果也就是我们要的检测结果,那我们再来看一下具体流程,输入的如果是图像,那么编码网络是什么,是图像编码器,输入图像通过图像编码器我们可以得到图像特征,图像特征怎么用呢,那当然是将图像特征转换到 BEV 空间当中得到 BEV Feature,所以我们中间看到的流程全都是用来做图像到 BEV 空间对应视角转换的

那么图像怎么转换到 BEV 的呢,有了图像特征通过深度估计网络可以得到深度值,然后利用深度值将图像特征对应的映射到 BEV 空间组成 BEV 特征,那么这个深度值预测模块其实是 BEVDepth 的核心内容了

在这里插入图片描述

我们先不着急,我们从头开始一个一个看,那首先第一个模块是图像编码器,图像的 Backbone,如上图所示,我们说输入图像通过图像编码器可以得到图像特征,图像编码网络有很多也就是 2D Backbone 有很多,包括 ResNet、ViT、Swin Transformer 等等,也可以使用一些多尺度的策略比如特定金字塔等等,最后我们得到什么,得到的是图像特征,那这就是图像编码模块的功能,非常简单

在这里插入图片描述

有了图像特征我们就考虑图像特征要怎么得到 BEV 特征呢,我们说这个过程呢其实离不开视角转换设计,有了图像特征我们可以通过深度估计,离散的也好连续的也好得到深度概率分布值或者具体的深度值,有了深度我们才可以做特征映射,才能转换到 BEV 空间

所以视角转换模块其实包含两个内容,一个是深度估计,一个是特征映射,那我们一个一个看,如上图所示,深度估计网络 Depth Net 其实包含两个输入,一个输入是图像特征,我们得到的图像特征,另一个输入是相机参数 Camera Parameters,内参外参矩阵它都属于相机参数,同时输入到 Depth Net 一个深度估计网络中去预测深度分布,我们得到的是一个深度分布结果。输入图像特征输入相机参数通过深度网络得到深度分布,我们刚才讲解的流程其实就是深度估计这个模块一个主要的流程

在这里插入图片描述

那大家可能有个疑问就是我们 Depth Net 应该怎么做,我们接下来看一下详细的 Depth Net 是怎么做的,如上图所示,我们刚刚讲了我们 Depth Net 网络包含两个输入,一个是图像特征 Image Features,一个是参数输入内参输入,输出其实也是两个,一个是经过卷积的特征我们叫 Context,图像通过卷积网络可以得到 Context,图像呢同时经过下面的支路可以得到 Depth

上面支路的图像特征处理很简单直接通过卷积输出 Context,那下面的支路也是通过卷积,只不过多了一个相机参数输入,相机内参要怎么处理,首先相机内参数本身参数维度很小,所以说要通过一个扩维的操作,扩维其实也很简单,一个 MLP 就能搞定的事情,扩到多少维呢,其实是和输入的图像通道有关系的,相机扩展的维度和图像通道维度数量是一样的

为什么这么做呢那也涉及到动机的问题,那像作者这里引入的相机内参矩阵其实更偏向一种权重参数,也就是说相机内参矩阵映射成了一种权重去乘上原始的 Feature,对原始图像特征的通道维度进行加权,那我们说这是什么呢,是通道注意力机制,权重高的通道我们需要重点关注,权重低的通道呢我们可以选择性忽略,完事之后得到了加权特征然后再通过一系列的残差网络,DCN 网络得到最终的深度预测结果

所以这个 Depth 网络它叫 Depth Net,相比而言还是比较轻量的,输入图像特征输入相机内参矩阵,输出深度预测结果和图像 Context 特征

在这里插入图片描述

那得到的输出我们来看看是怎么用的呢,在上图中也能看到我们刚才讲 Depth Net 的两个输出,一个是输出图像 Context 另一个是输出我们预测好的深度分布。另外我们一直强调什么,强调 BEVDepth 设计的动机是作者认为以前方法不好的主要原因是缺乏监督信息,那显然 BEVDepth 是包含监督网络的,它的监督是从哪来的呢,从点云过来的,场景的点云信息为深度估计模块提供了深度监督也就是上图中的 Depth Supervision

点云投影到图像上对应的位置,那么这个像素位置就有了点云的深度值作为显式的监督,我们讲显式那就是明确的告诉网络什么是对的什么是错的,我这个 pixel 应该映射到哪,我这个 pixel 不应该映射到哪,而不是让网络去猜我这个映射到底对不对,通过这样一个监督信息其实是辅助了深度预测模块的训练的,让网络可以预测得更准

有了深度有了图像特征可以做什么,可以做转换,那在做转换之前我们还要考虑一个事情,我们得到的这个深度结果一定是好的吗,深度结果是受深度信息监督的,我们这个深度信息监督一定是对的吗,那为什么这么问呢,其实是因为 BEVDepth 作者认为深度监督来源于点云的投影,点云投影到图像依赖什么呢,依赖相机的内参外参转换矩阵,内参我们讲过出厂后基本是固定的,然而外参是会变的,会由于车的抖动产生一定的偏差,那如果外参的转换矩阵存在偏差,点云通过内参外参矩阵投影到的图像像素是不是也就存在偏差了

在这里插入图片描述

因此在这种情况下 BEVDepth 作者认为深度监督是存在偏差的而且这个偏差不可避免很难估量,偏差既然不可避免既然很难估量我们就不再在 Depth Net 中处理了,也没有办法去处理,我们通过深度值预测出来之后,引入深度校正网络,如上图所示,额外的 Refinement 去修正外参扰动带来的偏差

通过这个网络之后,我们认为这个网络现在输出的深度已经很准了我们可以做映射了,所以这里就引入了一个映射模块叫 Efficient Voxel Pooling 体素的高效池化。那我们说这个模块其实包含两个概念,一个概念是体素池化,体素池化很好理解无非是和我们讲的 2D 图像上的网格池化类似,使用了一个最大值或者平均值等等的处理方式,那这里体素池化是用在体素上面。另外提出的一个词叫 Efficient 高效,什么叫高效呢,这个词怎么理解

我们一起来看一下体素高效池化这个模块详细的结构,如下图所示:

在这里插入图片描述

上面的右图是作者提出的体素高效池化,左图是我们本次课程当中提到过很多次的离散深度分布估计,将 2D 像素特征映射到 3D 空间特征的一种方式,图像上的每一个像素点映射到 3D 空间是一条射线。那从 BEVDepth 的框图也能看到一个相机对应的像素点到空间位置是一条射线,那这个射线通过离散化的网格在不同位置有着不同概率的深度分布,那比如图中高一点的地方可能概率就偏大一点,矮一点的颜色浅一点的地方可能概率就偏小一点

那体素的高效池化网络的高效体现在速度快,那怎么加速呢,其实是为每一个网格分配了一个 CUDA 线程,一个 CUDA 线程的作用是处理一个网格的特征,我们叫一个视锥空间的特征,BEV 空间下所有的视锥空间是一个并行化处理的,所有网格是一起做的,我们所有视锥空间是一起做的,那所以自然速度就会加快

那在这里一旦 BEV 空间构造好了,我们自然会进行下一步那就是基于 BEV 特征去做预测,有了 BEV Feature 我们自然可以做预测,那这就是 BEVDepth 完整的结构

3. 损失函数

那 OK,我们再理一下 BEVDepth 整体网络,其框图如下所示

在这里插入图片描述

输入的是 Multi-view 图像一个多视角的图像,通过图像编码器可以得到图像特征,通过 Depth Net 预测深度分布,然后通过深度校正 BEV 空间的特征生成可以得到 BEV Feature,核心内容其实是深度预测模块,与之前的深度分布估计不同 BEVDepth 引入的是有监督信息的深度估计,那这些监督信息哪来呢,点云投影出来的监督值,那既然是有监督信息的,损失函数也是有的,深度估计损失,还有一个是 3D 预测损失,那它们俩就是完整的 BEVDepth 的损失函数

4. 性能对比

OK,我们再看下性能,如下表所示:

在这里插入图片描述

nuScenes 测试集下 BEVDepth 整体性能还是可以的 mAP 是 0.52

在这里插入图片描述

我们是重点关注消融实验,那首先在表 1 中作者做了一个很有意思的实验,我们看下第一行 learned 它表示的其实就是我们 LSS 网络,它作为一个 Baseline 其 mAP 是 28.2,OK,那现在作者怎么做,把 LSS 网络学习到的离散深度分布结果替换成一些随机量,随机量分为两种有一种是 soft 的一种是 hard 的,我们翻译过来叫软随机和硬随机,软随机那就不是非 0 即 1 的结果,存在 0.5、0.6、0.8 等等,random hard 叫硬随机比如 one-hot 编码就是一个硬随机

那作者发现了一个什么特别有意思的事情呢,我们把 LSS 学习到的离散深度分布值替换成一些随机量之后,性能没有下降得很明显没有崩盘,它只是稍许下降,尤其是替换成 random soft 之后性能也仅仅从 28.2 下降了 3.7 个点到 24.5,这是不是挺神奇的,有一点超出我们常识认知。另外作者其实也用 GT 进行替换,这个性能提高非常明显,从 28.2 提高到了 47.0,有将近 20 个点的提升,那足以证明深度监督信息是很有效的

在这里插入图片描述

那在表 4 当中是对文中涉及的一些模块进行了一个验证,前面 DL 模块是深度监督模块,后面第二个 CA 模块是深度监督当中引入了相机参数,后面的 DR 模块是校正模块是 refinement,我们有了深度估计之后对深度值去进行一个校正,MF 是多帧的网络把时序信息引入进去之后性能有了进一步的提升

在这里插入图片描述

表 6 讨论了深度校正模块的一些详细的内容,把里面的一些卷积操作进行了对比,用了 1x1 的卷积,3x1 的卷积,3x3 的卷积,那性能最好的是 3x3 的卷积

在这里插入图片描述

另外由于引入了深度损失,有了深度监督有了深度预测结果所以引入了深度损失,那作者对深度损失函数也进行了讨论,如表 5 所示,采用了两种损失函数一个是 BCE,一个是 L1 以及合在一起的方式

在这里插入图片描述

我们再来看一个很有意思的东西,图像的训练尺寸和测试的尺寸对性能的鲁棒性是不是有影响,如上图所示,训练的时候采用的是 256x704 的尺寸,测试是在不同尺寸下去做的测试,那绿色的部分是 Base Detector,蓝色的是 BEVDepth 的方式也就是本文的方式

作者发现一个什么事情,我们训练尺寸比如 256x704 的训练尺寸如果放在同等尺寸下去进行测试的时候性能差不多,用 BEVDepth 是 30.4 用 base detector 是 28.2,大家性能差不多,如果说训练尺寸和测试尺寸差距很大,比如说我们训练的是 256x704 的尺寸推理的时候采用 192x640 的尺寸,那这个 Base Detector 性能下降得非常明显,从 28.2 直接下降到了 18.9,BEVDepth 性能下降得不是太明显

那为什么 Base Detector 鲁棒性这么差呢,它为什么对图像尺寸性能这么不好呢,其实也比较好理解,缺少了深度监督嘛,因为很多像素是没有学习到一个比较好的深度分布的,那么一旦测试环境发生变化性能波动就会非常大。同时也得益于比较好的深度分布预测,我们能看到 BEVDepth 的方式在不同尺寸下相比而言还是比较鲁棒的

在这里插入图片描述

另外作者还给出了上图的可视化结果,我们能看到像作者的方式投影的位置其实非常好的,绿色部分是 BEVDepth 的投影位置,旁边绿色加红色是传统方法的投影点,它只有很小一部分绿色的点是投影在正确的位置上,而很大一部分红色区域的点是投影在外面也就是错误位置上,它其实就是投影位置飘了

OK,我们 BEVDepth 的核心内容就到此为止,BEVDepth 主要思路其实就是通过深度监督信息的引入让深度估计得更准,那至于其他模块其实都是偏工程性质的模块

总结

BEVDepth 的作者围绕 Depth 深度估计展开,他认为现有的方法由于缺乏明确的深度监督很难做出准确的深度感知结果,此外深度估计子网络不能充分利用相机的内外参数导致无法有效推断像素深度,基于此 BEVDepth 作者提出了一个深度预测模块,与之前的深度分布估计方法不同的是 BEVDepth 引入的是有监督信息的深度估计,这些监督信息来自于点云的投影,这就是 BEVDepth 的核心内容了,通过点云投影到图像这个深度监督信息的引入让深度估计得更准

OK,以上就是 BEVDepth 的全部内容了,下节我们学习一篇想法独特的环视 BEV 感知算法 BEVDistill,敬请期待😄

下载链接

  • 论文下载链接【提取码:6463】
  • 数据集下载链接【提取码:data】

参考

  • [1] Li et al. Bevdepth: Acquisition of reliable depth for multi-view 3d object detection

相关文章:

四. 基于环视Camera的BEV感知算法-BEVDepth

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…...

CentOS系统环境搭建(二十五)——使用docker compose安装mysql

centos系统环境搭建专栏🔗点击跳转 文章目录 使用docker compose安装mysqlMySQL81.新建文件夹2.创建docker-compose.yaml3.创建my.cnf4.mysql容器的启动和关闭 MySQL5.71.新建文件夹2.创建docker-compose.yaml3.创建my.cnf4.mysql容器的启动和关闭 使用docker comp…...

协作机器人(Collaborative-Robot)安全碰撞的速度与接触力

协作机器人(Collaborative-Robot)的安全碰撞速度和接触力是一个非常重要的安全指标。在设计和使用协作机器人时,必须确保其与人类或其他物体的碰撞不会对人员造成伤害。 对于协作机器人的安全碰撞速度,一般会设定一个上限值&…...

第11章 GUI Page400~402 步骤二 画直线

运行效果: 源代码: /**************************************************************** Name: wxMyPainterApp.h* Purpose: Defines Application Class* Author: yanzhenxi (3065598272qq.com)* Created: 2023-12-21* Copyright: yanzhen…...

华为gre隧道全部跑静态路由

最终实现: 1、pc1能用nat上网ping能pc3 2、pc1能通过gre访问pc2 3、全部用静态路由做,没有用ospf,如果要用ospf,那么两边除了路由器上跑ospf,核心交换机也得用ospf r2配置: acl number 3000 rule 5 deny…...

【c++】入门1

c关键字 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染&#xff…...

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录,比如:D盘 执行命令:diango-admin startproject demo1 创建项目 如果提示diango命令不存在,搜索diango-admin程序的位置,然后加入到环境变量path中。 进入项目,cd demo…...

P4 音频知识点——PCM音频原始数据

目录 前言 01 PCM音频原始数据 1.1 频率 1.2 振幅: 1.3 比特率 1.4 采样 1.5 量化 1.6 编码 02. PCM数据有以下重要的参数: 采样率: 采集深度 通道数 ​​​​​​​ PCM比特率 ​​​​​​​ PCM文件大小计算: ​…...

解决Electron中WebView加载部分HTTPS页面白屏的方法

Electron是一个开源的桌面应用程序框架,它允许使用Web技术构建跨平台的桌面应用。在Electron应用中,WebView 是一个常用的组件,用于嵌套加载Web内容。然而,有时候在加载使用 HTTPS 协议的页面时,可能会因为证书问题导致…...

【Java中创建对象的方式有哪些?】

✅Java中创建对象的方式有哪些? ✅使用New关键字✅使用反射机制✅使用clone方法✅使用反序列化✅使用方法句柄✅ 使用Unsafe分配内存 ✅使用New关键字 这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的构造函数 (无参的和有…...

npm使用详解(好吧好吧是粗解)

目录 npm是什么? npm有什么用? npm安装 在 Windows 上 在 macOS 上 在 Linux 上(使用 apt 包管理器为例) 验证 npm 安装成功: npm使用 1. 初始化项目: 2. 安装和管理依赖: 3. 查看和…...

uniapp自定义头部导航怎么实现?

一、在pages.json文件里边写上自定义属性 "navigationStyle": "custom" 二、在对应的index页面写上以下&#xff1a; <view :style"{ height: headheight px, backgroundColor: #24B7FF, zIndex: 99, position: fixed, top: 0px, width: 100% …...

什么是 Dubbo?它有哪些核心功能?

文章目录 什么是 Dubbo&#xff1f;它有哪些核心功能&#xff1f; 什么是 Dubbo&#xff1f;它有哪些核心功能&#xff1f; Dubbo 是一款高性能、轻量级的开源 RPC 框架。由 10 层模式构成&#xff0c;整个分层依赖由上至下。 通过这张图我们也可以将 Dubbo 理解为三层模式&…...

(2021|CoRR,AugCLIP,优化)FuseDream:通过改进的 CLIP+GAN 空间优化实现免训练文本到图像生成

FuseDream: Training-Free Text-to-Image Generation with Improved CLIPGAN Space Optimization 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. CLIPGAN 文本到图…...

python pip安装依赖的常用软件源

目录 引言 一、什么是镜像源&#xff1f;​​​​​​​ 二、清华源 三、阿里源 四、中科大源 五、豆瓣源 六、更多资源 引言 在软件开发和使用过程中&#xff0c;我们经常需要下载和更新各种软件包和库文件。然而&#xff0c;由于网络环境的限制或者服务器的负载&#…...

避免大M取值过大引起的数值问题

在数学建模当中&#xff0c;常常会见到大M法&#xff0c;它之所以叫大M法&#xff0c;是因为它涉及到一个&#xff08;绝对值&#xff09;较大的系数M&#xff0c;这个大M的值应大于约束中的连续变量或者约束表达式可能取到的任何合理值&#xff0c;M值取过大往往会造成优化问题…...

史密斯圆图的使用

史密斯圆图的使用 简介识别史密斯圆图等反射系数圆归一化阻抗圆导纳圆图史密斯圆图的使用单支匹配双支匹配简介 史密斯图Smith Chart是电气工程,无线电,射频工程,微波工程和通信等领域常用的一种图示工具,用于分析和设计传输线和阻抗匹配网络,它由美国工程师Phillip H.Sm…...

可重复读解决了哪些问题? 对 SQL 慢查询会考虑哪些优化 ?

文章目录 可重复读解决了哪些问题&#xff1f;对 SQL 慢查询会考虑哪些优化 &#xff1f; 可重复读解决了哪些问题&#xff1f; &#xff08;1&#xff09;可重复读的核心就是一致性读(consistent read);保证多次读取同一个数据时&#xff0c;其值都和事务开始时候的内容是一致…...

从0开始python学习-35.allure报告企业定制

目录 1. 搭建allure环境 2. 生成报告 3. logo定制 4. 企业级报告内容或层级定制 5. allure局域网查看 1. 搭建allure环境 1.1 JDK&#xff0c;使用PyCharm 找到pycharm安装目录找到java.exe记下jbr目录的完整路径&#xff0c;eg: C:\Program Files\JetBrains\PyCharm Com…...

蓝桥杯2020年10月青少组Python程序设计省赛真题

1、设计一个猜字母的程序,程序随机给出26个小写字母中的一个,答题者输入猜测的字母,若输入的不是26个小写字母之一,让用户重新输入,若字母在答案之前或之后,程序给出相应正确提示,如答错5次,则答题失败并退出游戏,若回答正确,程序输出回答次数并退出游戏。 2、试编一个“口…...

【数据结构】布隆过滤器原理详解及其代码实现

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…...

Qt中实现短信验证码功能

在Qt中实现短信验证码功能,可以使用Qt的信号槽机制和计时器来实现。 首先,在mainwindow.h头文件中添加下列代码: #include <QMainWindow> #include <QTimer>namespace Ui {class MainWindow; }class MainWindow : public...

Redis-运维

转自 极客时间 Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis 同步 Redis主从数据同步,主从第⼀次同步是全量同步 replicaof 主机 端口 #当前这个机器做Master的备份master如何判断slave是不是第⼀次来同步数据&#xff1a; Repl…...

Qt制作定时关机小程序

文章目录 完成效果图ui界面ui样图 main函数窗口文件头文件cpp文件 引言 一般定时关机采用命令行模式&#xff0c;还需要我们计算在多久后关机&#xff0c;我们可以做一个小程序来定时关机 完成效果图 ui界面 <?xml version"1.0" encoding"UTF-8"?>…...

LeetCode day30

LeetCode day30 害&#xff0c;昨天和今天在搞数据结构的报告&#xff0c;后面应该也会把哈夫曼的大作业写上来。 今天认识认识贪心算法。(&#xff61;&#xff65;∀&#xff65;)&#xff89; 2697. 字典序最小回文串 给你一个由 小写英文字母 组成的字符串 s &#xff0c;…...

数据分析基础之《numpy(5)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […...

centos 安装 Miniconda

在 CentOS 上安装 Miniconda 的步骤通常包括下载 Miniconda 安装脚本、运行脚本以及配置环境。以下是详细步骤&#xff1a; 1. 下载 Miniconda 安装脚本 首先&#xff0c;您需要从 Miniconda 的官方网站下载适用于 Linux 的安装脚本。您可以使用 wget 命令在 CentOS 终端中直…...

第二百二十六回

文章目录 1. 概念介绍2. 具体细节2.1 发现服务2.2 发现特征值2.3 发送数据2.4 接收数据 3. 代码与效果3.13.2 运行效果 4. 经验总结 我们在上一章回中介绍了"连接蓝牙设备的细节"相关的内容&#xff0c;本章回中将介绍通过蓝牙发送数据的细节.闲话休提&#xff0c;让…...

ubuntu常用指令

Ubuntu是一个基于Linux的操作系统&#xff0c;它使用了大量的命令行指令。这些指令对于管理系统、处理文件、监控资源和执行各种任务都非常有用。以下是一些常用的Ubuntu命令&#xff1a; 系统管理 sudo&#xff1a;提供管理员权限执行命令&#xff08;例如 sudo apt update&a…...

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知&#xff0c;接口ISchedulerListener&#xff0c;如作业的添加、删除、停止、挂起等事件通知&#xff0c;调度器的启动、关闭、出错等事件通知&#xff0c;触发器的暂停、挂起等事件通知&#xff0c;接口部分定义如下&#xff1a…...

2024-AI人工智能学习-安装了pip install pydot但是还是报错

2024-AI人工智能学习-安装了pip install pydot但是还是报错 出现这样子的错误&#xff1a; /usr/local/bin/python3.11 /Users/wangyang/PycharmProjects/studyPython/tf_model.py 2023-12-24 22:59:02.238366: I tensorflow/core/platform/cpu_feature_guard.cc:182] This …...

在使用mapstruct,想忽略掉List<DTO>字段里面的,`data` 字段的映射, 如何写ignore: 使用@IterableMapping

在使用mapstruct,想忽略掉List字段里面的,data 字段的映射, 如何写ignore 代码如下: public interface AssigmentFileMapper {AssigmentFileDTO assigmentFileToAssigmentFileDTO(AssigmentFile assigmentFile);AssigmentFile assigmentFileDTOToAssigmentFile(Assigment…...

ansible-playbook的Temlates模块 tags模块 Roles模块

Temlates模块 jinja模板架构&#xff0c;通过模板可以实现向模板文件传参(python转义)把占位符参数传到配置文件中去,生产一个目标文本文件&#xff0c;传递变量到需要的配置文件当中 &#xff08;web开发&#xff09; nginx.conf.j2 早文件当中配置的是占位符&#xff08;声明…...

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件&#xff0c;Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用&#xff0c;以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改&#xff0c;而C…...

【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…...

C#和.Net常见问题记录

什么是.NET框架&#xff0c;.NET框架与C#(C Sharp)是什么关系&#xff1f; .NET框架是由Microsoft设计和维护的软件开发框架&#xff0c;.NET框架提供了C#(编程语言)开发的所有基础设施和支持。通过使用C#和.NET框架&#xff0c;开发者可以轻松地开发高质量、高效率的应…...

FAQ:Container Classes篇

1、Why should I use container classes rather than simple arrays?&#xff08;为什么应该使用容器类而不是简单的数组&#xff1f;&#xff09; In terms of time and space, a contiguous array of any kind is just about the optimal construct for accessing a sequen…...

每日一题(LeetCode)----栈和队列--滑动窗口最大值

每日一题(LeetCode)----栈和队列–滑动窗口最大值 1.题目&#xff08;239. 滑动窗口最大值&#xff09; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 …...

13.bash shell中的if-then语句

文章目录 shell中的流控制if语句if语句if-then语句if-then-else 语句 test命令数值比较字符串比较文件比较case语句 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; shell中的流控制if语句 简单的脚本可以只包含顺序执行的命令&#xff0…...

深入了解 Python 的 import 语句

在 Python 中&#xff0c;import 语句是一个关键的功能&#xff0c;用于在程序中引入模块和包。本文将深入讨论 import 语句的各种用法、注意事项以及一些高级技巧&#xff0c;以帮助你更好地理解和使用这一功能。 概念介绍 package 通常对应一个文件夹&#xff0c;下面可以有…...

接口测试 — 11.logging日志模块处理流程

1、概括理解 了解了四大组件的基本定义之后&#xff0c;我们通过图示的方式来理解下信息的传递过程&#xff1a; 也就是获取的日志信息&#xff0c;进入到Logger日志器中&#xff0c;传递给处理器确定要输出到哪里&#xff0c;然后进行过滤器筛选&#xff0c;通过后再按照定义…...

Hago 的 Spark on ACK 实践

作者&#xff1a;华相 Hago 于 2018 年 4 月上线&#xff0c;是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景&#xff0c;提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法&#xff0c;致力于为用户打造高效、多样、…...

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同&#xff0c;通过U盘进行文件拷贝时&#xff0c;导致无法拷贝。官方解决方案如下&#xff0c;但是描述的比较模糊。看我的操作步骤即可。 https://support.apple.com/zh-cn/guide/mac-help/mchlp1657/12.0/mac/12.6 前提条件 mac与…...

trtc-electron-sdk的demo中添加更新功能以及出现的报错问题

1、官网demo下载地址 点击下载 按照官网demo说明文档进行安装和运行 2、添加electron-updater npm install electron-updater根据项目需求安装对应的版本&#xff0c;建议使用5.2.1 3、创建一个handleUpdater.js文件&#xff0c;和package.json同级 // const { ipcMain } …...

什么是流量攻击? 流量攻击怎么处理?

由于DDoS攻击往往采取合法的数据请求技术&#xff0c;再加上傀儡机器&#xff0c;造成DDoS攻击成为最难防御的网络攻击之一。据美国最新的安全损失调查报告&#xff0c;DDoS攻击所造成的经济损失已经跃居第一。 传统的网络设备和周边安全技术&#xff0c;例如防火墙和IDSs(Intr…...

【大数据】NiFi 的基本使用

NiFi 的基本使用 1.NiFi 的安装与使用1.1 NiFi 的安装1.2 各目录及主要文件 2.NiFi 的页面使用2.1 主页面介绍2.2 面板介绍 3.NiFi 的工作方式3.1 基本方式3.2 选择处理器3.3 组件状态3.4 组件的配置3.4.1 SETTINGS&#xff08;通用配置&#xff09;3.4.2 SCHEDULING&#xff0…...

5 分钟内搭建一个免费问答机器人:Milvus + LangChain

搭建一个好用、便宜又准确的问答机器人需要多长时间&#xff1f; 答案是 5 分钟。只需借助开源的 RAG 技术栈、LangChain 以及好用的向量数据库 Milvus。必须要强调的是&#xff0c;该问答机器人的成本很低&#xff0c;因为我们在召回、评估和开发迭代的过程中不需要调用大语言…...

WPF Border

在 WPF 中&#xff0c;Border 是一种常用的控件&#xff0c;用于给其他控件提供边框和背景效果。 要使用 Border 控件&#xff0c;您可以在 XAML 代码中添加以下代码&#xff1a; <Border BorderBrush"Black" BorderThickness"2" Background"Lig…...

基于博弈树的开源五子棋AI教程[4 静态棋盘评估]

引子 静态棋盘的评估是棋力的一个很重要的体现&#xff0c;一个优秀的基于博弈树搜索的AI往往有上千行工作量&#xff0c;本文没有做深入讨论&#xff0c;仅仅写了个引子用来抛砖引玉。 评估一般从两个角度入手&#xff0c;一个是子力&#xff0c;另一个是局势。 1 评估维度 …...

STL--排序与检索

题目 现有N个大理石&#xff0c;每个大理石上写了一个非负整数。首先把各数从小到大排序&#xff0c;然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是&#xff0c;还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。&#xff08;样例中&#xff0c;…...