Ankit93's picture
Add application file
29572ad
Raw
History Blame Contribute Delete
3.36 kB
import cv2
import numpy as np
import mtcnn
from src.faceRecognize.facerec.architecture import *
from src.faceRecognize.facerec.train_v2 import normalize,l2_normalizer
from scipy.spatial.distance import cosine
#from keras.models import load_model
import pickle
from src.faceRecognize.facerec.mobilenet import *
confidence_t=0.99
recognition_t=0.5
required_size = (160,160)
def get_face(img, box):
x1, y1, width, height = box
x1, y1 = abs(x1), abs(y1)
x2, y2 = x1 + width, y1 + height
face = img[y1:y2, x1:x2]
return face, (x1, y1), (x2, y2)
def get_encode(face_encoder, face, size):
face = normalize(face)
face = cv2.resize(face, size)
encode = face_encoder.predict(np.expand_dims(face, axis=0))[0]
return encode
def load_pickle(path):
with open(path, 'rb') as f:
encoding_dict = pickle.load(f)
return encoding_dict
def no_detect(img ,detector,encoder,encoding_dict):
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = detector.detect_faces(img_rgb)
try:
for res in results:
face, pt_1, pt_2 = get_face(img_rgb, res['box'])
cv2.rectangle(img, pt_1, pt_2, (0, 0, 255), 2)
except:
pass
return img
def detect(img ,detector,encoder,encoding_dict):
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = detector.detect_faces(img_rgb)
for res in results:
if res['confidence'] < confidence_t:
continue
face, pt_1, pt_2 = get_face(img_rgb, res['box'])
encode = get_encode(encoder, face, required_size)
encode = l2_normalizer.transform(encode.reshape(1, -1))[0]
name = 'unknown'
distance = float("inf")
for db_name, db_encode in encoding_dict.items():
dist = cosine(db_encode, encode)
if dist < recognition_t and dist < distance:
name = db_name
distance = dist
if name == 'unknown':
cv2.rectangle(img, pt_1, pt_2, (0, 0, 255), 2)
cv2.putText(img, name, pt_1, cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 1)
else:
cv2.rectangle(img, pt_1, pt_2, (0, 255, 0), 2)
cv2.putText(img, name + f'_{1-distance:.2f}', (pt_1[0], pt_1[1] - 5), cv2.FONT_HERSHEY_SIMPLEX, 1,
(0, 200, 200), 2)
return img
if __name__ == "__main__":
required_shape = (160,160)
face_encoder = InceptionResNetV2()
path_m = "./faceRecognize/facerec/weights/facenet_keras_weights.h5"
face_encoder.load_weights(path_m)
#face_encoder = build_mobilenetv2(3)
encodings_path = './faceRecognize/facerec/encodings/encodings.pkl'
face_detector = mtcnn.MTCNN()
encoding_dict = load_pickle(encodings_path)
COUNT = 0
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret,frame = cap.read()
if not ret:
print("CAM NOT OPEND")
break
frame = detect(frame , face_detector , face_encoder , encoding_dict)
# if COUNT%2==0:
# frame = detect(frame , face_detector , face_encoder , encoding_dict)
# else:
# #frame = no_detect(frame , face_detector , face_encoder , encoding_dict)
# pass
cv2.imshow('camera', frame)
COUNT+=1
if cv2.waitKey(1) & 0xFF == ord('q'):
break