大一统模型 Universal Instance Perception as Object Discovery and Retrieval 论文阅读笔记

Universal Instance Perception as Object Discovery and Retrieval 论文阅读笔记

  • 一、Abstract
  • 二、引言
  • 三、相关工作
    • 实例感知
      • 通过类别名进行检索
      • 通过语言表达式的检索
      • 通过指代标注的检索
    • 统一的视觉模型
      • Unified Learning Paradigms
      • Unified Model Architectures
  • 四、方法
    • 4.1 Prompt 生成
    • 4.2 图像-Prompt 特征融合
    • 4.3 目标发现和检索
    • 4.4 训练和推理
      • 训练
      • 推理
  • 五、实验
    • 5.1 实施细节
    • 5.2 在 10 个任务上的评估
      • 目标检测和实例分割
      • REC 和 RES
      • SOT
      • VOS
      • MOT
      • MOTS
      • VIS
      • R-VOS
    • 5.3 消融和其它分析
  • 六、结论

写在前面

  马上又是一周周末了,开始写论文博客啦。

  这是一篇顶会文章,标题很清楚,就是一个一统的框架用于解决各种任务。这类文章在 21 年的时候挺多的,现在倒是不常见了。因为需要的资源很多,外部数据集也很庞大,一般的小资源团队基本搞不定。但一旦出世,效果必然十分炸裂。

  • 论文地址:Universal Instance Perception as Object Discovery and Retrieval
  • 代码地址:https://github.com/MasterBin-IIAU/UNINEXT
  • 收录于:CVPR 2023

一、Abstract

  所有的实例感知任务旨在发现利用 queries 查询到的目标,例如类别名、语言表达式、目标标注,但这一领域被划分为多个独立的子任务。于是本文提出了一种统一的实例感知模型 UNINEXT。UNINEXT 将多个实例感知任务划分为一个统一的目标发现和检索过程,通过改变输入的 promots 能够弹性地感知不同类型的目标。于是有一些好处:不同任务的数据和标签词汇能够用于训练统一的模型,而且有益于那些缺乏训练数据的任务;参数有效性,能够降低冗余的计算。UNINEXT 在 20 个 数据集,10 种实例级别的任务,6 种视频级别的任务上效果很好。

二、引言

  计算机视觉领域中,以目标为中心的理解是其中一个最关键和挑战性的任务。本文主要讨论其中的 10 个子任务。如下图所示:

在这里插入图片描述
  
  最基础的任务则是目标检测、实例分割、多目标跟踪\分割、视频实例分割。除了这些类别名外,还有一些任务则需要其他的指代信息,例如 Referring Expression Comprehension (REC) /Segmentation (RES)、Referring Video Object Segmentation (R-VOS)、单目标跟踪、视频目标分割等等。这些任务统称为实例感知。

  当前的实例感知方法都是基于一个或一部分子任务开发出的方法,且仅仅在特定的数据集上训练。这一设计有如下缺陷:独立的设计阻止了模型学习和共享不同任务的知识;多个任务间的交互合作可能被忽略掉了。受限于固定范围的类别,传统的目标检测器很难在多个目标类别的数据集上进行训练。于是问题来了:所有的实例感知任务旨在根据一些 queries 发现某些特定的目标,那么有没有可能设计一个统一的模型用于所有主流的实例感知任务呢?

  于是本文提出 UNINEXT,首先根据三种不同的输入 prompt 重新组织 10 种感知任务:

  • 类别名作为 Prompt,包含 Object Detection、Instance Segmentation、VIS,、MOT、MOTS
  • 语言表达式作为 Prompt,包含 REC、RES、R-VOS
  • 指代标注作为 Prompt,包含 SOT、VOS

  然后提出一种统一的,prompt 引导的目标发现和检测方法来解决这些任务。具体来说,UNINEXT 首先在 prompts 的引导下发现 N N N 个目标 Proposals,然后根据实例-Prompt 匹配得分检索出最终的实例。为解决不同的 prompt 模态,采用一种 Prompt 生成模块,由一个指代文本编码器和一个指代视觉编码器组成。然后一个早期融合模块用于增强初始的视觉特征和 prompt embeddings。选择基于 Transformer 的目标检测器作为实例解码器。具体来说,解码器首先生成 N N N 个实例 Proposals,然后这些 Prompt 从这些 Proposals 中检索出匹配的目标。

  在 10 个实例级别的感知任务上,统一使用一个模型,相同的模型参数,UNINEXT 在 20 个 benchmarks 上达到了 SOTA 的性能。本文贡献总结如下:

  • 提出一个统一的 Prompt 框架用于统一的实例感知;
  • UNINEXT 能够在不同的任务和领域上训练,不需要特定的任务头;
  • UNINEXT 在 20 个 benchmarks,10 个实例感知任务上,达到了 SOTA 的性能。

