? Reconocimiento Facial ? | Python – OpenCV
En este post veremos como realizar reconocimiento facial en Python usando OpenCV, para ello emplearemos: Eigenfaces, Fisherfaces y Local Binary Patterns Histograms.
Para poder llevar a cabo el reconocimiento facial, en primer lugar necesitaremos recolectar los datos, es decir los rostros de las personas que se desee reconocer, posteriormente entrenaremos el clasificador, para finalmente probarlo. Para todo este proceso será necesario usar la detección de rostros con haarcascades que habíamos visto en posts anteriores.
El objetivo de este post será proveer los pasos y código necesario para poder probar tú mismo esta aplicación, por lo que te dejaré los 3 programas que trataremos hoy y de igual manera podrás encontrarlos en mi repositorio en github.

CONTENIDO
- ¿Cuál es la diferencia entre detección y reconocimiento facial?
- Creando la base de datos de los rostros
- Preparando los datos para entrenar
- Entrenamiento del reconocedor
- EigenFaces
- EigenFaces en OpenCV, cv2.face.EigenFaceRecognizer_create()
- FisherFaces
- FisherFaces en OpenCV, cv2.face.FisherFaceRecognizer_create()
- Local Binary Patterns Histograms
- LBPH en OpenCV, cv2.face.LBPHFaceRecognizer_create()
- Entrenamiento (Código)
- Guardando el modelo obtenido
- EigenFaces
- Probando EigenFaces, FisherFaces y LBPH para el reconocimiento facial
- Probando EigenFaces
- Probando FisherFaces
- Probando LBPH
- Prueba extra en video directo (video streaming)
¿Cuál es la diferencia entre detección y reconocimiento facial?

Figura 1: Detección y reconocimiento facial.
Antes de pasar con el desarrollo de este post, es necesario entender la diferencia entre la detección y reconocimiento de rostros, ya que son términos que muchas veces se usan como si se refiriera a una misma acción.
La diferencia es simple, la detección de rostros busca caras dentro de una imagen o dentro fotogramas en caso de emplear un video. El reconocimiento facial en cambio emplea la detección de rostros y buscará identificar a la persona que le pertenece aquel rostro detectado.
Por lo tanto primero debemos emplear detección facial, y luego sobre el rostro detectado pasaremos al reconocimiento facial. Para esta último procedimiento se necesita que previamente se haya entrenado un clasificador de rostros de las personas que se deseen reconocer.
Creando la base de datos de los rostros
Para realizar el reconocimiento facial necesitaremos de los rostros de las personas que deseemos reconocer. Estos rostros deberán denotar variedad de expresiones como: felicidad, tristeza, aburrimiento, sorpresa, entre otros. Otro aspecto que deben tener estas imágenes es la variación de condiciones de luz, que las personas lleven lentes o que no los lleven, incluso que cierren los ojos o guiñen uno.
Es recomendable que se realice la recolección de estas imágenes en el escenario o ambiente en donde se vaya a aplicar el reconocimiento facial. Toda esta variedad de imágenes que se obtenga de los rostros contribuirá al desempeño de los algoritmos que usemos el día de hoy (y claro, según vayas experimentado podrás añadir o quitar algunas de estas condiciones que he nombrado).
Una pregunta que te debes estar haciendo es, ¿cuántos rostros por persona debo obtener para poder realizar el reconocimiento?. Pues bien, según mi percepción no hay una receta para saber cuantas imágenes, lo que si entre más y más variadas mejor.
Ahora vamos a pasar con el código, para ello estaré usando el programa del post anterior: ? ALMACENANDO ROSTROS ?? usando imágenes y video | Python – OpenCV, en especial el apartado de almacenar rostros desde un video. En este programa llamado capturandoRostros.py se almacenarán automáticamente 300 rostros dado un video, por ello he modificado un par de líneas de código la cuales explicaré, el resto del programa podrás revisarlo a profundidad en el post anteriormente citado.
import cv2
import os
import imutils
personName = 'Gaby'
dataPath = 'C:/Users/Gaby/Desktop/Reconocimiento Facial/Data'#Cambia a la ruta donde hayas almacenado Data
personPath = dataPath + '/' + personName
if not os.path.exists(personPath):
print('Carpeta creada: ',personPath)
os.makedirs(personPath)
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#cap = cv2.VideoCapture('Video.mp4')
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
count = 0
while True:
ret, frame = cap.read()
if ret == False: break
frame = imutils.resize(frame, width=640)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
auxFrame = frame.copy()
faces = faceClassif.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
rostro = auxFrame[y:y+h,x:x+w]
rostro = cv2.resize(rostro,(150,150),interpolation=cv2.INTER_CUBIC)
cv2.imwrite(personPath + '/rotro_{}.jpg'.format(count),rostro)
count = count + 1
cv2.imshow('frame',frame)
k = cv2.waitKey(1)
if k == 27 or count >= 300:
break
cap.release()
cv2.destroyAllWindows()
Línea 1 a 3: Importamos OpenCV, os e imutils.
Línea 5 a 7: En estas líneas crearemos una carpeta con el nombre de la persona que se desee reconocer, esta se creará dentro de la carpeta Data que ya había creado previamente de forma manual. Entonces en la línea 5 en personName se asigana el nombre de la persona, en la línea 6 se asigna a dataPath la ubicación del directorio donde se creará cada carpeta con el nombre de cada persona a reconocer. Finalmente personPath será la ruta completa.
Línea 9 a 11: Con la información de las líneas pasadas, se creará el directorio con el nombre de la persona a reconocer dentro de la carpeta Data. En el la línea 5 por ejemplo puedes ver que se creará una carpeta llamada ‘Gaby’, que tendrías que modificar de acuerdo a las personas que quieras identificar.
Línea 13 y 14: En la línea 13 indicamos que vamos a realizar un video en directo, mientras que en la línea 14 leeremos un video. Puedes usar cualquiera de estas dos líneas para poder capturar los rostros.
Línea 23: Estoy redimensionando con imutils.resize (para más información sobre esta función ve a este link), esto lo hago para redimensionar el tamaño de los fotogramas del video de entrada.
Línea 32: Se está redimensionando las imágenes correspondientes a los rostros para que todos posean el mismo tamaño. Yo he elegido 150 pixeles, pero podrías hacerlo con otro valor.
Línea 48: En esta línea he añadido la condición de count >= 300 para que el proceso de almacenamiento termine a los 300 rostros almacenados.
Para este procedimiento voy a leer un video de una amiga muy especial para mí llamada Brenda, y un video mío. Puedes ver el procedimiento de almacenamiento de los rostros en este enlace.

Preparando los datos para entrenar
Antes de proceder con el entrenamiento es necesario tener cada una de las imágenes con una etiqueta asociada a la persona a la que pertenecen los rostros. Por ello, por ejemplo cuando leamos la carpeta ‘Persona 1’ todas esas imágenes se les asignará etiqueta 0, luego a todas imágenes de los rostros de ‘Persona 2’ se asignará 1, de ‘Persona 3’ se asignará 2, y así sucesivamente. Con cada una de estas etiquetas le haremos saber al computador que las imágenes le corresponden a personas diferentes.

