【读点论文】PP-YOLOE: An evolved version of YOLO,面向友好部署的模型设计,为项目后续产业落地提供了更加有效的参考

PP-YOLOE: An evolved version of YOLO

Abstract

  • 在本报告中,我们介绍了PP-YOLOE,一种具有高性能和友好部署的工业最先进的目标探测器。我们在之前的PP-YOLOv2的基础上进行优化,采用无锚模式,更强大的骨干和颈部配备CSPRepResStage, ET-head和动态标签分配算法TAL。我们为不同的实践场景提供s/m/l/x模型。结果,pp - yoloe - 1在COCO测试开发上实现了51.4 mAP,在Tesla V100上实现了78.1 FPS,与之前的先进工业车型PP-YOLOv2和YOLOX相比,分别实现了(+1.9 AP, +13.35%提速)和(+1.3 AP, +24.96%提速)的显著提升。在TensorRT和fp16精度下,PP-YOLOE推理速度达到149.2 FPS。我们还进行了大量的实验来验证我们设计的有效性。源代码和预训练模型可在PaddleDetection PaddlePaddle/PaddleDetection: Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection. (github.com)。
  • 论文地址:[2203.16250] PP-YOLOE: An evolved version of YOLO (arxiv.org)
  • 首先PP-YOLOE-l 在COCO数据集上达到了51.4mAP。相比较PP-YOLOv2提升1.9AP和13.35%的速度,相比较YOLOX提升1.3AP和24.96%的速度。PP-YOLOE中主要的改进点是:anchor-free,powerful backbone and neck,TAL动态label assign,ET-head
  • 该检测器的设计机制包括Anchor free无锚盒机制,可扩展的backbone和neck,由CSPRepResStage(CSPNet+RMNet)构成,使用Varifocal Loss(VFL)和Distribution focal loss(DFL)的头部机制ET-head,动态标签分配算法Task Alignment Learning(TAL)

Introduction

  • 单级目标检测器由于具有良好的速度和精度平衡,在实时应用中很受欢迎。单级探测器中最突出的结构是YOLO系列。自YOLOv1以来,YOLO系列目标检测器在网络结构、标签分配等方面发生了巨大的变化。目前,YOLOX在Tesla V100上以68.9 FPS的速度实现了50.1 mAP的速度和精度的最佳平衡。

  • YOLOX引入了先进的无锚方法,配备了动态标签分配,提高了探测器的性能,在精度上明显优于YOLOv5。受YOLOX的启发,我们进一步优化了之前的作品PP-YOLOv2。PP-YOLOv2是一款高性能一级探测器,在特斯拉V100上具有49.5 mAP, 68.9 FPS的速度。在PP-YOLOv2的基础上,提出了YOLO的演进版本,命名为PP-YOLOE。PP-YOLOE避免使用可变形卷积和矩阵NMS等算子,以便在各种硬件上得到很好的支持。此外,PPYOLOE可以轻松扩展到具有不同计算能力的各种硬件的一系列模型。这些特点进一步推动了PP-YOLOE在更广泛的实际场景中的应用。

  • 如图所示,PP-YOLOE在速度和精度权衡方面优于YOLOv5和YOLOX。具体而言,pp - yoloe - 1以 78.1 FPS的速度在640 × 640分辨率的COCO上实现了51.4 mAP,比pp - yolo2 和yolox - 1分别高出1.9%和1.3% AP。此外,PP-YOLOE有一系列型号,可以像YOLOv5一样通过宽度乘倍器和深度乘倍器进行简单配置。我们的代码已经在PaddleDetection上发布,支持TensorRT和ONNX。

    • 在这里插入图片描述

    • PP-YOLOE与其他先进型号的比较。pp - yoloe - l在COCO测试开发上实现了51.4 mAP,在Tesla V100上实现了78.1 FPS,比pp - yoloe - v2获得了1.9 AP和9.2 FPS的提升。

  • PP-YOLOv2的总体情况包括:(1)backbone:具有可变形卷积的ResNet50-vd;(2)neck:具有SPP层的PAN,DropBlock;(3)head:轻量级的IoU感知;(4)激活函数:在backbone中使用ReLU激活,neck中使用Mish激活;(5)标签分配:为每个ground truth目标分配一个anchor box;(6)损失:分类损失、回归损失、目标损失,IoU损失和IoU感知损失;

  • PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的YOLO模型。PP-YOLOE有一系列的模型,即s/m/l/x,可以通过width multiplier和depth multiplier配置。PP-YOLOE避免了使用诸如Deformable Convolution或者Matrix NMS之类的特殊算子,以使其能轻松地部署在多种多样的硬件上

  • PPYOLOE中的anchor free方法,主要就是将之前anchor base中预测相较于anchor的xywh,改进为预测ltrb(left,top,right,bottom),并将ltrb结果乘上当前特征图的stride。

