Skip to content
Binary file removed face-recognition/data/train/barack_obama/1.jpg
Binary file not shown.
Binary file removed face-recognition/data/train/barack_obama/22.jpg
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file removed face-recognition/data/train/bill_gates/0.jpg
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed face-recognition/data/train/steve_jobs/0.jpg
Diff not rendered.
Binary file removed face-recognition/data/train/steve_jobs/1.jpg
Diff not rendered.
Binary file removed face-recognition/data/train/taylor_swift/0.jpg
Diff not rendered.
Binary file removed face-recognition/data/val/barack_obama/222.jpeg
Diff not rendered.
Binary file removed face-recognition/data/val/ben_afflek/33.jpg
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed face-recognition/data/val/ben_afflek/test.jpg
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Binary file removed face-recognition/data/val/steve_jobs/aa.jpg
Diff not rendered.
Binary file removed face-recognition/face_embeds_dataset.npz
Binary file not shown.
87 changes: 87 additions & 0 deletions face-recognition/face_recog.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import os
import os.path
import numpy as np
from numpy import expand_dims
from keras.models import load_model
from mtcnn import MTCNN
import cv2

def get_face(file):
IMAGE_SIZE = (160,160)
detector = MTCNN()
try:
img = cv2.cvtColor(cv2.imread(file),cv2.COLOR_BGR2RGB)
faces = detector.detect_faces(img)
if len(faces) < 1:
print('No faces detected')
return None
x,y,width,height = faces[0]["box"]
cropped = cv2.resize(img[y:y+height,x:x+width],IMAGE_SIZE)
return cropped
except:
return None



def get_face_frame(frame):
detector = MTCNN()
faces = detector.detect_faces(frame)
if len(faces) < 1:
print('No faces detected')
return None
return faces

def format_face_frame(faces,frame):
IMAGE_SIZE = (160,160)
x,y,width,height = faces[0]["box"]
cropped = cv2.resize(frame[y:y+height,x:x+width],IMAGE_SIZE)
return cropped

#standardize pixel values

def prewhiten(x):
if x.ndim == 4:
axis = (1, 2, 3)
size = x[0].size
elif x.ndim == 3:
axis = (0, 1, 2)
size = x.size
else:
raise ValueError('Dimension should be 3 or 4')

mean = np.mean(x, axis=axis, keepdims=True)
std = np.std(x, axis=axis, keepdims=True)
std_adj = np.maximum(std, 1.0/np.sqrt(size))
y = (x - mean) / std_adj
return y

#normalize embedding vectors

def l2_normalize(x, axis=-1, epsilon=1e-10):
output = x / np.sqrt(np.maximum(np.sum(np.square(x), axis=axis, keepdims=True), epsilon))
return output

#returns a list of embeddings from the list of images passed in
#list of images must be of type np.ndarray
#model is loaded from facenet_keras.h5

def get_embeddings(imgs,model):
imgs = prewhiten(imgs)
raws = []
for raw in imgs:
img = expand_dims(raw,axis=0)
raws.append(model.predict(img))
embeds = l2_normalize(np.concatenate(raws))
return embeds

#return the distance between 2 embeddings

def get_euclidean_distance(emb1,emb2):
return np.linalg.norm(emb1-emb2)

def embed_to_string(embed):
return ",".join([str(i) for i in list(embed)])

def string_to_embed(string):
embed = np.array(string.split(","))
return embed.astype(np.float)
72 changes: 72 additions & 0 deletions face-recognition/face_register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import tkinter as tk
import threading
import numpy as np
import cv2
from tkinter import filedialog
from keras.models import load_model
from face_recog import *

def register_face():

cap = cv2.VideoCapture(0)
if cap is None or not cap.isOpened():
user_in = input("This device does not have a camera. Do you want to submit an image file instead?(y/n): ")
while user_in.lower() != "y" and user_in.lower() != "n":
user_in = input("This device does not have a camera. Do you want to submit an image file instead?(y/n): ")
if user_in == "n":
print("Error: could not get user's face, exiting...")
return None
else:
face = None
while cap.isOpened():
input("Look directly into the camera and press any button to take a picture...")
ret,frame = cap.read()
if ret == True:
face = get_face_frame(frame)
if face is not None:
face = format_face_frame(face,frame)
break
else:
user_in = None
while user_in.lower() != "y" and user_in.lower() != "n":
user_in = input("No faces detected, try again? (y/n): ")
if user_in == "n":
print("Error: could not get user's face, exiting...")
return None
else:
user_in = None
while user_in.lower() != "y" and user_in.lower() != "n":
user_in = input("No faces detected, try again? (y/n): ")
if user_in == "n":
print("Error: could not get user's face, exiting...")
return None
print("Found user's face, saving... (may take up to 1 minute)")
model = load_model("./facenet_keras.h5")
embed = get_embeddings(np.array([face]),model)
cap.release()
cv2.destroyAllWindows()
print("Successfully saved! exiting...")
return embed[0]


root = tk.Tk()
root.wm_attributes('-topmost',1)
root.withdraw()

face = None
while True:
file_path = filedialog.askopenfilename()
if file_path == "": break
face = get_face(file_path)
if face is not None: break
else: print("No face found, please try again.")
if face is None:
print("Error: could not get user's face, exiting...")
return None
else:
print("Found user's face, saving... (may take up to 1 minute)")
model = load_model("./facenet_keras.h5")
embed = get_embeddings(np.array([face]),model)
print("Successfully saved! exiting...")
return embed[0]

83 changes: 83 additions & 0 deletions face-recognition/face_submit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import cv2
import tkinter as tk
from tkinter import filedialog
from face_recog import *
from keras.models import load_model

# allows submitting a face through file upload
# for demonstration purposes only, should not be used in final build

def submit_face_tmp():
root = tk.Tk()
root.wm_attributes('-topmost',1)
root.withdraw()

face = None
while True:
file_path = filedialog.askopenfilename()
if file_path == "": break
face = get_face(file_path)
if face is not None: break
else: print("No face found, please try again.")
if face is None:
print("Error: could not get user's face, exiting...")
return None
else:
return face

# grab the user's face using screen capture

def get_face_from_camera(cap):

c = -1
face = None
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
cv2.imshow('frame',frame)
if c == 20 or c == -1:
face = get_face_frame(frame)
if face is not None:
face = format_face_frame(face,frame)
break
c = 0
if cv2.waitKey(1) & 0xFF == ord('q'):
break
c+=1

else:
break

# Release everything if job is finished
cap.release()
cv2.destroyAllWindows()
return face

def submit_face():
cap = cv2.VideoCapture(0)
if cap is None or not cap.isOpened():
face = submit_face_tmp()
if face is None:
print("Error: could not get user's face, exiting...")
return None
else:
print("Found user's face, saving... (may take up to 1 minute)")
model = load_model("./facenet_keras.h5")
embed = get_embeddings(np.array([face]),model)
print("Successfully saved! exiting...")
return embed[0]
# print("This node does not have a camera, exiting...")
# return None
input("Look directly at the camera. (Press any key to continue)")
print("Searching for face... (press Q to quit")
face = get_face_from_camera(cap)
if face is None:
print("Error: could not get user's face, exiting...")
return None
print("Found user's face, submitting... (may take up to 1 minute)")
model = load_model("./facenet_keras.h5")
embed = get_embeddings(np.array([face]),model)
print("Successfully submitted! exiting...")
return embed[0]


Loading