人脸识别代码

一、加载图片数据

 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()

 

上一篇:Opencv的人脸检测


下一篇:STL三角网格模型体积计算