《Pyramid Vision Transformer》论文笔记

news2024/11/15 8:21:43

原文笔记

What

为了解决VIT在视觉任务上的局限性并且探究Transformer模型在视觉任务上的应用,这项工作提出了一种纯 Transformer 主干,称为 Pyramid Vision Transformer (PVT),它可以作为 CNN 主干在许多下游任务中的替代方案,包括图像级预测和像素级密集预测。具体来说,如图 1 (c) 所示,我们的 PVT 通过 (1) 将细粒度图像块(即每个补丁 4×4 像素)作为输入来学习高分辨率表示来克服传统 Transformer 的困难,这对于密集预测任务至关重要; (2) 随着网络的加深,引入渐进式收缩金字塔来减少 Transformer 的序列长度,显着降低计算成本,以及 (3) 采用空间缩减注意力 (SRA) 层在学习高分辨率特征时进一步减少资源消耗。

我们的方法比 ViT 具有以下优点:1)更灵活——可以在不同的阶段生成不同尺度的/通道的特征图; 2)更通用——可以很容易地插入和播放在大多数下游任务模型中; 3)对计算/内存更友好——可以处理更高分辨率的特征图或更长的序列。

Why

  • 卷积神经网络 (CNN) 在计算机视觉领域取得了显着的成功,使其成为几乎所有任务的通用和主导方法 [54, 22, 73, 49, 21, 39, 9, 32]。然而,这项工作旨在探索 CNN 之外的替代骨干网络,可用于密集预测任务,例如除了图像分类[12]外,目标检测,语义[83]和实例分割[40]。(替代卷积)
  • 以往的基于Transformer的视觉研究也很少研究探索干净且无卷积的 Transformer 主干来解决计算机视觉中的密集预测任务。(探索)
  • VIT(1)其输出特征映射是单尺度和低分辨率的,(2)它的计算和内存成本相对较高,即使对于常见的输入图像大小(例如,COCO基准[40]中800像素的较短边)。所以直接使其适应像素级密集预测(如目标检测和分割)是具有挑战性的因此,很难直接将 ViT 应用于需要高分辨率或多尺度特征图的密集预测任务。(区别于传统VIT的解决方法)

Challenge

Idea

Model

原文翻译

Abstract

尽管卷积神经网络 (CNN) 在计算机视觉中取得了巨大成功,但这项工作研究了一种更简单、无卷积的骨干网络,可用于许多密集预测任务。与最近提出的专门为图像分类设计的Vision Transformer (ViT) 不同,我们引入了金字塔视觉转换器 (PVT),它克服了将 Transformer 移植到各种密集预测任务的困难。与现有技术相比,PVT有几个优点。(1) 与通常产生低分辨率输出并产生高计算和内存成本的 ViT 不同,PVT 不仅可以在图像的密集分区上进行训练以实现高输出分辨率,这对于密集预测很重要,而且还使用渐进式收缩金字塔来减少大特征图的计算。(2) PVT继承了CNN和Transformer的优点,使其成为一个不需要卷积的针对不用视觉任务的统一的骨干,它可以作为CNN网络的一个直接的替代。(3) 我们通过广泛的实验验证 PVT,表明它提高了许多下游任务的性能,包括对象检测、实例和语义分割。例如,在参数数量相当的情况下,PVT+RetinaNet 在 COCO 数据集上达到了 40.4 AP,比 ResNet50+RetinaNet (36.3 AP) 高出 4.1 个绝对 AP(见图 2)。我们希望PVT可以作为像素级预测的替代和有用的主干,并促进未来的研究。

1. Introduction

卷积神经网络 (CNN) 在计算机视觉领域取得了显着的成功,使其成为几乎所有任务的通用和主导方法 [54, 22, 73, 49, 21, 39, 9, 32]。然而,这项工作旨在探索 CNN 之外的替代骨干网络,可用于密集预测任务,例如除了图像分类[12]外,目标检测,语义[83]和实例分割[40]。

