├── 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 |
--------------------------------------------------------------------------------