├── reconocido.png ├── entrenamiento.png ├── .gitignore ├── listaPermitidos.py ├── capture.py ├── README.md └── reconocimiento.py /reconocido.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futurelabmx/FaceRecognition2/master/reconocido.png -------------------------------------------------------------------------------- /entrenamiento.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futurelabmx/FaceRecognition2/master/entrenamiento.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compilados # 2 | 3 | *.class 4 | *.dll 5 | *.pyc 6 | 7 | # paquetes # 8 | 9 | *.zip 10 | *.dmg 11 | *.rar 12 | 13 | # Generados por el sistema operativo # 14 | 15 | .DS_Store 16 | .Trashes 17 | .Thumbs.db 18 | 19 | # Datos sensibles # 20 | 21 | credentials.py 22 | 23 | # directorios # 24 | 25 | /__pycache__/* 26 | /att_faces/* 27 | 28 | # imagenes # 29 | 30 | *.jpg -------------------------------------------------------------------------------- /listaPermitidos.py: -------------------------------------------------------------------------------- 1 | class flabianos: 2 | """ Lista de invitados a la cena del señor en el laboratorio """ 3 | 4 | def __init__(self): 5 | self.Invitados=['Luis Sustaita','Ricardo Mirón Torres', 6 | 'Aldo Fernando Olmeda','Paco López Ortiz','Oliver A. López', 7 | 'MD Diaz','Cristofer Nava','Miguel Aguirre','Polo A. Ruiz','Rodolfo Ferro', 8 | 'Juan Manuel Rocha','Ernesto Ramírez de Sancristobal', 9 | 'Adolfo Ramírez de Sancristobal','Omar Jair Purata Funes', 10 | 'Anthony Stark','Daniel PV','Jonathan Ivan'] 11 | 12 | def TuSiTuNo(self,EllosSi): 13 | if EllosSi in self.Invitados: 14 | print('Bienvenido {}'.format(EllosSi)) 15 | else: 16 | print('Lo siento {}, aun no trais el omnitrix'.format(EllosSi)) 17 | -------------------------------------------------------------------------------- /capture.py: -------------------------------------------------------------------------------- 1 | #OpenCV module 2 | import cv2 3 | #Modulo para leer directorios y rutas de archivos 4 | import os 5 | #OpenCV trabaja con arreglos de numpy 6 | import numpy 7 | #Obtener el nombre de la persona que estamos capturando 8 | import sys 9 | nombre = sys.argv[1] 10 | 11 | #Directorio donde se encuentra la carpeta con el nombre de la persona 12 | dir_faces = 'att_faces/orl_faces' 13 | path = os.path.join(dir_faces, nombre) 14 | 15 | #Tamaño para reducir a miniaturas las fotografias 16 | size = 4 17 | 18 | #Si no hay una carpeta con el nombre ingresado entonces se crea 19 | if not os.path.isdir(path): 20 | os.mkdir(path) 21 | 22 | #cargamos la plantilla e inicializamos la webcam 23 | face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 24 | cap = cv2.VideoCapture(0) 25 | 26 | img_width, img_height = 112, 92 27 | 28 | #Ciclo para tomar fotografias 29 | count = 0 30 | while count < 100: 31 | #leemos un frame y lo guardamos 32 | rval, img = cap.read() 33 | img = cv2.flip(img, 1, 0) 34 | 35 | #convertimos la imagen a blanco y negro 36 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 37 | 38 | #redimensionar la imagen 39 | mini = cv2.resize(gray, (int(gray.shape[1] / size), int(gray.shape[0] / size))) 40 | 41 | """buscamos las coordenadas de los rostros (si los hay) y 42 | guardamos su posicion""" 43 | faces = face_cascade.detectMultiScale(mini) 44 | faces = sorted(faces, key=lambda x: x[3]) 45 | 46 | if faces: 47 | face_i = faces[0] 48 | (x, y, w, h) = [v * size for v in face_i] 49 | face = gray[y:y + h, x:x + w] 50 | face_resize = cv2.resize(face, (img_width, img_height)) 51 | 52 | #Dibujamos un rectangulo en las coordenadas del rostro 53 | cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3) 54 | #Ponemos el nombre en el rectagulo 55 | cv2.putText(img, nombre, (x - 10, y - 10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0)) 56 | 57 | #El nombre de cada foto es el numero del ciclo 58 | #Obtenemos el nombre de la foto 59 | #Despues de la ultima sumamos 1 para continuar con los demas nombres 60 | pin=sorted([int(n[:n.find('.')]) for n in os.listdir(path) 61 | if n[0]!='.' ]+[0])[-1] + 1 62 | 63 | #Metemos la foto en el directorio 64 | cv2.imwrite('%s/%s.png' % (path, pin), face_resize) 65 | 66 | #Contador del ciclo 67 | count += 1 68 | 69 | #Mostramos la imagen 70 | cv2.imshow('OpenCV Entrenamiento de '+nombre, img) 71 | 72 | #Si se presiona la tecla ESC se cierra el programa 73 | key = cv2.waitKey(10) 74 | if key == 27: 75 | cv2.destroyAllWindows() 76 | break 77 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Reconocimiento facial con OPENCV 2 | Mediante el uso de un script aprenderemos las caras que nos interesen y con otro script arrancaremos la función de reconocimiento. 3 | 4 | OPENCV tiene 3 metodos incorporados para realizar reconocimiento facial, y porque **#Python** podemos usar cualquiera de ellos solo cambiando una linea de codigo. Aqui los 3 metodos y como llamarlos: 5 | 6 | 1. EigenFaces – cv2.face.EigenFaceRecognizer_create() 7 | 2. FisherFaces – cv2.face.FisherFaceRecognizer_create() 8 | 3. Local Binary Patterns Histograms (LBPH) – cv2.face.LBPHFaceRecognizer_create() 9 | 10 | Cada uno resalta componentes principales diferentes, es cuestion de elegir el adecuado de acuerdo a las necesidades de cada proyecto. 11 | 12 | | **EigenFaces** | **FisherFaces** | **LBPH** | 13 | | :-------: | :------: | :-----: | 14 | | ||| 15 | 16 | # Como usar la herramienta 17 | Para empezar deberemos instalar OpenCV junto con todas sus dependencias ⚠ Numpy y contrib son importantes ⚠ 18 | ~~~ 19 | pip install opencv-contrib-python 20 | ~~~ 21 | 22 | Posteriormente para guardar las fotos de entrenamiento para el modelo, nos descargaremos una pequeña BD de caras para que tenga mejor precisión y a la que añadiremos nuestra cara o las que nos interesen. Nos bajamos la BD de ejemplo de la Database of Faces de AT&T Laboratories Cambridge, descomprimimos la carpeta, dentro de ella creamos una mas llamada orl_faces y dentro de esa creamos una carpeta con el nombre de las caras que queremos reconocer. La ruta seria algo como esto: 23 | ~~~ 24 | carpeta_de_proyecto\att_faces\orl_faces\luis_sustaita 25 | carpeta_de_proyecto\att_faces\orl_faces\antonio_smith 26 | carpeta_de_proyecto\att_faces\orl_faces\ricardo_ferro 27 | carpeta_de_proyecto\att_faces\orl_faces\rodolfo_miron 28 | ~~~ 29 | 30 | De los scripts uno será para aprender caras (capture.py) y el otro para reconocerlas (reconocimiento.py). 31 | 32 | El primero de ellos es simple: busca una cara, toma una foto de ella y la guarda en la carpeta correspondiente. 33 | ~~~ 34 | python capture.py nombrePersona 35 | ~~~ 36 | 37 | 38 | - ⚠Ten en cuenta que el nombre de la persona es el mismo que pusiste en el nombre de su carpeta. 39 | 40 | - 👌Por default el script toma 100 fotos del rostro, pero recuerda que entre mayor sea el entrenamiento mejores reultados se obtendran. 41 | 42 | - ☝Trata de que solo una parsona aparezca en la escena para no guardar otros rostros con la misma etiqueta o nombre. 43 | 44 | Para comenzar a detectar y reconocer caras: 45 | ~~~ 46 | python reconocimiento.py 47 | ~~~ 48 | - Puedes cambiar el metodo de reconocimiento por caulquiera de los 3 mencionados al inicio, prueba los 3 y checa cual te da mejores resultados. 49 | 50 | 51 | -------------------------------------------------------------------------------- /reconocimiento.py: -------------------------------------------------------------------------------- 1 | #OpenCV module 2 | import cv2 3 | #Modulo para leer directorios y rutas de archivos 4 | import os 5 | #OpenCV trabaja con arreglos de numpy 6 | import numpy 7 | #Se importa la lista de personas con acceso al laboratorio 8 | from listaPermitidos import flabianos 9 | flabs=flabianos() 10 | 11 | # Parte 1: Creando el entrenamiento del modelo 12 | print('Formando...') 13 | 14 | #Directorio donde se encuentran las carpetas con las caras de entrenamiento 15 | dir_faces = 'att_faces/orl_faces' 16 | 17 | #Tamaño para reducir a miniaturas las fotografias 18 | size = 4 19 | 20 | # Crear una lista de imagenes y una lista de nombres correspondientes 21 | (images, lables, names, id) = ([], [], {}, 0) 22 | for (subdirs, dirs, files) in os.walk(dir_faces): 23 | for subdir in dirs: 24 | names[id] = subdir 25 | subjectpath = os.path.join(dir_faces, subdir) 26 | for filename in os.listdir(subjectpath): 27 | path = subjectpath + '/' + filename 28 | lable = id 29 | images.append(cv2.imread(path, 0)) 30 | lables.append(int(lable)) 31 | id += 1 32 | (im_width, im_height) = (112, 92) 33 | 34 | # Crear una matriz Numpy de las dos listas anteriores 35 | (images, lables) = [numpy.array(lis) for lis in [images, lables]] 36 | # OpenCV entrena un modelo a partir de las imagenes 37 | model = cv2.face.LBPHFaceRecognizer_create() 38 | model.train(images, lables) 39 | 40 | 41 | # Parte 2: Utilizar el modelo entrenado en funcionamiento con la camara 42 | face_cascade = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml') 43 | cap = cv2.VideoCapture(0) 44 | 45 | while True: 46 | #leemos un frame y lo guardamos 47 | rval, frame = cap.read() 48 | frame=cv2.flip(frame,1,0) 49 | 50 | #convertimos la imagen a blanco y negro 51 | gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 52 | 53 | #redimensionar la imagen 54 | mini = cv2.resize(gray, (int(gray.shape[1] / size), int(gray.shape[0] / size))) 55 | 56 | """buscamos las coordenadas de los rostros (si los hay) y 57 | guardamos su posicion""" 58 | faces = face_cascade.detectMultiScale(mini) 59 | 60 | for i in range(len(faces)): 61 | face_i = faces[i] 62 | (x, y, w, h) = [v * size for v in face_i] 63 | face = gray[y:y + h, x:x + w] 64 | face_resize = cv2.resize(face, (im_width, im_height)) 65 | 66 | # Intentado reconocer la cara 67 | prediction = model.predict(face_resize) 68 | 69 | #Dibujamos un rectangulo en las coordenadas del rostro 70 | cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3) 71 | 72 | # Escribiendo el nombre de la cara reconocida 73 | # La variable cara tendra el nombre de la persona reconocida 74 | cara = '%s' % (names[prediction[0]]) 75 | 76 | #Si la prediccion tiene una exactitud menor a 100 se toma como prediccion valida 77 | if prediction[1]<100 : 78 | #Ponemos el nombre de la persona que se reconoció 79 | cv2.putText(frame,'%s - %.0f' % (cara,prediction[1]),(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0)) 80 | 81 | #En caso de que la cara sea de algun conocido se realizara determinadas accione 82 | #Busca si los nombres de las personas reconocidas estan dentro de los que tienen acceso 83 | #flabs.TuSiTuNo(cara) 84 | 85 | #Si la prediccion es mayor a 100 no es un reconomiento con la exactitud suficiente 86 | elif prediction[1]>101 and prediction[1]<500: 87 | #Si la cara es desconocida, poner desconocido 88 | cv2.putText(frame, 'Desconocido',(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0)) 89 | 90 | #Mostramos la imagen 91 | cv2.imshow('OpenCV Reconocimiento facial', frame) 92 | 93 | #Si se presiona la tecla ESC se cierra el programa 94 | key = cv2.waitKey(10) 95 | if key == 27: 96 | cv2.destroyAllWindows() 97 | break 98 | --------------------------------------------------------------------------------