Method

  • 在本节中,我们将首先回顾我们的基线模型,然后从网络结构、标签分配策略、头部结构和损失函数等方面详细介绍PP-YOLOE的设计(下图)。

    • 在这里插入图片描述

    • 我们PP-YOLOE的模型架构。主干是CSPRepResNet,颈部是Path Aggregation Network (PAN),头部是Efficient Task-aligned head (ET-head)。

A Brief Review of PP-YOLOv2

  • PP-YOLOv2的整体架构包括具有可变形卷积的ResNet50-vd 主干、具有SPP层和DropBlock的PAN主干和轻量级IoU感知头。在PPYOLOv2中,主干使用ReLU激活函数,颈部使用mish激活函数。继YOLOv3之后,PP-YOLOv2只为每个 GT 值对象分配一个锚框。除了分类损失、回归损失和对象损失外,PP-YOLOv2还使用IoU损失和IoU感知损失来提高性能。

Improvement of PP-YOLOE

  • Anchor-free。如上所述,PP-YOLOv2以基于锚点的方式分配基础真理。然而,锚定机制引入了许多超参数,并且依赖于手工设计,这可能不能很好地推广到其他数据集。基于以上原因,我们在PP-YOLOv2中引入无锚法。根据FCOS[26]在每个像素上贴合一个锚点,我们为三个检测头设置上下限,将ground truth分配给相应的feature map。然后,计算边界框的中心,选择最接近的像素作为正样本。根据YOLO序列,预测一个四维向量(x, y, w, h)进行回归。这个修改使模型更快了一点,损失了0.3 AP,如表2所示。虽然根据PPYOLOv2的锚点尺寸仔细设置了上界和下界,但基于锚点和无锚点的赋值结果仍然存在一些小的不一致,这可能导致精度下降不大。PPYOLOE解析1 Backbone - 飞桨AI Studio (baidu.com)

  • Backbone and Neck。残差连接和密集连接在现代卷积神经网络中得到了广泛的应用。残差连接引入了解决梯度消失问题的捷径,也可以看作是一种模型集成方法。密集连接集合了具有不同接收域的中间特征,在目标检测任务中表现出良好的性能。CSPNet利用跨级密集连接来降低计算负担而不损失精度,这种方法在YOLOv5、YOLOX等有效的目标检测器中很流行。VoVNet和随后的TreeNet在对象检测和实例分割方面也表现出优异的性能。受这些作品的启发,我们提出了一种结合残差连接和密集连接的新型RepResBlock,用于我们的Backbone and Neck。

  • 源自TreeBlock,我们的RepResBlock在训练阶段如下图(b)所示,在推理阶段如下图©所示。首先,我们对原始TreeBlock进行简化(下图(a))。然后,我们用元素相加操作代替连接操作(下图(b)),因为RMNet在某种程度上显示了这两种操作的近似。因此,在推理阶段,我们可以将RepResBlock重新参数化为ResNet-34以RepVGG风格使用的基本残差块(下图©)。

    • 在这里插入图片描述

    • 我们的RepResBlock和CSPRepResStage的结构

  • 我们使用所提出的RepResBlock来构建Backbone and Neck。与ResNet类似,我们的主干名为CSPRepResNet,包含一个由三个卷积层组成的主干,以及由我们的RepResBlock堆叠的四个后续阶段,如上图(d)所示。在每一步中,采用跨阶段部分连接,避免了大量 3 × 3 卷积层带来的大量参数和计算负担。ESE(有效挤压和提取)层也用于在构建主干时在每个CSPRepResStage中施加信道注意。我们在PP-YOLOv2之后使用所提出的RepResBlock和CSPRepResStage构建颈部。与主干不同的是,主干去掉了RepResBlock中的残差链接和CSPRepResStage中的ESE层。

  • 我们使用宽度乘法器α和深度乘法器β像YOLOv5一样对基本 Backbone and Neck 进行联合缩放。因此,我们可以得到一系列具有不同参数和计算量的检测网络。基本骨干宽度设置为[64,128,256,512,1024]。除主干外,基本主干的深度设置为[3,6,6,3]。基本颈宽设置为[192,384,768],深度设置为3。下表给出了不同模型的宽度乘法器α和深度乘法器β的规格。

    • 在这里插入图片描述

    • 宽度乘法器α和深度乘法器β规范的一系列网络

  • 这样的修改使AP性能提高了0.7%,即49.5%,如下表所示。

    • 在这里插入图片描述

    • pp - yoloe - l在COCO val上的烧蚀研究。我们使用640×640分辨率作为输入,采用fp32精度,在特斯拉V100上进行测试,不进行后处理。

  • 任务一致性学习(TAL)。为了进一步提高准确性,标签分配是另一个需要考虑的方面。YOLOX使用SimOTA作为标签分配策略来提高性能。然而,为了进一步克服分类和定位的错位,在 TOOD 中提出了任务对齐学习(task alignment learning, TAL),它由动态标签分配和任务对齐损失组成。动态标签分配意味着预测/损失意识。根据预测,为每个真值分配动态的正锚点个数。通过显式地对齐这两个任务,TAL可以同时获得最高的分类分数和最精确的边界框。在PP-YOLOE训练时,前5个epoch是使用ATSS中的分配方式,后续的epochs才使用TAL作为label assign方式。主要原因是TAL需要模型具有一定表现的基础上,才能具有比较好的分配效果。

  • 比较值得注意的是,往常我们在计算class分支的loss时候,使用BCEloss时候,输入分别是pred_score和label_one_hot向量。而在PP-YOLOE中,将label_one_hot向量替换成了TAL分配时的alignment metric。alignment metric中分数越高,就意味着越是高质量样本,模型希望高质量样本拥有更高的class score。

  • 对于与任务对齐的损失,TOOD使用一个归一化的 t,即 t ^ \hat{t} t^ 来代替损失中的目标。它采用每个实例中最大的IoU作为规范化。分类的二进制交叉熵(Binary Cross Entropy, BCE)可以重写为:

    • L c l s − p o s = ∑ i = 1 N p o s B C E ( p i , t i ^ ) , ( 1 ) L_{cls-pos}=\sum_{i=1}^{N_{pos}}BCE(p_i,\hat{t_i}),(1) Lclspos=i=1NposBCE(pi,ti^),(1)
  • 我们研究了使用不同标签分配策略的性能。本文以CSPRepResNet为骨干,在上述改进的模型上进行了实验。为了快速得到验证结果,我们只在COCO train2017上训练了36个epoch,并在COCO val上进行验证,如下表所示,TAL达到了最佳的45.2% AP性能。我们使用TAL替代标签分配,如FCOS样式,并实现0.9% AP改进- 50.4% AP,如上表所示。

    • 在这里插入图片描述

    • 不同的标签分配在基本模型上。我们使用CSPRepResStage作为主干和颈部,一个1×1 conv层作为头部,在COCO train2017上只训练了36个epoch。

  • 高效任务对齐头(ET-head)。在目标检测中,分类与定位之间的任务冲突是一个众所周知的问题。许多文献都提出了相应的解决方案。YOLOX的解耦头吸取了大多数一级和二级检测器的经验,并成功应用于YOLO模型,提高了精度。但是,解耦的头部可能会使分类和定位任务分离和独立,缺乏针对任务的学习。在TOOD的基础上,我们改进了头,提出了以速度和精度为目标的ET-head。如图上所示,我们使用ESE取代了tod中的层关注,将分类分支的对齐简化为shortcut,将回归分支的对齐替换为分布焦损(distributed focal loss, DFL)层。通过上述变化,ET-head在V100上增加了0.9ms。

  • 对于分类和定位任务的学习,我们分别选择了变焦损失(VFL)和分布焦损失(DFL)。PP-Picodet成功地将VFL和DFL应用于目标检测器,并获得了性能提升。对于VFL,与[Generalized focal loss]中的质量焦点损失(quality focal loss, QFL)不同,VFL使用目标分数来加权阳性样本的损失。这种实现使得高IoU的阳性样本对损失的贡献相对较大。这也使得模型在训练时更加关注高质量的样本,而不是那些低质量的样本。相同的是,两者都使用IACS作为预测的目标。这可以有效地学习分类分数和定位质量估计的联合表示,使训练和推理之间具有较高的一致性。对于DFL,为了解决边界框表示不灵活的问题,[Generalized focal loss]提出使用一般分布来预测边界框。我们的模型由损失函数监督:

    • L o s s = α ⋅ L o s s V F L + β ⋅ L o s s G I O U + γ ⋅ L o s s D F L ∑ i N p o s t ^ , ( 2 ) Loss=\frac{\alpha·Loss_{VFL}+\beta ·Loss_{GIOU}+\gamma ·Loss_{DFL}}{\sum^{N_{pos}}_i\hat t},(2) Loss=iNpost^αLossVFL+βLossGIOU+γLossDFL,(2)

    • 其中, t ^ \hat t t^表示归一化目标得分,见式(1)。如上表所示,ET-head获得0.5% AP改善- 50.9% AP

  • 分类分支:VFL提出了非对称的加权操作。正负样本有不平衡的问题,同样在正样本中也有不等权的问题,意思就是要更多的发现有价值的正样本。在为负样本的时候,不同的负样本的weight主要由当前pred_score决定,pred_score越大,weight越大,loss越大。而在为正样本的时候,weight为gt_score,而gt_score来源于TAL assign时。这也就达到了①正样本和负样本权重计算方式不同,②每个正负样本在计算loss时的权重都是不同的,达到了非对称的加权操作

  • 回归分支:目标检测任务中做回归一般是直接预测某个回归值,或者预测相较于anchor的比例,而distribution focal loss (DFL)作者认为之前的bbox regression 采用的表示不够灵活,没有办法建模复杂场景下的uncertainty。用直接回归一个任意分布来建模框的表示可以有更好的效果。在PP-YOLOE中,将回归看作是一个分布预测任务

