13nishit's picture
Upload 25 files
aa77e96
from my_face_recognition import f_face_recognition as rec_face
from my_face_recognition import f_storage as st
import traceback
import numpy as np
import cv2
#------------------------ Inicia el flujo principal ----------------------------
class rec():
def __init__(self):
'''
-db_names: [name1,name2,...,namen] lista de strings
-db_features: array(array,array,...,array) cada array representa las caracteriticas de un usuario
'''
self.db_names, self.db_features = st.load_images_to_database()
def recognize_face(self,im):
'''
Input:
-imb64: imagen
Output:
res:{'status': si todo sale bien es 'ok' en otro caso devuelve el erroe encontrado
'faces': [(y0,x1,y1,x0),(y0,x1,y1,x0),...,(y0,x1,y1,x0)] ,cada tupla representa un rostro detectado
'names': ['name', 'unknow'] lista con los nombres que hizo match}
'''
try:
# detectar rostro
box_faces = rec_face.detect_face(im)
# condiconal para el caso de que no se detecte rostro
if not box_faces:
res = {
'status':'ok',
'faces':[],
'names':[]}
return res
else:
if not self.db_names:
res = {
'status':'ok',
'faces':box_faces,
'names':['unknow']*len(box_faces)}
return res
else:
# (continua) extraer features
actual_features = rec_face.get_features(im,box_faces)
# comparar actual_features con las que estan almacenadas en la base de datos
match_names = rec_face.compare_faces(actual_features,self.db_features,self.db_names)
# guardar
res = {
'status':'ok',
'faces':box_faces,
'names':match_names}
return res
except Exception as ex:
error = ''.join(traceback.format_exception(etype=type(ex), value=ex, tb=ex.__traceback__))
res = {
'status':'error: ' + str(error),
'faces':[],
'names':[]}
return res
def recognize_face2(self,im,box_faces):
try:
if not self.db_names:
res = 'unknow'
return res
else:
# (continua) extraer features
actual_features = rec_face.get_features(im,box_faces)
# comparar actual_features con las que estan almacenadas en la base de datos
match_names = rec_face.compare_faces(actual_features,self.db_features,self.db_names)
# guardar
res = match_names
return res
except:
res = []
return res
def bounding_box(img,box,match_name=[]):
for i in np.arange(len(box)):
x0,y0,x1,y1 = box[i]
img = cv2.rectangle(img,
(x0,y0),
(x1,y1),
(0,255,0),3);
if not match_name:
continue
else:
cv2.putText(img, match_name[i], (x0, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2)
return img
if __name__ == "__main__":
import argparse
parse = argparse.ArgumentParser()
parse.add_argument("-im","--path_im",help="path image")
parse = parse.parse_args()
path_im = parse.path_im
im = cv2.imread(path_im)
# instancio detector
recognizer = rec()
res = recognizer.recognize_face(im)
im = bounding_box(im,res["faces"],res["names"])
cv2.imshow("face recogntion", im)
cv2.waitKey(0)
print(res)