Neural Networks for Fingerprint Recognition

 Neural Computation ( IF 3.278 )

摘要:

在采集指纹图像数据库后,设计了一种用于指纹识别的神经网络算法。当给出一对指纹图像时,算法输出两个图像来自同一手指的概率估计值。在一个实验中,神经网络使用几百对图像进行训练,随后使用来自数据库中对应20个人的子集的几千对图像来测试其性能。目前实现的错误率小于0.5%。还简要讨论了其他结果、扩展和可能的应用。

1、介绍

指纹图像的快速、可靠和计算机化分类和匹配是模式识别中的一个显著问题,但到目前为止,还没有得到完整的解决方案。自动指纹识别系统原则上可以有非常广泛的应用,远远超出传统的刑事司法领域,例如,使锁和身份证的使用过时。我们在这里的目的是简要介绍我们在神经网络思想应用于指纹匹配问题上的初步结果。特别地,我们将描述一个神经网络算法的架构、训练和测试,当给出两张指纹图像时,输出两张图像来自同一根手指的概率p。有几个理由怀疑神经网络方法可能非常适合指纹问题。首先,指纹形成了一类非常特殊的图案,具有非常独特的味道和统计特征。因此,相应的模式识别问题似乎有很好的限制和约束,甚至可能比其他模式识别问题,如识别在这些领域中,神经网络已经取得了一定的成功(参见Le Cun et al. 1990)。其次,神经网络可以避免其他更传统的方法所固有的一些陷阱。一个多世纪以来(参见Moenssens 1971年的有趣总结),人类操作员可以根据细节和/或脊向来匹配成对的指纹图像。细部是脊状图中特殊类型的不连续,如分叉、岛状和末端。在完整的指纹图像上,通常有50到150分钟的顺序(图2a)。通常估计10个左右的匹配细节就足以可靠地建立身份。事实上,正是这种基于细节检测和匹配的策略,在以前大多数寻找自动化解决方案的尝试中都采用了这种策略。基于细节的方法有两个明显的弱点:它对噪声很敏感(特别是对于墨水指纹,小的扰动可以产生人为的细节或掩盖现有的细节),并且计算成本很高,因为它本质上是一个图匹配问题。第三,神经网络具有鲁棒性、自适应性和可训练性。这一点尤其重要,因为指纹图像可能包括几种不同的变形和噪声来源,从手指及其在收集设备上的位置(平移、滚动、旋转、压力、皮肤状况)到收集设备本身(墨水/光学)。此外,重要的是要注意速度、计算能力、错误接受和错误拒绝的概率、内存和数据库大小等方面的需求可能会根据所考虑的应用程序而有很大差异。要进入私人住宅或私家车,需要一个小型经济系统,该系统具有少数人的小型可修改数据库,响应时间最多只有几秒钟。另一方面,法医应用程序可能需要使用大型计算机快速搜索包含数百万条记录的大型数据库,并且响应时间可能更长。神经网络可以进行不同的定制和训练,以适应特定应用的特定要求。从技术角度来看,指纹分析领域存在两个不同的问题:分类和匹配。将指纹分类为子类有助于加快大型数据库的搜索速度。值得关注的是,神经网络是否可以用于实现一些传统的分类方案,例如将指纹模式划分为螺旋、拱门和循环(“模式级分类”),或者创建新的分类边界。然而,分类问题将在别处讨论。在这里,我们将专门关注匹配问题。实际上,在任何自动指纹系统的核心,无论是用于识别还是验证,无论是用于大型还是小型数据库环境,都应该有一个结构,当呈现两个指纹图像时,该结构可以决定它们是否来自同一根手指。因此,我们的目标是设计和测试这样一个神经算法。因为神经网络本质上是自适应的,需要从例子中训练,我们接下来描述我们的训练和测试例子的数据库,以及它是如何构建的。然后,我们考虑匹配算法包括两个阶段:预处理阶段和决策阶段。预处理阶段基本上是对齐两幅图像,并从中提取一个中心区域。这两个中心区域被馈送到决策阶段,这是算法的适当神经网络部分,并从示例中进行训练。尽管预处理阶段是相当标准的,但决策阶段是新颖的,并且基于实现概率贝叶斯方法来估计匹配概率p的神经网络。在主要实验中,网络通过梯度下降训练,使用来自5个手指的300对图像的训练集,每个手指5张图像。然后用另外15个手指的4650对图像来验证它的性能,每个手指也有5张图像。经过训练,该网络的总体错误率为0.5%。最后讨论了其他结果和可能的扩展。

