基于SVM实现人脸识别
一、实验目的
在pycharm平台上,采用SVM分类器实现人脸识别。在实验过程中:
- 学习应用主成成分分析对特征向量进行提取,并讨论选取前n个成分对识别准确性的影响。
- 增加对SVM的理解,通过调节SVM具有的参数具体分析对识别效果的影响。
- 人脸识别的成功精确度达到90%以上。
二、实验方法
1、从网上下载人脸数据集,并按照不同人脸图片进行分类存储。
2、读取图片并进行主成成分分析,调节选择前n维主成成分,分析各成分方差占比。
3、采用SVM分类器进行分类,调整其中参数,(包括:核函数,惩罚系数,多分类方法等)分析对结果的影响。
三、实验结果
- 下载Olivetti Faces人脸数据集得到一张包含20*20张人脸图片,如下:
- 2、进行图像分割后按不同人物将图片分别存入不同文件夹中,效果如下:(具体实现请看另一篇:https://blog.csdn.net/weixin_46579610/article/details/120967783)
- 3、读取图片进行主成成分分析
蓝点是各成分方差的占比,红线是各成分方差占比的积累。
从图中可以看出,各成分方差占比不断下降,当达到n=32左右后方差占比趋近于0,另外,n=32时,方差的积累已经达到了70%左右,其后增加的也很缓慢,所以对PCA的参数n可以在n=30以内调整分析即可。
- 在相同的SVM模型下(惩罚系数C=0.1,核函数=Linear,多分类方法=ovo),设置不同的PCA(主成成分分析方法)的参数n,对比训练和测试准确度。
n |
训练准确度(train_rate) |
测试准确度(test_rate) |
前n维方差占比 |
3 |
0.94 |
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%。
- 在相同的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.1 |
poly |
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
from sklearn.model_selection import train_test_split # 用于切分训练集和测试集
from sklearn.decomposition import PCA # PCA降维
from sklearn.svm import SVC # 支持向量机
import matplotlib.pyplot as pltdata = [] # 存放图像数据
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 = img.reshape(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 = pca.explained_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 = pca.transform(x_train)
x_test_pca = pca.transform(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))
基于SVM实现人脸识别相关推荐
- svm 用来人脸识别_基于SVM的人脸识别
基于 SVM 的人脸识别 摘要 :主成分分析( PCA )是人脸识别中特征提取的主要方法,支持向量机 ( SVM )具有适合处理小样本.非线性和高维数问题,利用核函数且泛化能力强 等多方面的优点.文章 ...
- 基于LDA+SVM实现人脸识别模型
基于LDA+SVM实现人脸识别模型 描述 人脸识别(图像识别)是机器学习领域十经典的应用,在本质上,人脸识别属于监督学习中的分类问题.前面章节中我们已经学习了支持向量机(SVM),该算法在图像分类领域 ...
- 基于PCA和SVM的人脸识别系统的设计与实现
基于PCA和SVM的人脸识别系统的设计与实现 1.1 题目的主要研究内容 工作的主要描述 下载人脸数据集,将其划分为训练集和测试集,对所有数据进行pca降维,将经过降维的训练集特征向量送入svm进 ...
- 【项目实战】Python基于MTCNN+FaceNet+SVM进行人脸识别项目实战
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 人脸识别的现代研究始于20世纪60年代末.在近20年,随着计算机 ...
- python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现
之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...
- 基于cnn的人脸识别_鬼都藏不住,人脸识别新突破!就算遮住半张脸也能100%被识别...
转自:新智元 如涉版权请加编辑微信iwish89联系 哲学园鸣谢 新智元报道 来源:sciencedirect 编辑:金磊,元子 [新智元导读]众所周知,人脸识别在摄像头无法捕捉到完整面部图像的情况下 ...
- 基于MATLAB的人脸识别 (1)
目录 引言 1 1 人脸识别技术 2 1.1人脸识别的研究内容 2 1.1.1人脸检测(Face Detection) 2 1.1.2人脸表征(Face Representation) 2 1.2几种 ...
- 基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
- Python基于OpenCV的人脸识别自助商店(源码&部署视频)
1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...
最新文章
- 洛谷P1908求逆序对【树状数组】
- select case when if 的一些用法
- Android 应用 之路 天气预报(五)
- 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。
- getParameterValues用法
- 使用postman模拟百度通用文字识别
- JS 实现 jQuery的$(function(){});
- python安装pyqt4_Python-Mac 安装 PyQt4
- 厉害了,Netty 轻松实现文件上传!
- 图像mnf正变换_PIE SDK最小噪声变换
- 腾讯2021校园招聘-后台综合-第一次笔试 8.23 20.00-22.00 Apare_xzc
- 国内手机市场遭遇寒风,智能手机企业激战千元机
- 大动作|阿里云扩招5000人!云计算、AI抢夺全球人才
- 线性代数_4、行列式按行展开,异乘变零,拉普拉斯定理
- python win32处理Excel(基础篇)
- linux内核级调用时间delay函数,及常用文件头
- Android 刘海屏的适配
- 荷兰国土不大,人口不多,为什么有那么多世界级大公司?
- JAVA计算机毕业设计租房管理系统Mybatis+系统+数据库+调试部署
- 如何让moment根据对应时间显示几秒前、几分钟前、几天前?