ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

人脸识别代码

2021-09-24 14:35:16  阅读:256  来源: 互联网

标签:人脸识别 testX 代码 face faces import data pixels


一、加载图片数据

 from os import listdir
 from os.path import isdir
 from PIL import Image
 from matplotlib import pyplot
 from numpy import savez_compressed
 from numpy import asarray
 from mtcnn.mtcnn import MTCNN
 ​
 ​
 def extract_face(filename, required_size=(160, 160)):
 ​
     image = Image.open(filename)
 ​
     image = image.convert('RGB')
 ​
     pixels = asarray(image)
 ​
     detector = MTCNN()
 ​
     results = detector.detect_faces(pixels)
 ​
     x1, y1, width, height = results[0]['box']
 ​
     x1, y1 = abs(x1), abs(y1)
     x2, y2 = x1 + width, y1 + height
 ​
     face = pixels[y1:y2, x1:x2]
 ​
     image = Image.fromarray(face)
     image = image.resize(required_size)
     face_array = asarray(image)
     return face_array
 ​
 ​
 def load_faces(directory):
     faces = list()
     for filename in listdir(directory):
 ​
         path = directory + filename
 ​
         face = extract_face(path)
 ​
         faces.append(face)
     return faces
 ​
 ​
 def load_dataset(directory):
     X, y = list(), list()
 ​
     for subdir in listdir(directory):
 ​
         path = directory + subdir + '/'
 ​
         if not isdir(path):
             continue
 ​
         faces = load_faces(path)
 ​
         labels = [subdir for _ in range(len(faces))]
 ​
         print('>loaded %d examples for class: %s' % (len(faces), subdir))
 ​
         X.extend(faces)
         y.extend(labels)
     return asarray(X), asarray(y)
 ​
 ​
 trainX, trainy = load_dataset('5-celebrity-faces-dataset/train/')
 print(trainX.shape, trainy.shape)
 ​
 testX, testy = load_dataset('5-celebrity-faces-dataset/val/')
 ​
 savez_compressed('5-celebrity-faces-dataset.npz', trainX, trainy, testX, testy)

二、提取图片特征

 from numpy import load
 from numpy import expand_dims
 from numpy import asarray
 from numpy import savez_compressed
 from keras.models import load_model
 ​
 ​
 def get_embedding(model, face_pixels):
 ​
     face_pixels = face_pixels.astype('float32')
 ​
     mean, std = face_pixels.mean(), face_pixels.std()
 ​
     face_pixels = (face_pixels - mean) / std
 ​
     samples = expand_dims(face_pixels, axis=0)
 ​
     yhat = model.predict(samples)
 ​
     return yhat[0]
 ​
 ​
 ​
 data = load('5-celebrity-faces-dataset.npz')
 ​
 trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3']
 ​
 print('Loaded: ', trainX.shape, trainy.shape, testX.shape, testy.shape)
 ​
 model = load_model('facenet_keras.h5')
 print('Loaded Model')
 ​
 newTrainX = list()
 for face_pixels in trainX:
     embedding = get_embedding(model, face_pixels)
     newTrainX.append(embedding)
 newTrainX = asarray(newTrainX)
 print(newTrainX.shape)
 ​
 newTestX = list()
 for face_pixels in testX:
     embedding = get_embedding(model, face_pixels)
     newTestX.append(embedding)
 newTestX = asarray(newTestX)
 print(newTestX.shape)
 # save arrays to one file in compressed format
 savez_compressed('5-celebrity-faces-embeddings.npz', newTrainX, trainy, newTestX, testy)

三、识别

 from numpy import load
 from sklearn.metrics import accuracy_score
 from sklearn.preprocessing import LabelEncoder
 from sklearn.preprocessing import Normalizer
 from sklearn.svm import SVC
 ​
 ​
 data = load('5-celebrity-faces-embeddings.npz')
 trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3']
 print('Dataset: train=%d, test=%d' % (trainX.shape[0], testX.shape[0]))
 # normalize input vectors
 in_encoder = Normalizer(norm='l2')
 trainX = in_encoder.transform(trainX)
 testX = in_encoder.transform(testX)
 # label encode targets
 out_encoder = LabelEncoder()
 out_encoder.fit(trainy)
 trainy = out_encoder.transform(trainy)
 testy = out_encoder.transform(testy)
 # fit model
 model = SVC(kernel='linear', probability=True)
 model.fit(trainX, trainy)
 # predict
 yhat_train = model.predict(trainX)
 yhat_test = model.predict(testX)
 # score
 score_train = accuracy_score(trainy, yhat_train)
 score_test = accuracy_score(testy, yhat_test)
 # summarize
 print('Accuracy: train=%.3f, test=%.3f' % (score_train*100, score_test*100))
 from random import choice
 from numpy import load
 from numpy import expand_dims
 from sklearn.preprocessing import LabelEncoder
 from sklearn.preprocessing import Normalizer
 from sklearn.svm import SVC
 from matplotlib import pyplot
 ​
 data = load('5-celebrity-faces-dataset.npz')
 testX_faces = data['arr_2']
 ​
 data = load('5-celebrity-faces-embeddings.npz')
 trainX, trainy, testX, testy = data['arr_0'], data['arr_1'], data['arr_2'], data['arr_3']
 ​
 in_encoder = Normalizer(norm='l2')
 trainX = in_encoder.transform(trainX)
 testX = in_encoder.transform(testX)
 ​
 out_encoder = LabelEncoder()
 out_encoder.fit(trainy)
 trainy = out_encoder.transform(trainy)
 testy = out_encoder.transform(testy)
 ​
 model = SVC(kernel='linear', probability=True)
 model.fit(trainX, trainy)
 ​
 selection = choice([i for i in range(testX.shape[0])])
 random_face_pixels = testX_faces[selection]
 random_face_emb = testX[selection]
 random_face_class = testy[selection]
 random_face_name = out_encoder.inverse_transform([random_face_class])
 ​
 samples = expand_dims(random_face_emb, axis=0)
 yhat_class = model.predict(samples)
 yhat_prob = model.predict_proba(samples)
 ​
 class_index = yhat_class[0]
 class_probability = yhat_prob[0,class_index] * 100
 predict_names = out_encoder.inverse_transform(yhat_class)
 print('Predicted: %s (%.3f)' % (predict_names[0], class_probability))
 print('Expected: %s' % random_face_name[0])
 ​
 pyplot.imshow(random_face_pixels)
 title = '%s (%.3f)' % (predict_names[0], class_probability)
 pyplot.title(title)
 pyplot.show()

 

标签:人脸识别,testX,代码,face,faces,import,data,pixels
来源: https://www.cnblogs.com/mtgold/p/15330233.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有