Transformer论文阅读:Swin Transformer算法笔记

news2024/11/14 20:49:31

标题:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
会议:ICCV2021
论文地址:https://ieeexplore.ieee.org/document/9710580/
官方代码:https://github.com/microsoft/Swin-Transformer
作者单位:微软亚洲研究院、中国科学技术大学、西安交通大学、清华大学

文章目录

  • Abstract
  • 1. Introduction
  • 2. Related Work
  • 3. Method
    • 3.1. Overall Architecture
    • 3.2. Shifted Window based Self-Attention
    • 3.3. Architecture Variants
  • 4. Experiments
    • 4.1. Image Classification on ImageNet-1K
    • 4.2. Object Detection on COCO
    • 4.3. Semantic Segmentation on ADE20K
    • 4.4. Ablation Study
  • 5. Conclusion

Abstract

本文提出了一种新的视觉Transformer,称为Swin Transformer,它可以作为计算机视觉的通用主干。将Transformer从语言转换到视觉的挑战来自于两个领域之间的差异,例如视觉实体的尺度变化较大、图像中的像素相对于文本中的文字具有较高的分辨率。为了解决这些差异,我们提出了一个层级式Transformer,其表征是通过移动窗口(Shifted windows)来计算的。移动窗口方案通过将自注意力的计算限制在非重叠的局部的窗口,从而带来更高的效率,同时还允许跨窗口的联系。这种层级式的结构具有在不同尺度下建模的灵活性,并且具有与图像尺寸相关的线性的计算复杂度。Swin Transformer的这些特性使其可以兼容广泛的视觉任务,包括图像分类(ImageNet-1K的top-1准确率为87.3)和稠密预测任务,如目标检测(COCO test-dev上的58.7 box AP和51.1 mask AP)和语义分割(ADE20K val上的53.5 mIoU)。其性能在各个视觉任务基准上都超过了之前的SOTA,展示了基于Transformer的模型作为视觉主干的潜力。层级式的设计和移动窗口方法也被证明对all-MLP结构是有益的。

1. Introduction

