一、题目
基于SVM算法的掌纹识别研究
二、数据库介绍
本次实验的数据存储采用的是windows的文件系统,未采用专业的数据库
三、任务选择
本次实验我选择的是分类任务,使用掌纹图像作为输入数据,然后使用支持向量机算法进行训练和测试,最后评估了模型的准确性、绘制了ROC曲线,并计算了AUC值、精确度和召回率。
四、评价指标
1,准确率(Accuracy):分类正确的样本数占总样本数的比例。
2,精确度(Precision):在所有被预测为正类的样本中,确实为正类的比例。
3,召回率(Recall):在所有真实的正类样本中,被正确预测为正类的比例。
4,ROC曲线和AUC值:ROC曲线下的面积(AUC)可以衡量模型对正负样本的区分能力,ROC曲线描述了在不同阈值下真正例率(召回率)和假正例率之间的关系。
五、编程语言
在本次实验中,我使用了Python编程语言来实现掌纹图像分类任务。
我使用了Python中的几个库来实现不同的功能:
cv2库:用于读取和处理图像数据,例如读取灰度图像,进行直方图均衡化以去除噪声。
numpy库:用于进行数组操作和数值计算,使用它来处理图像的像素值,并将其展平为特征向量。
sklearn库:使用其中的SVM模型、PCA降维方法和评价指标来训练和评估我们的分类模型。
matplotlib库:用于绘制ROC曲线和可视化结果,使用它来展示分类模型的性能和效果。
通过使用Python编写代码,调用这些库的函数和方法来完成整个掌纹图像分类任务。通过合理地利用Python编程语言和相关库的功能,以做到快速、高效地实现分类模型的训练、测试和评估,从而达到准确分类掌纹图像的目标。
六、算法原理
标明详细出处,例如是最新论文文献中的方法还是课本中的经典 算法或者自行设计的方法。如果是已有方法,对应给出论文或者课本专著的详细 信息,例如作者、标题、期刊名/会议名、年、卷、期、页码等。公式用公式编 辑器,不要截图。
七、程序框架
在本此实验中,我使用了支持向量机(Support Vector Machine,SVM)算法来完成掌纹图像的分类任务。SVM是一种监督学习算法,广泛应用于模式识别、图像分类和文本分类等领域。
SVM算法的核心思想是找到一个最佳的超平面,将不同类别的数据点分开。在代码中,我使用了sklearn库中的SVC类来实现SVM模型的训练和预测。
以下是我实现SVM算法的主要步骤:
数据准备:我首先读取和加载掌纹图像数据集,并将其划分为训练集和测试集。然后,对图像数据进行预处理,例如去噪。
特征提取:我将每个图像转换为特征向量表示。在此实验中,我使用了PCA(Principal Component Analysis)降维方法来提取图像的主要特征。通过降维,我能够减少数据的维度,并保留最相关的特征。相较于降维之前,模型的训练时间的大大减少。
模型训练:使用训练集的特征向量和对应的标签,调用SVC类的fit函数来训练SVM模型。在训练过程中,SVM算法会根据特征向量的分布情况找到一个最佳的超平面,使得不同类别的数据点距离超平面的间隔最大化。
模型预测:在模型训练完成后,我使用测试集的特征向量作为输入,调用SVC类的predict函数来进行预测。模型将根据学习到的超平面,对测试样本进行分类,并输出预测结果。
模型评估:我使用了多个评价指标来评估分类模型的性能,包括准确率、精确度、召回率和ROC曲线下的面积(AUC)。这些指标可以帮助我全面了解模型的分类效果和泛化能力。
通过实现SVM算法,能够充分利用训练数据中的信息,构建出一个高效、准确的分类模型,用于对掌纹图像进行分类。SVM算法具有较好的鲁棒性和泛化能力。
八、实验过程和结果分析
应列出详细的实验结果,并通过丰富的图、表等多种 形式直观展现,例如可通过曲线图表现出 PCA 不同降维后维数对应的识别率, 横坐标为 PCA 降维后的维数,纵坐标为识别率。需要有对比实验,可以对不同 参数下的结果进行对比,也可以对多种不同算法方案的结果进行对比。
- 在实验的初始阶段,我首先采用了train_test_split()方法来对实验数据进行分类,并且未对原始图像做任何处理,直接对模型进行了初步的参数设置就开始了学习,最终得到了以下测试结果:
训练集占比 | 测试集占比 | 正确率 |
50% | 50% | 82% |
60% | 40% | 88.75% |
70% | 30% | 90% |
80% | 20% | 92.5% |
90% | 10% | 100% |
由于在实际实验中要求的是前三张作为训练集,后三张作为测试集,即训练集与测试集占比各50%。由此可初步忽略过拟合的问题。此时我的分类方法如下:
def load_dataset():
images = []
labels = []
for i in range(0, 100):
for l in range(1, 7):
image_path = f"palmbases/P_{i}_{l}.bmp"
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
label = i
images.append(image)
labels.append(label)
train_images, test_images, train_labels, test_labels = train_test_split(
images, labels, test_size=0.2, random_state=42
)
return train_images, train_labels, test_images, test_labels
- 在此之后我又采用了每个掌纹的前三张图用于训练,后三张图用于测试,但正确率只有68.67%,与之前按整体随机划分训练集和测试集同样为50%:50%的82%的正确率相差甚远,正确率的差异可能是由于数据集划分方式不同导致的。在之前按整体随机划分训练集和测试集的情况下,每张掌纹图像都有相同的机会被用于训练和测试,确保了数据集的均衡性。而在当前的划分方式中,前三张图用于训练,后三张图用于测试,这样的划分方式可能导致数据集的不均衡。同时,经过观察发现,其实这六张掌纹图片的每个掌纹中的前三张图像与后三张图像具有较大的差异。模型在训练时可能无法充分学习到后三张图像的特征,从而导致测试准确率下降。于是我又进行了一些实验:
训练集 | 正确率 |
P{1,2,3} | 68.67% |
P{1,3,4} | 97.5% |
P{1,2,3,4} | 99.95% |
- 由于此时的正确率并不算高,同时又考虑到此时模型的拟合程度并没有达到最高点,还没有到过拟合的地步,因此我决定采用图像组合的方式来进行拟合,以便等比的扩大图像的差异,此处我采用了二种图片拼接方式。
3.1,方式一
将训练集的图像P{1,2,3}水平拼接,测试集的图像将自身复制三份再进行水平拼接。
3.2,方式二
分别将训练集的图像P{2,3} P{1,3} P{1,2} 水平拼接,测试集的图像将自身复制二份在进行水平拼接。
但拼接后模型的拟合结果并没有得到提升:
方式 | 正确率 |
方式一 | 67.67% |
方式二 | 68.33% |
- 经过观察图像发现,部分图像存在过曝或过暗的情况,经过对多种滤波方式和和均衡化的方式以及它们的组合的测试,最终决定采用直方图均衡化来去除干扰,获得标准化的图像数据。此时正确率也得以大大提升,达到了90.33%。部分实验结果如下:
方式 | 正确率 |
高斯滤波高斯核大小5*5 | 69.67% |
高斯滤波高斯核大小3*3 | 69% |
中值滤波 | 70% |
自适应直方图均衡化 | 69.67% |
直方图均衡化之后中值滤波 | 90% |
中值滤波之后直方图均衡化 | 89.67% |
中值滤波组合高斯滤波 | 68.67% |
- 在此之后,我又尝试了使用局部二值模式等方式来提取掌纹的纹理特征,但最终效过并不好,经过多种参数设置之后,正确率仍只有10%左右。
- 考虑到之前并不清楚将图像拼接后正确率不升反降的原因,因此在对原图像进行直方图均衡化之后,有对拼接后的图像进行实验测试结果如下:
方式 | 正确率 |
方式一 | 84.67% |
方式二 | 88.33% |
经过对比观察,出现这种情况的可能是,虽然对图像进行了拼接,但增加了冗余,同时由于同样都是掌纹图像,所以它们之间的距离并没有等比例的增加,它们之间的距离比例可能会有所下降。
- 调整函数参数
惩罚系数C | 正确率 |
1 | 90.33% |
10 | 90.21% |
50 | 89.8% |
100 | 90.12% |
此后,我又尝试了很多组合,但正确率没有得到显著提升。
- PCA降维
PCA降维后的维数 | 正确率 |
10 | 59.33% |
50 | 88.33% |
100 | 89.33% |
150 | 89.66% |
200 | 90% |
250 | 89.66% |
300 | 90.33% |
PCA降维之后,虽然正确率没有提升,但模型的训练速度得到大幅度的提升,大概从开始的30s左右变为5s左右。
- 经过以上实验均衡,最终选定直方图均衡化,PCA降维150,惩罚系数C=1,来作为最终的模型。模型性能如下
整体的ROC曲线 |
按掌纹分类的ROC曲线 |
从上往下依次为正确率,AUC,精确度,召回率 |
九、结论和心得体会
通过本次研究,我们基于SVM算法对掌纹图像进行了分类任务的研究。在实验过程中,我们首先对掌纹图像数据进行了预处理,包括图像读取、特征提取和数据集划分等步骤。随后我们使用SVM算法进行模型训练和测试,并通过多种实验对比不同参数和方法对模型性能的影响。最终,我们得出了有效的掌纹图像分类模型,并且选择了合适的参数配置和图像处理方法来获得较高的分类准确率。同时,我也深刻认识到在进行图像分类任务时,数据预处理和特征选择是非常重要的环节。合适的数据预处理方法可以有效提高模型的泛化能力,而特征选择则直接影响到分类器的性能。在实验过程中,我通过多次尝试和对比,逐步找到了最适合的图像处理方式和模型参数配置,使得模型性能达到了较好的水平。同时,我也意识到了对数据集的合理划分和均衡性对模型性能的重要性,这将对未来的实验设计和数据处理提供有益的启示。
在未来的研究中,我将继续深入学习和探索更多先进的图像处理技术和机器学习算法,以期进一步提升模型的性能和泛化能力。同时,我也将更加注重对数据集的分析和处理,以确保模型训练和测试的有效性和可靠性。通过不断地实践和探索,我相信能够在图像识别领域取得更多的成果和进步。