Experiment

  • 在本节中,我们给出了实验的细节和结果。所有实验都在MS COCO-2017训练集上进行训练,该训练集有80个类,118k张图像。对于消融研究,我们在5000张图像的MS COCO-2017验证集上使用具有单一尺度的标准COCO AP度量。我们使用MS COCO-2017 test-dev报告最终结果。

Implementation details

  • 我们使用随机梯度下降(SGD),动量= 0.9,权重衰减= 5e-4。我们使用余弦学习率计划,总epochs为300次,热身次数为5次,基本学习率为0.01。在8 × 32 G V100 GPU设备上,总批大小默认为64个,我们遵循线性缩放规则来调整学习率。在训练过程中也采用衰减= 0.9998的指数移动平均(EMA)策略。我们只使用一些基本的数据增强,包括随机裁剪、随机水平翻转、颜色失真和多尺度。特别地,输入大小均匀地从320绘制到768,步幅为32。

Comparsion with Other SOTA Detectors

  • 下表显示了MS-COCO测试分裂与其他最先进的目标检测器的结果比较。我们使用官方代码库重新评估YOLOv5和YOLOX,因为它们有非预定的更新。我们比较了批处理大小= 1(没有数据预处理和非最大抑制)的模型推理速度。而PP-YOLOE系列采用桨叶推理引擎。此外,为了公平比较,我们还在相同的环境下测试了基于tensorRT 6.0的FP16精度速度。应该强调的是,PaddlePaddle2正式支持用于模型部署的tensorRT。因此,PPYOLOE可以直接使用带有tensorRT的桨叶推理,其他测试遵循官方指南。

    • 在这里插入图片描述

    • 不同目标检测器在COCO 2017测试开发中的速度和精度比较。标注“+”的结果为官方发布的更新结果。用“*”标记的结果在我们的环境中使用官方代码库和模型进行测试。在验证和速度测试中,YOLOv5的输入大小不是640 × 640的平方,所以我们在表中跳过它。默认精度的速度是FP32的无trt和FP16的有trt。此外,我们为YOLOX w/o trt场景提供了FP32和FP16, FP32的速度在分割线的左侧,FP16的速度在右侧。PP-YOLOE+使用在Objects365数据集上预训练的模型。