2、数据库

尽管世界上有许多指纹数据库,但这些数据库通常不能供公众使用。此外,这是连接主义方法的一个关键问题,大多数数据库每个手指只包含一个图像或模板,而训练神经网络识别指纹图像需要同一记录的几个噪声版本可供训练。因此,要训练和测试神经网络,首先必须构建一个数字化指纹图像数据库。这些图像可以通过多种方式获得,例如通过带有墨水指纹的数字扫描仪或更复杂的全息技术(Igaki et al. 1990)。我们决定用一个简单的原理建造我们自己的收集装置。设备基本上由一个棱镜放置在CCD(电荷耦合装置)前摄像头连接到一个抓帧器板安装在个人电脑(图1)。当一个手指定位棱镜对角线脸上,入射光线从一个广场边的棱镜折射不同取决于他们遇到手指的接触点与棱镜(对应于一个脊)或非接触点。这在折射光束中产生了一种明暗条纹的图案,可以很容易地用镜头在CCD相机上聚焦,然后数字化并存储在计算机中。我们得到的图像大小为512 x 464像素,每像素有8位灰度。在相应的尺度上,脊的厚度相当于6个像素左右。这当然不是一种非常经济的格式,用于存储包含有用的信息少得多。但是,这种格式至少在开发阶段是必要的,特别是为了对预处理进行微调。通过这种方式,我们建立了一个数据库,其中包含了来自30个不同人的200多张指纹图像。为了解决匹配问题,数据库必须包含同一手指在不同时间拍摄的几张不同图像。因此,对于下面的内容,数据库中最重要的部分由100张图像的子集组成。这些是20个不同的人的食指图像,每个食指在不同的时间拍摄了5张不同的图像。在每次采集的时候,我们都没有给这个人任何关于手指在棱镜上的位置的特殊指示,只是“以一种自然的方式”这样做。一般来说,我们故意不去尝试减少现实环境中可能出现的噪音和可变性。例如,每次收集后,我们都没有清洁棱镜表面。事实上,我们确实观察到了来自同一根手指的图像之间的显著差异。这种可变性来自多个来源,主要是在手指水平(定位,压力,皮肤状况)和收集设备(亮度,焦点,棱镜表面状况)。我们已经使用这个数据库进行了几个学习实验,用来自7个人的图像对训练网络并在剩下的配对上测试算法。在这里,我们将主要报告我们最大的一个实验的典型结果,其中,在这个数据库中的rr) = 4950个图像对中,E) = 300个图像对来自5个不同的人,用于通过梯度下降来训练网络。余下的4650对图像用于测试算法的泛化能力。给定两张指纹图像A和B,它们匹配(或不匹配)的命题将用M(A, B)[或M(A, B)]表示。然后,目的是设计一种神经网络算法,当给出一对(a, B)指纹图像时,输出一个数字p = p(M) = p[M(a, B)],介于0和1之间,对应于一个置信度(Cox 1946)或两个指纹匹配的概率。在这里,正如在本文的其余部分一样,除了第一次引入新符号外,我们将倾向于在表示法中省略对(A, B)的显式依赖关系。

3、预处理阶段