受 Transformer [64] 在自然语言处理领域成功的启发,许多研究人员已经探索了它在计算机视觉中的应用。例如,一些工作[6,85,72,56,24,42]将视觉任务建模为具有可学习查询的字典查找问题,并在CNN主干之上使用Transformer解码器作为特定于任务的头部。尽管据我们所知,一些现有技术还将注意力模块 [70, 48, 80] 合并到 CNN 中,但很少研究探索干净且无卷积的 Transformer 主干来解决计算机视觉中的密集预测任务。

最近,Dosovitskiy等人[13]引入了视觉转换器(ViT)进行图像分类。这是用无卷积模型替换 CNN 主干的一个有趣且有意义的尝试。如图1 (b)所示,ViT有一个柱状结构,粗糙的图像补丁作为输入虽然ViT适用于图像分类,但直接使其适应像素级密集预测(如目标检测和分割)是具有挑战性的,因为(1)其输出特征映射是单尺度和低分辨率的,(2)它的计算和内存成本相对较高,即使对于常见的输入图像大小(例如,COCO基准[40]中800像素的较短边)。

为了解决上述限制,这项工作提出了一种纯 Transformer 主干,称为 Pyramid Vision Transformer (PVT),它可以作为 CNN 主干在许多下游任务中的替代方案,包括图像级预测和像素级密集预测。具体来说,如图 1 (c) 所示,我们的 PVT 通过 (1) 将细粒度图像块(即每个补丁 4×4 像素)作为输入来学习高分辨率表示来克服传统 Transformer 的困难,这对于密集预测任务至关重要; (2) 随着网络的加深,引入渐进式收缩金字塔来减少 Transformer 的序列长度,显着降低计算成本,以及 (3) 采用空间缩减注意力 (SRA) 层在学习高分辨率特征时进一步减少资源消耗。

总体而言,所提出的PVT具有以下优点。首先,与传统的CNN主干(见图1 (a)))相比,我们的PVT总是产生一个全局接受域,更适合检测和分割。其次,与ViT相比(见图1 (b)),由于其先进的金字塔结构,我们的方法可以更容易地插入到许多具有代表性的密集预测管道中,如RetinaNet[39]和Mask R-CNN[21]。第三,我们可以通过将我们的PVT与其他特定于任务的Transformer解码器(如PVT+DETR[6])相结合来构建无卷积管道,用于目标检测。据我们所知,这是第一个完全无卷积的目标检测管道

我们的主要贡献如下:(1)我们提出了金字塔视觉转换器(PVT),这是第一个为各种像素级密集预测任务设计的纯 Transformer 主干。结合我们的PVT和DETR,我们可以构建一个端到端的目标检测系统,没有卷积和手工制作的组件,如密集锚点和非极大值抑制(NMS)。(2) 通过设计渐进式收缩金字塔和空间缩减注意力 (SRA),我们在将 Transformer 移植到密集预测时克服了许多困难。这些能够减少 Transformer 的资源消耗,使 PVT 可以灵活地学习多尺度和高分辨率特征。(3)我们在几个不同的任务上评估了所提出的PVT,包括图像分类、目标检测、实例和语义分割,并将其与流行的ResNets[22]和ResNeXts[73]进行了比较。如图 2 所示,与现有技术相比,我们具有不同参数尺度的 PVT 可以始终存档提高性能。例如,相比于在相当数量的参数下,使用RetinaNet[39]进行目标检测,PVT-Small在COCO val2017实现了40.4 AP,超过了ResNet504.1分(40.4vs36.3)除此之外PVT-large取得了42.6AP,必ResNeXt101-64x4d多1.6AP同时少使用了30%的参数量

2. Related Work

2.1. CNN Backbones

CNN 是深度神经网络在视觉识别中的工作马。在[34]中首次引入了标准CNN来区分手写数字。该模型包含具有特定感受野的卷积核,可以捕获有利的视觉上下文。为了提供平移相等方差,卷积核的权重在整个图像空间之间共享。最近,随着计算资源(例如 GPU)的快速发展,在大规模图像分类数据集(例如 ImageNet [51])上成功训练堆叠卷积块 [33, 54]。例如,GoogLeNet[59]证明了包含多个内核路径的卷积算子可以获得非常有竞争力的性能。在 Inception 系列 [60, 58]、ResNeXt [73]、DPN [10]、MixNet [65] 和 SKNet [36] 中进一步验证了多路径卷积块的有效性。此外,ResNet[22]在卷积块中引入了跳跃连接,使得创建/训练非常深的网络成为可能,并在计算机视觉领域取得了令人印象深刻的结果。DenseNet[25]引入了一种密集连接的拓扑,它将每个卷积块连接到所有先前的块。最近的进展可以在最近的调查/评论论文中找到 [31, 53]。与成熟的 CNN 不同,vision Transformer backbone仍处于开发的早期阶段。在这项工作中,我们试图通过设计一种新的适用于大多数视觉任务的通用 Transformer 主干来扩展 Vision Transformer 的范围。

