基本原理 人脸识别-PCA特征脸_Python_萬仟网
上面那个链接被识别成不安全网址 谨慎访问吧
PCA principal Component Analysis 主成成分分析方法 1.基本原理1 利用KL变换抽取人脸主要成分 构成特征脸空间。
2 识别时将测试图像投影到此空间 得到一组投影系数 通过与各个人脸图像比较进行识别。
2.KL变换的实现1 基本公式
其中 [ 1, 2… ]T m E[ ] 为 列 矢 量 的 均 值 矢 量 U 为 矢 量 协 方 差 矩 阵C 的特征矩阵。
具体实现代码如下
# 实现kl变换 def kl_Transform(X): # 对X按列求平均得到mx mx X.mean(1) # P [X-mx] P X - mx # 通过减小计算量的方式求其协方差矩阵的特征矩阵U temp (P.T) * (P) # 获取temp的特征值和特征向量 V为其特征向量 array形式存储 _,V np.linalg.eig(temp) # temp的特征向量的定义 temp_eig [] # 通过读取列的方式,其大小为P的列数 将获取的特征值传入temp_eig for i in range(P.shape[1]): temp_eig.append(V[:,i]) # 传入数组化的temp_eig 通过 -1 len(temp_eig) 设置大小 temp_eig np.reshape(np.array(temp_eig),(-1,len(temp_eig))) # 将temp_eig转换为矩阵 temp_eig np.mat(temp_eig) # 计算特征矩阵U U P * temp_eig return U, mx, P
此处没有直接通过U x-mx (x-mx)^T的特征矩阵方式求 而是采用了一种减少计算量 以
x-mx ^T(x-mx)入手其推导如下
3.测试图像识别
def pca_Recognize(testImagePath,U,mx,P): # 取特征矩阵列数 作为训练次数 _,trainNumber np.shape(U) # projectImage为训练集图片 P存储整个训练集图片矩阵 U为其协方差矩阵的特征矩阵 projectImage U.T * (P) # 测试图片的读取 imdecode可以看出哦imread此处用来处理中文字符 cv2.IMREAD_GRAYSCALE灰度图片读取 testImageArray cv2.imdecode(np.fromfile(testImagePath, dtype np.uint8), cv2.IMREAD_GRAYSCALE) # 大小设置保持与测试集一致 testImageArray cv2.resize(testImageArray, img_size) # 将其转化为1-D的形式 用于和projectImage中的 图片数量-D中的挨个进行比较距离大小 testImageArray testImageArray.reshape(testImageArray.size, 1) # 转化为矩阵形式 testImageArray np.mat(testImageArray) # 通过传入的mx,U对测试集图像进行同样的处理 # 均值化处理 differenceTestImage testImageArray - mx # k-l变换的到处理后的测试图像 projectTestImage U.T * differenceTestImage # 距离记录 distance [] for i in range(0,trainNumber): # 挨个取出每个测试集图片参数q q projectImage[:,i] # 比较训练集和测试集距离大小 temp np.linalg.norm(projectTestImage - q) # 记录距离 distance.append(temp) # 取得最小距离 minDistance min(distance) # 取得最小距离对应的index index distance.index(minDistance) # 展示测试集数据图像 cv2.imshow( test data ,cv2.imread(testImagePath,cv2.IMREAD_GRAYSCALE)) # 展示输出集合测试图像 cv2.imshow( recognize result , cv2.imread( ./TrainDatabase / str(index 1) .jpg , cv2.IMREAD_GRAYSCALE)) # 循环记录为从0开始 图片命名从1开始 故此处为index 1 return index 14.测试集数据输入矩阵X
1 测试集、训练集目录文件结构
项目目录
测试集文件
训练集文件
2 具体代码
def load_Data(path): train_file_path os.listdir(path) #读取文件数 file_number len(train_file_path) T [] for i in range(1, file_number 1): ip path / str(i) .jpg # 灰度化处理 image cv2.imread(ip, cv2.IMREAD_GRAYSCALE) # 保持测试集训练集图像大小一致 image cv2.resize(image, img_size) # 将其转换为1-D的形式 image image.reshape(image.size, 1) T.append(image) # 转换为矩阵形式 T np.array(T) T T.reshape(T.shape[0], T.shape[1]) # 取转置 return np.mat(T).T5.主程序
import os import numpy as np import cv2 if __name__ __main__ : X load_Data( TrainDatabase ) # kl转换得到相关参数 U,mx,P kl_Transform(X) for i in range(1, 11): testImagePath ./TestDatabase / str(i) .jpg pca_Recognize(testImagePath, U, mx,P) cv2.waitKey(0)6.总结
只是简单的学习 大体上还是前辈大佬们的代码 有问题的地方还是希望大佬们多多指教 看这个真的让我明白了数学的重要性 数学不好一切白搭 心累。