三、相关工作

实例感知

通过类别名进行检索

  目标检测和实例感知旨在找到所有特定类别的目标 boxes 或 masks。早期的目标检测器可以大致划分为两阶段和一阶段的方法。最近是一些基于 Transformer 的检测器开始兴起。同时,实例分割方法也可以根据是否需要 box 级别的检测器划分为基于检测器和无检测器的方法。目标检测和实例分割同时也是 MOT、MOTS、VIS 的基石。主流的方法采用在线 “检测-关联” 的策略。然而最近的一些 VIS 方法采用离线的方式,在 VIS2019 数据集上表现很好,但是在 OVIS 上表现不行。

通过语言表达式的检索

  REC、RES、RVOS 旨在根据一条语言表达式发现一个特定的目标。与目标检测类似,REC 方法同样可以划分为三种类型。两阶段、单阶段和基于 Transformer 的方法。不同于 REC,RES 关注于设计不同的注意力机制从而实现视觉-语言的对齐。最近,SeqTR 提出将 REC 和 RES 视为点预测问题,达到了新的 SOTA。最后 R-VOS 可以视为 RES 在视频领域上的拓展。当前的 SOTA 方法是基于 Transformer 的离线方式。然而,离线方式妨碍了现实世界的应用,例如自动驾驶。

通过指代标注的检索

  SOT 和 VOS 首先在视频的第一帧上面使用 boxes 或者 masks 确定要跟踪的目标,然后要求算法去预测被跟踪目标的轨迹。这一任务核心问题在于:如何提取信息量丰富的目标特征?如何融合目标信息与当前帧的表示?

  对于第一个问题,大部分 SOT 方法通过一个 Siamese Backbone 编码目标信息。而 VOS 方法通常聚合多帧信息与相应的 masks 送入一个 memory 编码器中,提取细粒度的目标信息。对于第二个问题,之前的方法通常采用关联的手段,可能会导致信息丢失。最近的一些工作利用 Transformer 得到更具有区分性的表示。此外,VOS 中的特征融合也被空间-时间 memory 网络采用。

统一的视觉模型

  分为统一的学习算法和统一的模型架构

Unified Learning Paradigms

  通常是一种统一的学习算法用于覆盖尽可能多的任务和模态。例如 MuST、INTERN、Unified-IO、OFA。尽管这些工作在多个任务上的表现很好,但是模态内和模态间的关系还有待探索。

Unified Model Architectures

  通常设计一种统一的框架或者模型结构用于一组密切关联的任务。例如 Mask R-CNN、Mask2Former、Pix2SeqV2、GLIP、Unicorn。而本文提出一种统一的 Prompt 引导的结构用于 10 种实例感知任务。

四、方法

  首先将现有的实例感知任务分为三类:

  • 目标检测、实例分割、MOT、MOTS、VIS,以类别名为 Prompt ,找到所有特定类别的实例。
  • REC、RES、R-VOS,以表达式作为 Prompt,定位到某个特定的目标。
  • SOT 和 VOS,使用第一帧给定的标注作为 Prompt,预测被跟踪目标的轨迹。
    在这里插入图片描述
      UNINEXT 由三个主要模块组成:prompt 生成、image-prompt 特征融合、目标发现和检索。

