赞
踩
数据集:ORL经典人脸数据集
要求:
(1)利用PCA对每张人脸图片的特征进行降维。每张图片大小是92x112,转换成特征向量的话共有10304维,代码中将其降至20维。
(2)将数据集划分成训练集和测试集,训练SVM分类器,在测试集上进行分类。
说明
原始数据集中包含40个文件夹,每个文件夹中有10张图片共400张图片。代码中将所有图片进行转换,生成一个(400,10305)大小的特征矩阵并将该矩阵保存成 feature.txt 文件,方便读取。
其中前10304维是特征,最后增加1维存放图片的类别序号(即标签, 利用共40类,用1-40表示)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @Author : Sword @Date : 2020/5/12 @Version : v1.0 @File : ORL_recognition.py @Describe :利用PCA+SVM对ORL数据集进行分类,共40类,将类别标签序号设置为: 1-40 """ from PIL import Image import numpy as np from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import classification_report def make_feature(): """ 1.将每张图片转成大小为(1, 10304)的特征矩阵 2.同时将特征矩阵增加一个维度,存放类别序号(共40类,序号从1-40) 3.最终的特征矩阵大小为: (400, 10305),最后一维表示类别 """ # 用于存放当前类别标签(用外层循环i的值来表示) # 将该标签列表添加到每张图片特征矩阵的最后一维 class_list = [] # 将所有图片的特征向量进行堆叠,最后得到(400,10305)大小的特征矩阵 # 初始化为[[0]] --> 可以是任意值 stack_metrix = np.array([[0]]) for i in range(1, 41): """ 每一个文件夹表示一个类 """ class_list.append(i) class_matrix = np.array(class_list, ndmin=2) for j in range(1, 11): path = './data/ORL/s{}/{}.pgm'.format(i, j) x = Image.open(path) data = np.asarray(x) data = np.reshape(data, (1, -1)) one_data = np.column_stack((data, class_matrix)) # 第一次不堆叠 if i == 1 and j == 1: stack_metrix = one_data continue stack_metrix = np.row_stack((stack_metrix, one_data)) class_list.pop() np.savetxt('feature.txt', stack_metrix) def load_data(): """ 获取样本的特征以及类别标签 """ path = 'feature.txt' train_data = np.loadtxt(path) data = train_data[:, :10304] target = train_data[:, -1:] return data, target def train(): """ 1.PCA+SVM进行分类 2.PCA降维至20维 :return: """ data, target = load_data() x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=13) # 利用PCA将特征降至20维 pca = PCA(n_components=20) x_train = pca.fit_transform(x_train) svm_clf = SVC(C=100) svm_clf.fit(x_train, y_train) # 利用在训练集上进行降维的PCA对测试数据进行降维 # 保证转换矩阵相同 x_test_process = pca.transform(x_test) y_predict = svm_clf.predict(x_test_process) score = svm_clf.score(x_test_process, y_test) print('测试集上的预测精度为:{}'.format(score)) print('') print('测试集前10个样本的类别为:', y_test[:10].tolist()) print('预测的类别为:', y_predict[:10]) print('') print(classification_report(y_test, y_predict)) if __name__ == '__main__': train()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。