计算机视觉中的建模长期以来由卷积神经网络(CNNs)主导。从AlexNet及其在ImageNet图像分类挑战上的革命性表现开始,CNN结构通过更大的规模、更广泛的连接和更复杂的卷积形式变得越来越强大。随着CNN作为各种视觉任务的主干网络,这些结构的进步导致了性能的提高从而广泛地改善了整个领域。
另一方面,自然语言处理(NLP)中网络结构的演化已经走向了一条不同的道路,现在盛行的结构是Transformer。为了序列建模和转换任务而设计,Transformer的特点是利用注意力来建模数据中的远程依赖关系。它在语言领域的巨大成功使研究人员开始研究它对计算机视觉的适应性,最近它在某些任务上表现出了很好的效果,特别是图像分类和联合视觉-语言建模。
在本文中,我们寻求扩展Transformer的适用性,使其可以作为计算机视觉的通用主干,就像它在NLP中和CNNs在视觉中一样。我们观察到,将其在语言领域的高性能迁移到视觉领域的重大挑战可以通过两种模式之间的差异来解释。差异之一是尺度。与语言Transformers中作为处理的基本元素的单词token不同,视觉元素可以在尺度上有很大的变化,这个问题在目标检测等任务中受到关注。在现有的基于Transformer的模型中,token都是固定尺度的,这一特性不适合这些视觉应用。另一个不同之处在于,图像中像素的分辨率要远高于文本段落中的文字。存在许多视觉任务,如语义分割,需要在像素级进行稠密预测,这对于高分辨率图像上的Transformer来说是很难解决的,因为它的自注意力的计算复杂度是图像尺寸的二次方。为了克服这些问题,我们提出了一个通用的Transformer主干,称为Swin Transformer,它构造了层级式的特征图,并且具有与图像尺寸呈线性的计算复杂度。如图1a所示,Swin Transformer从小尺寸的patch(用灰色勾勒)开始,在更深的Transformer层中逐步合并相邻的patch,从而构建层级式的表征。通过这些层级式的特征图,Swin Transformer模型可以方便地利用先进的稠密预测技术,如特征金字塔网络(FPN)或U-Net。线性的计算复杂度是通过在划分图像的非重叠窗口(用红色勾勒)内局部地计算自注意力来实现的。由于每个窗口中的patch的数量是固定的,因此复杂度与图像尺寸成线性关系。这些优点使得Swin Transformer适合作为各种视觉任务的通用主干,这与以前基于Transformer的结构不同,后者只生成单一分辨率的特征图,并且具有平方级复杂度。
在这里插入图片描述
Swin Transformer的一个关键设计要素是其窗口划分在连续的自注意力层之间移动,如图2所示。移动的窗口桥接了前一层的窗口,提供了它们之间的联系,显著增强了建模能力(见表4)。该策略在实际延迟方面也是有效的:窗口内的所有query块共享相同的key集合(query和key是自注意力层中的投影向量),这有利于硬件中的内存访问。相比之下,早期的基于滑动窗口的自注意力方法在通用硬件上由于不同query像素的key集合不同而导致高延迟(虽然有一些有效的方法可以在通用硬件上实现基于滑动窗口的卷积层,但由于其在特征映射中共享kernel权重,基于滑动窗口的自注意力层在实践中很难实现高效的内存访问)。我们的实验表明,所提出的移动窗口方法比之前的滑动窗口方法具有更低的延迟,但在建模能力方面是相似的(见表5和表6)。移动窗口方法也被证明对all-MLP结构是有益的。
在这里插入图片描述
提出的Swin Transformer在图像分类、目标检测和语义分割等识别任务上取得了强大的性能。在3个任务上,它都显著优于ViT/DeiT和ResNe(X)t模型,并且具有相似的延迟。其在COCO test-dev集上的58.7 box AP和51.1 mask AP超过了之前SOTA的结果+2.7 box AP(无外部数据的复制-粘贴)和+2.6 mask AP(DetectoRS)。在ADE20K语义分割上,它在验证集上获得了53.5 mIoU,比之前的SOTA(SETR)提高了+3.2 mIoU。在ImageNet-1K图像分类上也取得了87.3%的最高准确率。
我们相信,一个跨越计算机视觉和自然语言处理的统一结构可以使这两个领域受益,因为它将促进视觉和文本信号的联合建模,并且来自两个领域的建模知识可以更深入地共享。我们希望Swin Transformer在各种视觉问题上的强大表现能够推动这一观点在社区中深入,并鼓励对视觉和语言信号进行统一建模。

2. Related Work

CNN及其变体 卷积神经网络用作贯穿计算机视觉的标准网络模型。虽然CNN已经存在了几十年,但直到AlexNet的提出,CNN才脱颖而出成为主流。此后,更深、更有效的卷积神经网络结构被提出,以进一步推动计算机视觉领域的深度学习浪潮,如VGG、GoogleNet 、ResNet、DenseNet、HRNet和EfficientNet等。除了这些结构上的进步,在改进单个卷积层方面也有很多工作,比如深度可分离卷积和可变形卷积。虽然CNN及其变体仍然是计算机视觉应用的首要主干结构,但我们突出了Transformer式结构在视觉和语言统一建模方面的强大潜力。我们的工作在几个基本的视觉识别任务上取得了很好的表现,我们希望这将有助于建模的转变。
基于自注意力的主干结构 同样,受到自注意力层和Transformer结构在NLP领域成功的启发,一些工作使用自注意力层来代替流行的ResNet中的部分或全部空间卷积层。在这些工作中,自注意力在每个像素的局部窗口内被计算以加速优化,并且它们实现了比相应的ResNet结构稍好的准确率/FLOPs权衡。然而,它们昂贵的内存访问导致它们的实际延迟显著大于卷积网络。与之前使用的滑动窗口不同,我们提出在连续的层之间移动窗口,这允许了在通用硬件中更高效的实现。
自注意力/Transformers来补足CNN 另一个工作路线是用自注意力层或Transformers来增强一个标准的CNN结构。自注意力层可以通过提供编码远程依赖或异构交互的能力来补足主干网络或头部网络。最近,Transformer中的编码器-解码器设计已经应用于目标检测和实例分割任务。我们的工作探索了Transformers对基本视觉特征提取的适应性,是对这些工作的补充。
基于Transformer的视觉主干 与我们工作最相关的是Vision Transformer(ViT)及其后续工作。ViT的开创性工作是直接在不重叠的中等大小的图像块上应用Transformer结构进行图像分类。与卷积网络相比,它在图像分类方面取得了令人印象深刻的速度-精度权衡。虽然ViT需要大规模的训练数据集(即JFT-300M)才能表现良好,但DeiT引入了几种训练策略,使得ViT在使用较小的ImageNet-1K数据集时也是有效的。ViT在图像分类上的结果令人鼓舞,但由于其低分辨率特征图和复杂度随图像尺寸的呈二次方增加,因此其结构不适合用作稠密视觉任务或输入图像分辨率较高时的通用主干网络。有一些工作通过直接上采样或反卷积将ViT模型应用于目标检测和语义分割的稠密视觉任务,但性能相对较低。与我们的工作同时发生的是一些修改ViT结构以更好地进行图像分类的工作。根据经验,尽管我们的工作侧重于通用性能,而不是专门针对分类,但是我们发现我们的Swin Transformer结构在这些图像分类方法中实现了最佳的速度-精度权衡。另一项同时发生的工作探索了类似的思路,在Transformers上构建多分辨率特征图。它的复杂度仍然是图像大小的二次方,而我们的复杂度是线性的,并且在局部操作,这已被证明有利于建模视觉信号中的高相关性。我们的方法既高效又有效,在COCO目标检测和ADE20K语义分割上都达到了SOTA的精度。