任何用于指纹识别的算法都可能从几个标准预处理阶段开始,在这些阶段中,原始图像可能被旋转、平移、缩放、对比度增强、分割、压缩或用一些合适的过滤器进行卷积。在我们的应用程序中,预处理阶段的目的是从两个输入图像中每个提取一个称为中心区域的中心补丁,并对齐两个中心区域。只有两个对齐的中心区域依次被馈送到决策阶段。预处理本身包括几个步骤,首先过滤掉高频噪声,然后补偿图像中存在的平移效应,并分割它们,最后对齐和压缩中心区域。为了便于描述,其中一个输入图像将被称为参考图像,另一个被称为测试图像,尽管两者之间没有本质上的区别。

3.1、低通滤波

为了去除原始图像中似乎存在的大量高频尖峰,我们将每个显著偏离其四个相邻值的像素替换为相应的平均值。

3.2、细分

对于每张图像,我们首先使用边缘检测算法在每个指纹周围绘制一个紧密的矩形框,并确定框的几何中心。然后,将参考图像的中心区域定义为位于前面描述的中心下方的65 x 65中心方形斑块。对于测试图像,我们选择一个相似但更大的尺寸为105 x 105的补丁(在每个方向上将前一个补丁扩展20个像素)。这个较大的补丁被称为窗口。

3.3、校准

我们一个像素一个像素地滑动参考图像的中心区域,穿过测试图像的窗口(上下左右各滑动20个像素),并在每一步计算相应的相关性,直到找到相关性最大的位置。除了训练阶段,这是整个算法中计算成本最高的部分。然后通过选择相关性最大位置对应的中心65 x 65 patch来确定测试图像的中心区域(图2b)。

3.4、压缩与归一化

最后,两个65 x 65的中心区域中的每一个都通过5 x 5的截断高斯函数进行离散卷积,简化为32 x 32的数组。这个32 x 32压缩的中心区域包含一个低分辨率的图像,大致相当于原始图像中的10个脊线。得到的像素值在0到1之间被方便地归一化。在我们的实现中,所有的参数,特别是各种矩形框的大小都是可调的。这里给出的值是在以下模拟中使用的值,从经验上看,似乎产生了良好的结果。为了避免边界效果,通常在各种矩形框周围添加2像素宽的框架,这就解释了一些奇怪的大小。在这个阶段,人们也很自然地想知道,关于两个输入的匹配的决定是否已经仅仅基于在对齐步骤(3.3)中通过阈值确定的最大相关性的值。这是一个关键的经验观察,这种最大的相关性,部分由于噪声效应,是不够的。特别是匹配指纹图像和不匹配指纹图像的相关性通常都很高(在0.9以上),我们通常会观察到不匹配对的相关性高于匹配对的相关性。因此,在预处理之后有一个非线性决策阶段是非常必要的。最后,需要注意的是,在训练和测试过程中,预处理只需要对每对图像应用一次。特别地,在训练阶段,只有中心区域需要在神经网络中循环。虽然预处理不受训练,但它可以以与整个算法的全局神经体系结构兼容的并行方式实现。

4、神经网络决策阶段

决策阶段是算法的神经网络部分。与其他相关应用一样(参见Le Cun et al. 19901),该网络具有金字塔结构,两个对齐和压缩的中心区域作为输入,并具有单个输出p。金字塔的底层对应于中心的卷积具有多个滤波器或特征检测器的区域。随后的层次是新颖的。基于卷积滤波器的输出,他们实现的最终决策结果来自于用于估计p的概率贝叶斯模型。网络的过滤部分和决策部分都是可适应的,同时进行训练。

4.1、卷积

两个中心区域首先用一组可调滤波器进行卷积。在这个实现中只使用了两种不同的过滤器类型,但是扩展到更多类型的过滤器是很简单的。在这里,每个滤波器都有一个7 x 7的接受场,并且两个相邻的同类型滤波器的接受场有2个像素的重叠,以近似一个连续的卷积操作。给定类型的所有过滤器的输出组成一个6 x 6的数组。因此,每个32 × 32的核心被转换成几个6 × 6的数组,每个数组对应一个滤波器类型。过滤器类型j在其中一个数组中的位置(x, y)的输出为(例如对于A)