Conclusion

  • 在本报告中,我们提出了PPYOLOv2的几个更新,包括可扩展的主干颈架构,高效的任务对齐头,先进的标签分配策略和改进的目标损失函数,形成了一系列高性能的目标检测器,称为PP-YOLOE。同时,我们提出了s/m/l/x模型,可以覆盖不同的实际场景。此外,在PaddlePaddle官方支持下,这些模型可以顺利过渡到部署。我们希望这些令人鼓舞的设计可以为开发人员和研究人员提供灵感。

  • Backbone 翻译为主干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?翻译的很好,主干部分,哈哈哈哈,文字游戏了哈。这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。这些网络经常使用的是resnet VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。(14 封私信 / 80 条消息) 深度学习网络中backbone是什么意思? - 知乎 (zhihu.com)

SAHI:超大图片中对小目标检测的切片辅助超推理库

  • 目标检测和实例分割是迄今为止计算机视觉中最重要的应用领域。然而,小物体的检测和大图像的推理仍然是实际使用中的主要问题。切片推理的概念基本上是;对原始图像的较小切片执行推理,然后合并原始图像上的切片预测。可以用下图表示:

    • 在这里插入图片描述
  • 为了提高你的模型在小目标上的性能,推荐以下技术:medium.com

    • 提高图像采集的分辨率
    • 增加模型的输入分辨率
    • tile你的图像
    • 通过增强生成更多数据
    • 自动学习模型anchors
    • 过滤掉无关的类别
  • 检测小物体的另一个重要策略是将图像切割后形成batch,这个操作叫做tile,作为预处理步骤。tile可以有效地将检测器聚焦在小物体上,但允许你保持所需的小输入分辨率,以便能够运行快速推断。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全学习DAY08_算法加密