3. Method

3.1. Overall Architecture

在这里插入图片描述
Swin Transformer结构的概述如图3所示,其阐明了tiny版本(Swin-T)。它首先通过像ViT一样的patch分割模块将输入的RGB图像分割成不重叠的patch。每个patch被视为一个“token”,其特征被设置为原始像素RGB值的concatenation。在我们的实现中,我们使用 4 × 4 4×4 4×4的patch大小,因此每个patch的特征维度为 4 × 4 × 3 = 48 4×4×3=48 4×4×3=48。在此raw-valued特征上使用线性嵌入(linear embedding)层,将其投影到任意维度(记为 C C C)。
在这些patch token上应用多个经过改进的自注意力计算(Swin Transformer块)的Transformer块。Transformer块保持token数量( H 4 × W 4 \frac{H}{4}×\frac{W}{4} 4H×4W)不变,与线性嵌入(linear embedding)合称为“Stage 1”。
为了产生层级式的表征,随着网络的加深,通过patch合并(patch merging)层来减少token的数量。第一个patch合并层将每组 2 × 2 2×2 2×2的相邻补丁的特征concatenate起来,并在 4 C 4C 4C维度的concatenate后的特征上使用一个线性层。这样使得token数量减少了 2 × 2 = 4 2×2=4 2×2=4 2 × 2× 2×分辨率下采样)倍,输出维度设置为 2 C 2C 2C。之后,使用Swin Transformer块进行特征变换,分辨率保持在 H 8 × W 8 \frac{H}{8}×\frac{W}{8} 8H×8W不变。这里的第一个patch合并与特征变换的块被记为“Stage 2”。这个过程会重复两次,也就是“Stage 3”和“Stage 4”,输出分辨率分别为 H 16 × W 16 \frac{H}{16}×\frac{W}{16} 16H×16W H 32 × W 32 \frac{H}{32}×\frac{W}{32} 32H×32W。这些stage共同产生一个层级式表征,具有与典型卷积网络相同的特征图分辨率,如VGG和ResNet。因此,所提出的结构可以方便地替换掉现有方法中的主干网络,用于各种视觉任务。
Swin Transformer块 Swin Transformer是通过将Transformer模块中标准的多头自注意力(multi-head self attention,MSA)模块替换为基于移动窗口的模块来构建的,其它层保持不变。如图3b所示,一个Swin Transformer模块由一个基于移动窗口的MSA模块组成,随后是一个2层的MLP,GELU非线性介于MLP之间。在每个MSA模块和每个MLP之前会应用一个LayerNorm(LN)层,在每个模块之后会应用一个残差连接。