其中I,s(A)是图像A的压缩中心区域在(r,s)位置的像素强度,f是常见的sigmoids之一[f(x) (1 +e-)-, wxy,r,s是从压缩中心区域的(r,s)位置到滤波器输出数组中(x, y)位置的连接权值,t是偏置。在(x, y)位置对应滤波器接收野的7 x 7 patch上取4.1中的和。阈值和7x7的权值模式是滤波器类型的特征(所谓的“权值共享”),因此它们也可以被视为平移不变卷积核的参数。它们在一个图像中共享,但也在图像A和b之间共享。因此,wyrs w(x -r,y - s),在这个实现中,每种过滤器类型由7 x 7 +1 50个可学习参数表征。在接下来的内容中,我们简化了过滤器输出位置的符号,让(x,y) i。对于每个过滤器类型j,我们现在可以形成一个数组Az (A, B),由所有的平方差组成

令Az = Az(A, B)表示所有位置i和滤波器类型j的所有aa和B)的数组(图3)。

 4.2、决策

网络决策部分的目的是估计A和B之间匹配的概率p = p[M(A, B)/Az(A, B)] = p(M/Az),给定卷积滤波器提供的证据Az。决策部分可以看作是一个二元贝叶斯分类器。我们提出的决策网络有四个关键要素。1. 由于网络的输出被解释为概率,大多数反向传播网络中通常使用的最小均方误差似乎并不是衡量网络性能的合适指标。对于概率分布,估计概率输出p和真实概率p之间的交叉熵,求和

5、结果与结论

