knn实现掌纹识别

Knn掌纹识别算法对比:Knn ResNet 高斯滤波器、Gabor滤波器、LBP等掌纹提取

哲,zhe

摘要:自动掌纹识别是一种近年来出现的生物识别技术。在人们宽阔的掌心皮肤表面上,有着丰富的纹理结构,包括主线、皱纹线、脊线、奇异点、纹理和其他图像特征。这些特征彼此不同,与基因无关,因此掌纹包含了大量的信息可以用于身份识别。掌纹图像中的主要线条和皱纹是最重要的特征,也是掌纹识别的主要依据。主线是指“头线”,“心线”和“生命线”的总称,每个人都有。皱纹不一定每个人都有,但如果有的话,对于识别会更有帮助。

关键词:掌纹识别,K近邻算法,残差神经网络

  1. 介绍

纹理特征提取 掌纹中有很多纹理特征:

图一: 掌纹中的主要线路以及皱纹

数据集:有100人的手掌图像,每个人有6个样本,其中3个在文件夹“训练”中,其余样本在文件夹“测试”中。使用“培训”文件夹中的图像进行注册,并使用“测试”文件夹中的图像进行测试。对提取的特征进行匹配,得到匹配精度。

2,原理

  1. SIFT(尺度不变特征变换)

尺度不变特征变换(SIFT)是一种尺度不变的特征变换。它可以将图像数据转化为与尺寸无关的局部特征。这个特征非常稳定,图像的尺寸、旋转角度、旋转扭曲、视角变化、噪声和光照变化对这个特征的影响很小。SIFT的主要步骤是提取图像中的关键点,并使用关键点描述符来描述这些关键点。

整个过程主要分为四个步骤:

(1) 尺度空间峰值选择。这一步的目的是在尺度空间中选择满足尺度不变性和旋转不变性的潜在关键点(或感兴趣点)。

(2) 关键点定位。这一步的目的是准确定位特征关键点的位置,包括去除伪关键点。

(3) 方向分配。这一步的目的是根据关键点的局部梯度方向为每个对应的关键点分配一个

方向。

(4) 关键点描述。这一步的目的是为每一个关键点用一个高维向量表示

  1. K最近邻算法

最简单的初始分类器是记录与训练数据相对应的所有类别,当测试对象的属性和训练对象的属性完全匹配时,可以进行分类。但是,如何让所有的测试对象找到一个完全匹配的训练对象,接着又出现了一个问题,即一个测试对象同时匹配多个训练对象,导致一个训练对象被划分为多个类别。基于这些问题,就提出了K最近邻算法(KNN)。KNN 通过测量不同特征值之间的距离来进行分类。其算法思想是:如果在特征空间中的k最相似样本(即特征空间中的最近邻)中大多数属于某个类别,那么该样本也属于这个类别。其中,k通常不大于20。

在KNN算法中,选择的邻居都是已经正确分类的对象。该方法根据最近样本或样本的分类决定,确定待分类样本属于哪个类别。在KNN中,对象之间的距离被计算为对象之间的非相似度指数,以避免对象之间的匹配问题。距离通常使用欧氏距离。此外,KNN 根据k个对象的主导类别做出决策,而不是单个对象的类别。这两点是KNN算法的优势。KNN算法的描述如下:

(1) 计算测试数据与每个训练数据之间的距离。

(2) 根据距离的增长关系进行排序。

(3) 选择距离最小的K个点。<

(4) 计算前K个点所属类别的出现频率。

(5) 将前K个点中频率最高的类别作为测试数据的预测分类。

  1. 深度残差网络

残差网络(ResNet)是由微软亚洲研究院何凯明团队于2015年提出的,并在许多比赛中获得第一名。相关论文《 Deep Residual Learning for Image Recognition》也获得了CVPR2016的最佳论文奖。在论文中,作者提出了如图3所示的残差结构。添加一个恒等映射(identity mapping),原始函数H(X)需要学习转换为F(X) + X。文章认为,与H(X)相比,F(x)的优化更简单,两者的优化难度不同。这个想法来自于图像处理中的残差向量编码。通过重新构建,将问题分解为多个尺度之间的残差问题,可以获得更好的优化结果。

3残差连接示意

3,实现思路

使用SIFT来提取特征,并使用KNN进行分类,还尝试了卷积神经网络方法,如ResNet。

Knn实现程序代码框架图:

4,实验结果和分析

  1. 使用SIFT提取特征并使用KNN进行分类,准确率为97.31%