3.2. Shifted Window based Self-Attention

标准的Transformer结构及其对图像分类的改进都是进行全局自注意力,计算一个token与所有其它token之间的关系。全局计算导致复杂度与token数量的二次方相关,使其不适用于许多需要大量token来进行稠密预测或表征高分辨率图像的视觉问题。
非重叠窗口中的自注意力 为了高效建模,我们提出在局部窗口内计算自注意力。窗口被排列成以非重叠的方式平均地划分图像。假设每个窗口包含 M × M M×M M×M个patch,全局MSA模块和在 h × w h×w h×w个patch的图像上基于窗口的计算复杂度分别为(在确定复杂度时,我们省略了SoftMax计算):
Ω ( MSA ) = 4 h w C 2 + 2 ( h w ) 2 C Ω ( W-MSA ) = 4 h w C 2 + 2 M 2 h w C \begin{align} &\Omega(\textrm{MSA})=4hwC^2+2(hw)^2C\\ &\Omega(\textrm{W-MSA})=4hwC^2+2M^2hwC \end{align} Ω(MSA)=4hwC2+2(hw)2CΩ(W-MSA)=4hwC2+2M2hwC其中,前者与patch数 h w hw hw呈二次方关系,后者在 M M M固定(默认设置为7)时呈线性关系。全局自注意力计算在 h w hw hw较大时通常是代价高昂的,而基于窗口的自注意力是可扩展的。
在连续的块中移动窗口划分 基于窗口的自注意力模块缺少跨窗口的联系,限制了其建模能力。为了在引入跨窗口联系的同时保持非重叠窗口的高效计算,我们提出了一种在连续的Swin Transformer块中交替使用两种划分布局的移动窗口划分方法。
如图2所示,第一个模块使用从左上角像素开始的规则的窗口划分策略,将 8 × 8 8×8 8×8的特征图均匀划分为 2 × 2 2×2 2×2个尺寸为 4 × 4 4×4 4×4 M = 4 M=4 M=4)的窗口。然后,下一个模块采用从前一层移动而来的窗口布局,通过把窗口从规则划分的窗口移动 ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) (\left\lfloor\frac{M}{2}\right\rfloor,\left\lfloor\frac{M}{2}\right\rfloor) (2M,2M)个像素。
采用移动窗口划分方法,连续的Swin Transformer块计算如下:
z ^ l = W-MSA ( LN ( z l − 1 ) ) + z l − 1 z l = MLP ( LN ( z ^ l ) ) + z ^ l z ^ l + 1 = SW-MSA ( LN ( z l ) ) + z l z l + 1 = MLP ( LN ( z ^ l + 1 ) ) + z ^ l + 1 \begin{align} &\hat{\mathrm{z}}^l=\textrm{W-MSA}(\textrm{LN}(\mathrm{z}^{l-1}))+\mathrm{z}^{l-1}\nonumber\\ &\mathrm{z}^l=\textrm{MLP}(\textrm{LN}(\hat{\mathrm{z}}^l))+\hat{\mathrm{z}}^l\nonumber\\ &\hat{\mathrm{z}}^{l+1}=\textrm{SW-MSA}(\textrm{LN}(\mathrm{z}^l))+\mathrm{z}^l\nonumber\\ &\mathrm{z}^{l+1}=\textrm{MLP}(\textrm{LN}(\hat{\mathrm{z}}^{l+1}))+\hat{\mathrm{z}}^{l+1} \end{align} z^l=W-MSA(LN(zl1))+zl1zl=MLP(LN(z^l))+z^lz^l+1=SW-MSA(LN(zl))+zlzl+1=MLP(LN(z^l+1))+z^l+1其中, z ^ l \hat{\mathrm{z}}^l z^l z l \mathrm{z}^l zl别表示块 l l l中的 (S)W-MSA \textrm{(S)W-MSA} (S)W-MSA模块和 MLP \textrm{MLP} MLP模块的输出特征; W-MSA \textrm{W-MSA} W-MSA SW-MSA \textrm{SW-MSA} SW-MSA分别表示使用规则布局和移动窗口划分布局的基于窗口的多头自注意力。
移动窗口划分方法在前一层中引入了相邻非重叠窗口之间的联系,并且在图像分类、目标检测和语义分割中被发现是有效的,如表4所示。
针对移动布局的高效批次计算 移动窗口划分的一个问题是,在移动布局中会产生更多的窗口,从 ⌈ h M ⌉ × ⌈ w M ⌉ \left\lceil\frac{h}{M}\right\rceil×\left\lceil\frac{w}{M}\right\rceil Mh×Mw ( ⌈ h M ⌉ + 1 ) × ( ⌈ w M ⌉ + 1 ) (\left\lceil\frac{h}{M}\right\rceil+1)×(\left\lceil\frac{w}{M}\right\rceil+1) (Mh+1)×(Mw+1),并且其中一些窗口会小于 M × M M×M M×M(为了使窗口尺寸 ( M , M ) (M,M) (M,M)可以被 ( h , w ) (h,w) (h,w)的特征图尺寸所分割,需要时会在特征图上使用右下角填充)。一个朴素的解决方案是将较小的窗口填充到 M × M M×M M×M的尺寸,并在计算注意力时掩盖填充值。当规则划分中的窗口数目较少时,例如 2 × 2 2×2 2×2时,这种朴素的解决方案增加的计算量相当大( 2 × 2 → 3 × 3 2×2→3×3 2×23×3,增加了2.25倍)。在这里,我们提出了一种更高效的向左上方循环移动的批次计算方法,如图4所示。在这个移动之后,一个成批的窗口可能由几个在特征图中不相邻的子窗口组成,因此使用一个掩码机制将自注意力计算限制在每个子窗口内。通过循环移动,成批的窗口的数量保持与规则窗口划分相同,因此也是高效的。该方法的低延迟如表5所示。
在这里插入图片描述
相对位置偏置 在计算自注意力时,我们遵循此前的工作,在计算相似度时给每个头加上一个相对位置偏置 B ∈ R M 2 × M 2 B\in\mathbb{R}^{M^2×M^2} BRM2×M2
A t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T / d + B ) V (4) \mathrm{Attention}(Q,K,V)=\mathrm{SoftMax}(QK^T/\sqrt d+B)V\tag{4} Attention(Q,K,V)=SoftMax(QKT/d +B)V(4)其中, Q , K , V ∈ R M 2 × d Q,K,V\in\mathbb{R}^{M^2×d} Q,K,VRM2×d分别是query、key和value矩阵; d d d是query/key的维度, M 2 M^2 M2是窗口内的patch数。由于沿每个轴的相对位置在 [ − M + 1 , M − 1 ] [-M+1,M-1] [M+1,M1]范围内,因此我们参数化了一个较小尺寸的偏置矩阵 B ^ ∈ R ( 2 M − 1 ) × ( 2 M − 1 ) \hat{B}\in\mathbb{R}^{(2M-1)×(2M-1)} B^R(2M1)×(2M1),并且 B B B中的值取自 B ^ \hat{B} B^
我们观察到,这相对于没有该偏置项或使用绝对位置嵌入的对应方法有显著的改进,如表4所示。进一步在输入中加入绝对位置嵌入,性能会略有下降,因此在我们的实现中不采用。
在预训练中学习到的相对位置偏置也可以用来初始化模型,通过双三次插值以不同的窗口大小进行微调。

