YoloV8改进策略:Block改进|焦点调制网络

摘要

FocalNets是一个新型的神经网络架构,它的核心特点是用焦点调制模块完全取代了自注意力(SA)机制,用于在视觉任务中建模令牌(token)之间的交互。这种架构的设计旨在提高模型的可解释性,并在各种视觉任务上实现卓越的性能。
本文使用FocalNets的Block替换YoloV8的Block,实现涨点。

论文:《焦点调制网络》

https://arxiv.org/pdf/2203.11926.pdf
我们提出了焦点调制网络(简称FocalNets),其中自注意力(SA)被焦点调制模块完全取代,用于在视觉中建模令牌交互。焦点调制包含三个组件:(i)焦点上下文化,通过堆叠深度卷积层实现,以从短到长范围编码视觉上下文;(ii)门控聚合,用于选择性地收集上下文信息到每个查询令牌的调制器中;(iii)元素级仿射变换,将调制器注入查询中。大量实验表明,FocalNets表现出非凡的可解释性(如图1所示),并在图像分类、目标检测和分割等任务上,以类似的计算成本超越了SoTA SA对应项(例如Swin和Focal Transformers)。具体来说,具有tiny和base大小的FocalNets在ImageNet-1K上可以达到 82.3 % 82.3\% 82.3% 83.9 % 83.9\% 83.9%的top-1准确率。在 22 4 2 224^{2} 2242分辨率的ImageNet-22K上进行预训练后,使用 22 4 2 224^{2} 2242 38 4 2 384^{2} 3842分辨率微调时,分别达到了 86.5 % 86.5\% 86.5% 87.3 % 87.3\% 87.3%的top-1准确率。对于使用Mask R-CNN的目标检测任务,使用 1 1 1倍训练计划的FocalNet base比Swin对手高出 2.1 2.1 2.1个百分点,并且已经超过了使用 3 3 3倍训练计划的Swin( 49.0 49.0 49.0 v.s. 48.5 48.5 48.5)。对于使用UPerNet的语义分割任务,FocalNet base在单尺度上比Swin高出 2.4 2.4 2.4个百分点,并且在多尺度上也比Swin表现更好( 50.5 50.5 50.5 v.s. 49.7 49.7 49.7)。使用大型FocalNet和Mask2former,我们在ADE20K语义分割上实现了 58.5 m I o U 58.5 \mathrm{mIoU} 58.5mIoU,在COCO全景分割上实现了 57.9 P Q 57.9 \mathrm{PQ} 57.9PQ。使用巨大的FocalNet和DINO,我们在COCO minival和test-dev上分别实现了 64.3 64.3 64.3 64.4 m A P 64.4 \mathrm{mAP} 64.4mAP,在比Swinv2-G[53]和BEIT-3[84]等基于注意力的大型模型更优越的基础上,创下了新的SoTA记录。这些令人鼓舞的结果表明,焦点调制可能是视觉领域所需要的。
在这里插入图片描述

1、引言

Transformer [79] 最初是为自然语言处理(NLP)而提出的,自从Vision Transformer(ViT) [22] 这一开创性工作以来,它已成为计算机视觉中普遍使用的架构。Transformer在各种视觉任务中都展现出了巨大的潜力,包括图像分类 [75, 82, 89, 54, 108, 78]、目标检测 [3, 120, 114, 18]、分割 [80, 86, 14] 以及更多其他任务 [45, 112, 4, 9, 81, 41]。在Transformer中,自注意力(SA)无疑是成功的关键,它使全局交互变得依赖于输入,这与卷积操作使用共享内核限制在局部区域内进行交互形成了鲜明对比。尽管如此,SA的效率一直是人们关注的焦点,因为它对于视觉令牌数量的复杂度是二次方的,特别是对于高分辨率输入时。为了解决这个问题,许多工作提出了SA的变体,通过令牌合并 [82]、窗口注意力 [54, 78, 108]、动态令牌选择 [60, 98, 59] 或混合方法 [95, 15] 来实现。同时,一些模型通过增强SA与(深度)卷积的结合来提出,以捕获具有良好局部结构感知的长距离依赖关系 [89, 25, 94, 23, 21, 40, 7, 20]。
在这里插入图片描述

在这项工作中,我们旨在回答一个根本问题:是否有比自注意力(SA)更好的方式来建模依赖于输入的长距离交互?我们首先分析了当前SA的先进设计。在图2的左侧,我们展示了在ViT [22] 和Swin Transformer [54] 中提出的红色查询令牌与其周围橙色令牌之间的常用(窗口式)注意力。为了产生输出,SA涉及大量查询-键交互(红色箭头),随后是查询与大量空间分布令牌(上下文特征)之间同样大量的查询-值聚合(黄色箭头)。但是,是否有必要进行如此繁重的交互和聚合呢?在这项工作中,我们采取了一种替代方法,即首先围绕每个查询局部地聚合上下文,然后使用聚合的上下文自适应地调制查询。如图2右侧所示,我们可以简单地应用与查询无关的局部聚合(例如深度卷积)来生成不同粒度级别的汇总令牌。之后,这些汇总令牌被自适应地聚合到调制器中,最终注入到查询中。这种改变仍然能够实现依赖于输入的令牌交互,但通过将聚合与单个查询解耦,显著简化了这个过程,从而仅对几个特征进行轻量级的交互。我们的方法受到焦点注意力(focal attention)的启发 [95],它执行多个级别的聚合以捕获精细和粗略的视觉上下文。然而,我们的方法在每个查询位置提取调制器,并利用一种更简单的方式来实现查询-调制器交互。我们将这种新机制称为焦点调制,并使用它来替代SA,构建一个无注意力的架构,即焦点调制网络,简称FocalNet。

最终,我们在图像分类、目标检测和分割任务上进行了大量实验,结果表明,我们的FocalNet在性能上始终显著优于同等成本的SoTA SA模型。特别地,我们的FocalNet在使用微小和基本模型大小时,分别达到了82.3%83.9%的top-1准确率,但吞吐量与Swin和Focal Transformer相当甚至翻倍。当在ImageNet-22K上以224^2分辨率进行预训练时,我们的FocalNet在 22 4 2 224^2 2242 38 4 2 384^2 3842分辨率下分别达到了86.5%87.3%的准确率,与Swin在相似成本下的表现相当或更好。在转移到密集预测任务时,这一优势尤为显著。在COCO目标检测任务上,我们的FocalNet使用微小和基本模型大小,在Mask R-CNN 1×设置下分别实现了46.149.0的框mAP,超过了使用3×设置的Swin(46.0和48.5框mAP)。在ADE20k语义分割任务上,我们的基本模型大小的FocalNet在单尺度评估下达到了50.5 mIoU,超过了Swin在多尺度评估下的表现(49.7 mIoU)。使用预训练的大型FocalNet,我们在ADE20K语义分割任务上实现了58.5 mIoU,在基于Mask2former的COCO全景分割任务上实现了57.9 PQ。使用巨大的FocalNet和DINO [106],我们在COCO minival和test-dev上分别实现了64.3和64.4 mAP,在COCO上建立了新的SoTA,超过了如Swinv2-G [53]和BEIT-3 [84]等基于注意力且规模更大的模型。请在图3中查找视觉比较,并在实验中查找详细信息。最后,我们将Focal Modulation应用于类似于ViTs的单体布局中,并清楚地展示了其在不同模型大小上的优越性。

在这里插入图片描述

2、相关工作

自注意力机制。Transformer [79] 首先通过将图像分割成一系列视觉标记,在 Vision Transformer (ViT) [22] 中引入视觉领域。ViTs中的自注意力(SA)策略在经过优化的训练方案下,已经展现出优于现代卷积神经网络(ConvNets)如ResNet [30]的性能。随后,多尺度架构[5, 82, 94]、轻量级卷积层[89, 25, 46]、局部自注意力机制[54, 108, 15, 95]以及可学习的注意力权重[101]等被提出,以进一步提升性能并支持高分辨率输入。更全面的综述可以参考[38, 27, 38]。我们的焦点调制机制与SA有着显著的不同,它首先从不同粒度级别聚合上下文,然后调制各个查询标记,从而形成一个无需注意力的标记交互机制。在上下文聚合方面,我们的方法受到[95]中提出的焦点注意力的启发。然而,焦点调制的上下文聚合是在每个查询位置进行的,随后进行调制而非注意力计算。这些机制上的差异使得效率和性能得到了显著提升。另一项密切相关的工作是Poolformer [100],它使用池化来总结局部上下文,并通过简单的减法来调整单个输入。尽管效率不错,但它在性能上仍然落后于流行的视觉变换器,如Swin。正如我们将要展示的,在不同级别上捕获局部结构是至关重要的。

MLP架构。视觉MLP可以分为两类:(i)全局混合MLP,如MLP-Mixer [72]和ResMLP [74],通过空间投影在视觉标记之间进行全局通信,辅以各种技术,如门控、路由和傅里叶变换[51, 58, 70, 71]。(ii)局部混合MLP通过空间移位、置换和伪核混合等方式对邻近标记进行采样以实现交互[99, 32, 48, 8, 26]。最近,MixShift-MLP [113]以类似于焦点注意力[95]的精神,利用MLP同时实现了局部和全局交互。MLP架构和我们的焦点调制网络都是无注意力的。然而,具有多级上下文聚合的焦点调制能够自然地捕获短程和长程结构,因此在准确性和效率之间实现了更好的权衡。

卷积神经网络(ConvNets)一直是计算机视觉中深度神经网络复兴的主要驱动力。自从VGG [63]、InceptionNet [67]和ResNet [30]的出现以来,该领域已经迅速发展。专注于提高ConvNets效率的代表性工作有MobileNet [33]、ShuffleNet [111]和EfficientNet [69]。另一条研究线路旨在集成全局上下文以补偿ConvNets,例如SE-Net [35]、Non-local Network [85]、GCNet [2]、LR-Net [34]和C3Net [97]等。引入动态操作是增强ConvNets的另一种方法,如Involution [43]和DyConv [10]所展示的。最近,ConvNets从两个方面重新崛起:(i)卷积层被集成到自注意力(SA)中,并带来了显著的增益[89,25,46,23],反之亦然[76];(ii)ResNets通过使用类似的数据增强和正则化策略缩小了与ViTs之间的差距[88],将SA替换为(动态)深度卷积[28, 55]也可以略微超过Swin。我们的焦点调制网络也利用深度卷积作为微架构,但进一步引入了多级上下文聚合和输入依赖调制。我们将展示这个新模块的性能显著优于原始的卷积网络。

3、焦点调制网络

3.1、从自注意力到焦点调制

给定一个视觉特征图 X ∈ R H × W × C \mathbf{X} \in \mathbb{R}^{H \times W \times C} XRH×W×C 作为输入,一个通用的编码过程通过与其周围环境 X \mathbf{X} X(例如,相邻的标记)的交互 T \mathcal{T} T 和对上下文的聚合 M \mathcal{M} M 为每个视觉标记(查询) x i ∈ R C \boldsymbol{x}_{i} \in \mathbb{R}^{C} xiRC 生成一个特征表示 y i ∈ R C \boldsymbol{y}_{i} \in \mathbb{R}^{C} yiRC

自注意力。自注意力模块使用后期聚合过程,可以表述为:

y i = M 1 ( T 1 ( x i , X ) , X ) \boldsymbol{y}_{i} = \mathcal{M}_{1}(\mathcal{T}_{1}(\boldsymbol{x}_{i}, \mathbf{X}), \mathbf{X}) yi=M1(T1(xi,X),X)

其中,在通过交互 T 1 \mathcal{T}_{1} T1 计算查询和目标之间的注意力分数之后,对上下文 X \mathbf{X} X 进行聚合 M 1 \mathcal{M}_{1} M1

焦点调制。相比之下,焦点调制使用早期聚合过程来生成精炼的表示 y i \boldsymbol{y}_{i} yi,可以表述为:

y i = T 2 ( M 2 ( i , X ) , x i ) \boldsymbol{y}_{i} = \mathcal{T}_{2}(\mathcal{M}_{2}(i, \mathbf{X}), \boldsymbol{x}_{i}) yi=T2(M2(i,X),xi)

其中,首先使用 M 2 \mathcal{M}_{2} M2 在每个位置 i i i 对上下文特征进行聚合,然后基于 T 2 \mathcal{T}_{2} T2 查询与聚合的特征进行交互以形成 y i \boldsymbol{y}_{i} yi

比较式(1)和式(2),我们发现(i)焦点调制的上下文聚合 M 2 \mathcal{M}_{2} M2 通过共享操作符(例如深度卷积)分摊了上下文的计算,而自注意力中的 M 1 \mathcal{M}_{1} M1 计算成本更高,因为它需要对不同查询求和不可共享的注意力分数;(ii)交互 T 2 \mathcal{T}_{2} T2 是标记与其上下文之间的轻量级操作符,而 T 1 \mathcal{T}_{1} T1 涉及计算标记到标记的注意力分数,具有二次复杂度。

基于式(2),我们将焦点调制实例化为:

y i = q ( x i ) ⊙ m ( i , X ) \boldsymbol{y}_{i} = q\left(\boldsymbol{x}_{i}\right) \odot m(i, \mathbf{X}) yi=q(xi)m(i,X)

其中, q ( ⋅ ) q(\cdot) q() 是查询投影函数, ⊙ \odot 表示逐元素乘法。 m ( ⋅ ) m(\cdot) m() 是上下文聚合函数,其输出称为调制器。图 4(a) 和 (b) 比较了自注意力和焦点调制。所提出的焦点调制具有以下有利的特性:

  • 平移不变性。由于 q ( ⋅ ) q(\cdot) q() m ( ⋅ ) m(\cdot) m() 总是以查询标记 i i i 为中心,并且不使用位置嵌入,因此调制对输入特征图 X \mathbf{X} X 的平移是不变的。
  • 明确的输入依赖性。调制器是通过 m ( ⋅ ) m(\cdot) m() 聚合目标位置 i i i 周围的局部特征来计算的,因此我们的焦点调制明确地依赖于输入。
  • 空间特异性和通道特异性。目标位置 i i i 作为 m ( ⋅ ) m(\cdot) m() 的指针,可以实现空间特异性调制。逐元素乘法可以实现通道特异性调制。
  • 解耦的特征粒度。 q ( ⋅ ) q(\cdot) q() 保留了单个标记的最精细信息,而 m ( ⋅ ) m(\cdot) m() 提取了更粗糙的上下文。它们通过调制解耦但结合在一起。

接下来,我们将详细描述式(3)中 m ( ⋅ ) m(\cdot) m() 的实现。

3.2、通过 m ( ⋅ ) m(\cdot) m() 的上下文聚合

已经证明,短程和远程上下文对于视觉建模都至关重要 [95, 21, 55]。然而,具有较大感受野的单一聚合不仅会在时间和内存上带来高昂的计算成本,还会破坏对密集预测任务特别有用的局部精细结构。受 [95] 的启发,我们提出了一种多尺度分层上下文聚合。如图 4 © 所示,聚合过程包含两个步骤:分层上下文化,以从局部到全局范围提取不同粒度级别的上下文;门控聚合,将不同粒度级别的所有上下文特征凝聚成调制器。
在这里插入图片描述

步骤 1:分层上下文化。

给定输入特征图 X \mathbf{X} X,我们首先使用线性层将其投影到一个新的特征空间,即 Z 0 = f z ( X ) ∈ R H × W × C \mathbf{Z}^{0} = f_{z}(\mathbf{X}) \in \mathbb{R}^{H \times W \times C} Z0=fz(X)RH×W×C。然后,使用 L L L 个深度卷积堆叠来获得上下文的分层表示。在焦距级别 ℓ ∈ { 1 , … , L } \ell \in \{1, \ldots, L\} {1,,L},输出 Z ℓ \mathbf{Z}^{\ell} Z 是通过以下方式推导的:

Z ℓ = f a ℓ ( Z ℓ − 1 ) ≜ GeLU ⁡ ( DWConv ⁡ ( Z ℓ − 1 ) ) ∈ R H × W × C , \mathbf{Z}^{\ell} = f_{a}^{\ell}\left(\mathbf{Z}^{\ell-1}\right) \triangleq \operatorname{GeLU}\left(\operatorname{DWConv}\left(\mathbf{Z}^{\ell-1}\right)\right) \in \mathbb{R}^{H \times W \times C}, Z=fa(Z1)GeLU(DWConv(Z1))RH×W×C,

其中 f a ℓ f_{a}^{\ell} fa 是第 ℓ \ell 级的上下文化函数,通过卷积核大小为 k ℓ k^{\ell} k 的深度卷积 DWConv 后跟一个 GeLU 激活函数 [31] 来实现。使用深度卷积进行式(4)的分层上下文化是出于其理想特性的考虑。与池化操作 [100, 35] 相比,深度卷积是可学习的且结构感知的。与常规卷积相比,它是通道化的,因此在计算上更为经济。

分层上下文化过程通过 Eq. (4) 生成了 L L L 个级别的特征图。在级别 ℓ \ell 上,有效感受野是 r ℓ = 1 + ∑ i = 1 ℓ ( k i − 1 ) r^{\ell} = 1 + \sum_{i=1}^{\ell} \left(k^{i} - 1\right) r=1+i=1(ki1),这通常远大于卷积核的大小 k ℓ k^{\ell} k。为了捕获整个输入的全局上下文,这可能是一个高分辨率的输入,我们在第 L L L 级别的特征图 Z L \mathbf{Z}^{L} ZL 上应用全局平均池化,得到 Z L + 1 = AvgPool ⁡ ( Z L ) \mathbf{Z}^{L+1} = \operatorname{AvgPool}(\mathbf{Z}^{L}) ZL+1=AvgPool(ZL)。因此,我们总共获得了 ( L + 1 ) (L+1) (L+1) 个特征图 { Z ℓ } ℓ = 1 L + 1 \left\{\mathbf{Z}^{\ell}\right\}_{\ell=1}^{L+1} {Z}=1L+1,它们共同捕获了不同粒度级别的短程和远程上下文。

步骤 2:门控聚合。

在这一步骤中,通过分层上下文化得到的 ( L + 1 ) (L+1) (L+1) 个特征图被凝聚成一个调制器。在图像中,一个视觉标记(查询)与其周围上下文之间的关系通常取决于标记本身的内容。例如,模型可能会依赖于局部精细特征来编码显著视觉对象的查询,但对于背景场景的查询则主要依赖于全局粗粒度特征。基于这种直觉,我们使用一个门控机制来控制从每个查询的不同级别中聚合多少信息。

具体来说,我们使用一个线性层来获取一个空间级别感知的门控权重 G = f g ( X ) ∈ R H × W × ( L + 1 ) \mathbf{G} = f_{g}(\mathbf{X}) \in \mathbb{R}^{H \times W \times (L+1)} G=fg(X)RH×W×(L+1)。然后,通过逐元素乘法执行加权和,得到一个与输入 X \mathbf{X} X 大小相同的单一特征图 Z out \mathbf{Z}^{\text{out}} Zout

Z out = ∑ ℓ = 1 L + 1 G ℓ ⊙ Z ℓ ∈ R H × W × C \mathbf{Z}^{\text{out}} = \sum_{\ell=1}^{L+1} \mathbf{G}^{\ell} \odot \mathbf{Z}^{\ell} \in \mathbb{R}^{H \times W \times C} Zout==1L+1GZRH×W×C

其中, G ℓ ∈ R H × W × 1 \mathbf{G}^{\ell} \in \mathbb{R}^{H \times W \times 1} GRH×W×1 G \mathbf{G} G 中对应于级别 ℓ \ell 的一个切片。在图 5 中可视化这些门控图时,我们惊讶地发现,我们的 FocalNet 确实如我们所期望的那样,学会了自适应地从不同焦距级别收集上下文。我们可以看到,对于一个小对象上的标记,它更多地关注低焦距级别的精细局部结构,而一个位于均匀背景中的标记则需要从更高级别中感知到更大的上下文。到目前为止,所有的聚合都是空间上的。为了实现不同通道之间的通信,我们使用了另一个线性层 h ( ⋅ ) h(\cdot) h() 来获得调制器映射 M = h ( Z out ) ∈ R H × W × C \mathbf{M} = h\left(\mathbf{Z}^{\text{out}}\right) \in \mathbb{R}^{H \times W \times C} M=h(Zout)RH×W×C。在图 6 中,我们可视化了 FocalNet 最后一层中调制器 M \mathbf{M} M 的幅度。有趣的是,调制器自动更加关注那些决定类别的物体,这为我们提供了一种简单的方式来解释 FocalNet。

在这里插入图片描述

焦点调制。根据上述描述的 m ( ⋅ ) m(\cdot) m() 的实现方式,Eq.(3) 中的焦点调制可以在标记级别上重写为:

y i = q ( x i ) ⊙ h ( ∑ ℓ = 1 L + 1 g i ℓ ⋅ z i ℓ ) \boldsymbol{y}_{i} = q\left(\boldsymbol{x}_{i}\right) \odot h\left(\sum_{\ell=1}^{L+1} \boldsymbol{g}_{i}^{\ell} \cdot \boldsymbol{z}_{i}^{\ell}\right) yi=q(xi)h(=1L+1gizi)

其中, g i ℓ \boldsymbol{g}_{i}^{\ell} gi z i ℓ \boldsymbol{z}_{i}^{\ell} zi 分别是 G ℓ \mathbf{G}^{\ell} G Z ℓ \mathbf{Z}^{\ell} Z 在位置 i i i 上的门控值和视觉特征。我们将提出的焦点调制以 PyTorch 风格的伪代码总结在算法 1 中,该算法使用几个深度可分离卷积和线性层实现。

3.3、与其他架构设计的关系

根据公式 Eq. (6),我们建立了我们的焦点调制与其他相关架构设计(除了自注意力机制)之间的联系。深度可分离卷积已被用于增强自注意力(SA)的局部结构建模 [89, 21, 25],或者纯粹地用于实现高效的长距离交互 [33, 28, 55]。我们的焦点调制也采用了深度可分离卷积作为其构建块之一。然而,我们并不是直接将其响应作为输出,而是使用深度可分离卷积来捕获分层上下文,然后将其转换为调制器来调制每个查询。我们将在实验中展示,这三个组件作为一个整体,共同贡献了最终的良好性能。

Squeeze-and-Excitation (SE) 是在视觉转换器出现之前提出的 [35]。它利用全局平均池化来全局地压缩上下文,然后是一个多层感知器(MLP)和一个 Sigmoid 函数,以获取每个通道的激励标量。SE 可以被视为焦点调制的一个特例。在 Eq. (6) 中设置 L = 0 L=0 L=0,焦点调制退化为 q ( x i ) ⊙ h ( f g ( x i ) ⋅ Avg-Pool ( f z ( X ) ) ) q\left(\boldsymbol{x}_{i}\right) \odot h\left(f_{g}\left(\boldsymbol{x}_{i}\right) \cdot \text{Avg-Pool}\left(f_{z}(\mathbf{X})\right)\right) q(xi)h(fg(xi)Avg-Pool(fz(X))),这与 SE 类似。在我们的实验中,我们研究了这种变体,并发现全局上下文对于视觉建模来说是远远不够的。

PoolFormer 是最近提出的模型,因其简洁性而备受关注 [100]。它使用平均池化在滑动窗口中局部提取上下文,然后使用元素级的减法来调整查询标记。它与 SE-Net 有相似的精神,但使用局部上下文而不是全局上下文,并使用减法而不是乘法。将 PoolFormer 和焦点调制放在一起比较,我们可以发现它们都提取局部上下文并启用查询-上下文交互,但方式不同(池化与卷积,减法与调制)。

3.4、复杂度

在焦点调制公式 Eq. (6) 中,主要有三个线性投影 q ( ⋅ ) , h ( ⋅ ) q(\cdot), h(\cdot) q(),h() f z ( ⋅ ) f_{z}(\cdot) fz() 用于 Z 0 \mathbf{Z}^{0} Z0。此外,它还需要一个轻量级的线性函数 f g ( ⋅ ) f_{g}(\cdot) fg() 用于门控和 L L L 个深度可分离卷积 f a { 1 , … , L } f_{a}^{\{1, \ldots, L\}} fa{1,,L} 用于分层上下文化。因此,可学习的参数总数为 3 C 2 + C ( L + 1 ) + C ∑ ℓ ( k ℓ ) 2 3 C^{2} + C(L+1) + C \sum_{\ell} \left(k^{\ell}\right)^{2} 3C2+C(L+1)+C(k)2。由于 L L L ( k ℓ ) 2 \left(k^{\ell}\right)^{2} (k)2 通常远小于 C C C,模型大小主要由第一项决定,我们将在 Sec. 4 中展示。关于时间复杂度,除了线性投影和深度可分离卷积层之外,元素级乘法为每个视觉标记引入了 O ( C ( L + 2 ) ) \mathcal{O}(C(L+2)) O(C(L+2)) 的复杂度。因此,特征图的总复杂度为 O ( H W × ( 3 C 2 + C ( 2 L + 3 ) + C ∑ ℓ ( k ℓ ) 2 ) ) \mathcal{O}\left(H W \times \left(3 C^{2} + C(2L+3) + C \sum_{\ell} \left(k^{\ell}\right)^{2}\right)\right) O(HW×(3C2+C(2L+3)+C(k)2))。相比之下,Swin Transformer 中窗口大小为 w w w 的窗口自注意力复杂度为 O ( H W × ( 3 C 2 + 2 C w 2 ) ) \mathcal{O}\left(H W \times \left(3 C^{2} + 2 C w^{2}\right)\right) O(HW×(3C2+2Cw2)),而 ViTs 中的普通自注意力复杂度为 O ( ( H W ) 2 C + H W × ( 3 C 2 ) ) \mathcal{O}\left((H W)^{2} C + H W \times \left(3 C^{2}\right)\right) O((HW)2C+HW×(3C2))

3.5、网络架构

我们采用了与 Swin [54] 和 Focal Transformers [95] 相同的阶段布局和隐藏维度,但将自注意力模块替换为焦点调制模块。因此,我们构建了一系列焦点调制网络(FocalNet)变体。在 FocalNets 中,我们只需要指定焦点层级数量( L L L)和每个层级的卷积核大小( k ℓ k^{\ell} k)。为了简化,我们从较低的焦点层级到较高的焦点层级逐渐增加卷积核大小,即 k ℓ = k ℓ − 1 + 2 k^{\ell} = k^{\ell-1} + 2 k=k1+2。为了匹配 Swin 和 Focal Transformers 的复杂度,我们针对四种布局设计了小感受野(SRF)和大感受野(LRF)版本,分别使用 2 和 3 个焦点层级。我们在网络开头使用非重叠卷积层进行块嵌入(核大小 = 4 × 4 = 4 \times 4 =4×4,步长 = 4 = 4 =4),并在两个阶段之间使用另一个非重叠卷积层(核大小 = 2 × 2 = 2 \times 2 =2×2,步长 = 2 = 2 =2)。

4、实验

4.1、图像分类

我们在ImageNet-1K分类任务[19]上比较了不同的方法。遵循[75, 54, 95]中的配方,我们使用ImageNet-1K训练集训练FocalNet-T、FocalNet-S和FocalNet-B,并在验证集上报告Top-1准确率(%)。训练细节见附录。

为了验证FocalNet的有效性,我们将其与基于ConvNets、Transformers和MLPs的三组方法进行比较。结果如表1所示。我们看到,FocalNets优于传统的CNNs(例如,ResNet[30]及其增强版[88])、MLP架构(如MLP-Mixer[73]和gMLP[50])以及Transformer架构(如DeiT[75]和PVT[82])。特别是,我们将FocalNets与Swin和Focal Transformers进行了比较,它们使用相同的架构来验证FocalNet在底层部分的独立有效性。我们发现,具有小感受野(SRF)的FocalNets在模型大小、FLOPs和吞吐量相似的情况下,性能始终优于Swin Transformer。例如,微型FocalNet比Swin-Tiny提高了0.9%的Top-1准确率。与Focal Transformers(FocalAtt)相比,虽然我们改用大感受野(LRF),但它仍然远小于FocalAtt中使用的感受野。焦点调制在所有模型大小上均优于强大且设计精良的焦点注意力。更重要的是,它通过去除许多耗时的操作(如滚动和展开)大大提高了运行速度。

模型增强。我们研究了是否一些常用于视觉Transformer的技术也可以提升我们的FocalNets。首先,我们探讨了使用重叠的补丁嵌入(patch embedding)进行下采样的效果[25]。根据[89],我们在开始时将补丁嵌入的核大小和步长从(4,4)更改为(7,4),并在后续阶段将(2,2)更改为(3,2)。比较结果如表2所示。重叠的补丁嵌入提高了所有尺寸模型的性能,但稍微增加了计算复杂性和时间成本。

其次,我们按照[21,119]的做法,将FocalNets设计得更深但更窄。在表3中,我们将FocalNet-T的深度布局从2-2-6-2更改为3-3-16-3,将FocalNet-S/B从2-2-18-2更改为4-4-28-4。同时,第一阶段的隐藏维度分别从96、128减少到64、96。这些改变导致模型更小、FLOPs更少,但由于顺序块的数量增加,时间成本会更高。结果表明,增加深度显著提升了FocalNets的性能。这些结果证明了为视觉Transformer开发的常用模型增强技术可以很容易地用于提升FocalNets的性能。
在这里插入图片描述

ImageNet-22K预训练。我们研究了在ImageNet-22K上进行预训练的FocalNets的有效性。ImageNet-22K包含14.2M张图像和21K个类别。训练细节见附录。我们在表4中报告了结果。虽然FocalNet-B/L都是在224×224分辨率下进行预训练,并直接在目标域中转移到384×384的图像大小,但我们可以看到它们始终优于Swin Transformer。

4.2、语言-图像对比学习

我们还研究了FocalNet在最近流行的语言-图像对比学习范式中的应用。更具体地说,我们的实验设置遵循了野外图像分类(ICinW)挑战中的学术赛道。在这个赛道中,我们使用ImageNet-21K(去除了ImageNet-1K的图像)、GCC3M+12M和YFCC15M进行预训练,并评估了20个下游数据集和ImageNet-1K的零样本性能[42]。这一设置最初是在UniCL[96]中提出的。我们使用UniCL目标进行模型预训练,并将视觉骨干网络指定为FocalNet-B和Swin-B进行比较。结果如表5所示。在ICinW的20个数据集上,FocalNet-B平均比Swin-B高出0.8个点的增益,在ImageNet-1K上高出2.0个点的增益。

4.3、目标检测与分割

目标检测与实例分割。我们在COCO 2017数据集[49]上进行目标检测的比较。我们选择Mask R-CNN[29]作为检测方法,并使用在ImageNet-1K上预训练的FocalNet-T/S/B作为骨干网络。所有模型都在118k训练图像上进行训练,并在5k验证图像上进行评估。我们采用两种标准的训练方案:12个周期的1×方案和36个周期的3×方案。按照[54],我们使用相同的多尺度训练策略,随机将图像的较短边缩放到 [ 480 , 800 ] [480, 800] [480,800]。与[95]类似,为了适应更高的输入分辨率,我们在所有焦点级别上通过增加6个核大小 k ℓ k^{\ell} k来进行上下文聚合。与[95]中上采样相对位置偏差不同,FocalNets使用简单的零填充来处理额外的核参数。这种扩展引入的开销可以忽略不计,但有助于提取更长的范围上下文。在训练时,我们使用AdamW[57]作为优化器,初始学习率为 1 0 − 4 10^{-4} 104,权重衰减为0.05。所有模型的批处理大小设置为16。对于FocalNet-T/S/B,我们在1×训练方案中分别设置随机丢弃率为0.1、0.2、0.3,在3×训练方案中分别设置为0.3、0.5、0.5。
在这里插入图片描述

结果如表6所示。我们测量了box和mask的mAP,并报告了小范围和大范围接收域模型的结果。与Swin Transformer相比,FocalNets在1×训练方案中,对于tiny、small和base模型,box mAP( A P b \mathrm{AP}^{b} APb)分别提高了2.2、1.5和1.9。在3×训练方案中,改进仍然是一致且显著的。值得注意的是,FocalNet-T/B在1×训练方案下的性能(45.9/48.8)与经过3×训练方案的Swin-T/B(46.0/48.5)相当。与FocalAtt[95]相比,具有大范围接收域的FocalNets在所有设置下均表现出色,并且计算成本更低。对于实例分割,我们观察到FocalNets的趋势与目标检测相似。为了进一步验证FocalNets的通用性,我们使用FocalNet-T作为骨干网络,训练了三个检测模型:Cascade Mask R-CNN[1]、Sparse R-CNN[66]和ATSS[109]。我们使用3×训练方案对所有模型进行训练,并在表7中报告了box mAP。可以看出,与之前的SoTA方法相比,FocalNets为这三种检测方法都带来了明显的提升。

语义分割。我们在语义分割任务上评估FocalNets的性能,这是一个需要精细理解和长距离交互的密集预测任务。我们使用ADE20K[118]数据集进行实验,并遵循[54]使用UperNet[90]作为分割方法。我们使用在ImageNet-1K上预训练的FocalNet-T/S/B作为骨干网络,对UperNet进行160k次迭代训练,输入分辨率为 512 × 512 512 \times 512 512×512,批处理大小为16。为了进行比较,我们报告了单尺度和多尺度(MS)的mIoU。表8显示了使用不同骨干网络的结果。在所有设置下,FocalNet显著优于Swin和Focal Transformer。即使是基础模型,FocalNet(SRF)在单尺度和多尺度上分别比Swin Transformer高出2.1和1.4。与Focal Transformer相比,FocalNets表现出更大的优势,并且计算成本更低。这些结果证明了FocalNets在像素级密集预测任务上的优越性,除了实例级目标检测任务外。

扩大FocalNets的规模。鉴于上述FocalNets在目标检测和分割任务上表现出的优越性能,我们进一步研究了在扩大规模时的有效性。特别是,为了与在ImageNet-22K上以 384 × 384 384 \times 384 384×384分辨率预训练的Swin-L进行公平比较,我们也使用3个焦点级别和核大小[3, 5, 7]在ImageNet-22K上以 384 × 384 384 \times 384 384×384分辨率对FocalNet-L进行预训练。我们使用Mask2former[12]在ADE20K上进行语义分割,在COCO上进行全景分割。如表9所示,FocalNet-L在模型大小相似且使用相同预训练数据的情况下,性能优于Swin-L。我们注意到,以灰色字体显示的方法(如Swinv2-G和ViT-Adapter-L)取得了更好的性能,但使用了更多的参数和训练数据。在表10中,我们比较了不同模型在具有133个类别的COCO数据集上的全景分割性能。我们的FocalNet-L在PQ上略优于Swin-L。这些结果清楚地证明了在扩大到大模型规模时,我们的FocalNets在各种分割任务上的有效性。
在这里插入图片描述

最后,我们研究了在大规模目标检测中FocalNets的有效性。目前,许多方法已经扩展到数十亿模型参数[52, 84]。为了迎头赶上,我们在ImageNet-22K上预训练了一个具有约7亿参数的巨大FocalNet,使用与我们大模型相同的方案进行90个周期的训练。在预训练的FocalNet-H基础上,我们使用公开的目标检测方法DINO[106]。按照之前的工作,我们在Object365[62]上预训练检测模型,并在COCO训练集上进行微调。我们在表11中报告了结果。我们的模型击败了如SwinV2-G[52]、BEIT-3[106]等SoTA方法,同时消耗的参数和骨干网络预训练数据更少。它还优于使用新特征蒸馏技术[87]调整的SwinV2-G,并在COCO排行榜上建立了新的SoTA。我们相信,在配备相同技术并在更多数据上进行预训练后,我们的FocalNet可以进一步得到提升。

4.4、网络检验

模型变体。我们在表12中比较了从FocalNet衍生出的六个不同模型变体。

  • 深度卷积网络。它将顶层 L L L的特征向量输入到一个两层的多层感知机(MLP)。得到的模型接近于DW-Net[28]。尽管它可以达到81.6%的准确率,超过了Swin(81.3%),但它的性能比FocalNet低0.7%。FocalNet虽然使用深度卷积作为组件,但其目的是聚合上下文信息,并用于调制每个单独的标记。
  • 池化聚合器。它将深度卷积模块替换为平均池化,在标记聚合方面与MetaFormer[100]相似。平均池化具有稍低的复杂度,但导致准确率显著下降1.8%。与深度卷积相比,池化是置换不变的,因此无法捕获视觉结构。
  • 全局池化聚合器。它移除了所有级别的局部聚合,只保留全局聚合( Z L + 1 \mathbf{Z}^{L+1} ZL+1)。这个变体类似于SENet[35]。结果表明,仅使用全局上下文进行视觉建模是不够的,导致准确率显著下降6.7%。
  • 多尺度自注意力。给定不同级别的汇总标记,将它们结合起来的直观方法是在它们之间执行自注意力(SA)。我们开发了两种SA方法:在聚合之前和之后分别计算 q q q k k k v v v。与FocalNet相比,这两种方法都导致性能明显下降,并增加了运行时间延迟。
  • 滑动窗口自注意力。最后,我们在窗口内的每个视觉标记上应用滑动窗口SA。由于它涉及每个细粒度标记的密集交互,时间和内存成本激增,并且性能比FocalNet差。

组件分析。这里我们进行FocalNet的消融实验,以研究每个组件的相对贡献。实验结果如表13所示,其中我们探讨了以下模型架构变化对模型性能的影响:

  • 将乘法替换为加法:我们将方程(6)中的逐元素乘法改为加法,这将调制器转换为一个偏置项。这导致准确率下降了0.7%,这表明逐元素乘法是比加法更强大的调制方式。
  • 无全局聚合:我们在焦点调制中移除了顶部的全局平均池化。这导致性能下降了0.3%。即使分层聚合已经覆盖了一个相对较大的感受野,全局信息( Z L + 1 \mathbf{Z}^{L+1} ZL+1)对于捕获全局上下文仍然是有用的。
  • 仅顶部聚合:我们不是从所有焦点级别聚合特征图,而只使用顶层的特征图。在这种情况下,较低级别的、更“局部”和“细粒度”的特征被完全丢弃。这种变化导致性能下降了0.4%,这验证了我们的假设,即不同级别和空间范围的特征是相互补充的。
  • 无门控聚合:在聚合多个级别的特征图时,我们移除了门控机制。这导致性能下降了0.4%。正如我们之前讨论的,视觉标记(查询)与其周围环境的依赖关系取决于查询内容。提出的门控机制有助于模型自适应地学习在哪里以及收集多少信息。
    在这里插入图片描述

在表14中,我们研究了改变焦点级别(即深度卷积层的数量 L L L)的影响。在我们之前报告的实验中,结果表明较大的感受野通常能获得更好的性能(大感受野 vs. 小感受野)。这里,我们进一步改变 L L L的值来探究。除了设置 L = 2 L=2 L=2 L = 3 L=3 L=3外,我们还尝试了 L = 0 L=0 L=0 L = 1 L=1 L=1 L = 4 L=4 L=4。相应地,增加 L L L的值会带来轻微的性能提升,并最终达到一个平稳的状态。令人惊讶的是,即使只有单一层级且核大小为3的焦点调制,也能获得不错的性能。当我们将单层级的核大小从3增加到13时,性能会轻微下降0.1%,并且与具有三个层级但相同感受野大小的模型(第二行)相比,存在0.4%的差距。这表明仅增加感受野并不一定能提高性能,同时兼顾细粒度和粗粒度上下文的分层聚合是至关重要的。

4.5、与ViTs和ConvNeXts的比较

ViTs[22]无疑是应用自注意力进行视觉建模的开创性工作。在这里,我们追溯其起源,并研究我们的焦点调制是否可以适应像ViTs这样的整体架构。我们将ViTs中的所有自注意力模块替换为焦点调制,以构建整体式的FocalNet-T/S/B。我们使用16的patch大小和三个焦点级别,核大小分别为3、5和7,这样有效感受野就接近ViT中的全局自注意力。如表16所示,FocalNets在类似的浮点运算和速度下,始终优于ViTs。除了定量比较外,我们还在图7中展示了FocalNet-B/16和ViT-B/16的调制图和注意力图。FocalNets明显表现出比ViTs更强的可解释性。
在这里插入图片描述
在这里插入图片描述

在第2节中,我们简要讨论了一些与我们的工作同时进行的相关研究。其中,ConvNeXts[55]在一些具有挑战性的视觉任务上取得了新的最佳性能。在这里,我们通过总结一系列视觉任务的结果,在表15中定量比较了FocalNets与ConvNeXts的性能。FocalNets在大多数情况下都优于ConvNeXts。我们的FocalNets使用深度卷积来进行上下文建模,与ConvNeXt相似,但还使用调制来将上下文信息注入到每个单独的标记中,这产生了显著的差异。
在这里插入图片描述

5、结论

在本文中,我们提出了焦点调制,这是一种新的通用机制,能够实现依赖于输入的标记交互,用于视觉建模。它包含层次化的上下文化,为每个查询标记从短程到长程收集上下文;基于查询内容自适应地聚合上下文特征到调制器中的门控聚合;以及简单而有效的调制。通过焦点调制,我们构建了一系列简单的无注意力焦点调制网络(FocalNets),用于各种视觉任务。广泛的实验表明,FocalNets在图像分类、目标检测和语义分割等任务上,以相似的时间/内存成本,显著优于目前最先进的自注意力模型(例如,Swin和Focal Transformer)。值得注意的是,我们的FocalNets在COCO目标检测任务上实现了新的最佳性能,同时使用的参数和预训练数据远少于先前的工作。这些令人鼓舞的结果使得焦点调制成为有效且高效的视觉建模中,自注意力机制的一个更优选甚至更好的选择。

未来工作

这项工作的主要目标是开发一种更有效的视觉标记交互方式。尽管这看起来是直接的,但仍需要进行更全面的研究,以验证我们的焦点调制是否可以应用于其他领域,如NLP任务。此外,当处理多模态任务时,自注意力机制可以很容易地通过交替查询和键来转变为交叉注意力。提出的焦点调制需要为单个查询收集上下文。如何执行所谓的交叉调制需要更多关于多模态学习的探索。

致谢

我们要感谢IDEA团队的雷张、张浩、李峰和刘世龙,他们为我们在使用DINO进行目标检测方面提供了有益的讨论和详细的指导。同时,我们也要感谢Aishwarya Kamath分享了Object365v2数据集。此外,我们感谢Lingchen Meng在将DINO中的对比去噪转换为常规去噪方面提供的帮助。感谢各位的支持和协助,使得我们的研究工作得以顺利进行。

YoloV8官方结果

YOLOv8l summary (fused): 268 layers, 43631280 parameters, 0 gradients, 165.0 GFLOPsClass     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 29/29 [all        230       1412      0.922      0.957      0.986      0.737c17        230        131      0.973      0.992      0.995      0.825c5        230         68      0.945          1      0.995      0.836helicopter        230         43       0.96      0.907      0.951      0.607c130        230         85      0.984          1      0.995      0.655f16        230         57      0.955      0.965      0.985      0.669b2        230          2      0.704          1      0.995      0.722other        230         86      0.903      0.942      0.963      0.534b52        230         70       0.96      0.971      0.978      0.831kc10        230         62      0.999      0.984       0.99      0.847command        230         40       0.97          1      0.995      0.811f15        230        123      0.891          1      0.992      0.701kc135        230         91      0.971      0.989      0.986      0.712a10        230         27          1      0.555      0.899      0.456b1        230         20      0.972          1      0.995      0.793aew        230         25      0.945          1       0.99      0.784f22        230         17      0.913          1      0.995      0.725p3        230        105       0.99          1      0.995      0.801p8        230          1      0.637          1      0.995      0.597f35        230         32      0.939      0.938      0.978      0.574f18        230        125      0.985      0.992      0.987      0.817v22        230         41      0.983          1      0.995       0.69su-27        230         31      0.925          1      0.995      0.859il-38        230         27      0.972          1      0.995      0.811tu-134        230          1      0.663          1      0.995      0.895su-33        230          2          1      0.611      0.995      0.796an-70        230          2      0.766          1      0.995       0.73tu-22        230         98      0.984          1      0.995      0.831
Speed: 0.2ms preprocess, 3.8ms inference, 0.0ms loss, 0.8ms postprocess per image

改进方法

从官方的github中获取代码,并做适当的修改,代码如下:

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

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

相关文章

Midjourney订阅攻略/Midjourney的基本参数和命令

AI绘画软件Midjourney使用原理 Midjourney是一个由Midjourney研究实验室开发的先进的人工智能程序,它可以根据用户的文本输入生成精美的图像。Midjourney的主要原理是通过收集大量已有的作品数据,对这些数据进行算法解析,它就可以通过关键词生…

HandyControl PropertyGrid及自定义编辑器

前提条件 项目引入对应HandyControl对应版本包。 使用案例 UI部分 <Window xmlns:hc"https://handyorg.github.io/handycontrol"><hc:TabControl><hc:TabItem Header"默认样式"><hc:PropertyGrid Width"380" SelectedO…

在ubuntu下安装MQTT 服务

ubuntu系统版本22.4.4LTS amd64 在ubuntu系统下打开终端输入命令 ## 安装MQTT 服务 sudo apt-get install mosquitto mosquitto-clients继续执行后系统就完成了安装并默认已启动服务 ## 查看MQTT运行状态 systemctl status mosquitto## 启动服务 systemctl start mosquitto…

HarmonyOS NEXT应用开发之Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照&#xff0c;并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮&#xff0c;拉起原生相机进行拍照。完成拍照后&#xff0c;将图片在HTML的img标签中显示。 实现思路 添加Web组件&#xff0c;设置…

ASP .Net Core 8.0 依赖注入的三种注入模式

&#x1f433;前言 &#x1f340;在.NET中&#xff0c;依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解耦组件之间的依赖关系。 依赖注入的核心思想是将对象的依赖关系&#xff08;即对象所需的其他服务或组件&#…

蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断

按键中断&#xff1a; 将按键配置成GPIO_EXTI中断即外部中断 模式有三种上升沿&#xff0c;下降沿&#xff0c;上升沿和下降沿都会中断 external -> 外部的 interrupt -> 打断 trigger -> 触发 detection -> 探测 NVIC中将中断线ENABLE 找接口函数 在接口函数中写…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题&#xff0c;相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题&#xff0c;导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因&#xff0c;只是看到一些连锁反应带来的结果…… 影响因素…

统计-R(相关系数)与R^2(决定系数)

1.相关系数&#xff08;R&#xff09; 定义&#xff1a;考察两个事物&#xff08;在数据里我们称之为变量&#xff09;之间的相关程度。 假设有两个变量X&#xff0c;Y&#xff0c;那么两个变量间的皮尔逊相关系数可通过以下公式计算&#xff1a; 公式一&#xff1a; 其中…

CCF-CSP认证考试 202305-1 重复局面 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202305-1 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任…

File文件对象

在计算机系统中&#xff0c;文件是非常重要的存储方式。Files&#xff08;java.nio.file.Files&#xff09;提供了多种方法来处理文件系统中的文件。比直接使用File文件要方便。 Files工具类:读取指定文件中的所有文本 package study1;import java.io.IOException; import ja…

项目管理系统私有化部署解决方案!找企智汇软件!

企智汇项目管理软系统是一款支持私有化部署的项目管理系统&#xff0c;适合大型、中型、小型企业的不同需求。企智汇软件是一个专业的项目全周期管理平台&#xff0c;拥有10年的项目管理经验&#xff0c;以项目为中心&#xff0c;通过计划控制进度&#xff0c;预算控制成本&…

HTML5语义化元素

在HTML5之前&#xff0c;网站的分布层级有哪些呢&#xff1f; nav&#xff0c;header&#xff0c;main&#xff0c;footer 这样做有一个弊端 我们往往过多的使用div&#xff0c;通过ID或class来区分元素 对于浏览器来说这些元素不够语义化 对于我来说搜索引擎来说&#xff0c;不…

海康威视相机SDK二次开发(JAVA语言)

目录 前言客户端创建虚拟相机示例代码保存图片程序运行结果修改需求 二次开发引入外部包对SaveImage.java文件进行修改保存图片saveDataToFile方法选择相机chooseCamera方法主方法 FileUtil类处理过期照片启动类与配置文件application.yml通过实体类读取yml启动类 SaveImage.ja…

供应链投毒预警 | 开源供应链投毒202402月报发布啦

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年2月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

快速搭建一个一元二次方程flask应用

新建flask_service目录、templates子目录 flask_service —— app.py —— templates —— —— index.html app.py from flask import Flask, request, jsonify, render_template import random import matplotlib.pyplot as plt from io import BytesIO import base64app F…

jenkins Pipeline接入mysql

背景&#xff1a; jenkin pipeline进化过程如下&#xff1a; Jenkins Pipeline 脚本优化实践&#xff1a;从繁琐到简洁 >>>>> Jenkins Pipeline脚本优化&#xff1a;为Kubernetes应用部署增加状态检测>>>>>> 使用Jenkins和单个模板部署多个K…

BootScrap详细教程

文章目录 前言一、BootScrap入门二、导航三、栅格系统四、container五、面板六、媒体对象七、分页八、图标九、实现动态效果 前言 BootScrap是别人帮我们写好的CSS样式。如果想要使用BootScrap&#xff0c;需要先下载下来&#xff0c;在页面上引入&#xff0c;编写HTML需要按照…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

(学习日记)2024.03.18:UCOSIII第二十节:移植到STM32

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

注册个人小程序

访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人&#xff0c;填写信息 注册完成&#xff0c;即可登录进入填写信息