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增加正弦位置编码之后再切分回原来的视角序列。在这种情况下,不同视角图片的位置编码是连续的。

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

在这里插入图片描述

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

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

相关文章

【C++】虚拟继承 组合

目录 一、虚拟继承 🌟【非虚拟内存分布】 🌟【虚拟继承内存分布】 🌟【虚拟继承读取】 🌟【练习检验】 🌟【继承的总结和反思】 二、组合 🌟【继承和组合】 🌟【前言回顾】 上一篇文章我们…

MATLAB和ROS联合仿真参考资料

参考文章: MATLAB和ROS联合仿真篇(从MATLAB获取ROS信息)链接

每日一题|djwcb【算法赛】|字符串快速幂

每日一题|djwcb【算法赛】 djwcb 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 djwcb 注意: 快速幂字符串,看…

手写springboot启动器, 学习SpringBoot的最佳实践

自己手写的SpringBoot启动器, 是一个学习了解SpringBoot启动逻辑和了解springboot原理的不错的实践Demo. 废话不多说,直接上代码: 项目结构 maven多项目结构, myspringboot 自己手写的SpringBoot启动器 service-demo 用来测试SpringBoot启动器的示例项目 项目pom依赖 1.…

python、execl数据分析(数据描述)

一 python 1.各函数 1.1python库的安装与导入 #pip install os#pip install matplotlib#pip install seaborn#pip install scikit-learn#pip install scipy#修 改 工 作 目 录import osos.getcwd () # 查看当前工作环境os.chdir( F :\my course\database ) # 修改工作环境o…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

力扣HOT100 - 283. 移动零

解题思路: 双指针 指针 i 用于寻找不为零的位置 指针 j 用于寻找为零的位置 不为零时,自己与自己交换,i 和 j 同时向下一个位置移动 为零时,nums[ i ]与nums[ j ]交换,使零向后移动 class Solution {public void…

总结虚函数表机制——c++多态底层原理

前言: 前几天学了多态。 然后过去几天一直在测试多态的底层与机制。今天将多态的机制以及它的本质分享给受多态性质困扰的友友们。 本节内容只涉及多态的原理, 也就是那张虚表的规则,有点偏向底层。 本节不谈语法!不谈语法&#x…

发布文章积分自动增加

controller ApiOperation(value "添加文章")PostMapping("/addwengzhang")public String addwengzhang(RequestBody WengDto wengDto) {if (wengDto.getContent() null || wengDto.getTitle() null) {return "参数不可为空";}User user user…

【MySQL】InnoDB引擎

逻辑结构 InnoDB存储引擎逻辑结构如图所示: Tablespace:表空间,一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间,用来存放表记录、索引等数据。 Segment:段,表空间中有多个段&#xff0c…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-乘积尾零

solution 找末尾0的个数&#xff0c;即找有多少对2和5 >问题等价于寻找所给数据中&#xff0c;有多少个2和5的因子&#xff0c;较少出现的因子次数即为0的个数 #include <iostream> using namespace std; int main() {// 请在此输入您的代码printf("31");…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述&#xff1a; m块砖&#xff0c;n人搬&#xff0c;男搬4&#xff0c;女搬3&#xff0c;两个小孩抬一砖&#xff0c;要求一次全搬完&#xff0c;问男、 女、小孩各若干&#xff1f; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.S…

二手车交易网站|基于JSP技术+ Mysql+Java+ B/S结构的二手车交易网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…

OC高级编程 第3章:Grand Central Dispatch

3.1 Grand Central Dispatch (GCD)概要 3.1.1什么是GCD Grand Central Dispatch&#xff08;GCD&#xff09;是异步执行任务的技术之一。一般将应用中记述线程管理用的代码在系统级中实现。开发者只要定义想执行的任务并追加到Dispatch Queue中&#xff0c;GCD就能生成必要的…

如何使用Docker安装Paperless-ngx系统并实现远程在线搜索查阅文档

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使用。它内置…

登录注册界面

T1、编程设计理工超市功能菜单并完成注册和登录功能的实现。 显示完菜单后&#xff0c;提示用户输入菜单项序号。当用户输入<注册>和<登录>菜单序号时模拟完成注册和登录功能&#xff0c;最后提示注册/登录成功并显示注册信息/欢迎XXX登录。当用户输入其他菜…

Open CASCADE学习|将圆转换为NURBS曲线

NURBS曲线&#xff0c;全称非均匀有理B样条曲线&#xff08;Non-Uniform Rational B-Splines&#xff09;&#xff0c;是计算机图形学中用于表示几何形状的数学表示方法。它结合了非均匀B样条&#xff08;B-Splines&#xff09;和有理基函数&#xff08;Rational Basis Functio…

R语言迅速计算多基因评分(PRS)

Polygenic Risk Scores in R 最朴素的理解PRS&#xff1a; GWAS分析结果中&#xff0c;有每个SNP的beta值、se值、P值&#xff0c;因为GWAS分析中将SNP变为0-1-2编码&#xff0c;所以这些显著的SNP的beta值&#xff0c;就可以用于预测。 比如&#xff1a;GWAS分析中&#xf…