2.2. Dense Prediction Tasks

Preliminary.密集预测任务旨在对特征图执行像素级分类或回归。目标检测和语义分割是两个具有代表性的密集预测任务。

目标检测。在深度学习时代,cnn[34]已经成为目标检测的主要框架,包括单级检测器(如SSD[43]、RetinaNet[39]、FCOS[62]、GFL[37,35]、PolarMask[71]和OneNet[55])和多级检测器(Faster R-CNN[49]、Mask R-CNN[21]、Cascade R-CNN[4]和Sparse R-CNN[57])。这些流行的对象检测器大多建立在高分辨率或多尺度特征图上,以获得良好的检测性能。最近,DETR [6] 和可变形 DETR [85] 结合 CNN 主干和 Transformer 解码器来构建端到端的对象检测器。同样,它们为了获得目标检测准确性也需要高分辨率或多尺度特征图。

语义分割。CNN 在语义分割中也起着重要作用。在早期阶段,FCN [44] 引入了全卷积架构来为任意大小的给定图像生成空间分割图。之后,Noh 等人介绍了反卷积操作。 [47],并在 PASCAL VOC 2012 数据集 [52] 上取得了令人印象深刻的性能。受FCN的启发,UNet[50]是专门为医学图像分割领域提出的,弥合了相同空间大小对应的低层特征图和高层特征图之间的信息流。为了探索更丰富的全局上下文表示,Zhao 等人。 [81] 在各种池化尺度上设计了一个金字塔池化模块,Kirillov 等人。 [32] 基于 FPN [38],开发了一种称为语义 FPN 的轻量级分割头。最后,DeepLab家族[8,41]应用扩展卷积来扩大接受域,同时保持特征图的分辨率。与目标检测方法类似,语义分割模型也依赖于高分辨率或多尺度特征图。

2.3. Self-Attention and Transformer in Vision

由于卷积滤波器权重通常在训练期间是固定的,因此它们无法动态适应不同的输入。已经提出了许多方法来缓解这个问题使用动态过滤器[30]或自我注意操作[64]。非本地块[70]试图在空间和时间上对远程依赖关系进行建模,这已被证明有利于准确的视频分类。然而,尽管它取得了成功,但非局部算子的计算成本很高和内存开销很高。Criss-cross [26] 通过交叉路径生成稀疏注意力图进一步降低了复杂性。Ramachandran等人[48]提出了独立的自我注意,用局部自注意单元替换卷积层。ANet [3] 在结合自注意力和卷积操作时取得了有竞争力的结果。LambdaNetworks [2] 使用 lambda 层,这是一种有效的自注意力来替换 CNN 中的卷积。DETR [6] 利用 Transformer 解码器将对象检测建模为具有可学习查询的端到端字典查找问题,成功地消除了对 NMS 等手工过程的需求。基于 DETR,可变形 DETR [85] 进一步采用可变形注意力层关注一组稀疏的上下文元素,获得更快的收敛和更好的性能。最近,Vision Transformer (ViT)[13]采用纯Transformer[64]模型进行图像分类,将图像视为一系列补丁。DeiT[63]使用一种新的蒸馏方法进一步扩展了ViT。与以前的模型不同,这项工作将金字塔结构引入 Transformer 以呈现纯 Transformer骨干网络以应对密集预测任务,而不是一个根据任务特定的头或一个图像分类模型。

3. Pyramid Vision Transformer(PVT)

3.1 Overall Architecture

