Obtener rostros de un conjunto de imágenes

Estoy desarrollando una prueba de concepto que para crear un dataset de imágenes para su uso en una aplicación que explota la inteligencia artificial en rostros, todo esto como parte de nuestra suite de Avatares que construimos hace algunos meses.

La idea es muy sencilla, voy a poner en un directorio muchas fotografias en formato jpg … estas tienen una persona en diferentes posiciones, pero lo que necesitamos es aislar completamente el rostro y obtener las coordenadas.

Lo primero que vamos a hacer es instalar las librerías necesarias:

pip install opencv-python
pip install numpy

Ahora tenemos que cargar la imagen en cuestión:

import cv2
image = cv2.imread('image.jpg')

Por último usamos la función de OpenCV para detectar rostros:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

Ahora tomamos las coordenadas donde se encuentra el rostro y lo guardamos en el archivo, poniendo como parte del nombre del archivo dichas coord.

for (x, y, w, h) in faces:
face_crop = image[y:y + h, x:x + w]
cv2.imwrite(f'face_{x}_{y}.jpg', face_crop)

¡Listo!

Con esto creamos el dataset de las imagenes, mismas que están depositadas en el directorio específico para su explotación … por ejemplo, puedes subir 100 fotos donde aparezcas, creas el dataset y lo subes a Leonardo.AI y podrás crear tus propias imagenes basadas en el modelo que creamos.

EDIT:

El código anterior no es recursivo, solo es por imágenes; por lo que se tendría que agregar lo siguiente:

import os
from PIL import Image
folder_path = '/path/to/folder/'
for file_name in os.listdir(folder_path):
if file_name.endswith('.jpg') or file_name.endswith('.png'):
image_path = os.path.join(folder_path, file_name)
image = Image.open(image_path)
## aqui va el código
image.close()