基于SVM实现人脸识别

基于SVM实现⼈脸识别
⼀、实验⽬的霍尔式角度传感器
在pycharm平台上,采⽤SVM分类器实现⼈脸识别。在实验过程中:
1. 学习应⽤主成成分分析对特征向量进⾏提取,并讨论选取前n个成分对识别准确性的影响。
2. 增加对SVM的理解,通过调节SVM具有的参数具体分析对识别效果的影响。
3. ⼈脸识别的成功精确度达到90%以上。
⼆、实验⽅法
1、从⽹上下载⼈脸数据集,并按照不同⼈脸图⽚进⾏分类存储。
2、读取图⽚并进⾏主成成分分析,调节选择前n维主成成分,分析各成分⽅差占⽐。
3、采⽤SVM分类器进⾏分类,调整其中参数,(包括:核函数,惩罚系数,多分类⽅法等)分析对结果的影响。
三、实验结果
1. 下载Olivetti Faces⼈脸数据集得到⼀张包含20*20张⼈脸图⽚,如下:
验光组合
1. 2、进⾏图像分割后按不同⼈物将图⽚分别存⼊不同⽂件夹中,效果如下:(具体实现请看另⼀篇:)
环境风洞
1. 3、读取图⽚进⾏主成成分分析
蓝点是各成分⽅差的占⽐,红线是各成分⽅差占⽐的积累。
从图中可以看出,各成分⽅差占⽐不断下降,当达到n=32左右后⽅差占⽐趋近于0,另外,n=32时,⽅差的积累已经达到了70%左右,其后增加的也很缓慢,所以对PCA的参数n可以在n=30以内调整分析即可。
1. 在相同的SVM模型下(惩罚系数C=0.1,核函数=Linear,多分类⽅法=ovo),设置不同的PCA(主成成分分析⽅法)的参数n,对⽐训
练和测试准确度。
n训练准确度(train_rate)测试准确度(test_rate)前n维⽅差占⽐
3  0.9
4    0.67  0.217
5    1.00    0.91  0.323
8    1.00      1.00  0.420
20    1.00      1.00  0.587
从上表可以看出,在此问题下,只需要使⽤特征向量较少的信息量(⽅差占⽐)就可以实现较好的分类效果,n=8时,训练和测试的准确度已经达到100%。
1. 在相同的PCA的参数n(n=5)条件下,调整SVM的参数:
惩罚系数C核函数多分类⽅法训练准确度测试准确度
0.1 linear ovo    1.00  0.916
1.0 linear ovo    1.00  0.917
2.0 Linear ovo    1.00  0.917
0.1poly ovo  0.386  0.267
0.1 rbf ovo  0.178  0.083
0.1 linear ovr    1.00  0.916
从上表可以看出,惩罚系数C和多分类⽅法在此问题下对实验结果影响不⼤;⽽核函数的选取很重要,使⽤线性核函数可以达到很好效果,⽽此问题不适合使⽤多项式和径向基核函数。
结果讨论
1、本实验证明了SVM⽅法可以很好的解决样本数量较少的分类问题,在这次实验中,⽤到的全部数据集只有20*10张图⽚,即有20个⼈物,每个⼈物只有10张图⽚,但SVM仍然很好地完成了分类任务,甚⾄可以达到100%的训练和测试成功率。其中原因和SVM的理论有关,因为在SVM中,只有位于分类边缘的特征向量(即⽀持向量)对分类⾯有影响,所以SVM不需要特别多的数据。
立体巴士2、本实验证明了特征提取的必要性,训练和测试的特征不是越多越好,更多的特征不仅增加了计算量⽽且会降低分类的质量。通过特征提取可以将关键的信息提取出来,更有利于进⾏分类。在本实验中通过主成成分分析可视化的看到各个分量所含的信息占⽐,并且使⽤较少的信息(n=8时占⽐为0.42)就可以达到很好的效果,相⽐于将原图的特征向量直接传⼊SVM,极⼤的减⼩了运算量。
3、对SVM⽅法,核函数的选取极其重要,并不是越复杂的核函数效果越好,需要具体问题具体尝试后选取最佳。在本实验中,使⽤最简单的线性核函数反⽽可以实现更好的效果。
结论
对实际问题要具体分析,不要因为⽬前神经⽹络很热门就认为神经⽹络可以解决所有问题⽽忽视了其他机器学习⽅法。相⽐于神经⽹络,SVM有其⽆法⽐拟的优点:实现简单,计算量⼩,需要数据量少,调参简单,优秀的泛化能⼒等。
具体代码如下
# 导⼊模块
import cv2  # openCV 模块⽤于图像处理
import numpy as np
del_selection import train_test_split  # ⽤于切分训练集和测试集
from sklearn.decomposition import PCA  # PCA降维
from sklearn.svm import SVC  # ⽀持向量机
import matplotlib.pyplot as plt
data = []  # 存放图像数据
label = []  # 存放标签
# 读取20*10张图⽚
for i in range(1, 21):
for j in range(1, 11):
path = 'img' + '/' + str(i) + '/' + str(j) + '.jpg'
img = cv2.imread(path, -1)
h, w = img.shape
# 将图⽚转化成列表
img_col = shape(h * w)
data.append(img_col)
label.append(i)
# 将图⽚列表转化成矩阵类型
C_data = np.array(data)
C_label = np.array(label)
软毡# 切分训练集和测试集,参数test_size为测试集占全部数据的占⽐
x_train, x_test, y_train, y_test = train_test_split(C_data, C_label, test_size=0.3, random_state=256)
# 主成成分分析,参数n_components为取前n维最⼤成分
n = 5
pca = PCA(n_components=n, svd_solver='auto').fit(x_train)
# 形象化展⽰各个成分的⽅差占⽐,即主成成分分析的本征图谱和累积量
a = plained_variance_ratio_
b = np.zeros(n)
k = 0
for i in range(1, n):
k = k + a[i]
b[i] = k
# 作图
plt.plot(b, 'r')
plt.plot(a, 'bs')
人脸识别器plt.show()
# 将训练和测试样本都进⾏降维
x_train_pca = ansform(x_train)
x_test_pca = ansform(x_test)
# 使⽤SVM模型进⾏分类,
svc = SVC(C=0.1, kernel='linear', decision_function_shape='ovr')
svc.fit(x_train_pca, y_train)
# 获得训练精确度
print('训练准确度:')
print('%.5f' % svc.score(x_train_pca, y_train))
# 获得测试精确度
print('测试准确度:')
print('%.5f' % svc.score(x_test_pca, y_test))

本文发布于:2024-09-24 07:17:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/333523.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:成分   分类   测试   分析
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议