我们的目标是将金字塔结构引入 Transformer 框架中,以便它可以为密集预测任务(例如对象检测和语义分割)生成多尺度特征图。PVT的概述如图3所示。与CNN主干[22]类似,我们的方法有四个阶段来生成不同尺度的特征图。所有阶段共享相似的架构,它由一个补丁嵌入层(Patch Embedding layer)和 Li个 Transformer 编码器层组成。

在第一步,输入的是一张大小为H*W*3的图片,我们将它划分为HW/4^2个patches每一个patch的尺寸是4*4*3,之后将flatten之后的向量输入线性投射层获得patch embedding,尺寸为HW/4^2*C1,之后嵌入的补丁和位置嵌入通过具有 L1 层的 Transformer 编码器传递,输出被重新整形为大小为 H4 ×W4 ×C1 的特征图 F1。同样,使用前一阶段的特征图作为输入,我们得到以下特征图:F2、F3 和 F4,其步幅相对于输入图像为 8、16 和 32 像素。使用特征金字塔{F1, F2, F3, F4},我们的方法可以很容易地应用于大多数下游任务,包括图像分类,目标检测,和语义分割。

3.2. Feature Pyramid for Transformer

与使用不同卷积步长获得多尺度特征图的CNN骨干网[54,22]不同,我们的PVT使用渐进收缩策略通过补丁嵌入层来控制特征映射的规模。

在这里,我们将第 i 阶段的补丁大小表示为 Pi。在阶段i的开始,我们首先将输入特征映射Fi−1∈R^Hi−1×Wi−1×Ci−1平均划分为Hi−1Wi−1/Pi^2patches,然后将每个补丁压平并投影到Ci维嵌入中。在线性投影之后,嵌入补丁的形状可以看作是Hi−1/Pi × Wi−1/Pi × Ci,其中高度和宽度比输入小Pi倍。

这样,我们可以在每个阶段灵活调整特征图的规模,从而使为 Transformer 构建一个特征金字塔成为可能。

3.3 Transformer Encoder

第 i 阶段的 Transformer 编码器有 Li 个编码器层,每个编码器层由注意力层和前馈层组成 [64]。由于PVT需要处理高分辨率(如4步)特征图,我们提出了一种空间缩减注意(SRA)层来代替编码器中传统的多头注意(MHA)层[64]。

与 MHA 类似,我们的 SRA 接收查询 Q、键 K 和值 V 作为输入,并输出细化的特征。不同的是,我们的SRA降低了K和V的空间尺度再进行注意力操作这大大减少了计算/内存开销。SRA 在阶段 i 的详细信息可以表示如下:

3.4. Model Details

总之,我们方法的超参数如下:

• Pi:阶段 i 的补丁大小;

• Ci:阶段i输出的通道数;

• Li:阶段i中的编码器层数;

• Ri:阶段i中SRA的缩减率;

• Ni:阶段i中SRA的头部数;

• Ei:阶段i中前馈层[64]的扩展比;

遵循 ResNet [22] 的设计规则,我们 (1) 在浅层使用小输出通道号; (2) 在中间阶段集中主要计算资源。为了为讨论提供实例,我们在表 1 中描述了一系列不同尺度的 PVT 模型,即 PVT-Tiny、-Small、-Medium 和 -Large,其参数编号分别与 ResNet18、50、101 和 152 相当。第 4 节介绍了在特定下游任务中使用这些模型的更多详细信息。

3.5. Discussion

我们模型最相关的工作是 ViT [13]。在这里,我们讨论了它们之间的关系和差异。首先,PVT 和 ViT 都是纯 Transformer 模型,没有卷积。它们之间的主要区别是金字塔结构。与传统的Transformer[64]类似,ViT输出序列的长度与输入相同,这意味着ViT的输出是单尺度的(见图1 (b))。此外,由于资源有限,ViT 的输入是粗粒度的(例如,补丁大小为 16 或 32 像素),因此其输出分辨率相对较低(例如 16 步幅或 32 步幅)。因此,很难直接将 ViT 应用于需要高分辨率或多尺度特征图的密集预测任务。我们的PVT通过引入渐进式收缩金字塔打破了Transformer的例行。它可以像传统的CNN主干那样生成多尺度特征图。此外,我们还设计了一个简单但有效的注意力层——SRA,用于处理高分辨率特征图并降低计算/内存成本。得益于上述设计,我们的方法比 ViT 具有以下优点:1)更灵活——可以在不同的阶段生成不同尺度的/通道的特征图; 2)更通用——可以很容易地插入和播放在大多数下游任务模型中; 3)对计算/内存更友好——可以处理更高分辨率的特征图或更长的序列。