4.1 Prompt 生成

  首先一个 Prompt 模块将原始的 prompts 输入转化为统一的格式。为解决语言相关的 Prompt,使用语言编码器 BERT,表示为 EncL。具体来说。对于类别引导的任务,将当前数据集内出现的类别名作为语言表达式。以 COCO 为例,表达式可以写作:“person. bicycle. … . toothbrush”。对于所有的类别引导和表达式引导的任务,语言表达式通过 EncL,得到一个 Prompt embedding F p ∈ R L × d F_p\in\mathbb{R}^{L\times d} FpRL×d L L L 为序列长度。

  对于标注引导的任务,采用一个指代视觉编码器 Enc V ref \text{Enc}_\text{V}^\text{ref} EncVref。具体来说,首先在相关帧的指代位置处裁剪出一个 2 2 2^2 22 倍原目标区域的模板。然后将这一模板调整为固定尺寸 256 × 256 256\times256 256×256。接下来添加一个额外的通道,名为目标先验,拼接上去形成一个 4 通道的输入。目标区域先验处的值设为 1,其它为 0。然后这一模板图像与目标先验一起通过 Enc V ref \text{Enc}_\text{V}^\text{ref} EncVref,得到一个级联的特征金字塔 { C 3 , C 4 , C 5 , C 6 } \{C_3,C_4,C_5,C_6\} {C3,C4,C5,C6},相应的空间尺寸为 32 × 32 32\times32 32×32 16 × 16 16\times16 16×16 8 × 8 8\times8 8×8 4 × 4 4\times4 4×4。最后将所有特征上采样到 32 × 32 32\times32 32×32,之后相加。展平后得到最终的 Prompt embedding F p ∈ R 1024 × d F_p\in\mathbb{R}^{1024\times d} FpR1024×d

  Prompt 生成过程表示如下:
F p = { E n c L r e f ( exp ⁡ ression ) expression-guided E n c L r e f ( concat ( categories ) ) category-guided m e r g e ( E n c V r e f ( [template, prior] ) annotation-guided F_p=\begin{cases}\mathrm{Enc}_\mathrm{L}^\mathrm{ref} (\exp\text{ression})~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\text{expression-guided}\\\mathrm{Enc}_\mathrm{L}^\mathrm{ref}(\text{concat}(\text{categories}))~~~~~~~~~~~~~~~~~~~~~~~~\text{category-guided}\\\mathrm{merge}(\mathrm{Enc}_\mathrm{V}^\mathrm{ref}(\text{[template, prior]})~~~~~~~~~~~~~~~~ \text{annotation-guided}&\end{cases} Fp= EncLref(expression)                                     expression-guidedEncLref(concat(categories))                        category-guidedmerge(EncVref([template, prior])                annotation-guided

4.2 图像-Prompt 特征融合

  与 Prompt 并行,整个图像穿过另一个视觉编码器 Enc V \text{Enc}_\text{V} EncV,得到级联的视觉特征 F v F_v Fv,然后采用一个提前融合模块。具体来说。一个双向的 cross-attention(Bi-XAtt)模块用于检索不同输入的信息,然后将检索到的表示添加到原始的特征上。这一过程描述为:
F p 2 v , F v 2 p = B i − X A t t ( F v , F p ) F v ′ = F v + F p 2 v ; F p ′ = F p + F v 2 p \begin{aligned} &F_{\mathrm{p2v}},F_{\mathrm{v2p}}=\mathrm{Bi-XAtt}(F_{v},F_{p}) \\ &F_{v}^{\prime}=F_{v}+F_{\mathbf{p}2\mathbf{v}};F_{p}^{\prime}=F_{p}+F_{\mathbf{v}2\mathbf{p}} \end{aligned} Fp2v,Fv2p=BiXAtt(Fv,Fp)Fv=Fv+Fp2v;Fp=Fp+Fv2p  不同于 GLIP,其采用 6 层的视觉-语言融合层和 6 层外部 BERT 层用于特征增强,本文的提前融合模块则更有效率。

4.3 目标发现和检索

  在提出显著性的视觉和 prompt 表示后,下一个关键步骤则是将输入的特征转化为不同感知任务中的实例。UNINEXT 采用 Deformable-DETR 中的编码器-解码器架构。

  Transformer 编码器以级联的 prompt 感知的视觉特征作为输入。然后采用 Multi-scale Deformable Self-Attention 增强目标信息。此外,添加辅助的预测头用于编码器的结尾,生成 N N N 个初始的参考点作为解码器的输入。

  Transformer 解码器以增强的多尺度特征, N N N 个参考点 和 N N N 个目标 queries 作为输入。本文尝试两种 query 生成策略:静态 query,不随图像或 Prompts 而改变;基于 Prompt 的动态 queries。第一种策略很容易通过 nn.Embedding(N,d) \text{nn.Embedding(N,d)} nn.Embedding(N,d) 实现,而第二种策略则可以通过池化序列维度,增强的 Prompt 特征 F v ′ F_v^{\prime} Fv 得到,之后重复 N N N 次。实验部分表明静态策略通常执行的比动态策略好。原因可能是静态部分包含了更丰富的信息,同时拥有更好的训练稳定性。

  在解码器的结尾,采用一组预测头来得到最终的实例预测,产生目标的 boxes 和 masks。此外,引入一个 embedding 头用于辅助 MOT、MOTS、VIS 所需要的轨迹。

  接下来产生精确的目标。具体来说,给定早期融合后的 prompt embedding F p ′ F_p^{\prime} Fp,对于类别引导任务,将每个名字的 embedding 视为一个权重矩阵 W ∈ R 1 × d W\in\mathbb{R}^{1\times d} WR1×d。此外,对于表达式引导和标注引导的任务,权重矩阵 W W W 通过对聚合的 prompt embedding F p ′ F_p^{\prime} Fp,使用全局平均池化 global average pooling (GAP) 沿着序列维度得到。给出公式描述过程:
W = { F p ′ [ i ] , i ∈ { 0 , 1 , . . . , C − 1 } category 1 L ∑ i = 0 L F p ′ ( i , j ) expression/annotation W=\begin{cases}F_p'[i],i\in\{0,1,...,C-1\}&\text{category}\\\frac{1}{L}\sum_{i=0}^LF_p'(i,j)&\text{expression/annotation}\end{cases} W={Fp[i],i{0,1,...,C1}L1i=0LFp(i,j)categoryexpression/annotation
  最终,实例-Prompt 匹配得分 S S S ,表示为目标特征和转换后的权重矩阵的乘积: S = F ins W T S=F_\text{ins}W^{\text{T}} S=FinsWT,通过 Focal Loss 监督其训练。

4.4 训练和推理

训练

  整体的训练过程包含三个连续阶段:通用的感知预训练;图像级别的共同训练;视频级别的共同训练。第一阶段,预训练 UNINEXT 在大规模目标检测数据集 Objects365 上。由于 Objects365 没有 mask 标注,于是引入 BoxInst 中提出的辅助损失用于训练 mask 分支,于是损失函数为:
L s t a g e 1 = L r e t r i e v e + L b o x + L m a s k b o x i n s t \mathcal{L}_{\mathrm{stage}1}=\mathcal{L}_{\mathrm{retrieve}}+\mathcal{L}_{\mathrm{box}}+\mathcal{L}_{\mathrm{mask}}^{\mathrm{boxinst}} Lstage1=Lretrieve+Lbox+Lmaskboxinst
然后基于第一阶段的预训练权重,在图像数据集 COCO、RefCOCO、RefCOCO+、RefCOCOg 上微调 UNINEXT。使用 Dice Loss 和 Focal Loss 进行 mask 的训练:
L s t a g e 2 = L r e t r i e v e + L b o x + L m a s k \mathcal{L}_{\mathrm{stage2}}=\mathcal{L}_{\mathrm{retrieve}}+\mathcal{L}_{\mathrm{box}}+\mathcal{L}_{\mathrm{mask}} Lstage2=Lretrieve+Lbox+Lmask
  最后在视频级别的数据集上微调 UNINEXT。为防止模型遗忘之前在图像级别上学到的知识,将图像级别的数据集转化为伪视频,和其它视频数据集一起训练。总结下,第三阶段的训练数据包含:伪标签视频、SOT&VOS 数据集(GOT-10K、LaSOT、TrackingNet、Youtube-VOS),MOT&VIS 数据集(BDD100K、VIS19、OVIS),R-VOS 数据集 Ref-Youtube-VOS。同时,一个用于 SOT&VOS 任务的指代视觉编码器和一个外部的 embedding 头用于辅助优化。于是第三阶段的损失如下:
L s t a g e 3 = L r e t r i e v e + L l o o x + L m a s k + L e m b e d \mathcal{L}_{\mathrm{stage}3}=\mathcal{L}_{\mathrm{retrieve}}+\mathcal{L}_{\mathrm{loox}}+\mathcal{L}_{\mathrm{mask}}+\mathcal{L}_{\mathrm{embed}} Lstage3=Lretrieve+Lloox+Lmask+Lembed

推理

  对于类别引导的任务,UNINEXT 预测不同类别的实例并将其与之前的轨迹关联起来,这一过程是在线的方式。对于表达式引导和标注引导的任务,直接选择与给定 Prompt 最高匹配得分的目标作为最终的结果,无需后处理。

五、实验

5.1 实施细节

  尝试不同的视觉 Backbone 作为编码器,如 ResNet-50、ConvNeXt-Large、ViT-Huge。BERT 为文本编码器,其参数在第一个阶段训练而在第二个阶段冻结。Transformer 中的编码器和解码器结构有 6 层的编码器层和 6 层的解码器层。目标 queries 的数量 N = 900 N=900 N=900。优化器 AdamW,权重衰减 0.05。预训练在 Objects365 上采用 32 个 A100 GPU,而在其它阶段则采用 16 块 A100(一般的小作坊就不用尝试啦)。

5.2 在 10 个任务上的评估

目标检测和实例分割

在这里插入图片描述

REC 和 RES

在这里插入图片描述

SOT

在这里插入图片描述

VOS

在这里插入图片描述

MOT

在这里插入图片描述

MOTS

在这里插入图片描述

VIS

在这里插入图片描述

R-VOS

在这里插入图片描述

5.3 消融和其它分析

  所有的模型均采用 ResNet-50 作为 backbone,在五个任务(目标检测、REC、VOS、R-VOS、VIS)的五个数据集 COCO、RefCOCO、Youtube-VOS、Ref-Youtube-VOS、Youtube-VIS 2019 上进行评估。结果如下表所示:
在这里插入图片描述

六、结论

  本文提出 UNINEXT,采用 Prompt 引导的目标发现和检索算法统一了 10 个实例感知任务,大量实验表明 UNINEXT 在 20 个数据集上,同一套模型参数达到了 SOTA 的性能。

写在后面

  附录还有一些内容,关于训练细节、可视化、损失函数啥的,这里就不过多展开了。通篇读下来,是一个以 Prompt 为主要形式的框架,新颖性可能也不算太高吧,毕竟有 SAM 和 Unified 等模型在前面开路,但是这个调参和实验的工作量应该是值得一篇顶会论文的。

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

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

相关文章

罗技M590鼠标usb优联连接不上

手里有一个罗技M590鼠标从18年4月一直用到现在,质量很好,除了滚轮有些松别的没毛病。最近一台笔记本电脑办公不太够用,又领了一个台式机,就想到M590支持双模连接,并且支持Flow,就把usb优联接收器从电池仓拿…

Java学习路径:入门学习、深入学习、核心技术,操作案例和实际代码示例

学习路径:入门学习、深入学习、核心技术, 每个主题都包括很多的操作案例和实际代码示例。 a. 入门学习: 1. 基础语法: 变量和数据类型: // 定义和初始化变量 int age 25;// 不同数据类型的声明 double price 19.99…

React基础入门

文章目录 创建项目组件和事件更新状态导出组件jsx react是目前最流行的前端框架,几乎也不用太介绍了。 创建项目 首先下载node.js,安装成功后,最好换成国内的源 npm config set registry https://registry.npm.taobao.org然后就可以使用脚…

AI动画制作 StableDiffusion

1.brew -v 2.安装爬虫项目包所必需的python和git等系列系统支持部件 brew install cmake protobuf rust python3.10 git wget pod --version brew link --overwrite cocoapods 3.从github网站克隆stable-diffusion-webui爬虫项目包至本地 ssh-add /Users/haijunyan/.ssh/id_rs…

jQuery 第十一章(表单验证插件推荐)

文章目录 前言jValidateZebra FormjQuery.validValValidityValidForm BuilderForm ValidatorProgressionformvalidationjQuery Validation PluginjQuery Validation EnginejQuery ValidateValidarium后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏&…

mysql 更改密码

由于两台设备的mysql数据库的密码不一样,开发时每次连接数据库都需要更改配置文件,所以想修改一下mysql数据库的密码。 mysql 修改密码千万不要直接修改,直接修改的话会出现两种情况: 1,修改成功,无法登录。…

基于时隙的多重冗余流指纹模型

文章信息 论文题目:基于时隙的多重冗余流指纹模型 期刊(会议):网络与信息安全学报 时间:2023 级别:CCF C 概述 为确保内生网络流量安全可信,本文在研究流水印及其扩展的流指纹机制的基础上&a…

小程序中的大道理之二--抽象与封装

继续扒 接着 上一篇 的叙述, 健壮性也有了, 现在是时候处理点实际的东西了, 但我们依然不会一步到底, 让我们来看看. 一而再地抽象(Abstraction Again) 让我们继续无视那些空格以及星号等细节, 我们看到什么呢? 我们只看到一整行的内容, 当传入 3 时就有 3 行, 传入 4 时就…

明道云伙伴成果与展望

摘要:这篇文章介绍了明道云在过去一年的成果以及未来的计划。明道云将把更多资源和精力投入到伙伴身上,提供更全面的支持,包括产品特性、展业支持和 GTM (Go-To-Market)支持三个方面。在产品特性方面,明道云…

【C++初阶】STL之学习string的用法

目录 前言:一、认识下string1.1 什么是string1.2 为什么要有string 二、string 类的接口使用2.1 初始化与析构2.1.1 初始化2.1.2 析构 2.2 容量操作2.2.1 长度大小——size和length2.2.2 空间总大小——capacity2.2.3 判空——empty2.2.4 清空——clear2.2.5 预留空…

学习视频剪辑方法:AI智剪助力,批量处理短视频无忧

随着短视频的兴起,越来越多的人开始关注如何有效地制作和发布这些内容。但是,短视频的制作并不容易,要耗费大量的时间和精力。现在有很多AI智能剪辑工具可以快速、高效地制作短视频。其中,AI智剪是一款非常受欢迎的视频剪辑功能&a…

原生javascript实现放大镜效果

效果图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>放大镜</title><style&g…

图论|知识图谱——详解自下而上构建知识图谱全过程

导读&#xff1a;知识图谱的构建技术主要有自顶向下和自底向上两种。其中自顶向下构建是指借助百科类网站等结构化数据源&#xff0c;从高质量数据中提取本体和模式信息&#xff0c;加入到知识库里。而自底向上构建&#xff0c;则是借助一定的技术手段&#xff0c;从公开采集的…

【Python】Playwright模块进行自动化测试

playwright是由微软开发的Web UI自动化测试工具&#xff0c;支持Node.js、Python、C# 和 Java语言&#xff0c;本文将介绍Python版本的Playwright使用方法。 微软开源了一个非常强大的自动化项目叫playwright-python&#xff0c;项目地址&#xff1a;https://github.com/micros…

[图片来源BZhan]最小生成树(Prim➕Kruskal)、最短路径(Dijkstra➕Floyd)

文章目录 0.基础知识0.1图的存储结构0.2算法复杂度1.BFS和DFS2.Prim和Kruskal 1.最小生成树1.1Prim算法1.算法思想2.Prim代码实现 1.2Kruskal算法1.算法思想2.Kruskal代码实现[demo] 2.最短路径2.1问题抽象:2.2两种常见的最短路径问题:1.Dijkstra: 单源最短路径O(N^2)2.Floyd: …

⑥【bitmap 】Redis数据类型: bitmap [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …

记录一些免费的 API接口

主要记录一些日常开发中可以使用到的一些免费api接口&#xff0c;目前包括 ip地址查询、天气查询 通过 IP 查询地址 ip-api (不支持 https) &#x1f4a1; api接口文档 &#x1f579; 调用接口 $ curl http://ip-api.com/json&#x1f4dd; 返回信息&#xff08;位置信息&…

easyx的基本使用<一>(万字解析)

easyx的基本使用 一.基本框架1.创建文件2.创建窗体-initgraph,closegraph,getchar 二.简单的绘制1.圆形-circle2.坐标系统-setorigin,setaspectratio 三.简单图形1.绘制点-putpixel2.简单的直线-line3.矩形-rectangle4.椭圆-ellipse5.圆角矩形-roundrect6.扇形-pie7.圆弧-arc 四…

ElasticSearch01

ElasticSearch 版本&#xff1a;7.8 学习视频&#xff1a;尚硅谷 笔记&#xff1a;https://zgtsky.top/ ElasticSearch介绍 Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMet…