VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录

  • VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准
    • 总结
    • 摘要
    • 介绍
    • 相关工作
      • 单视角指静脉识别
      • 多视角指静脉识别
      • Transformer
    • 数据库
      • 基本信息
    • 方法
      • 总体结构
      • 静脉掩膜生成
      • VPC编码器
        • 视角内相关性的提取
        • 视角间相关关系提取
        • 输出融合
        • IFFN
        • 近邻感知模块(NPM)
      • patch嵌入和输出层
        • patch嵌入
        • 输出层
    • 实验
      • 实验设置
        • 单视角识别
        • 多视角识别
        • 闭集协议
        • 开集协议
        • 跨视角识别
      • 进一步实验和讨论
        • 多视角识别视角数的影响
        • 消融实验
        • 全局token的讨论
        • 位置编码的讨论

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

论文:
VPCFormer: A transformer-based multi-view finger vein recognition model and a new benchmark

总结

摘要

现有的血管模式映射实际上把一个3D网络拓扑映射到一个2D平面,不可避免地导致3D特征损失和2D图像的拓扑模糊性。除此之外,基于单视角的方法在实践中对于手指旋转和平移十分敏感。为了解决这些问题,我们首先建立了一个基准通过建立多视角指静脉数据库,名为清华多视角指静脉3视角(THUMVFV-3V)数据库,收集了两期的数据。THUMVFV-3V提供了三种ROI包括统一的处理过程。进一步,我们提出了一种新的基于Transformer的模型血管模式受限编码器(VPC编码器)和近邻视角模块(NPMs)。特别地,VPC编码器结合一个新颖的静脉模式注意力模块(VPAM)和一个集成的前向网络(IFFN)。受跨视角血管有很强相关性的事实启发,我们设计了VPAM。在静脉掩膜的辅助下,VPAM经过精心设计,专门提取静脉图案之间的视图内和视图间相关性。更进一步,我们提出了IFFN来有效聚合VPAM中先前的注意力和内容信息。除此之外,NPM提出来捕捉单视角内的相关信息,增强最后多视角指静脉的表达。丰富实验表明我们的VPCFormer的相似性。

介绍

近年来,指静脉识别领域取得了巨大的进展。这些算法主要使用单视角图片进行识别,被持续的挑战困扰,例如,所拍摄的图像往往无法覆盖手指静脉的广阔区域,造成有限的身份信息。重要的是,因为真实指静脉在手指中像一个3D网络结构,当血管以单视角捕捉会丢失掉3D信息。进一步,单视角采集的指静脉图片内容受手指的旋转和平移影响大,因此导致表现差。多视角指静脉识别为什么能够解决上述问题的原因总结如下:(1)对于多视角指静脉图片,相邻视角间的视觉相关性大大提高了窃取静脉图案的难度,并减少了利用印刷静脉图案进行攻击的可能性(2)多视角图像相比单视角图像包含了更丰富的内容,例如位置变化,多角度可以互为参考,因此弥补单视角下的静脉信息限制(3)多视角图片可以在3D空间封装指静脉的结构信息。算法可以潜在地从这些多视图输入推断手指静脉的空间特征,从而增强特征的可辨别性和鲁棒性

我们在这个工作的贡献总结如下:

  • 我们提出里THUMVFV-3V数据库,一个多视角指静脉数据库。
  • 一个基于Transformer的网络
  • 相比于多种方法,VPCFormer在多视角指静脉识别上取得了最好的表现。

相关工作

单视角指静脉识别

huang13受ViT成功的启发提出里指静脉Transformer(FVT),使用一个金字塔结构来进行多层次的特征提取。

多视角指静脉识别

yang15应用多视角指纹表面和血管图片来生成点云用来识别,进一步,它们结合注意力机制到MVCNN来有效处理多视角输入。最近,19FV-LT应用了预训练的Transformer并堆叠三个块,结合一个局部信息矩阵,来提取多视角指静脉特征。

与上面提到的方法不同,我们的VPCFormer在静脉模式限制下提取了视角间和视角内的相关关系,捕捉了近邻内背景和血管间的相互关系。这个设计增强了模型提取多角度指静脉特征的效率。

Transformer

受到ViT和它的变种的启发,我们提出了VPCFormer,一个基于Transformer结构的模型,用来探索视角间和视角内的血管模式相关性。

数据库

基本信息

为了收集足够的样本,我们邀请了180名志愿者参与我们的数据获取过程。完整的收集过程分为最小间隔30天,最大间隔106天,平均45.8天的两个阶段。除此之外,171个对象参与全程,而另外9名缺席了第二次采集。所有对象提供双手的中指和无名指成像,每根手指6个样本,每个样本由三张不同角度的图片构成,总共18张图片。

排除掉过曝和不合适的,我们的THUMVFV-3V包含660类,总数23670张指静脉图片,并且数据集是性别均衡的。

在这里插入图片描述

预处理操作有四个步骤(1)手指边缘的粗检测(2)手指边界的细化(3)角度对齐(4)ROI生成,在图二我们给了一个预处理步骤的简要介绍。

在我们的THUMVFV-3V中,提供了三种ROI

  • ROI1:包含所有内容只做角度矫正。
  • ROI2:只包含手指区域,所有非手指区域被手指掩膜掩盖掉
  • ROI3:基于ROI2,手指区域沿着列方向对手指区域进行线性插值以扩展静脉区域,覆盖整个图像。最后resize到100 x 200

在这里插入图片描述

方法

总体结构

在这里插入图片描述

手指静脉图像中的背景变化受到沿着近红外光路的皮下组织厚度和脂肪含量变化的影响,多个视图的参与在不同视图背景之间的相关性中引入了复杂性和不可预测性。另一方面,相邻视角的血管模式,位于相同的空间区域,应该从视角中提取到强烈的相关性,尽管两个视角图片间存在视觉差别。因此,更应该考虑不同视角间的静脉模式相关性和不是那些背景间的。

在指静脉图像中,静脉和周围的背景联合影响成像结果,因此,不仅仅考虑不同视角模式间关系是至关重要的,也要考虑血管和背景间的局部相关性。

基于这些观察结果,我们提出里一个基于Transformer的模型,称为VPCFormer来进行多视角指静脉特征提取。VPCFormer主要由一些VPC编码器和NPM堆叠而成。具体来说,一个VPC编码器由一个VOAM和一个IFFN构成。通过引入血管掩膜,VPAM旨在增强血管信息间的交互通过视角间和视角内的注意力。IFFN用来有效聚合前面的注意力和内容信息。更进一步,NPM设计用来捕捉一个局部区域内的像素相关性。

给定一个多视角手指图片输入 { I i } i = 1 U \{I^{i}\}^U_{i=1} {Ii}i=1U U U U表示视角的数目。每个视角 I i I^i Ii被变换到数据token序列 X 0 i ∈ R H W p 2 × d X_0^i \in{\mathbb{R}^{\frac{HW}{p^2}\times d}} X0iRp2HW×d通过patch嵌入层,这里 p p p表示patch大小, H , W H,W H,W表示高宽, d d d表示token维度。对于第 l l l个VPC编码器,其第 i i i个视角的输出表达为 X l i X_l^i Xli。最后,VPCFormer提取了多视角指静脉特征 f f f来进行识别。

静脉掩膜生成

为了限制自注意力模块的注意力到静脉模式,有必要获取相应的静脉掩膜。

起初,我们需要获取血管模板来表示血管像素的位置。迄今为止,没有包含血管分割ground-truth的指静脉数据集存在。手工分割和标注不仅是费时费力,而且会对算法泛化性造成不好的影响。从先前的工作10获得灵感,可以使用一些现存算法的输出作为血管模板,缓和单方法的影响。采用四种可信赖的方法,LMC,Kumar,EMC和EIFNet,后者是唯一一个在THU-FVS上训练的。在融合步骤,采用一个多数投票机制:当一个像素被三个或更多的算法认证为血管点,那么就会被标注为血管,否则,标注为背景点。对于融合模板,血管点为1,背景点为0。

