opencv 学习人脸识别
2018-03-27 10:02
302 查看
人脸数据库链接:AR人脸库(包含50位男性和50位女性每人26张人脸共2600张人脸图片 ):http://www.datatang.com/data/46195ORL人脸库(包含40个人的每人10张人脸的共400张人脸):http://www.cl.cam.ac.uk/Research/DTG/attarchive:pub/data/att_faces.tar.Zhttp://www.cl.cam.ac.uk/Research/DTG/attarchive:pub/data/att_faces.zip
import numpy as np
import os, glob, random, cv2
def pca(data,k):
data = np.float32(np.mat(data))
rows,cols = data.shape #取大小
data_mean = np.mean(data,0) #求均值
Z = data - np.tile(data_mean,(rows,1))
D,V = np.linalg.eig(Z*Z.T ) #特征值与特征向量
V1 = V[:, :k] #取前k个特征向量
V1 = Z.T*V1
for i in xrange(k): #特征向量归一化
V1[:,i] /= np.linalg.norm(V1[:,i]) #求范数
return np.array(Z*V1),data_mean,V1
def loadImageSet(folder=u'./att_faces', sampleCount=5): #加载图像集,随机选择sampleCount张图片用于训练
trainData = []; testData = []; yTrain=[]; yTest = [];
for k in range(40):
folder2 = os.path.join(folder, 's%d' % (k+1)) #glob.glob返回所有匹配的文件路径列表。它只有一个参数pathname
data = [cv2.imread(d.encode('gbk'),0) for d in glob.glob(os.path.join(folder2, '*.pgm'))]
sample = random.sample(range(10), sampleCount)
trainData.extend([data[i].ravel() for i in range(10) if i in sample])
testData.extend([data[i].ravel() for i in range(10) if i not in sample])
yTest.extend([k]* (10-sampleCount))
yTrain.extend([k]* sampleCount)
return np.array(trainData), np.array(yTrain), np.array(testData), np.array(yTest)
def main():
xTrain_, yTrain, xTest_, yTest = loadImageSet()
num_train, num_test = xTrain_.shape[0], xTest_.shape[0]
xTrain,data_mean,V = pca(xTrain_, 50)
xTest = np.array((xTest_-np.tile(data_mean,(num_test,1))) * V) #得到测试脸在特征向量下的数据
yPredict =[yTrain[np.sum((xTrain-np.tile(d,(num_train,1)))**2, 1).argmin()] for d in xTest]
print u'欧式距离法识别率: %.2f%%'% ((yPredict == np.array(yTest)).mean()*100)
if __name__ =='__main__':
main()
import numpy as np
import os, glob, random, cv2
def pca(data,k):
data = np.float32(np.mat(data))
rows,cols = data.shape #取大小
data_mean = np.mean(data,0) #求均值
Z = data - np.tile(data_mean,(rows,1))
D,V = np.linalg.eig(Z*Z.T ) #特征值与特征向量
V1 = V[:, :k] #取前k个特征向量
V1 = Z.T*V1
for i in xrange(k): #特征向量归一化
V1[:,i] /= np.linalg.norm(V1[:,i]) #求范数
return np.array(Z*V1),data_mean,V1
def loadImageSet(folder=u'./att_faces', sampleCount=5): #加载图像集,随机选择sampleCount张图片用于训练
trainData = []; testData = []; yTrain=[]; yTest = [];
for k in range(40):
folder2 = os.path.join(folder, 's%d' % (k+1)) #glob.glob返回所有匹配的文件路径列表。它只有一个参数pathname
data = [cv2.imread(d.encode('gbk'),0) for d in glob.glob(os.path.join(folder2, '*.pgm'))]
sample = random.sample(range(10), sampleCount)
trainData.extend([data[i].ravel() for i in range(10) if i in sample])
testData.extend([data[i].ravel() for i in range(10) if i not in sample])
yTest.extend([k]* (10-sampleCount))
yTrain.extend([k]* sampleCount)
return np.array(trainData), np.array(yTrain), np.array(testData), np.array(yTest)
def main():
xTrain_, yTrain, xTest_, yTest = loadImageSet()
num_train, num_test = xTrain_.shape[0], xTest_.shape[0]
xTrain,data_mean,V = pca(xTrain_, 50)
xTest = np.array((xTest_-np.tile(data_mean,(num_test,1))) * V) #得到测试脸在特征向量下的数据
yPredict =[yTrain[np.sum((xTrain-np.tile(d,(num_train,1)))**2, 1).argmin()] for d in xTest]
print u'欧式距离法识别率: %.2f%%'% ((yPredict == np.array(yTest)).mean()*100)
if __name__ =='__main__':
main()
相关文章推荐
- opencv学习-Cascade Classifier-人脸人眼识别
- 【OpenCV学习笔记 022】人脸识别 小试牛刀
- 学习OpenCV——行人识别&人脸识别(总算运行出来了)
- 接深度学习,opencv人脸识别,目标检测等项目
- Opencv学习(人脸识别)
- opencv学习-pca人脸识别
- OpenCV学习:人脸识别 简单程序
- OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读
- 人脸识别《一》opencv人脸识别之收集人脸并学习
- OpenCV学习记录(一):使用haar分类器进行人脸识别
- OpenCV学习 物体检测 人脸识别 填充颜色
- python3.6.3+opencv3.3.0学习笔记八--本地视频人脸识别后另存
- Opencv 入门学习之图片人脸识别
- opencv学习-建立人脸识别分类器
- OpenCV Python 学习笔记(五) 人脸识别
- opencv 学习之简单人脸识别学习
- ios学习之基于 OpenCV的人脸识别
- 【OpenCV学习笔记 014】人脸人眼识别
- OpenCV学习笔记[3]Java Demo人脸识别
- 学习Opencv, 人脸识别, 图片来自百度