算法加密 漏洞分析、漏洞勘测、漏洞探针、挖漏洞时要用到的技术知识 存储密码加密-应用对象传输加密编码-发送回显数据传输格式-统一格式代码特性混淆-开发语言 传输数据 – 加密型&编码型 安全测试时,通常会进行数据的修改增加提交测试 数据在传输的时候进行…

0725 区块链1.0 2.0 3.0 智能合约 比特币 以太坊 DAG 有向无环图

文献阅读:[1]华亚洲. 基于改进Block-DAG区块链的时空数据存储及查询方法研究[D].辽宁大学,2022.DOI:10.27209/d.cnki.glniu.2022.001364.[1]华亚洲,丁琳琳,陈泽等.面向时空数据的区块链构建及查询方法[J].计算机应用,2022,42(11):3429-3437. 文献总结: …

【 Spring AOP学习二】统一功能处理:拦截器异常返回数据格式

目录 一、用户登录权限效验 🍑1、Spring拦截器实现用户统一登录验证(重要) (1)定义一个拦截器 (2)将自定义拦截器加入到系统配置中 🍑2、拦截器实现原理 🍑3、统一…

【计算机视觉中的 GAN 】 - 条件图像合成和 3D 对象生成(2)

一、说明 上文 【计算机视觉中的 GAN 】或多或少是GANs,生成学习和计算机视觉的介绍。我们达到了在 128x128 图像中生成可区分图像特征的程度。但是,如果你真的想了解GAN在计算机视觉方面的进展,你肯定必须深入研究图像到图像的翻译。…

mybatis-config.xml-配置文件详解

文章目录 mybatis-config.xml-配置文件详解说明文档地址:配置文件属性解析properties 属性应用实例 settings 全局参数定义应用实例 typeAliases 别名处理器举例说明 typeHandlers 类型处理器environments 环境environment 属性应用实例 mappers配置 mybatis-config.xml-配置文…

什么是 HTTP 长轮询?

什么是 HTTP 长轮询? Web 应用程序最初是围绕客户端/服务器模型开发的,其中 Web 客户端始终是事务的发起者,向服务器请求数据。因此,没有任何机制可以让服务器在没有客户端先发出请求的情况下独立地向客户端发送或推送数据。 为…

在linux中进行arm交叉编译体验tiny6410裸机程序开发流程