4. Application to Downstream Tasks

4.1. Image-Level Prediction

图像分类是图像级预测最经典的任务。为了提供讨论的实例,我们设计了一系列不同尺度的PVT模型,分别是PVT-Tiny、-Small、-Medium和-Large,其参数数分别类似于ResNet18、50、101和152PVT系列的详细超参数设置在补充材料中(SM)中提供。

PVT系列的详细超参数设置在补充材料中(SM)中提供。

对于图像分类,我们遵循 ViT [13] 和 DeiT [63] 将可学习的分类标记附加到最后阶段的输入,然后使用全连接 (FC) 层在令牌之上进行分类。

4.2. Pixel-Level Dense Prediction

除了图像级预测之外,还需要对特征图执行像素级分类或回归的密集预测也经常出现在下游任务中。在这里,我们讨论了两个典型的任务,即对象检测和语义分割。

我们将PVT模型应用于三种具有代表性的密集预测方法,即RetinaNet[39]、Mask RCNN[21]和语义FPN[32]。RetinaNet 是一种广泛使用的单级检测器,Mask R-CNN 是最流行的两阶段实例分割框架,Semantic FPN 是一种没有特殊操作(例如扩张卷积)的普通语义分割方法。使用这些方法作为基线使我们能够充分检查不同主干的有效性。

实现细节如下:(1)与ResNet一样,我们使用在ImageNet上预训练的权值初始化PVT主干;(2)我们使用输出特征金字塔{F1, F2, F3, F4}作为FPN[38]的输入,然后将细化的特征映射输入到后续的检测/分割头;(3)在训练检测/分割模型时,PVT中没有一层被冻结;(4)由于检测/分割的输入可以是一个任意形状,在 ImageNet 上预训练的位置嵌入可能不再有意义。因此,我们根据输入分辨率对预训练的位置嵌入进行双线性插值。

5. Experiments

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

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

相关文章

【人工智能】Linux系统Mamba安装流程

在编译安装 mamba 之前,你需要确保已安装正常的PyTorch环境。 # 安装必要的系统依赖 sudo apt update sudo apt install build-essential # 安装mamba依赖 pip install packaging wheel # 克隆仓库 git clone https://github.com/Dao-AILab/causal-conv1d.git git …

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 点击链接获取【2024华为杯研赛资料汇总】: https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目: 大数据驱动的…

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码:完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…

torch.embedding 报错 IndexError: index out of range in self

文章目录 1. 报错2. 原因3. 解决方法 1. 报错 torch.embedding 报错: IndexError: index out of range in self2. 原因 首先看下正常情况: import torch import torch.nn.functional as Finputs torch.tensor([[1, 2, 4, 5], [4, 3, 2, 9]]) embedd…

【C++ Primer Plus习题】17.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <fstream> using namesp…

PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发&#xff0c;它的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金&#xff0c;这使得GoFly快速框架得到良好的发展&#xff0c;GoFly技术团队加大投入反哺科技企业和开…

数据结构之搜索二叉树

目录 一、什么是搜索二叉树 基本概念 特点 注意事项 二、搜索二叉树的C实现 2.0 构造与析构 2.1 插入 2.2 查找 2.3 删除 2.3.1 无牵无挂型 2.3.2 独生子女型 2.3.3 儿女双全型 三、搜索二叉树的应用 3.1 key搜索 3.2 key/value搜索 一、什么是搜索二叉树 搜索二…

EAGLE——探索混合编码器的多模态大型语言模型的设计空间

概述 准确解释复杂视觉信息的能力是多模态大型语言模型 (MLLM) 的关键重点。最近的研究表明&#xff0c;增强的视觉感知可显著减少幻觉并提高分辨率敏感任务&#xff08;例如光学字符识别和文档分析&#xff09;的性能。最近的几种 MLLM 通过利用视觉编码器的混合来实现这一点…