3.3. Architecture Variants

我们构建了我们的基础模型Swin-B,使其具有与ViTB/DeiT-B相似的模型大小和计算复杂度。我们还引入了Swin-T、Swin-S和Swin-L,它们分别是大约0.25×、0.5×和2×的模型大小和计算复杂度的版本。注意,Swin-T和Swin-S的复杂度分别与ResNet-50(DeiT-S)和ResNet-101的复杂度相近。窗口尺寸默认设置为 M = 7 M=7 M=7。对于所有实验,每个头的query维度 d = 32 d=32 d=32,每个MLP的扩充层中 α = 4 \alpha=4 α=4。这些模型变体结构的超参数为:

  • Swin-T: C = 96 C=96 C=96,层数 = { 2 , 2 , 6 , 2 } =\{2,2,6,2\} ={2,2,6,2}
  • Swin-S: C = 96 C=96 C=96,层数 = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}
  • Swin-B: C = 128 C=128 C=128,层数 = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}
  • Swin-L: C = 192 C=192 C=192,层数 = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}

其中, C C C是第一个阶段中隐藏层的通道数。用于ImageNet图像分类的模型变量的模型大小、理论计算复杂度(FLOPs)和吞吐量列于表1。

4. Experiments

4.1. Image Classification on ImageNet-1K

