人脸识别——PCA降维
人脸识别——PCA降维
数据
本实验采集82名同学每人三张共计246张图片,两张用于训练,一张用于测试
PCA
path1 = "E:\\code\\jupyter\\facedata" #文件夹目录
files1 = os.listdir(path1) #得到文件夹下的所有文件名称
labels = []
for file in files1: #遍历文件夹
labels.append(file) #每个文件的文本存到list中
j = 0
dataname = []
for i in range(0, 82):
path2 = path1 + '\\' + labels[i] + '\\'
files2 = os.listdir(path2)
for file in files2:#获取每个人的图片
path3 = path2 + file
dataname.append(path3)#dataname是所有图片的路径
j = j + 1
images = []
labels = []
for index,face in enumerate(dataname):
image = cv2.imread(face, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (128, 128))#image是一个128*128的矩阵
images.append(image)
labels.append(int(index))
for i in range(246):
labels[i] = int(labels[i]/3)#将图像每三个分为一组
# 图像数据转换特征矩阵
image_data = []
for image in images:
data = image.flatten()
image_data.append(data)
print(image_data[0].shape)
# 转换为numpy数组
X = np.array(image_data)
y = np.array(labels)
print(type(X))
print(X.shape)
# 画出特征矩阵
data = pd.DataFrame(X)
data
#划分训练集和测试集
x1 = []
y1 = []
x2 = []
y2 = []
for i in range(246):
if i%3 != 0:
x1.append(X[i])
y1.append(y[i])
else:
x2.append(X[i])
y2.append(y[i])
x_train = np.array(x1)
y_train = np.array(y1)
x_test = np.array(x2)
y_test = np.array(y2)
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape, sep = '\n')
#164用于训练,82用于测试
model+predicted
# 画出特征个数和所携带信息数的曲线图
explained_variance_ratio = []
for i in range(1,151):
pca = PCA(n_components=i).fit(X)
explained_variance_ratio.append(pca.explained_variance_ratio_.sum())
plt.plot(range(1,151),explained_variance_ratio)
plt.show()
# 选择维度100,训练PCA模型
pca = PCA(n_components = 100)
pca.fit(X)
#返回测试集和训练集降维后的数据集
x_train_pca = pca.transform(x_train)
x_test_pca = pca.transform(x_test)
print(x_train_pca.shape)
print(x_test_pca.shape)
#数据降维到100
#使用svc模型训练预测
svc = SVC(C = 2, kernel='linear', class_weight='balanced')
svc.fit(x_train_pca, y_train)
#svc_pre = svc.predict(x_test)
svc.score(x_test_pca, y_test)
#准确率0.67
#使用“特征脸”模型
model=cv2.face.EigenFaceRecognizer_create()
model.train(x_train_pca, y_train)
label = []
confidence = []
for i in range(82):
j, k = model.predict(x_test_pca[i])
label.append(j)
confidence.append(k)
print('pca', precision_score(y_test, label, average='micro'))
#准确率0.65
本实验主要目的是学习PCA的使用,最终的结果受使用数据的影响,不具参考价值