我们使用来自数据库的300对图像和两种不同的滤波器类型(图5)训练了前几节中描述的网络。然后在4650对新图像上测试网络性能。网络通常能很好地学习训练数据库。然而,当只使用一种筛选器类型时,情况就不同了。由于99%的匹配(或不匹配)对产生高于0.8(或低于0.2)的输出,因此在整个种群的输出单元中,匹配和不匹配对之间的分离是良好的。泛化集的错误率通常为0.5%,其中大约一半的错误是由于错误的拒绝,一半是由于错误的接受。在许多应用程序中,这两种类型的错误并不是对称的。例如,通常情况下,错误的接受比错误的拒绝更具灾难性。如果通过改变p上的决策阈值,我们强制错误接受率为0%,则错误拒绝率增加到4%。这个错误率当然需要减少,但即使如此,对于某些应用来说,它也几乎是可以接受的。与其他相关应用一样,网络在学习过程中发现的过滤器类型的解释并不总是直接的(图5和图6)。我们在较小的数据库上使用多达四种过滤器类型进行了各种实验。通常,滤波器类型中至少有一种总是显示为边缘或脊方向检测器。在各种实验过程中发现的其他一些过滤器类型可以用微小探测器来解释,尽管这可能更有争议。在训练阶段结束时,决策阶段滤波器的输出接近二进制0或1。由于网络的最终决定完全基于这些输出,这些输出提供了原始包含在512 x 464 x 8位图像中的所有相关匹配信息的非常压缩和呈现。因此,在这篇文章中在实现过程中,每张图像被大致减少到36 x 2 = 72位,这与理论下限的粗略估计(过去和现在的人类数量大约是
在应用中,算法不会像在训练阶段那样被使用。特别地,只有参考图像的中心区域需要存储在数据库中。由于前向传播通过决策阶段的算法是很快,人们实际上可以设想算法的一种变化,其中预处理中的对齐步骤被修改,参考图像仅以决策阶段滤波器相应输出给出的最压缩形式存储在数据库中。在这种变化中,测试图像的105 x 105窗口中包含的所有可能的65 x 65方形补丁,在经过通常的压缩和归一化预处理步骤后,通过卷积滤波器阵列发送,然后通过神经网络与参考图像的相应输出进行匹配。最后的决定将基于对p值的结果曲面的检查。这种算法是否也能带来更好的决策,还需要进一步研究。为了降低错误率,可以尝试以下几种方法。一种可能是在4.7和4.8中使用更通用的指数模型,而不是二项分布。或者,可以增加过滤器类型的数量或自由参数的数量(例如,通过让pi和qj也依赖于位置)以及训练和验证集的大小。另一种可能性是在比较中使用更大的窗口,或者,例如,使用两个小窗口而不是一个,第二个窗口由第一个窗口的对齐自动对齐。我们所拥有的残余假排斥的很大一部分似乎是由于旋转效应,也就是说,手指有时在收集设备上处于不同的角度。我们所描述的网络似乎能够处理大角度的旋转。较大的旋转可以很容易地在预处理阶段处理。也可以在收集系统中加入引导装置,以完全避免旋转问题。在这项研究中,我们试图找到一个通用的神经网络匹配器,原则上能够解决整个种群的匹配问题。在这方面,值得注意的是,这个网络只训练了与五个不同的人有关的图像对,但它很好地推广到与20人有关的更大的数据库。显然,通用网络还需要在更大的人口样本上进行测试。然而,与分类问题不同的是,匹配问题对训练集和测试集的大小应该不那么敏感。例如,在classifymg轮式分类中,有必要将网络暴露给整个种群中具有所有细微统计变化的轮式模式的大样本。在我们的匹配器中,我们基本上是从另一个图像中减去一个图像,因此只有差异的可变性才是真正重要的。特定的应用程序,特别是那些涉及小型数据库的应用程序,具有在网络的结构和训练方面都可以有利地利用的特定特征,并提出一些特定的问题。例如,对于汽车锁应用程序,只有与少数人的小数据库相关联的一对指纹才会出现阳性匹配。指纹匹配正确与数据库以外的人都无关。他们可能不需要培训。可以想象,在小型数据库应用程序中,可以训练不同的网络分别识别数据库中的每条记录,以防止可能的冒名顶替者。最后,我们所描述的方法,特别是带有概率解释的贝叶斯决策阶段,并不专门用于指纹识别问题。它是一个通用的框架,可以应用于需要建立同一性或同源性的其他模式匹配问题。相应的神经网络可以很容易地体现在硬件中,特别是在离线学习的情况下。正如已经指出的,预处理和决策阶段中的大多数步骤实际上是卷积的,并且可以并行实现。在工作站上,目前完全处理一对图像大约需要10秒。使用专门的硬件,这个时间可以减少几个数量级。

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

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

相关文章

第 365 场 LeetCode 周赛题解

A 有序三元组中的最大值 I 参考 B B B 题做法… class Solution { public:using ll long long;long long maximumTripletValue(vector<int> &nums) {int n nums.size();vector<int> suf(n);partial_sum(nums.rbegin(), nums.rend(), suf.rbegin(), [](int x…

golang工程——protobuf使用及原理

相关文档 源码&#xff1a;https://github.com/grpc/grpc-go 官方文档&#xff1a;https://www.grpc.io/docs/what-is-grpc/introduction/ protobuf编译器源码&#xff1a;https://github.com/protocolbuffers/protobuf proto3文档&#xff1a;https://protobuf.dev/programmin…

加入PreAuthorize注解鉴权之后NullPointerException报错

记录一次很坑的bug&#xff0c;加入PreAuthorize注解鉴权之后NullPointerException报错&#xff0c;按理来说没有权限应该403报错&#xff0c;但是这个是500报错&#xff0c;原因是因为controller层的service注入失败&#xff0c;然而我去掉注解后service注入成功&#xff0c;并…

使用VSCODE 调试ros2具体设置

vscode 调试 ROS2 张得帅&#xff01; 于 2023-09-09 15:39:39 发布 456 收藏 1 文章标签&#xff1a; vscode ros2 版权 1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件&#xff0c;添…

二十七、[进阶]MySQL默认存储引擎InnoDB的简单介绍

1、MySQL体系结构 MySQL大致可以分为连接层、服务层、引擎层、存储层四个层&#xff0c;这里需要注意&#xff0c;索引的结构操作是在存储引擎层完成的&#xff0c;所以不同的存储引擎&#xff0c;索引的结构是不一样的。 &#xff08;1&#xff09;体系结构示意图 &#xff0…

国庆10.01

TCPselect 代码 服务器 #include<myhead.h> #include<sqlite3.h> #define PORT 6666 //端口号 #define IP "192.168.0.104" //IP地址//键盘事件 int jp(fd_set tempfds,int maxfd) {char buf[128] ""; //用来接收数据char buf1[128] …

【算法|贪心算法系列No.2】leetcode2208. 将数组和减半的最少操作次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Spring注册Bean系列--方法1:@Component

原文网址&#xff1a;Spring注册Bean系列--方法1&#xff1a;Component_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;Component。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书 ​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

借助 ControlNet 生成艺术二维码 – 基于 Stable Diffusion 的 AI 绘画方案

背景介绍 在过去的数月中&#xff0c;亚马逊云科技已经推出了多篇博文&#xff0c;来介绍如何在亚马逊云科技上部署 Stable Diffusion&#xff0c;或是如何结合 Amazon SageMaker 与 Stable Diffusion 进行模型训练和推理任务。 为了帮助客户快速、安全地在亚马逊云科技上构建、…

【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明

在智能驾驶中&#xff0c;DDS有可能被广泛使用&#xff0c;因此推出这篇说明教程。 1、基于【QT开发&#xff08;5&#xff09;】教程的项目文档进行开发 2、安装DDS 查看《【eProsima Fast DDS&#xff08;1&#xff09;】安装eProsima Fast DDS》 至少安装: foonathan_m…

LeetCode每日一题:2136. 全部开花的最早一天(2023.9.30 C++)

目录 2136. 全部开花的最早一天 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 2136. 全部开花的最早一天 题目描述&#xff1a; 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生…

Java八股文

JAVA八股文 这里写目录标题 **JAVA八股文**面向对象三大特征接口与抽象类的区别重载与重写与equals异常处理机制HashMap原理红黑树乐观锁和悲观锁HashTable与HashMap的区别ArrayList和LinkedList的区别如何保证ArrayList的线程安全什么是线程上下文切换sleep()和wait()的区别yi…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中&#xff0c;我们将首先介绍Nginx的基本概念&#xff0c;然后演示如何使用Docker C…

stm32 - GPIO

stm32 - GPIO GPIO结构图GPIO原理图输入上拉/下拉/浮空施密特触发器片上外设 输出推挽/开漏/关闭输出方式 GPIO88种模式复用输出 GPIO寄存器端口配置寄存器_CRL端口输入数据寄存器_IDR端口输出数据寄存器_ODR端口位设置/清除寄存器_BSRR端口位清除寄存器_BRR端口配置锁定寄存器…

Window 安装多个版本的 java 并按需切换

1、按需下载对应版本的 java 官网链接&#xff1a;Java Downloads | Oracle 2、执行安装程序&#xff0c;根据安装向导一步一步走就行&#xff0c;每个版本安装在不同的目录下。 3、配置环境变量 a&#xff09;为每个版本 java 新建不同名称的 JAVA_HOME 系统变量&#xff0…

【Java 进阶篇】JDBC插入数据详解

在Java应用程序中&#xff0c;与数据库交互是一项常见的任务。其中&#xff0c;插入数据操作是一种基本的数据库操作之一。本文将详细介绍如何使用Java JDBC&#xff08;Java Database Connectivity&#xff09;来执行插入数据操作。无论您是初学者还是有一定经验的开发人员&am…

数仓精品理论-做大数据还有没有前途?

数仓精品理论-做大数据还有没有前途&#xff1f; 做大数据还有没有前途&#xff1f;大数据三要三不要我来讲讲大数据前景 做大数据还有没有前途&#xff1f; 先说&#xff0c;答案是肯定的&#xff0c;但一定要记住三要三不要。 datapulse官网&#xff1a; github:https://data…

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…