Spaces:
Configuration error
Configuration error
| 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) |