在这里插入图片描述

之后,由 H W p 2 \frac{HW}{p^2} p2HW元素组成指静脉掩膜。特别是,一个 p × p p\times p p×p的所有值被设为1方形掩膜应用。使用步长 p p p和血管模板进行卷积。卷积结果称为 M ^ \hat{M} M^,上面提到的操作表达为:
M ^ ( i , j ) = ∑ m = 0 p − 1 ∑ n = 0 p − 1 T ( p ⋅ i + m , p ⋅ j + n ) \hat{M}(i,j) = \sum_{m=0}^{p-1}\sum_{n=0}^{p-1}T(p\cdot i+m,p\cdot j+n) M^(i,j)=m=0p1n=0p1T(pi+m,pj+n)
T ( i , j ) T(i,j) T(i,j)表示位置 ( i , j ) (i,j) (i,j)的值。因此,静脉掩膜 M M M可以被计算为
M ( i , j ) = { 1 if  M ^ ( i , j ) ≥ ζ , 0 otherwise , \mathbf{M}(i,j)=\begin{cases}1&\text{if}\ \hat{\mathbf{M}}(i,j)\geq\zeta,\\0&\text{otherwise},\end{cases} M(i,j)={10if M^(i,j)ζ,otherwise,
ζ \zeta ζ是预先设定的阈值避免小数目血管像素造成的错误。

在这里插入图片描述

VPC编码器

虽然应用自注意力模块可以捕捉全局信息和长距离依赖,但是,直接应用这些模块到多视角输入,允许模型自动学习所有可能的长距离依赖是不合适的,因为受限于有限的训练样本和不同视角间背景的弱相关性,我们设计了基于多头自注意力的VPAM,来提取视角间和内的血管模式的相关关系。VPAM的整体结构如上图所示。

视角内相关性的提取

对于第 i i i个视角的数据token X i X^i Xi,相应的查询 Q i Q^i Qi,键值 K i K^i Ki和值 V i V^i Vi计算如下:
Q i = X i W q , K i = X i W k V i = X i W v \begin{aligned} Q^i &= X^iW_q,\\ K^i &=X^iW_k \\ V^i &= X^iW_v \end{aligned} QiKiVi=XiWq,=XiWk=XiWv
W q , W k W_q,W_k Wq,Wk W v W_v Wv d × d h e a d d\times d_{head} d×dhead维的可学习权重矩阵。基于这三个向量,第 i i i个视角的注意力分数矩阵 S i i S_{ii} Sii可以计算为 S i i = Q i ⋅ K i ⊤ S_{ii} = Q^{i}\cdot K^{i^{\top}} Sii=QiKi。为了限制模型注意力到血管模式,我们使用上乘的掩膜 M i M^i Mi来设置 S i i S_{ii} Sii的相关分数,将和背景token相关的相关分数设定为负无穷,即
S i i ~ = − ε ( 1 − M i ) + S i i \tilde{S_{ii}} = -\varepsilon(1-\mathbf{M}^i)+S_{ii} Sii~=ε(1Mi)+Sii
ε \varepsilon ε表示一个非常大的整数值,在这篇文章中, ε = 2 31 − 1 \varepsilon=2^{31}-1 ε=2311。接下来,我们使用 s o f t m a x softmax softmax S ~ i i \tilde{S}_{ii} S~ii转化为概率分布 P ~ i i \tilde{P}_{ii} P~ii:

P ~ i i = s o f t m a x ( S ~ i i d k ) \tilde{P}_{ii} = softmax(\frac{\tilde{S}_{ii}}{\sqrt{d_k}}) P~ii=softmax(dk S~ii)

d k d_k dk表示 K i K^{i} Ki的维度。在这里 P ~ i i \tilde{P}_{ii} P~ii只保留了在第 i i i个视角内的不同位置和血管模式间的相关信息,而忽略了和背景区域的联系。最终,基于概率分布 P ~ i i \tilde P_{ii} P~ii,视角内自注意力可以计算为

O i n t r a i = A t t e n t i o n ( Q i , K i , V i ) = P ~ i i ⋅ V i O_{intra}^i = Attention(Q^{i}, K^{i},V^{i}) = \tilde{P}_{ii}\cdot V^i Ointrai=Attention(Qi,Ki,Vi)=P~iiVi

视角间相关关系提取

提取视角间相关性的操作和视角内相似。对于来自两个视角的给定数据token X i X^i Xi X j X^j Xj,我们需要将来自视角 i i i的查询 Q i Q^i Qi和来自视角 j j j的键值 K j K^j Kj相乘来计算视角 i i i j j j不同位置的注意力分数。称为 S i j = Q i ⋅ K j ⊤ S_{ij} = Q^i\cdot K^{j^\top} Sij=QiKj。对于 S i j S_{ij} Sij的第 c c c行( S c ∗ S_{c*} Sc),主要表示 X i X^{i} Xi的第 c c c个token和 X j X^{j} Xj中所有token的注意力分数。类似地,我们需要限制视角 j j j的注意力区域。因此,通过使用视角 j j j​的血管掩膜来屏蔽模型对非血管区域的注意力

S i j ~ = − ε ( 1 − M j ) + S i j \tilde{S_{ij}} = -\varepsilon(1-\mathbf{M}^j)+S_{ij} Sij~=ε(1Mj)+Sij

在这里, S ~ c ∗ \tilde{S}_{c*} S~c表示和 X i X^i Xi的第 c c c个token和所有 X j X^j Xj的表示血管的token间的注意力分数。

就像之前着重提到的,视角间注意力的关键目标在于捕捉不同视角间包含血管模式的token的相关关系。显然,如果 X i X^i Xi的第 c c c个token表示背景区域, S ~ c ∗ \tilde{S}_{c*} S~c表示一个 X i X^{i} Xi中的背景token和所有 X j X^j Xj中的token的相关关系,阻止 X i X^i Xi背景token的相应注意力分数至关重要。然而,直接操作 S ~ i j \tilde{S}_{ij} S~ij会导致需要对 s o f t m a x softmax softmax输出做二外的操作,我们直接将 s o f t m a x softmax softmax概率分布的输出直接设置为
P ~ i j = ( M i ⋅ 1 ⊤ ) ⊙ s o f t m a x ( S ~ i j d k j ) \tilde{P}_{ij} = (M^i \cdot 1^\top)\odot softmax(\frac{\tilde{S}_{ij}}{\sqrt{d_{k^{j}}}}) P~ij=(Mi1)softmax(dkj S~ij)
⊙ \odot 是哈达玛积, 1 ∈ R H W p 2 × 1 1\in\mathbb{R}^{\frac{HW}{p^2}\times 1} 1Rp2HW×1表示一个元素全为1的列向量。在这里, P ~ i j \tilde{P}_{ij} P~ij专门保留了视角 i i i j j j血管token之间的联系。最后我们将视角间注意力操作的输出记为

O i n t e r i j = P ~ i j ⋅ V j O^{ij}_{inter} = \tilde{P}_{ij}\cdot{V}^{j} Ointerij=P~ijVj

输出融合

当我们获取了两种注意力输出 O i n t r a i O^{i}_{intra} Ointrai O i n t e r i j O^{ij}_{inter} Ointerij,我们直接将他们相加来获得VPAM最后的输出

O i = O i n t r a i + O i n t e r i j O^{i} = O^{i}_{intra} + O^{ij}_{inter} Oi=Ointrai+Ointerij

在这里插入图片描述

IFFN

在ViT,包裹行注意力信息的token会被送入两层MLP来增强特征学习。尽管如此,我们观察得出传统地前向网络(FFN)在指静脉特征提取任务上存在缺陷,因此造成显著的表现下降。

特别地,为了适应图像数据和更好组合前面的注意力,我们结合1x1卷积核地点卷积,和3x3卷积核地深度卷积。IFFN地具体结构如上图所示。

在IFFN,我们首先在空间上重新排列包含视角间和视角内注意力信息地token O i ′ ∈ R H W p 2 × d O^{i^{'}}\in\mathbb{R}^{\frac{HW}{p^2}\times d} OiRp2HW×d来获取视角特征映射 F i ∈ R d × H p × W p F^i \in{\mathbb{R}^{d\times \frac{H}{p}\times \frac{W}{p}}} FiRd×pH×pW。接下类,一个点卷积用来将通道从 d d d扩展为 4 d 4d 4d。这个技术增强了它在高维空间的表现能力。在这之后,我们应用一个深度卷积,在不显著增加参数数量的情况下增强注意力和内容信息。然后在通过一个点卷积将维度复原回 d d d

近邻感知模块(NPM)

为了补充模型捕捉局部近邻相关性的能力,提出了NPM。卷积操作天然拥有捕捉近邻内图像像素间相关性的能力。通过设置卷积核大小或者调整卷积层数调整这一能力。最后,我们提出了使用两层3x3卷积核的卷积层的NPM用来捕捉5x5近邻内的像素间相关性。为了减少参数量没有直接使用5x5卷积层。对于NPM的输入,来自各个视角的数据token被排列为空间结构映射图像网格,允许我们有效适应卷积操作

patch嵌入和输出层

patch嵌入

为了使用基于Transformer的模型处理,图像首先送入嵌入层,将每个不重叠的patch变成嵌入token嵌入。我们使用Visformer的patch嵌入来实现参数和表现的平衡。

输出层

在经过 L − 1 L-1 L1NPM和 L L LVPC编码器,得到所有视角的数据token, { X L i } i = 1 U \{X_L^i\}^U_{i=1} {XLi}i=1U。下一步是融合 { X L i } i = 1 U \{X_L^i\}^U_{i=1} {XLi}i=1U以全视角指静脉特征 f f f用来识别。特别地,对于第 i i i个视角,对于横跨 X l i X_l^i Xli的每个位置计算平均值来获得视角表达 f i f^{i} fi:

f i = 1 H W p 2 ∑ j = 1 H W p 2 x j i f^i=\frac{1}{\frac{HW}{p^2}}\sum_{j=1}^{\frac{HW}{p^2}}\mathbf{x}_j^i fi=p2HW1j=1p2HWxji

平均操作在保持全局信息的同时有助于减轻噪声的影响。为了将拼接的视角表达 [ f 1 , . . . , f u ] [f^1,...,f^u] [f1,...,fu]映射到目标特征空间,一个线性层被用来学习视角表达间的隐含关系最终获得多视角指静脉特征 f f f来进行识别。这个过程表达为

f = L i n e a r ( C o n c a t ( f 1 , . . . , f U ) ) f=Linear(Concat(f^1,...,f^U)) f=Linear(Concat(f1,...,fU))

在这里插入图片描述

对于提取到的特征,我们使用最近邻分类器,采用余弦相似度作为距离度量进行指静脉识别。

实验

实验设置

所有传统地方法在Matlab中实现,输入ROI顺序经过中值滤波和对比限制自适应直方图均衡。所有subspace方法在Matlab中实现,所有ROI reshape为64 下144没有额外的预处理。包含的深度学习方法通过移除最后的分类层和用circle loss替代softmax loss来裁剪用于特征提取。

单视角识别

在这里插入图片描述

三种基于方向性特征的传统方法视角间的性能损耗低,具有良好的鲁棒性

多视角识别
闭集协议

多视图指静脉识别是指同时使用来自不同视图的多个指静脉图像进行完整的身份验证。

在这里插入图片描述

开集协议

在这个部分,分配80%的类别(528)用于训练,剩下的20%(132)用于评估。更重要的是,评估涉及132个看不见的类,其中包括来自第一期的注册样本和来自第二会话的探测样本。

在这里插入图片描述

跨视角识别

在这里插入图片描述

即使是存在重叠区域的跨视角识别,基于深度学习的方法也可以提供可接受的结果。我们认为通过进一步的数据扩充,基于深度学习的方法可以在跨视角识别上获得持续提升。

进一步实验和讨论

多视角识别视角数的影响

在这里插入图片描述

因此,有必要明智地选择输入视图的数量,以在模型性能和模型复杂性之间取得最佳平衡。

消融实验

在这里插入图片描述

全局token的讨论

在ViT中,输入要在patch嵌入层之后拼接类别token,认为类别token可以起到全局表达的作用。只有类token用于特征提取或分类。而一些研究反对使用类别token,而建议在数据token上使用平均池化来获取全局特征。对于具体的基于多视角输入的研究,提出了视角token的概念。简单地说,视角标记只是从特定视图中提取信息,这可以被视为相应视图的特征。我们设计了以下策略:

  • 只有类token

类token的描述会打乱token序列的空间排列。因此,类别token不会进入NPM和IFFN的深度卷积层,也不会参与VPAM。为了促进类别和数据token之间的交换,我们引入了一个新的多头注意力模块在VPAM之后。MHSA操作只更新类别token而不更改数据token。最后,只有类别token被用于表达输出特征 f f f

  • 只有视角特征

类似的,加入视角token也会打乱数据token的空间排列。由于视角token只和相应视角内的数据token交互,通过增加额外的掩膜使视角token参与在VPAM的视角内自注意力。视角token前向传播方向如图12所示。通过在合适的位置分开视角和数据token,我们可以防止模型中任何数据token流的孙环。最后,所有视角token被直接拼接进入一个线性层。

在这里插入图片描述

  • 两种token

如上所述,视角token构成了每个单独视角的抽象,而类别token表达了一个全局特征。当结合这两种全局token时,我们保留了视角token的刘翔。除此之外,在VPAM后插入一个新的多头注意力,以特别促进所有视角token和类别token。

在这里插入图片描述

效果差可能是因为有限训练数据下提取不同全局信息的挑战。出乎意料地是,两种token的结合导致网络未能收敛,是ERR保持在50%。这个情况可能是因为视角token很难表达每个视角的全局信息。因此,类别token很难从视角token中获取全局信息。

位置编码的讨论

许多研究将Transformer结构和位置编码结合来捕获输入的空间信息。在实验中,我们调查了位置编码在VPCFormer中的作用。

因为输入是由多视角图片组合而成,我们提出两种策略A和B。

在这里插入图片描述

策略A:相同的正弦编码应用在每个视角的输入token,确保不同视角间同一的位置嵌入。

策略B:来自不同视角的token以视角顺序拼接在一起。这些token增加正弦位置编码之后再切分回原来的视角序列。在这种情况下,不同视角图片的位置编码是连续的。

结果显示提升很少,可能是因为卷积的引入使得网络继承了卷积建模局部特征的能力,导致位置编码效果下降。

在这里插入图片描述

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

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

相关文章

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革、多样性、质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上少儿编程网上…

pdf压缩文件怎么压缩最小?一键压缩PDF

pdf文件压缩是为了减小文件大小,以便更轻松地共享、传输和存储文件,通过压缩pdf文件,可以减少文件占用的存储空间,加快文件的上传和下载速度,并节省带宽和存储成本;在本教程中,我们将介绍一些有效的方法来最…

如何自定义一个starter?

在Spring Boot中,创建一个自定义starter可以简化特定功能或组件的配置过程,让其他项目能够轻松地重用这些功能。 一、问题解析 这里我们以自定义一个xxl-job的starter为例,介绍下如何简化配置。 添加依赖 添加Spring Boot的依赖&#xff1a…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据,众所周知,Gmsh可以导出多种网格数据格式,比如大家熟悉的msh、stl、inp、cgns(似乎不完善)等等,但是gmsh不支持nas格式的导出,只支持nas格式的导入&a…

Bug定位与分析,软件测试员你中招了吗?

之所以写这一篇文章,是突然想起来曾经在测试过程中被开发嘲讽过,事情是这样的,当时发现了一个疑似前端的Bug就草草提交到了禅道,结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

睿考网:不是会计专业能考中级会计师吗?

不是会计专业也是可以考中级会计师的,中级会计师报名条件中并没有对专业做明确的限制,不同的学历对工作年限的要求不一样,如果考生满足报考条件就可以参加。 1.具备大学专科学历,从事会计工作满5年。 2.具备大学本科学历或学士学…

大数据Doris(七十):全球电商狂欢节万亿级实时大屏解决方案

文章目录 全球电商狂欢节万亿级实时大屏解决方案 一、背景介绍 <

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…

算法学习 | day25/60 递增子序列/全排列/全排列II

一、题目打卡 1.1 递增子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> path;vector<vector<int>> res;int tmp INT_MIN;void recur(vector<int>& nums, int startInd){if(p…

Java项目:74 ssm基于Java的超市管理系统+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能包括:商品分类&#xff0c;供货商管理&#xff0c;库存管理&#xff0c;销售统计&#xff0c;用户及角色管理&#xff0c;等等功能。项目采…

数据库性能压测之TPC-C基准测试

原文链接&#xff1a;https://blog.csdn.net/TIME_1981/article/details/126114797 本文作为学习笔记记录。 TPC Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched)&#xff1a; 1.1 以need为标准&#xff0c;循环对比need和matched的每一个位置的元素值是否相等 2.获…

NAT---网络地址转换技术

Network Address Translation 1、起源&#xff1a;ip地址不够用 2、作用&#xff1a;让私网地址映射成公网地址&#xff0c;进而访问网络。 3、私网Ip地址的范围&#xff1a; A类&#xff1a;10.0.0.0-10.255.255.255 B类&#xff1a;172.16.0.0-172.31.255.255 C类&…

多线程合并练习题,线程安全(售票任务引入)--学习JavaEE的day30

day30 练习&#xff08;day29&#xff09; 注意代码注释&#xff0c;里面涉及代码实现遇到问题及解决方案&#xff0c;由于理解方便没有单独出来 1.计算任务 1.计算任务&#xff0c;一个包含了2万个整数的数组&#xff0c;分拆了多个线程来进行并行计算&#xff0c;最后汇总出…

Open CASCADE 用户指南:可视化

文章目录 介绍基本概念呈现(Presentation)Presentation 的结构Presentation 包(package)基本示例&#xff1a;如何显示 3D 对象 选择(Selection)术语和概念算法包和类(Packages and classes)使用示例 应用交互服务&#xff08;AIS&#xff09;介绍交互对象呈现(Presentations)隐…

【C语言】【Leetcode】88. 合并两个有序数组

文章目录 一、题目二、思路再思考 一、题目 链接: link 二、思路 这题属于简单题&#xff0c;比较粗暴的做法就是直接比较两个数组&#xff0c;先把第二个数组加到第一个的后面&#xff0c;如何冒泡排序&#xff0c;这种方法简单粗暴但有效&#xff0c;可是不适用于这题&…

Vue3使用v-if指令进行条件渲染

Vue3使用v-if指令进行条件渲染 条件渲染是根据条件的真假来有条件地渲染元素。在Vue.js 3.x中&#xff0c;常见的条件渲染包括使用v-if指令和v-show指令。本文讲解使用v-if指令进行条件渲染。 2.3.1 v-if/v-else-if/v-else 在Vue中使用v-if、v-else-if和v-else指令实现条件…

数据结构·二叉树(1)

目录 1 树的概念及结构 1.1 树的结构 1.2 树的概念 1.3树的表示 2 二叉树的概念及结构 2.1二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的存储结构 1 树的概念及结构 1.1 树的结构 前面所学到的顺序表链表等&#xff0c;都是线性的数据结构&#xff0c;今天介绍的树&am…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-第几个幸运数字

幸运数字是可以被3,5,7任一整除的数字&#xff0c;列举小明号码内的所有可能组合并计数。注意别忘了把1占的一位减去。 #include<stdio.h> typedef long long ll; int main(){long long ans 0, n 59084709587505LL;for(ll i 1; i < n; i * 3){//计算小于等于n的数…