人脸识别代码

人脸识别代码一、加载图片数据 from os import listdir from os.path import isdir from PIL import Image from matplotlib import pyplot from numpy import sa

人脸识别代码"

一、加载图片数据

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

 

今天的文章人脸识别代码分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/53491.html

(0)
编程小号编程小号
上一篇 2023-08-30
下一篇 2023-08-30

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注