在某鱼上找了一个友善之臂的Tiny6410开发板用来体验一下嵌入式开发。这次先体验一下裸机程序的开发流程,由于这个开发板比较老旧了,官方文档有很多过期的内容,所以记录一下整个过程。 1. 交叉编译器安装 按照光盘A中的文档《04- Tiny6410 L…

fasta序列转为数字0和1-python

原始文件: 目标文件: linux版本 #name:lin_convert_fasta_to_01.py #! /usr/bin/env python #usage: python hash-always.py -l 1.list -f 2.txt > out.txt import argparse parser argparse.ArgumentParser(description"Advanced screeni…

perf 分析MySQL底层函数调用

文章目录 一、安装软件包二、数据采集2.1 perf top2.2 perf record 三、数据加工和解读 一、安装软件包 sudo yum install -y perf git clone https://github.com/brendangregg/FlameGraph二、数据采集 2.1 perf top perf top -g -p pidof mysqld 第一列:符号引…

常见面试题之设计模式--工厂方法模式

1. 概述 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore&…

QT:当登录成功时,关闭登录界面,跳转到新的界面中

1> 继续完善登录框,当登录成功时,关闭登录界面,跳转到新的界面中 widget.h #include "widget.h" //#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent)//, ui(new Ui::Widget) {//ui->setu…

LeetCode使用最小花费爬楼梯(动态规划)

使用最小花费爬楼梯(动态规划) 题目描述算法流程(方法一)编程代码优化代码算法流程(方法二)编程代码代码优化 链接: 使用最小花费爬楼梯 题目描述 算法流程(方法一) 编程代码 class Solution { public:int minCostClimbingStair…

Windows驱动第一节(什么是驱动?)

本文来自微软,由本人兴趣爱好人工翻译(非机翻) What is a driver? - Windows drivers | Microsoft Learn 我想很难给驱动这个词一个准确的定义.最基础的定义是驱动是一个用于让操作系统和硬件设备通信的软件组件. 举一个例子,假设一个应用程序需要从硬件设备读取一些数据,这…

npm yarn nrm

npm 和 yarn npm和yarn都是包管理器,yarn是在2016年发布的,那时npm还处于V3时期,那时候还没有package-lock.json文件,不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽。此时,yarn 诞生了。yarn 的优点&#xff0c…

ReID网络:MGN网络(1) - 概述

Start MGN 1. 序言 现代基于感知的信息中,视觉信息占了80~85%。基于视觉信息的处理和分析被应用到诸如安防、电力、汽车等领域。 以安防市场为例,早在2017年,行业咨询公司IHS Market,我国在公共和私人领域安装有摄像头约1.76亿…

redis 存储原理与数据模型

文章目录 一、redis的存储结构1.1 存储结构1.2 存储转换 二、字典(dict)实现2.1 数据结构2.2 哈希冲突2.3 扩容2.4 缩容2.5 渐进式rehash2.6 scan 命令2.7 expire机制 三、跳表(skiplist)实现3.1 理想跳表3.2 redis跳表 一、redis的存储结构 1.1 存储结构 1.2 存储转换 二、字…

QT--day2(信号与槽,多界面跳转)

第一个界面头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标头文件 #include <QPushButton> //按钮类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

PHP数据库

PHP MySQL 连接数据库 MySQL 简介MySQL Create 免费的 MySQL 数据库通常是通过 PHP 来使用的。 连接到一个 MySQL 数据库 在您能够访问并处理数据库中的数据之前&#xff0c;您必须创建到达数据库的连接。 在 PHP 中&#xff0c;这个任务通过 mysql_connect() 函数完成。 …

Ubuntu18.04配置PX4开发环境

源文件下载 读者可以参考PX4中文维基百科&#xff0c;或者使用下面命令↓ git clone https://github.com/PX4/PX4-Autopilot.git --recursive 下载完成之后&#xff0c;执行脚本安装命令&#xff0c;PX4给我们提供了脚本安装模式 bash ./PX4-Autopilot/Tools/setup/ubuntu.sh …

【Matplotlib 绘制折线图】

使用 Matplotlib 绘制折线图 在数据可视化中&#xff0c;折线图是一种常见的图表类型&#xff0c;用于展示随着变量的变化&#xff0c;某个指标的趋势或关系。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制折线图。 绘制折线图 下面的代码展示了如何使用 Matplo…