Figura 2: Ejemplo de rostros y etiquetas.
Entonces en otro script llamado entrenandoRF.py prepararemos este proceso, es decir las imágenes y etiquetas para poder entrenarlos empleando: Eigenfaces, fisherfaces y Local Binary Patterns Histograms.
import cv2
import os
import numpy as np
dataPath = 'C:/Users/Gaby/Desktop/Reconocimiento Facial/Data'#Cambia a la ruta donde hayas almacenado Data
peopleList = os.listdir(dataPath)
print('Lista de personas: ', peopleList)
labels = []
facesData = []
label = 0
for nameDir in peopleList:
personPath = dataPath + '/' + nameDir
print('Leyendo las imágenes')
for fileName in os.listdir(personPath):
print('Rostros: ', nameDir + '/' + fileName)
labels.append(label)
facesData.append(cv2.imread(personPath+'/'+fileName,0))
#image = cv2.imread(personPath+'/'+fileName,0)
#cv2.imshow('image',image)
#cv2.waitKey(10)
label = label + 1
#print('labels= ',labels)
#print('Número de etiquetas 0: ',np.count_nonzero(np.array(labels)==0))
#print('Número de etiquetas 1: ',np.count_nonzero(np.array(labels)==1))
Línea 1 a 3: Importamos OpenCV, os y numpy con un alias np.
Línea 5 a 7: En primer lugar especificamos la ruta de la carpeta ‘Data’ que habíamos creado manualmente antes y dentro de ella estará cada carpeta con el nombre de las personas que se desee identificar (lo habíamos realizado en el apartado anterior). En la línea 6 listamos todas los nombres de las carpetas almacenadas en ‘Data’. En la línea 7 imprimimos la lista obtenida.
Línea 9: Declaramos labels en este se almacenarán las etiquetas correspondientes a cada imagen según la persona.
Línea 10: Declaramos facesData en donde se almacenará cada una de las imágenes de los rostros.
Lo que necesitamos construir en la línea 9 y 10 es lo que podemos ver en la figura 2.
Línea 11: Estableceremos un contador label en 0, para conforme se termine de leer las imágenes de una persona, cambie a otro valor. Esto ayudará al clasificador a entender que se tarda de diferentes personas.
Línea 13 a 15: Vamos a leer cada una las carpetas dentro de ‘Data’. En personPath establecemos la ruta a la carpeta de cada persona. Mientras que en la línea 15 imprimimos el mensaje 'Leyendo las imágenes...' para que cuando se ejecute podamos saber en que parte del proceso estamos.
Línea 17 y 18: Aquí leeremos todas las imágenes correspondientes a cada rostro. En la línea 18 estamos imprimiendo el nombre de la carpeta y la imagen.
Línea 19: En labels vamos añadiendo la etiqueta de cada imagen.
Línea 20: En el array facesData añadiremos cada imagen (rostro).
Línea 21 a 23: Si deseamos leer cada imagen (rostro) para verificar que se está realizando bien el proceso, podemos descomentar estas líneas.
Línea 24: Cada vez que se termine de almacenar los rostros y etiquetas de una carpeta, se incrementará label en 1.
Línea 27 y 28: Podemos comprobar en número de etiquetas almacenadas, por ejemplo, cuantas están en 0, 1, etc. El número que obtengamos debe corresponder con el número de imágenes almacenadas en cada carpeta dentro de ‘Data’.
Ahora que tenemos listos nuestros datos (imágenes y etiquetas) en dos arrays es hora de realizar el entrenamiento, podrás escoger de cada uno de las tres técnicas de las cuales te había comentado, vamos a analizar cada una de ellas.
Entrenamiento del reconocerdor
Vamos a hablar brevemente de Eigenfaces, fisherfaces y Local Binary Patterns Histograms antes de pasar con el entrenamiento.
Te recomiendo que visites la documentación de OpenCV sobre estos métodos: https://docs.opencv.org/4.2.0/da/d60/tutorial_face_main.html#tutorial_face_eigenfaces
Eigenfaces
Este emplea el método PCA (Principal Component Analysis), lo que nos dice la documentación de OpenCV es: ‘La idea es que un conjunto de datos de alta dimensión a menudo se describe mediante variables correlacionadas y, por lo tanto, solo unas pocas dimensiones significativas explican la mayor parte de la información.’
Eigenfaces en OpenCV, cv2.face.EigenFaceRecognizer_create()
Para este método usaremos cv2.face.EigenFaceRecognizer_create(). Podríamos darle parámetros, sin embargo en este tutorial lo dejaremos vacío, pero si te interesa saber más sobre estos puedes visitar este link con su documentación.
Existen algunas consideraciones cuando vayamos a usar este método:
- Las imágenes de entrenamiento como de predicción deben estar en escala de grises.
- El método eigenfaces asume que todas las imágenes, ya sean de entrendamiento o test deben tener el mismo tamaño.
Fisherfaces
Este método es una mejora de anterior.
Fisherfaces en OpenCV, cv2.face.FisherFaceRecognizer_create()
Al igual que el método anterior, de dejaré el link a esta función para que profundices sobre ella en caso de ser necesario.
Consideraciones:
- Las imágenes de entrenamiento como de predicción deben estar en escala de grises.
- El método eigenfaces asume que todas las imágenes, ya sean de entrendamiento o test deben tener el mismo tamaño.
Local Binary Patterns Histograms
LBPH (Histogramas de Patrones Binarios Locales) presenta mejoras respecto a los métodos anteriores, ya que es más robusto ante cambios de iluminación. Además, citando a la documentación de OpenCV: ‘ La idea es no mirar la imagen completa como un vector de alta dimensión, sino describir solo las características locales de un objeto‘.
LBPH en OpenCV, cv2.face.LBPHFaceRecognizer_create()
Para esta función puedes usar distintos parámetros como radius, neighbors, grid_x, grid_y y threshold, para más información sobre estos puedes dirigirte a este link.
Consideraciones:
- Las imágenes de entrenamiento como de predicción deben estar en escala de grises.
- No se tiene especificaciones sobre el tamaño de las imágenes correspondientes a los rostros. Por lo tanto asumimos que pueden tener distinto tamaño.
Entrenado (Código)
Ahora que tenemos una idea de estos métodos para reconocimiento facial usando OpenCV, pasaremos al código. Podremos elegir entonces de los siguientes métodos (recuerda comentar los 2 que no vayas a usar):
# Métodos para entrenar el reconocedor face_recognizer = cv2.face.EigenFaceRecognizer_create() face_recognizer = cv2.face.FisherFaceRecognizer_create() face_recognizer = cv2.face.LBPHFaceRecognizer_create()
Una vez que hayas elegido uno de estos métodos es hora de entrenar, y descuida que solo necesitarás una línea de código.
# Entrenando el reconocedor de rostros
print("Entrenando...")
face_recognizer.train(facesData, np.array(labels))
Línea 37: Para entrenar el reconocedor de rostros necesitamos de face_recognizer.train, en donde face_recognizer será la variable donde se asignó el método (cualquierda de las líneas 31, 32 o 33). Dentro de los paréntesis tendremos que especificar el array en donde estén contenidos los rostros o imágenes de entrenamiento, mientras que el segundo parámetro corresponde a las etiquetas. Es necesario que este sea un numpy array por ello he puesto np.array(labels).
Guardando el modelo obtenido
Una vez entrenado el modelo que nos servirá para reconocer rostros es posible almacenarlo. ¿Para qué nos serviría esto?, pues el entrenamiento toma tiempo, y más si son varias personas que se busca reconocer, es por eso que es mejor guardar el modelo obtenido para luego leerlo en otro script, así nos ahorramos el volverlo a entrenar.
Para almacenar el modelo usaremos write, dentro de los paréntesis deberemos especificar el nombre que deseamos asignarle, junto con la extensión XML o YAML.
# Almacenando el modelo obtenido
#face_recognizer.write('modeloEigenFace.xml')
#face_recognizer.write('modeloFisherFace.xml')
face_recognizer.write('modeloLBPHFace.xml')
print("Modelo almacenado...")
Línea 40 a 43: Usaremos write para guardar el modelo. Yo había elegido guardar un modelo por cada método (por separado), por ello usé distintos nombres en las líneas 40 a la 42. En la línea 43 imprimiremos un mensaje de 'Modelo almacenado...'.
Obtendrás el o los modelos almacenados algo parecido a lo siguiente:

Figura 3: Ejemplo del almacenamiento de distintos modelos.
Probando EigenFaces, Fisherfaces y LBPH para el reconocimiento facial
Ahora que hemos llegado hasta este punto, es hora de probar el reconocimiento. Crearemos un script llamado ReconocimientoFacial.py. El proceso que vamos a realizar, al igual que en el entrenamiento nos servirá para los tres métodos (por separado). Veamos:
import cv2
import os
dataPath = 'C:/Users/Gaby/Desktop/Reconocimiento Facial/Data' #Cambia a la ruta donde hayas almacenado Data
imagePaths = os.listdir(dataPath)
print('imagePaths=',imagePaths)
#face_recognizer = cv2.face.EigenFaceRecognizer_create()
#face_recognizer = cv2.face.FisherFaceRecognizer_create()
#face_recognizer = cv2.face.LBPHFaceRecognizer_create()
# Leyendo el modelo
#face_recognizer.read('modeloEigenFace.xml')
#face_recognizer.read('modeloFisherFace.xml')
#face_recognizer.read('modeloLBPHFace.xml')
#cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#cap = cv2.VideoCapture('Video.mp4')
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
while True:
ret,frame = cap.read()
if ret == False: break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
auxFrame = gray.copy()
faces = faceClassif.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
rostro = auxFrame[y:y+h,x:x+w]
rostro = cv2.resize(rostro,(150,150),interpolation= cv2.INTER_CUBIC)
result = face_recognizer.predict(rostro)
cv2.putText(frame,'{}'.format(result),(x,y-5),1,1.3,(255,255,0),1,cv2.LINE_AA)
'''
# EigenFaces
if result[1] < 5700:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
# FisherFace
if result[1] < 500:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
# LBPHFace
if result[1] < 70:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
'''
cv2.imshow('frame',frame)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
Antes de pasar con la explicación del programa, debo decir este agrupa como probar el funcionamiento del reconocimiento facial con cada uno de los tres métodos vistos en este post. Cuando llegue la hora desglozaremos cada uno de ellos.
Línea 1 y 2: Importamos OpenCV y os.
Línea 4 a 6: Voy a especificar la ruta en donde están las carpetas de las personas que vamos a reconocer, y las listaremos para obtener únicamente sus nombres. Esto lo hago ya que al momento de realizar el reconocimiento facial tomaré de aquí los nombres para que se visualicen.
Línea 8 a 11: Establezco el método que voy a usar para realizar el reconocimiento facial, puedes descomentar la línea que corresponda a aquel con el que entrenaste el reconocedor.
Línea 13 a 15: Para poder leer el modelo almacenado usaremos read, el nombre del modelo corresponderá al que se almacenó en la sección anterior.
Línea 17 y 18: Tienes dos opciones para poder probar el funcionamiento del reconocedor de caras, en la línea 17 por ejemplo puedes hacerlo a través de un videostreaming, mientras que en la línea 18 a través de la lectura de un video.
Línea 20 a 32: Aquí haremos el mismo procedimiento que en el primer programa capturandoRostros.py, vamos a leer el clasificador de rostros, luego pasamos con la lectura de los fotogramas, transformamos a escala de grises, detectamos los rostros, luego vamos con el análisis de cada uno de los rostros detectados, los recortamos y redimensionamos. Realizamos esto ya que las imágenes con las que entrenamos, como en los nuevos rostros se debe aplicar el mismo proceso.
Línea 33: En esta línea vamos a emplear predict para una nueva imagen llamada rostro que nos permitirá predecir los resultados. Esto lo hemos asignado a result, por lo que en la posición 0 tendremos una etiqueta (0, 1, …) y el valor de confianza, este último será diferente para cada método.
predict()
Predice una etiqueta y la confianza asociada (por ejemplo, la distancia) para una imagen de entrada determinada.
NOTA 1: Algo que hay que tener en cuenta es que al aplicar predict, obtendremos una etiqueta y su valor de confianza asociado. Vamos a tener muy en cuenta este segundo valor ya que dependiendo este podremos aceptar o descartar el reconocimiento.
NOTA 2: Los valores (valor de confianza) más bajos o cercanos a cero querrá decir que el rostro a identificar tiene mucha similitud al de los entrenados, mientras que al tener valores muchos más altos el grado de similitud será más pobre por lo que podremos descartarlos. Cabe destacar que dependiendo de cada método obtendremos distintos valores de confianza que podremos comparar.
Línea 35: Visualizamos los resultados obtenidos en result.
De las líneas 37 a 59, las explicaré luego ya que dependerán de cada método empleado.
Línea 61 a 67: Procedemos a visualizar frame, el proceso se dentendrá cuando se presione ‘Esc’, se terminará con el video y se cerrarán todas las ventanas de visualización
Probando EigenFaces
Si descomentamos las líneas 8 y 13 correspondientes al método EigenFaces, vamos a obtener una etiqueta con el rostro más parecido a los entrenados junto con su valor de confianza. Tendremos que realizar algunas pruebas para determinar un umbral para que aparezca el nombre de la persona identificada y para valores mayores a este umbral será considerado como rostro desconocido.
Una vez que hemos probado el código y hemos experimentado, procederemos a descomentar las líneas 37 a 43.
# EigenFaces
if result[1] < 5700:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
Línea 38: Comparo el valor de confianza que está en result[1] con 5700, de tal modo que valores menores a este se etiquete con el nombre de la persona y valores mayores a este se estiquete como desconocido. El umbral 5700 que he escogido ha sido a través de prueba y error, por lo que tu debes cambiar este con la experimentación que realices con respecto a tus resultados.
Línea 39 y 40: En la línea 39 vamos a visualizar el nombre de la persona correspondiente al valor de la etiqueta almacenada en result[0], para ello usaremos imagePaths para obtener los nombres. En la línea 40 dibujaremos un rectángulo de color verde alrededor del rostro detectado.
Línea 42 y 43: En caso de que el valor de confianza supere 5700 (en mi caso), se visualizará 'Desconocido' y un rectángo rojo que rodee el rostro.
Veamos los resultados al aplicar este método y este umbral (puedes ver las pruebas aquí):

