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}} X0i∈Rp2HW×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=0∑p−1n=0∑p−1T(p⋅i+m,p⋅j+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=Qi⋅Ki⊤。为了限制模型注意力到血管模式,我们使用上乘的掩膜 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~=−ε(1−Mi)+Sii
ε \varepsilon ε表示一个非常大的整数值,在这篇文章中, ε = 2 31 − 1 \varepsilon=2^{31}-1 ε=231−1。接下来,我们使用 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(dkS~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~ii⋅Vi、
视角间相关关系提取
提取视角间相关性的操作和视角内相似。对于来自两个视角的给定数据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=Qi⋅Kj⊤。对于 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~=−ε(1−Mj)+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=(Mi⋅1⊤)⊙softmax(dkjS~ij)
⊙ \odot ⊙是哈达玛积, 1 ∈ R H W p 2 × 1 1\in\mathbb{R}^{\frac{HW}{p^2}\times 1} 1∈Rp2HW×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~ij⋅Vj
输出融合
当我们获取了两种注意力输出 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} Oi′∈Rp2HW×d来获取视角特征映射 F i ∈ R d × H p × W p F^i \in{\mathbb{R}^{d\times \frac{H}{p}\times \frac{W}{p}}} Fi∈Rd×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 L−1NPM和 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=p2HW1∑j=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增加正弦位置编码之后再切分回原来的视角序列。在这种情况下,不同视角图片的位置编码是连续的。
结果显示提升很少,可能是因为卷积的引入使得网络继承了卷积建模局部特征的能力,导致位置编码效果下降。
相关文章:

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准
文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…...
Android 图形渲染和显示系统关系
SurfaceFlinger:作为 Android 系统中的一个系统服务,SurfaceFlinger 负责管理整个屏幕的渲染和合成工作。它管理和合成多个 Surface,并与硬件加速器以及 Hardware Composer (HWC) 进行交互,最终将图像数据发送给显示硬件进行显示。…...
3.C++:类与对象(下)
一、再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;i…...

iOS开发之SwiftUI
iOS开发之SwiftUI 在iOS开发中SwiftUI与Objective-C和Swift不同,它采用了声明式语法,相对而言SwiftUI声明式语法简化了界面开发过程,减少了代码量。 由于SwiftUI是Apple推出的界面开发框架,从iOS13开始引入,Apple使用…...

2024-简单点-pandas
pandas pandas to numpy 尽量不用.values提取数据 numexpr 和 bottleneck加速 布尔操作 describe 自定义describe .pipe df.apply 行或者列级别函数级别应用...

面试笔记——Redis(双写一致、持久化)
双写一致 双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。 相关问题:使用Redis作为缓存,mysql的数据如何与Redis进行同步?——双写一致性问题 回答时࿰…...

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞
漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…...

css的active事件在手机端不生效的解决方法
需求:需求就是实现点击图中的 “抽奖” 按钮,实现一个按钮Q弹的放大缩小动画 上面是实现的效果,pc端,点击触发 :active 问题:但是这种方式在模拟器上可以,真机H5一调试就没生效了,下面是简单…...

00. 认识 Java 语言与安装教程
认识 Java Java 在 20 多年发展过程中,与时俱进,为了适应时代的需要,经历过两次重大的版本升级,一个是 Java 5,它提供了泛型等重要的功能。另一个是提供了 Lambda 表达式等重要的功能的 Java 8。 一些重要的 Java 的…...
数据结构-栈-004
1链栈 1.1栈结点结构体定义 /*定义一个数据结构*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个栈结点*/ typedef struct stack_node {DATA_TYPE data;//数据域struct stack_node *pnext;//指针域 }STACK_NODE;1.2栈顶结点结构体定义 /*…...
(第76天)XTTS 升级:11GR2 到 19C
参考文档: 11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1)V4 使用跨平台增量备份减少可传输表空间的停机时间 (Doc ID 2940565.1)前言 XTTS(Cross Platform Transportable Tablespaces,跨平台迁移表空间)是…...

修改网站源码,给电子商城的商品添加图片时商品id为0的原因
修改网站源码,给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来,由于PictureControl.class.php是复制CourseControl.class.php而来,于是对比了这两个文件,在CourseControl.class.php找到了不一样的关键几条…...
ffmpeg开发异步AI推理Filter
ffmpeg开发异步AI推理Filter 1.环境搭建、推理服务及客户端SDK2.编译原版ffmpeg3.测试原版ffmpeg的filter功能4.准备异步推理filter5.修改点6.重新编译ffmpeg7.测试异步推理filter本文旨在阐述如何开发一个FFmpeg Filter,该模块利用gRPC异步通信机制调用远程视频处理服务。这一…...
python与excel第七节 拆分工作簿
一个工作簿中多个工作表拆分为多个工作簿 假设一个excle工作簿中有多个工作表,现在需要将每个工作表拆分为单独的工作簿。 例子: import xlwings as xw# 设置生成文件的路径path D:\\TEST\\dataIn# 源文件的路径workbook_name D:\\TEST\\dataIn\\产…...

JS08-DOM节点完整版
DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…...

【python】python3基础
文章目录 一、安装pycharm 二、输入输出输出 print()文件输出:格式化输出: 输入input注释 三、编码规范四、变量保留字变量 五、数据类型数字类型整数浮点数复数 字符串类型布尔类型序列结构序列属性列表list ,有序多维列表列表推导式 元组tu…...

计算机三级网络技术 选择+大题234笔记
上周停去准备计算机三级的考试啦,在考场上看到题目就知道这次稳了!只有一周的时间,背熟笔记,也能稳稳考过计算机三级网络技术!...

智能合约 之 ERC-721
ERC-721(Non-Fungible Token,NFT)标准 ERC-721是以太坊区块链上的一种代币标准,它定义了一种非同质化代币(Non-Fungible Token,NFT)的标准。NFT是一种加密数字资产,每个代币都具有独…...
== 和 equals 的区别是什么?
和 equals() 在 Java 中都是用于比较两个对象,但它们之间存在显著的差异: 比较的内容: :这是 Java 中的基本比较运算符,对于基本数据类型(如 int, char, double 等),它比较的是值&a…...

VUE:内置组件<Teleport>妙用
一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...