有两种训练设置:直接在ImageNet-1K训练和先在ImageNet-22K预训练然后再在ImageNet-1K微调。
在这里插入图片描述
具体的实验结论可以参照原文。

4.2. Object Detection on COCO

在这里插入图片描述
在目标检测上的对比实验,具体的实验结论可以参照原文。

4.3. Semantic Segmentation on ADE20K

在这里插入图片描述
在语义分割上的对比实验,具体的实验结论可以参照原文。

4.4. Ablation Study

在这里插入图片描述
移动窗口和相对位置偏置的有效性,具体的实验结论可以参照原文。
在这里插入图片描述
在这里插入图片描述
提出的自注意力方法的有效性,具体的实验结论可以参照原文。

5. Conclusion

本文提出了一种新的视觉Transformer,Swin Transformer,它产生一种层级式的特征表示,并且具有与输入图像尺寸相关的线性计算复杂度。Swin Transformer在COCO目标检测和ADE20K语义分割上达到了SOTA的性能,大大超过了此前最好的方法。我们希望Swin Transformer在各种视觉问题上的强大性能可以鼓励视觉和语言信号的统一建模。

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

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

相关文章

[安装之2] 台式计算机加固态硬盘,台式机添加固态硬盘教程_台式主机固态硬盘怎么安装

固态硬盘是用固态电子存储芯片阵列制成的硬盘,也是电脑中比较常见的内存硬件,有些用户在使用电脑时候,由于内存不足导致系统运行较卡的情况,往往会选择添加固态硬盘来解决,那么台式主机固态硬盘怎么安装呢?…

shell脚本内调用另外一个shell脚本的几种方法

有时会在一个shell脚本(如test_call_other_shell.sh)中调用另外一个shell脚本(如parameter_usage.sh),这里总结几种可行的方法,这些方法在linux上和windows上(通过Git Bash)均适用: 1.通过source: 运行在相同的进程,在test_…

CCIE重认证-300-401-拖图题全

拖图 拖图题 编程 snippet;192.168.5.0,mask 255.255.255.0;number是192.168.5.0;mask是255.255.255.0 snippets;edit-config对config,loopback对name 100,address对primary,mask…

广度优先搜索算法 - 迷宫找路

广度优先搜索算法1 思考问题1.1 这个迷宫需不需要指定入口和出口?2 先粗略实现2.1 源码2.2 源码解释3 优化代码3.1 优化读取文件部分3.2 增加错误处理4 再优化-让程序变得更加灵活4.1 用户外部可以循环输入入口和出口5 完整代码这是一个提问者的提出的问题&#xff…

制造业的云ERP在外网怎么访问?内网服务器一步映射到公网

随着企业信息化、智能化时代的到来,很多制造业企业都在用云ERP。用友U 9cloud通过双版本公有云专属、私有云订阅、传统软件购买三种模式满足众多制造业企业的需求,成为一款适配中型及中大型制造业的云ERP,是企业数智制造的创新平台。 用友U 9…

python 面向对象利用selenium【获取某东商品信息】

用python程序和谷歌selenium插件获取某东商品详细信息【商品名称、商品简介,超链接】利用selenium自动化程序 中的css页面结构索取来获取详细数据关于谷歌selenium的安装方法和使用方法第一步检查自己谷歌浏览器的版本1.1 找到设置:并鼠标点击进入1.2进入…

排序评估指标——NDCG和MAP