Probando FisherFaces
Ahora probaremos el reconocimiento facial empleando Fisher Faces. Tendrías que descomentar las líneas 9, 14 y de la 45 a 51.
# FisherFace
if result[1] < 500:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
Línea 46: En mi caso después de realizar algunas pruebas establecí un umbral de 500 de tal modo que valores menores a este se visualizará el nombre de la persona, mientras que valores mayores a este se visualizará como rostro desconocido.
Línea 47 y 48: Se visualizará el nombre de la persona y un rectángulo que rodee el rostro de color verde.
Línea 50 y 51: En caso de que el valor sea mayor a 500 se visualizará ‘Desconocido’ y un rectángulo que rodee el rostro de color rojo.
Veamos algunas pruebas realizadas (puedes ver las pruebas aquí):

Probando LBPH
Para probar este método descomentaremos las líneas 10, 15, 53 a 59. Analicemos estas últimas:
# LBPHFace
if result[1] < 70:
cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
Línea 54: Con esté método después de pruebas he establecido un umbral de 70 de tal modo que valores mayores son tratados como desconocidos y menores se etiqueta a cada uno de los rostros.
Línea 55 y 56: Se visualiza de color verde el nombre de la persona identificada y un rectángulo que rodee el rostro.
Línea 58 y 59: Se visualiza de color rojo ‘Desconocido’ y un rectángulo que rodee el rostro.
(puedes ver las pruebas aquí)

Prueba extra en directo (video streaming)
Ahora, con este último método voy a probar el reconocimiento facial con un videostreaming. Lo voy a hacer en un lugar diferente al que usé para realizar la captura de rostros (al alimentar el clasificiador), además de usar otra cámara y otra iluminación, veamos:

NOTA: Este procedimeinto lo puedes ver en video aquí.
Quería mostrarte este análisis extra, ya que te podría pasar algo similar, y es que al aplicar reconocimiento facial en este videostreaming ha fallado. Esto se debe a la falta de diversidad en las condiciones de las imágenes con las que entrené el reconocedor.
Para mejorar el reconocimiento voy a incrementar 100 rostros con este ambiente, a más de los 300 que tenía inicialmente, así que en total tendré 400 imágenes con mi rostros y entrenaré nuevamente.
Una vez obtenido el modelo, probemos el reconocimiento a ver que tal nos va:

Entonces recuerda que para mayor robustes o para que mejor reconozca debes tener mayor diversidad en las imágenes (rostros) con las que vayas a entrenar.
Referencias:
- https://docs.opencv.org/4.2.0/da/d60/tutorial_face_main.html
- https://docs.opencv.org/4.2.0/dd/d7c/classcv_1_1face_1_1EigenFaceRecognizer.html
- https://www.superdatascience.com/blogs/opencv-face-recognition
- https://docs.opencv.org/4.2.0/dd/d7c/classcv_1_1face_1_1EigenFaceRecognizer.html
- https://docs.opencv.org/3.4/d2/de9/classcv_1_1face_1_1FisherFaceRecognizer.html
- https://docs.opencv.org/3.4/df/d25/classcv_1_1face_1_1LBPHFaceRecognizer.html
- https://docs.opencv.org/master/dd/d65/classcv_1_1face_1_1FaceRecognizer.html#ac8680c2aa9649ad3f55e27761165c0d6
- https://docs.opencv.org/master/dd/d65/classcv_1_1face_1_1FaceRecognizer.html#a2adf2d555550194244b05c91fefcb4d6




