基于SVM实现人脸识别

一、实验目的

在pycharm平台上,采用SVM分类器实现人脸识别。在实验过程中:

  1. 学习应用主成成分分析对特征向量进行提取,并讨论选取前n个成分对识别准确性的影响。
  2. 增加对SVM的理解,通过调节SVM具有的参数具体分析对识别效果的影响。
  3. 人脸识别的成功精确度达到90%以上。

实验方法

1、从网上下载人脸数据集,并按照不同人脸图片进行分类存储。

2、读取图片并进行主成成分分析,调节选择前n维主成成分,分析各成分方差占比。

3、采用SVM分类器进行分类,调整其中参数,(包括:核函数,惩罚系数,多分类方法等)分析对结果的影响。

三、实验结果

  1. 下载Olivetti Faces人脸数据集得到一张包含20*20张人脸图片,如下:

                        ​​​​​​​        

  1. 2、进行图像分割后按不同人物将图片分别存入不同文件夹中,效果如下:(具体实现请看另一篇:https://blog.csdn.net/weixin_46579610/article/details/120967783

                                

  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.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%。

  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.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 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 = 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))

  • 4
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 基于SVM人脸识别可以分为以下几个步骤: 1. 数据集准备:收集人脸图像数据集并进行预处理,包括图像去噪、归一化、人脸检测和特征提取等。 2. 特征提取:从预处理后的人脸图像中提取特征向量,常用的特征提取算法包括PCA、LBP、HOG等。 3. 数据集划分:将数据集划分为训练集和测试集,通常采用交叉验证的方法进行划分。 4. 模型训练:使用训练集训练SVM分类器,根据不同的特征提取算法SVM参数设置,得到不同的人脸识别模型。 5. 模型测试:使用测试集评估模型的识别准确率和性能,可以采用准确率、召回率、F1值等指标评估模型性能。 6. 预测应用:使用训练好的SVM分类器对新的人脸图像进行分类,实现人脸识别功能。 这里提供一个基于Python的SVM人脸识别的示例代码,使用的是OpenCV库进行图像处理和特征提取,使用sklearn库进行SVM分类器的训练和测试: ``` import cv2 import numpy as np from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 读取人脸图像数据集并进行预处理 def load_dataset(): X = [] y = [] # TODO: 读取人脸图像数据集并进行预处理,生成训练集和标签 return X, y # 提取人脸图像特征向量 def extract_features(X): features = [] # TODO: 对训练集中的每个人脸图像提取特征向量 return np.array(features) # 划分数据集并训练SVM分类器 def train_svm(X, y): # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练SVM分类器 clf = SVC(kernel='linear', C=1.0) clf.fit(X_train, y_train) # 测试SVM分类器 y_pred = clf.predict(X_test) acc = accuracy_score(y_test, y_pred) print("Accuracy:", acc) return clf # 使用SVM分类器进行人脸识别 def predict_svm(clf, X): # TODO: 对新的人脸图像进行分类,返回识别结果 return None if __name__ == '__main__': # 加载数据集 X, y = load_dataset() # 提取特征向量 features = extract_features(X) # 训练SVM分类器 clf = train_svm(features, y) # 进行人脸识别测试 # TODO: 对新的人脸图像进行分类,返回识别结果 ``` 需要注意的是,针对不同的人脸图像数据集和特征提取算法,需要进行相应的调整和优化,以达到更好的识别效果。 ### 回答2: 基于 SVM人脸识别是一种常用的方法,在 Python 中也有相关的实现。 首先,我们需要收集一组有标签的人脸图像作为训练集,每个人脸图像需要有对应的标签来表示其所属的人物。然后将这些图像转换为灰度图像,提取出人脸特征,比如使用 Haar 特征检测器或深度学习模型进行人脸检测和特征提取。 接下来,我们可以使用 scikit-learn 库中的 SVM 实现来建立分类模型。通过将训练集中的人脸图像特征与对应的标签输入 SVM 模型进行训练,模型将基于这些特征学习出一个分类器,用于预测测试图像的标签。 对于测试阶段,我们将测试图像也转换为灰度图像,并提取相同的人脸特征。然后,通过训练得到的 SVM 模型对测试图像进行分类预测,并得到预测结果。 最后,我们可以进行模型评估,计算分类的准确率、召回率等指标来评估模型的性能。如果需要进一步提高准确率,我们可以调整 SVM 的参数选择合适的核函数,并使用交叉验证等方法进行模型调优。 需要注意的是,基于 SVM人脸识别方法在较大的人脸数据库上可能面临计算性能的挑战。如果需要处理大量数据并保证实时性能,可以考虑使用其他更高效的人脸识别算法,如基于深度学习的方法(如卷积神经网络)。 ### 回答3: 人脸识别是计算机视觉领域的一个重要研究方向,基于SVM人脸识别是其中一种常用的方法。在Python环境下,我们可以使用一些开源库来实现该功能。 首先,我们需要使用OpenCV库来进行人脸检测。OpenCV提供了人脸检测的经典算法,如Haar特征级联分类器和深度学习中的人脸检测器。 接下来,我们可以使用Dlib库进行人脸特征点的提取。Dlib提供了许多人脸特征点的模型,如68个特征点和5个特征点的模型,可以用于提取人脸区域的细节特征。 然后,我们需要使用一些图像处理库来对提取到的人脸进行预处理。这包括将彩色图像转换为灰度图像、图像尺寸的归一化和直方图均衡化等。 在特征提取和预处理完成后,我们可以使用机器学习库scikit-learn来进行SVM分类器的训练和预测。我们需要将提取到的特征作为输入,标签作为输出,通过训练建立一个SVM分类模型。 最后,我们可以用训练好的SVM模型对新的人脸图像进行分类预测,判断其属于训练集中的哪个人脸类别。 需要注意的是,人脸识别是一个复杂的任务,由于SVM只能对二分类进行处理,因此在实际应用中,可能需要使用更加复杂的算法和深度学习模型来提高准确率。另外,为了提高人脸识别的效果,还可以采用人脸对齐、特征融合和增加训练样本等方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值