在搜索和推荐任务中,系统常返回一个item列表。如何衡量这个返回的列表是否优秀呢? 例如,当我们检索【推荐排序】,网页返回了与推荐排序相关的链接列表。列表可能会是[A,B,C,G,D,E,F],也可能是[C,F,A,E,D],现在问题来了…

使用canvas写一个flappy bird小游戏

简介 canvas 是HTML5 提供的一种新标签,它可以支持 JavaScript 在上面绘画,控制每一个像素,它经常被用来制作小游戏,接下来我将用它来模仿制作一款叫flappy bird的小游戏。flappy bird(中文名:笨鸟先飞&am…

XSS注入进阶练习篇(一)XSS-LABS通关教程

XSS注入进阶练习篇1.常用标签整理2. XSS-LABS 练习2.1 level 1 无限制2.2 level 2 双引号闭合2.3 level 3 源码函数书写不全,单引号绕过2.4 level 4 无尖括号绕过2.5 level 5 a标签使用2.6 level 6 大小写绕过2.7 level 7 置空替换绕过2.8 level 8 URL编码绕过 - 重…

安全—07day

Tomcat AJP 文件包含漏洞(CVE-2020- 1938) 漏洞概述 Ghostcat(幽灵猫)是由长亭科技安全研究员发现的存在于Tomcat 中的安全漏洞,由于Tomcat AJP 协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含 Tomcat上所有…

Java岗面试题--Java并发(日积月累,每日三题)

目录面试题一:并行和并发有什么区别?面试题二:线程和进程的区别?追问:守护线程是什么?面试题三:创建线程的几种方式?1. 继承 Thread 类创建线程,重写 run() 方法2. 实现 …

详解垃圾回收算法,优缺点是什么?|金三银四系列

本文详细介绍了在 JVM 中如何判断哪些对象是需要回收的,以及不同的垃圾回收算法以及优缺点。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达上篇文章详细介绍了 JVM 的结构以及其内存结构,需要阅读请移步。本文主要…

Android 9.0系统源码_通知服务(二)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知,对于移动设备来说是很常见的一种功能需求,本篇文章我们将会结合Android9.0系统源码具体来分析一下,应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…

关于HDFS

目录 一、HDFS概述 二、HDFS架构与工作机制 三、HDFS的Shell操作 四、Hdfs的API操作 一、HDFS概述 HDFS:Hadoop Distributed File System;一种分布式文件管理系统,通过目录树定位文件。使用场景:一次写入,多次读出…

java 自定义注解

文章目录前言Annotation包自定义注解自定义注解示例参考文章:java 自定义注解 用处_java注解和自定义注解的简单使用参考文章:java中自定义注解的作用和写法前言 在使用Spring Boot的时候,大量使用注解的语法去替代XML配置文件,十…

SpringAMQP消息队列(SpringBoot集成RabbitMQ)

一、初始配置1、导入maven坐标<!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2、yml配置spring:rabbitmq:host: 你的rabbitmq的ipport: …

4G模块DTU网关远程抄表方案(三):水表188协议

4G模块DTU网关远程抄表方案&#xff08;三&#xff09;&#xff1a;水气电表188协议 1 CTJ 188协议简介 CJ/T188协议规定了户用计量仪表(以下简称仪表)&#xff0c;包括水表、燃气表、热量表等仪表数据传输的基本原则&#xff0c;接口形式及物理性能、数据链路、数据标识及数…

目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

目标检测 回归损失函数1、Smooth L1 Loss2、 IoU Loss3、 GIoU Loss &#xff08;Generalized-IoU Loss&#xff09;4、 DIoU Loss &#xff08;Distance-IoU Loss&#xff09;5、 CIoU Loss &#xff08;Complete-IoU Loss&#xff09;总结&#xff1a;目标检测任务的损失函数…

【计算机网络】数据链路层(下)

文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…

1.1 硬件与micropython固件烧录及自编译固件

1.ESP32硬件和固件 淘宝搜ESP32模块,20-50元都有,自带usb口,即插即用. 固件下载地址:MicroPython - Python for microcontrollers 2.烧录方法 为简化入门难度,建议此处先使用带GUI的开发工具THonny,记得不是给你理发的tony老师. 烧录的入口是: 后期通过脚本一次型生成和烧…