Exelente trabajo.
Muy bien explicado y ejemplos muy bien logrados, estoy iniciando el trabajo de reconocer objetos con openvc y python y tu trabajo es mejor que he visto hasta ahora.
Me a servido mucho, gracias, seguire viendo tus video y de seguro te estare haciendo mas preguntas mas adelante.
Por ahora solo felicitaciones….
Hola Willie, muchas gracias por valorar el contenido que realizo, te a lo agradezco de todo corazón. 🙂
hola Gaby, mira soy nuevo en esto y tengo un pequeño problema con el reconocimiento facial, hice un proyecto similar al tuyo, lo carge en liClipse para simular a python y la raspberry y el proyecto funciono, lo pase a la raspberry pi 3 que de echo estoy dificultades porque no me detecta el wifi, ni el set country pero bueno; lo paso a la raspberry y ya no funciona…. probe con tu codigo y me hace lo mismo.
si previo al ciclo for le pido que me muestre en pantalla frame me da cuadro por cuadro la imagen, pero despues del for es casi imposible imprimir el frame. le cambie el valor de cap a -1 para que detectara la picamera.
tengho la version de python 3.9.2 y la version de openCV 4.5.1 y numpy 1.23.1
Ayuda por favor.
Hay alguna manera de que al mostrar el nombre de la persona, ejecute una acción? para poder llamarla como servicio en otra aplicación.
hola muy bien todo pero no logro probar con el video en directo me lo puedes explicar muchas gracias
Hola Nicolas, puedes probar con: cap = cv2.VideoCapture(0,cv2.CAP_DSHOW) allí podrás acceder a la webcam de tu computador.
#cap = cv2.VideoCapture(0)
#cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
#cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
a mi me funciono con esto
Muchas gracias Clara!
no me sale : ,( ……..
Hola Yaneth, ¿qué pasó?. No te pongas triste.
Hola amiga:
Te saludo desde Ecuador, estoy desarrollando una tesis de identificacion de emociones por medio de la gastronomía ecuatoriana, pero en realidad no tengo idea de como usar los programas que tu los usas, porque mi estudio es un campo diferente a la tecnología, podrías ayudarme paso a paso lo que debo hacer o como me pudo comunicar contigo.
Espero tu ayuda mil gracias
Hola Maria, como te comentaba los tutoriales están realizados paso a pasito, para que puedas desarrollarlos sin problemas. Tú puedes! 🙂
Hola.
Primero que nada, agradezco que se tome la molestia de enseñar sus conocimientos a todos. Sus tutoriales son bastante buenos. He estado haciendo algunas pruebas con los códigos que proporciona y me surgen algunas dudas. Mi idea es hacer una lista de asistencia con reconocimiento facial. Es decir, que al ingresar se detecte el rostro y lo agregue a una lista que posterior mente se exportará a excel. Mi duda es, ¿como puedo obtener el nombre de la persona que detecta el sistema?
Hola Eduardo, mucho gusto y muchas gracias por valorar el contenido. Podrías usar las mismas etiquetas que se usó para diferenciar a cada persona, o también podrías guardar su nombre en las carpetas que generamos en un inicio y de este modo registrarlos.
Hola muy buena información me ayudo a solucionar un par de errores que tenia.
Me gustaria que me apoyaras para poder guardar esos datos en una base de datos como seria la función que me guarde por ejemplo el nombre de la persona si la reconoce, la fecha, hora etc y en otra tabla datos de la persona que no reconozca ademas de sus imágenes como seria esa parte de antemano GRACIAS
Ohh entiendo Luis, tengo en pendiente un tutorial para integrarlo con base de datos.
Ante mano muchas gracias por tus códigos, por tu trabajo y dedicación. Sirven de mucho para muchos. Tenga problemas en el código de entrenandoRF. En la linea de código 11: face_recognizer = cv2.face.LBPHFaceRecognizer_create() me sale un mensaje de error File»ruta»……, line 11, in module. He revisado la sintaxis y esta donde bien. He probado este codigo en otra laptop y funciona correctamente. Ademas este mismo erro me sale en el código de ReconocimientoFacial..py
Hola Willy, muchas gracias. Puede ser la versión de OpenCV que tengas instalada. Prueba con la versión 4.2
Hi guy, can you give me advice on distinguishing between real face and fake face from video or picture?
Hi guy, can you give me advice on distinguishing between real face and fake face from video or picture?
Hola gaby, muy buen blog.
tengo una pequeña duda. ¿Como instalo los métodos de reconocimiento de rostro del Opencv?
gracias.
Hola Reivaj muchas gracias, una vez que instalas opencv (con contrib), puedes emplearlos.
Hola Gabriela muy bueno el tutorial y los aportes, realmente me encanta, tengo un error un poco molesto,
File «C:\Users\Bianca Andrea\Desktop\Reconocimiento facial\capturandoRostros.py», line 27
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
^
TabError: inconsistent use of tabs and spaces in indentation
No se si me podrias apoyar para resolverlo
gracias
ya resolvi este problema jeje
Genial Bianca! 😀
hola gabriela te felicito por todo el aporte que nos brindas, tengo una pregunta ya que tengo un error en el entrenamientoRF
me sale este error
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\face\src\eigen_faces.cpp:72: error: (-210:Unsupported format or combination of formats) In the Eigenfaces method all input samples (training images) must be of equal size! Expected 32761 pixels, but was 75625 pixels. in function ‘cv::face::Eigenfaces::train’
Estuve buscando y todo pero no entiendo muy bien la verdad, le cambie la version del opencv y todo pero no cambia nada.
Por favor necesito tu ayuda, gracias por la respuesta
Hola Gaby. Estoy corriendo el codigo pero me aparece un error cuando uso .Train
face_recognizer.train(facesData, np.array(labels))
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wwma2wne\opencv\modules\core\src\lda.cpp:1087: error: (-5:Bad argument) At least two classes are needed to perform a LDA. Reason: Only one class was given! in function ‘cv::LDA::lda’
Ese es el mensaje que aparece. ¿Qué debo hacer?
Hola Katherine, es posible que solo estés entrenando el modelo con solo una etiqueta, es decir con el rostro de un solo sujeto. He probado los modelos Eigen_Face y LBPH_Face, los cuales si me acepto con solo el rostro de un solo sujeto. Cuando entrene el modelo Fisher_Face con solo un sujeto me apareció el mismo mensaje de error, sin embargo entrene el modelo mencionado agregando un 2do rostro y corrió de maravillas.
Fuente:
https://stackoverflow.com/questions/13194301/face-recognition-in-video-using-opencv-gives-unhandled-exception#comment43777818_13218560
Lo buscas con control + F como:
The Fisherfaces method needs at least two classes to learn a model. This case should have been caught and OpenCV 2.4.2 throws the following exception on my system:
Hola, la solucion del 10 marzo, 2021 a las 11:48 pm por parte de Ing. Juan Luis Sigue siendo adecuada hoy en dia, se necesita al dia de la fecha del comentario (13/3/2024) 2 etiquetas para poder entrenar el modelo fisher faces, de lo contrario lanzará una excepcion. Recuerda que, como se dice en el post, las imagenes de entrenamiento deben tener el mismo tamaño en pixeles. Un saludo!
Hola Gaby, primero felicitarte por lo didáctico y la dedicación que pones en cada post, en serio tus post son de gran ayuda.
Quiero consultarte sobre la línea 55 del LBPHFace, veo que asocias el índice del array del listado de directorios directamente con la etiqueta común al grupo de imágenes (línea 20 del script de entrenamiento), podrías explicarme un poquito más esta parte, ya que solo estaríamos dependiendo del número de directorios o es que internamente el modelo entrenado guarda un parámetro del nombre del directorio? me queda esa duda,
Hola Cristian muchas gracias, me alegra mucho que te guste el contenido que realizo, 😀 te lo agradezco mucho. Si, para visualizar los nombres de cada persona reconocida estoy usando los nombres de los directorios.
Hola Gaby, tengo un problema en el código de entrenamiento. Me sale este error.
Traceback (most recent call last):
File «/Users/martin/PycharmProjects/OpencvPython/Training.py», line 30, in
face_recognizer = cv2.face.EigenFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
Hola Martin, debe ser por la versión de OpenCV, podrías probar con la 4.2? Con ella realicé el tutorial.
A mi no se me quiere instalar, cuqando pongo pip insntall opencv-contrib-python==4.2.0
Mmmm, tal vez probando con la versión 3. En tal caso si no funciona, podrías darle un vistazo a las funciones para reconocimiento facial de la versión de OpenCV que tengas instalado.
Hola Gaby.
Excelente trabajo, me gustaría me orientes cómo integrar lo que realizaste con una BD, para capturar por ejemplo la persona que se visualiza y guardar ese evento con fecha, hora y día por ejemplo.
Muchas gracias por compartir tu conocimiento, sos increíble.
Hola Juan, siii muchas gracias por la sugerencia. Tengo ese tutorial en pendiente, espero poder realizar pronto! 🙂
Hola, muchas gracias por tu gran contenido, es muy bueno lo que he visto. pero tengo un problema al momento de llevarlo a la practica, aqui te dejo un enlace a la captura de pantalla que realice del error que tengo, si me podrias ayudar estaría muy agradecido::
https://www.youtube.com/redirect?stzid=Ugz_4OIP7nTZMUdxbLx4AaABAg.9GVsOLz5JlP9GWxTAdscve&event=comments&redir_token=QUFFLUhqbHFHTVFZemd6ZF9HZDBzUXp5UFVKQkhtSlpfZ3xBQ3Jtc0ttYVdhWjRsMTZFVkVORS1Hc0Vva1VGQ1duYXhxT2docFNmaW81MG12Nk5fODlLTXFCS3FDNlJWcUVLQkhNZmlGamtCbmVXVVFQLW9qUDFFVlZWSGJzNEJBU2E2VElYaUp0SzIyWDJ1aHhlSkhtcFZSQQ%3D%3D&q=https%3A%2F%2Futneduec-my.sharepoint.com%2F%3Ai%3A%2Fg%2Fpersonal%2Fbvmayam_utn_edu_ec%2FEaCJO1YZDdFOgUyMVo7MSz8BFTsO-4SayGK7OOZRRdRdlg%3Fe%3DitEnU7
Hola Vicente muchas gracias!. Puede que sea por la versión de OpenCV. Para este tutorial usé la 4.2.
Tengo un problema similar, me arroja varios errores será por la version de Python y de OpenCV?
Hola José, depende del error que te esté dando.
Hola son excelentes tu videos, me esta sirviendo de mucho pero tengo este molesto error
Traceback (most recent call last):
File «reconocimiento.py», line 14, in
face_recognizer.read(‘/home/pi/reconocimientofacial/modelEingenFace.xml’)
AttributeError: ‘cv2.face_BasicFaceRecognizer’ object has no attribute ‘read’
Hola Edwin, asegúrate de haber instalado opencv contrib. 🙂
Hola Gaby!
En primer lugar me sieto sumamente agradecido por tu excelente labor.
Una medida de lo impecable de tu trabajo es que yo soy principiante. O sea nunca antes había visto a python ni nada por el estilo. Y he logrado excelentes avances en casi todos los videos y proyectos.
En segundo quería molestarte, todos los escollos los he tratado de resolver solo para o molestar, pero con este estoy trabado.
En el script: entrenando.py cuando utilizo el modeloLBPHFace no logra guardar el modelo y me sale el siguiente error:
Traceback (most recent call last):
File «C:\Users\Personal\PycharmProjects\ReconocimietoFacial\entrenando.py», line 32, in
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
Cualquier ayuda será de invaluable valor.
Muchas Gracias por todo
Cordialmente
José María
Hola José María. Muchas gracias por tu comentario, por contarme que el contenido te ha sido de ayuda, me alegra muchísimo saberlo 🙂 En cuanto al error que obtienes, asegúrate de haber instalado opencv-contrib. Para este tutorial usé la versión de OpenCV 4.2. Espero que sea de ayuda.
Por cierto, muchas gracias por ser tan cortés y amable. Un abrazo.
Hola Gaby,
Quiero felicitarte por tan excelente trabajo, por la dedicación y ganas que le metes a los contenidos, realmente me atrapó y consolido el deseo de aprender más, pero necesito consultarte algo, y es que para esta parte cv2.imwrite(personPath + ‘/rostro_{}.jpg’.format(count),rostro) en la captura y guardado de rostros no se ejecuta y no genera errores, por lo que he podido leer la función imwrite presenta problemas con el uso de path por el uso de algunos caracteres como \n,\b,\v,\x, puedes aconsejarme otras funciones para el guardado de las imágenes, te lo agradecería bastante. Saludos y sigue adelante con tan excelente labor.
Hola Leonardo muchas gracias, que chévere que te haya gustado el campo y que te haya animado a aprender más sobre ello. Te cuento que suelo usar cv2.imwrite para almacenar imágenes. Eso si, para determinar el path he usado: «/», debido a que he obtenido errores si ubico «\». Puedes darle un vistazo también, a que se haya creado la carpeta o si estás usando algún carácter especial como la tilde para leer o almacenar la imagen.
Hola, una pregunta si quiero agregar mas datos a los modelos entrenados sin que estos se borren o sin que los sobre escriba, como puedo hacer??
Hola David, tendrías que iniciar el contador desde un número mayor, dependiendo de las imágenes que ya tengas almacenadas.
Hola Gaby felicidades por el tuto es muy bueno. Solo que tengo una duda, quiero que los modelos o arhivos XML, que ya entrene, quiero agregarle mas información, pero no quiero que los sobre escriba o se borren estos datos. como puedo hacerlo???. Veo que tu lees carpeta por carpeta, pero si estoy checando solo una carpeta en especifico. como puedo agregarle al modelo esos nuevo datos???
Gracias de ante mano. Saludos.
Hola David, muchas gracias. 🙂 Podrías cambiarle de nombre al archivo xml obtenido, para que puedas generar otro sin que se borre el que ya tienes. Saludos David. 🙂
Saludos desde Colombia, excelentes videos y recursos los que publicas. Tengo una duda, es posible aplicar esto mismo en una raspberry PI + una unidad Intel NCS2? (MYRIAD). Gracias.
Hola Cesar, apliqué este tutorial en la raspberry y estos fueron los resultados: https://www.youtube.com/watch?v=f7QhpaZXPkE&list=PLBg7GSvtrU2MOLWM0bGU1_FT3LsJPyY-5&index=31 Emm con respecto a la otra pregunta, lo siento no he usado MYRIAD.
hola gaby una ayuda por fa, el codigo me funcionaba bien y no se que paso que me comenzo a dar error:
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-i1s8y2i1\opencv\modules\core\src\lda.cpp:1087: error: (-5:Bad argument) At least two classes are needed
to perform a LDA. Reason: Only one class was given! in function ‘cv::LDA::lda’
y no se como solucionarlo, ayuda por fa
Me pasa lo mismo, descubriste por que ocurre
me sale este error
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-5rb_9df3\opencv\modules\core\src\lda.cpp:183: error: (-5:Bad argument) Wrong shapes for given matrices. Was size(src) = (1,67500), size(W) = (22500,300). in function ‘cv::LDA::subspaceProject’
Hola , me parece excelente tus videos que nos ayudan a resolver muchos problemas a quienes estamos empezando en este mundo . tengo un problema , En el script: entrenando.py cuando utilizo el modeloLBPHFace no logra guardar el modelo y me sale el siguiente error:
Traceback (most recent call last):
File “C:\Users\Personal\PycharmProjects\ReconocimietoFacial\entrenando.py”, line 32, in
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
tengo el openCV 4.2 , espero que me ayudes a resolver este problema , gracias
Hola Frank, muchas gracias. Revisa que tengas instalado OpenCV con contrib, puede que eso te esté dando problemas.
Yo he resuelto de esta manera
import cv2
import numpy as np
import os
dataPath = «C:/Users/crym3n/Documents/dev/Reconocimiento facial/Data»
peopleList = os.listdir(dataPath)
print(«Lista de personas:», peopleList)
labels = []
facesData = []
imageSize = (200, 200) # Tamaño deseado para las imágenes redimensionadas
for label, person in enumerate(peopleList):
personPath = dataPath + «/» + person
print(f»Entrenando imágenes de {person}:»)
for fileName in os.listdir(personPath):
labels.append(label)
image = cv2.imread(personPath + «/» + fileName) # Leer la imagen en color
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convertir la imagen a escala de grises
resizedImage = cv2.resize(gray, imageSize) # Redimensionar la imagen
facesData.append(resizedImage)
# Entrenar el reconocedor de rostros
face_recognizer = cv2.face.EigenFaceRecognizer_create()
print(«Entrenando el reconocedor de rostros…»)
face_recognizer.train(facesData, np.array(labels))
# Almacenar el modelo entrenado
face_recognizer.write(«modeloEigenFace.xml»)
print(«Modelo almacenado correctamente.»)
# Cargar el modelo entrenado
face_recognizer.read(«modeloEigenFace.xml»)
print(«Modelo cargado correctamente.»)
# Iniciar la captura de video
cap = cv2.VideoCapture(0)
faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades + «haarcascade_frontalface_default.xml»)
while True:
ret, frame = cap.read()
if ret == False:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceClassif.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
rostro = gray[y:y+h, x:x+w]
rostro = cv2.resize(rostro, imageSize) # Redimensionar el rostro al mismo tamaño que las imágenes de entrenamiento
result = face_recognizer.predict(rostro)
#cv2.putText(frame, f»{peopleList[result[0]]}», (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
cv2.putText(frame,'{}’.format(result),(x,y-5),1,1.3,(255,255,0),1,cv2.LINE_AA)
# EigenFaces
if result[1] < 5700:
cv2.putText(frame,'{}'.format(peopleList[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2)
else:
cv2.putText(frame,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA)
cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow("frame", frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
Hola! muchas gracias por tu contenido, sólo una duda, cuál sería la razón por la cual no se almacenan las imágenes?
Hola Maria, muchas gracias. Emmm puedes revisar cv2.imwrite, este debe especificar el path de un directorio que exista en el computador.
Te agradezco que tomes el tiempo para responderme <3
Igual te comento que el programa corre sin ningún problema y se crea dicha carpeta en la dirección que indico, pero no se almacenan automáticamente las imágenes.
Gracias a ti María :). Puedes comentar el código para ver que puede estar pasando?.
El error radicaba en la Ruta, pues la mía contenía una tilde, por lo que usar la ruta relativa en lugar de la absoluta fue la solución, gracias nuevamente 😀 !
Holaaaaa!
Quiero agradecerte por tan buen blog! Me has ayudado bastante, Gaby 🙂
Sólo tengo un problema pues me aparece el siguiente error y ya intenté de mil manera solucionarlo, sin éxito 🙁
error: (-2:Unspecified error) This Eigenfaces model is not computed yet. Did you call Eigenfaces::train? in function ‘cv::face::Eigenfaces::predict’
Hola Mariana, muchas gracias. ¿Instalaste OpenCV contrib? Puede que por allí vaya el problema.
buenas noches, a mi me sale un error a la hora del entrenamiento es este: File «C:\Users\osc24\OneDrive\Documentos\reconocimiento\entrenandoRF.py», line 33, in
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’ lo mismo con las otras 2 mneras de entrenamiento
Hola Oscar, debes instalar OpenCV con: pip install opencv-contrib-python, debe ser por ello que obtienes el error.
Como puedo solucionar este erro:
Traceback (most recent call last):
File «C:\Users\hecto\Desktop\Reconocimiento\Prueb.py», line 3, in
import imutils
ModuleNotFoundError: No module named ‘imutils’
[Finished in 6.9s]
Hola Hector, debes instalar imutils con: pip install imutils
Eres la mejor en visión artificial, sigue adelante!!!
Muchas gracias Lalo. 🙂
Hola, me preguntaba si podias ayudarme con un proyecto que tengo soy nuevo en programacion y me gusta lo que estas haciendo… te cuento quiero hacer una pagina web con reconocimiento facial quiero insetar este codigo en mi pagina para guardar datos de un estudiante si puedes ayudarme te lo agradeceria bastante
Felicidades, muy buen tutorial. Gracias por tu tiempo y dedicación para compartirnos tus conocimientos. tenía un error pero en los comentarios encontré la solución 🙂 🙂 :).
Muchas gracias alt82. 🙂
Muchas gracias por tus tutoriales, son excelentes!
el código me marca este error:
File «C:\Users\Mini\Desktop\proyectos Python\detectorRostro\reconocimientoFacial2.py», line 28, in
result = face_recognizer.predict(rostro)
cv2.error: OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\opencv_contrib\modules\face\src\eigen_faces.cpp:117: error: (-2:Unspecified error) This Eigenfaces model is not computed yet. Did you call Eigenfaces::train? in function ‘cv::face::Eigenfaces::predict’
Según yo esta casi idéntico a tu código ¿a que se puede deber?
Saludos y gracias de antemano.
Hola Oscar, si realizaste el entrenamiento?
hola Gaby , saludo desde Colombia excelente trabajo, pero no he podido correrlo en raspberry os, en el programa entrenandoRF.py me sale esto:
AttributeError: module ‘cv2’ has no attribute ‘face’
he leido que debo instalar » opencv-contrib-python » pero en raspbian os no se termina de instalar
alguna idea?
de antemano gracias.
Hola Omar, efectivamente es porque no has instalado opencv-contrib. Puedes instalarlo con este video: https://youtu.be/Zsu16-SfaAg Muchos saludos para ti también Omar. 🙂
Hola, excelente video, ¿saben si se puede guardar en una base de datos (como para registrar asistencia)?
Muchas gracias. me ha servido mucho solo tengo una pregunta ese código se puede compilar con openCL para renderizar el GPU en vez del CPU?. Estube mirando y si permite hacerlo pero permite hacerlo con Cuda con tarjeta grafica intel
Me salia un error para la variable DataPath hasta que le cambie la ruta por dataPath = ‘C:\\Users\\USUARIO\\Downloads\\Proyectos de computacion’ agregando doble slash
Hola, primeramente déjame felicitarme por el contenido del video es excelente, y otra cosita cual entrenador me recomiendas es crees tu que es el que mas resalte de los tres?
Hola muy buena explicación, también he leído los comentarios y estoy realizando un sistema como el que menciona una persona por aquí (Luis Alfonso Soto Calihua). Estoy realizando un sistema de reconocimiento facial para registro de entradas y salidas utilizando gran parte de el código de este blog, pero me he encontrado que no es del todo exacto, es decir, al ser demasiado rápido por una milésima de segundo puede reconocer el rostro de otro usuario y registrar los datos de este al momento de acercarse a la cámara por lo cual mi pregunta es: ¿se puede hacer que en lugar de capturar por vídeo se tome una foto y que el sistema reconozca por medio de este quien es el usuario? Si es así podría ser mucho más exacto en mi caso. Espero haberme explicado correctamente
Hola Gaby , saludo desde Perú, excelente trabajo, me ha ayudado bastante; mi pregunta es la siguiente: Como podría hacer la predicción pero con una imagen, en vez de hacerlo con la cámara web, intenté cambiar el código y no me sale error ni nada, pero no me imprime ningún resultado. de antemano muchas gracias.
Muy buen trabajo. Gracias por compartir tus conocimientos. Una consulta. Quisera saber si se puede usar los tres métodos en uno solo. Gracias
Hola muy buenos tus tutoriales…. queria saber si cada ves que yo hago la captura de fotos a varias personas por separado y cuando genero las carpetas con cada nombre de usuario….¿el scrip entrenadorrf cada ves que lee el contenido de la carpeta data lee el contenido de todas las carpetas creadas? OTRA PREGUNTA ¿a medida que voy creando mas fotos el entrenadorrf al generar el archivo modeloLBPHFace.xml ya incluye todos los otros usuarios ya creados anteriormente? ¿Como puedo hacer para que cada ves que le saco fotos a personas ya queden incluidas en archivo generado en el entrenadorrf? espero entiendas mi pregunta. Gracias por tu tiempo
Hola las imagenes q se capturan nunca se llega a guardar en la carpeta creada a q se debe esto
Hola Genesis, puede que no se esté especificando correctamente la ubicación donde deben guardarse. Revisa la función cv2.imwrite. 🙂
Interesante video, como puedo hacer para replicarlo en Google colab y no me salga error en esta parte «face_recognizer = cv2.face.EigenFaceRecognizer_create() «. Gracias
Hola Kevin, prueba instalando: pip install opencv-contrib-python. 🙂
Hola, se quiere agradecer por el conocimiento compartido. Pero tengo un error a la hora de generar el entrenamiento.
face_recognizer.train(facesData, np.array(labels))
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\core\src\matrix.cpp:235: error: (-215:Assertion failed) s >= 0 in function ‘cv::setSize
Según es por que hay valores negativos en la matríz pero según yo no hay inicializados en 0 dentro de la matriz.
Buen tutorial me puede ayudar con este error que me sale al momento de ejecutar el programa a que se debe me ayudas porfavor
File «C:\Users\veroa\Desktop\captura Rstro\Reconocimientofacial.py», line 22
faces = faceClassif.detectMultiScale(gray,1.3,5)
^
IndentationError: unindent does not match any outer indentation level
[Finished in 0.3s]
Hola Veronica, al parecer en esa línea te falta un tab. Puedes borrar los espacios y volver a darle en tab para que se solucione, es un problema de identación.
hola Gaby, mira soy nuevo en esto y tengo un pequeño problema con el reconocimiento facial, hice un proyecto similar al tuyo, lo carge en liClipse para simular a python y la raspberry y el proyecto funciono, lo pase a la raspberry pi 3 que de echo estoy dificultades porque no me detecta el wifi, ni el set country pero bueno; lo paso a la raspberry y ya no funciona…. probe con tu codigo y me hace lo mismo.
si previo al ciclo for le pido que me muestre en pantalla frame me da cuadro por cuadro la imagen, pero despues del for es casi imposible imprimir el frame. le cambie el valor de cap a -1 para que detectara la picamera.
tengho la version de python 3.9.2 y la version de openCV 4.5.1 y numpy 1.23.1
Ayuda por favor.
Muchas gracias! he aprendido mucho contigo!
Muchas gracias Javier, me alegra mucho saberlo!. 😀
Hola gaby como estas? me agrada mucho tu trabajo, no se si me podías ayudar con una duda que tengo, como ves tengo un problema es con el guardado de las imágenes en la carpeta especificada, todo se ejecuta bien pero el imwrite no quiere funcionar por algún motivo
rostro = cv2.resize(rostro,(150,150),interpolation=cv2.INTER_CUBIC)
cv2.imwrite(personPath + ‘/rotro_{}.jpg’.format(count),rostro)
count = count + 1
También copie directamente tu código al portapapeles y tampoco funciono el grabado de las imágenes, no se si me podrías ayudar
Hola Emmanuel, muchas gracias por darte el tiempo de dejar un comentario, me alegra mucho que te guste el contenido que realizo. En cuanto a tu pregunta, te recomendaría verificar que el path donde vas a almacenar las imágenes no posea símbolos especiales (tildes por ejemplo), eso puede hacer que no se almacene la imagen.
hola, muy bueno tu video, te felicito
quisiera que me puedas resolver esta duda, me sale este error al momento de ejecutar el programa:
[ERROR:0@0.014] global D:\a\opencv-python\opencv-python\opencv\modules\core\src\persistence.cpp (505) cv::FileStorage::Impl::open Can’t open file: ‘C:\Users\TERESA DE JESÚS\AppData\Local\Programs\Python\Python310\lib\site-packages\cv2\data\haarcascade_frontalface_default.xml’ in read mode
[ WARN:0@0.014] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_(‘imagen_000.jpg’): can’t open/read file: check file path/integrity
Traceback (most recent call last):
File «C:\Users\TERESA DE JESÚS\Desktop\reconocimientofacial\CapturandoRostros.py», line 7, in
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
Tenía exactamente tu mismo error.
Lo que hice con mi código fue cambiar cambiar como sigue:
De lo original…
car_classifier = cv2.CascadeClassifier(‘Haarcascades\haarcascade_fullbody.xml’)
a lo nuevo…
body_classifier = cv2.CascadeClassifier(‘Haarcascades/haarcascade_fullbody.xml’)
Y se solucionó.
En otras palabras lo que hice fue cambiar \ por / y listo.
Tenía exactamente tu mismo error.
Lo que hice con mi código fue cambiar cambiar como sigue:
De lo original…
car_classifier = cv2.CascadeClassifier(‘Haarcascades\haarcascade_fullbody.xml’)
a lo nuevo…
body_classifier = cv2.CascadeClassifier(‘Haarcascades/haarcascade_fullbody.xml’)
Y se solucionó.
En otras palabras lo que hice fue cambiar \ por / y listo.
Hola Jhampier,si no estoy equivocado, tu problema es que tal y como reza la parte final del error (copio y pego):
«_src.empty() in function ‘cv::cvtColor’»
Parece que por algúna razón tu variable image, NO CONTIENE nada, por lo que no puede hacer la conversión a escala de grises. Revisa la línea de image = cv2.imread() haber si por alguna razón ves el porqué image no contiene la imagen que quieres cargar. (el archivo indicado no está en la carpeta, o el nombre de la foto no esta bien escrita, o cosas asi.)
Buenas, qué tal, estuve realizando el primer método y me aparece un error en la línea de predict. No sé si podría apoyarme con ello por favor.
Traceback (most recent call last):
File «F:/Procesamiento Python/reconocimiento_facial/reconocimiento_facial.py», line 31, in
resultado = cara_recognizer.predict(rostro)
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\lda.cpp:183: error: (-5:Bad argument) Wrong shapes for given matrices. Was size(src) = (1,67500), size(W) = (22500,600). in function ‘cv::LDA::subspaceProject’
Hola, me han funcionado tus videos de reconocimiento facial, me gustaria ahora como podria utilizar ese reconocimiento en una pagina web en html
Tengo este error. Pero ya revise la direccion de las imagenes y su direccion estan bien , y el archivo repstrp_0 existe.. que puede ser?
Se produjo una excepción: NotADirectoryError
[WinError 267] El nombre del directorio no es válido: ‘D:/mine/projects/WORKS/FaceRecognitionEspCAM/data/Dani/rotro_0.jpg’
File «D:\mine\projects\WORKS\FaceRecognitionEspCAM\entrenador.py», line 16, in
print(os.listdir(personPath))
Hola muy buenos los vídeos y la explicación, soy nuevo en Python he logrado que funcionen en el IDE de desarrollo, pero ahora mi dolor de cabeza es como lo llevo del código algo funcional, ya sea a un ejecutable para escirtorio, página web a un servidor, me podrías apoyar y orientar ese siguiente paso.