科研绘图系列:R语言ggplot2画热图(heatmap)

文章目录 介绍加载R包导入数据数据预处理画图导出数据系统信息介绍 热图(Heatmap)是一种数据可视化技术,它通过颜色的变化来表示数据的大小或者密度。热图通常用于展示两个变量之间的关系,或者在二维空间上展示数据的分布情况。以下是热图可以表示的一些内容: 数据分布:…

网络原理 HTTP与HTTPS协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多计算机网络知识 目录 1.HTTP概念 2.HTTP报文格式 3.HTTP请求 1.首行 1.1URL 1.2 GET⽅法 1.3 POST⽅法 1.4 其他⽅法 2.请求头&#xff08;head…

JVM面试问题集

什么是JVM? 了解过字节码文件的组成吗? 说一下运行时数据区 哪些区域会出现内存溢出&#xff0c;会有什么现象? JM在JDK6-8之间在内存区域上有什么不同 类的生命周期 什么是类加载器 什么是双亲委派机制 打破双亲委派机制 Tomcat的自定义类加载器

【网络通信基础与实践番外一】多图预警之图解UDP和TCP前置知识

参考大佬的文章https://www.cnblogs.com/cxuanBlog/p/14059379.html 一、宏观架构中的传输层 在计算机中&#xff0c;任何一个可以交换信息的介质都可以称为端系统。计算机网络的运输层则负责把报文从一端运输到另一端&#xff0c;运输层实现了让两个互不相关的主机进行了逻辑…

Kafka-Manager安装及操作

文章目录 一、kafka-manager介绍二、kafka-manager安装三、Kafka-Manager操作 一、kafka-manager介绍 CMAK (Cluster Manager for Apache Kafka, previously known as Kafka Manager) CMAK (previously known as Kafka Manager) is a tool for managing Apache Kafka cluster…

STM32篇:开发环境安装

编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5 和 STM32CubeMX 一.Keil5 的安装 使用 Keil4 写 STM32 代码其实也是可以&#xff0c;但需要很复杂的配置&#xff0c;不建议新手操作。 比较推荐 Keil5 编写 STM32 &#xff0c;只需要一些简单的设置就可…

(一)Lambda-Stream流

概述 Java8的Stream使用的是函数式编程模式&#xff0c;它可以被用来对集合或数组进行链状流式的操作&#xff0c;可以更方便地让我们对集合或数组操作。 使用Stream流程&#xff1a; 创建流 -> 中间操作 -> 终结操作; 注&#xff1a;必须要有终结操作否则中间操作不生效…

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息&#xff0c;比如用户手机号码信息。然而随着时间的变化&#xff0c;某些用户信息会发生改…

7.搭建个人金融数据库之快速获取股票列表和基本信息!

前边我们提过&#xff0c;免费的数据一般来自于爬虫&#xff0c;获取难度和维护成本都比较高&#xff0c;其实不太适合小白用户。所以非必要情况下&#xff0c;我们尽量不用这种方式来获取数据。 我自己用的比较多的是tushare&#xff0c;一般来说有它也就够了&#xff0c;大…

Junit4测试报错:java.lang.NoClassDefFoundError: org/junit/runner/manipulation/Filter

原来build path 界面&#xff1a; Junit为Modulepath 应把Junit改为Classpath即可&#xff0c;如下图所示&#xff1a;

前端和后端的相对路径和绝对路径

1. 相对路径访问图片 test.html 位于 web/a/b/c/ 目录中&#xff1a; 若要访问 static/img/ 文件夹中的图片&#xff08;假设图片名为 image.png&#xff09;&#xff0c;相对路径应该是&#xff1a; <img src"../../../static/img/image.png" alt"Image&quo…

Java笔试面试题AI答之设计模式(3)

文章目录 11. Spring开发中的哪里使用了工厂设计模式 &#xff1f;1. BeanFactory2. 工厂方法模式3. 抽象工厂模式4. 示例说明总结 12. 什么是代理模式 &#xff1f;13. 请列举代理模式的应用场景 &#xff1f;14. 什么是原型模式 &#xff1f;15. 请简述Java中原型模式的使用方…