栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python+Opencv实现简单PCA人脸识别

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python+Opencv实现简单PCA人脸识别

基本原理 人脸识别-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 1
4.测试集数据输入矩阵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).T
 5.主程序
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.总结

只是简单的学习 大体上还是前辈大佬们的代码 有问题的地方还是希望大佬们多多指教 看这个真的让我明白了数学的重要性 数学不好一切白搭 心累。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267330.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号