算法流程:

  1. 预处理图片以使图片灰度均衡。
  2. 通过SIFT算法生成的关键点key point和描述符description(特征描述向量)对比。
  3. 使用KNN计算查询图片和训练图片之间的匹配点数,并使用k(k=2)最近邻匹配。

4)根据最大匹配点数确定查询图片的类别。

  1. 卷积神经网络ResNet,可以获得83.16%的准确率(Accuracy)。

主要包括5个步骤:

1)建立数据集。

2)数据增强。

3)加载数据。

4)迁移学习。

5)训练。

可以看出: 当迭代至500次后,准确率便不再有明显的上升。

准确率以及损失值的变化曲线如上图所示。

  1. 纹理提取

此外,我还尝试使用高斯滤波器、Gabor滤波器、LBP等方法来处理掌纹图像并从中提取纹理,但这些方法并没有提高掌纹识别的准确性。

图像特征提取结果:

(a)灰度化             (b) 低通量高斯滤波         (c) Gabor滤波器

5,结论和心得体会

该项目主要是完成掌纹特征提取和分类任务。数据集包含100个人的掌纹图片,每个人的训练集中分布有3张掌纹图片,测试集中分布有另外3张掌纹图片。在这个项目中,我尝试了传统方法使用SIFT提取特征和KNN进行分类,准确率达到了97.31%。同时,我还尝试了使用卷积神经网络方法,如ResNet,准确率达到了83.16%。此外,我还尝试使用高斯滤波器、Gabor滤波器、LBP等方法处理掌纹图像并从中提取纹理,但这些方法并没有提高掌纹识别的准确率。

可能有以下几个原因:

1. 样本数量不足:每个人仅有3张掌纹图片用于训练,这对于掌纹识别任务来说可能是不够的。更多的样本数量可以提供更多的信息,帮助算法更好地学习和泛化。

2. 特征提取方法选择不当:虽然尝试了多种特征提取方法,如SIFT、高斯滤波器、Gabor滤波器和LBP等,但这些方法并不一定适用于掌纹图像的特征提取。掌纹图像与其他类型的图像(如自然图像)具有一些差异,可能需要更适合掌纹纹理的特定方法。

3. 分类器选择不当:使用了KNN和卷积神经网络作为分类器,但其性能可能受到多种因素的影响。分类器的选择应该根据数据集的特点和任务需求进行调整和优化。

4. 数据预处理不足:在进行特征提取之前,对数据进行适当的预处理也是很重要的。例如,可以考虑进行图像增强、去噪或归一化等操作,以提高图像质量和特征的可靠性。

5. 参数调整不当:每种方法都有其自身的参数设置,可能需要通过调整参数来获得更好的效果。尝试不同的参数组合可能会有所帮助。

综上所述,提高掌纹识别准确率可能需要更多的样本、适合掌纹图像的特定特征提取方法、合适的分类器选择、充分的数据预处理以及参数调整的优化。

参考文献与注释

Deep Residual Learning for Image Recognition  He, Kaiming, Zhang, Xiangyu, Ren, Shaoqing

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于Python和OpenCV库的KNN实现人脸识别的代码示例: ```python import cv2 import numpy as np import os # 加载数据集和标签 def load_dataset(dataset_path): faces = [] labels = [] for dir_name, subdir_list, file_list in os.walk(dataset_path): for file_name in file_list: if file_name.endswith('.jpg'): img_path = os.path.join(dir_name, file_name) label = int(dir_name.split('/')[-1]) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) faces.append(img) labels.append(label) return faces, labels # 训练模型 def train(faces, labels): knn_model = cv2.face.KNearest_create() knn_model.train(np.array(faces), cv2.ml.ROW_SAMPLE, np.array(labels)) return knn_model # 预测人脸 def predict(knn_model, test_img): test_img = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY) test_img = cv2.resize(test_img, (128, 128)) test_img = np.array(test_img).reshape(-1, 128*128).astype(np.float32) ret, results, neighbours, dist = knn_model.findNearest(test_img, k=5) return int(results[0][0]) # 加载数据集和标签 faces, labels = load_dataset('dataset') # 训练模型 knn_model = train(faces, labels) # 加载测试图像 test_img = cv2.imread('test.jpg') # 预测人脸 predicted_label = predict(knn_model, test_img) print('Predicted label: {}'.format(predicted_label)) ``` 在这个示例,我们假设人脸图像数据集已经按照标签分好类,每个人的图像都在以其标签为名的文件夹。`load_dataset`函数用于加载数据集和标签,`train`函数用于训练KNN模型,`predict`函数用于预测人脸。最后,我们通过加载测试图像,调用`predict`函数预测人脸,并输出预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值