Extrae fotos de rostros individuales de una foto de grupo

Estoy buscando una herramienta que tome una foto grupal (de alta resolución), ubique todas las caras automáticamente y las extraiga como fotografías individuales. ¿Existe tal herramienta? Reconocer rostros es bastante estándar, pero extraerlos automáticamente como archivos únicos es algo que aún no he encontrado.

Tampoco me importaría si la herramienta fuera gratuita/barata :)

¿En qué sistema operativo debería ejecutarse?
Correcto. Gracias por preguntar. Preferiría Windows, pero iOS o OS X también estarían bien.
Si tiene alguna capacidad de secuencias de comandos, en OSX podría usar FaceDetect para extraer coordenadas que luego podrían pasarse a ImageMagick para su extracción.
@StarGeek: Wow, parece prometedor: es un script de Python, por lo que también debería funcionar en Windows (donde me siento más cómodo).
Se necesita un poco de trabajo para que sea utilizable en Windows. Consulte esta publicación de Reddit que hice que detalla los pasos que tuve que seguir para que funcione.
@StarGeek: Esto funcionó perfectamente. ¿Le importaría convertir eso en una respuesta (tal vez incluso incluir las partes relevantes de la publicación de reddit)? Para instalar opencv, el comando pip install opencv-pythonfuncionó bien.

Respuestas (1)

Gracias a @StarGeek (publicación relevante de Reddit ), pude escribir un pequeño guión para esto.

Para configurar el entorno en Python 3 (en una máquina con Windows 10 que usa Anaconda), realicé los siguientes pasos:

  • pip install opencv-python
  • Descargar y extraerfacedetect
  • Renombrar facedetectafacedetect.py
  • En el archivo facedetect.py, edite la línea

DATA_DIR = '/usr/share/opencv/'

al camino adecuado. En mi Windows 10 era:

DATA_DIR = 'C:/Anaconda3/Lib/site-packages/cv2/data/'; si tiene Python instalado solo para el usuario actual, podría verse algo como

DATA_DIR = '%LOCALAPPDATA%/Programs/Python/Python37/Lib/site-packages/cv2/data/'

  • Por último, cambia la línea.

'HAAR_FRONTALFACE_ALT2': 'haarcascades/haarcascade_frontalface_alt2.xml'

a

'HAAR_FRONTALFACE_ALT2': 'haarcascade_frontalface_alt2.xml',

  • Coloque la(s) imagen(es) a procesar en el mismo directorio quefacedetect.py
  • Ejecute el siguiente script en ese directorio:
import cv2
import facedetect
import glob
import os

facedetect.load_cascades(facedetect.DATA_DIR)

for file in glob.glob("*.jpg"):
    original = cv2.imread(file)
    im, faces = facedetect.face_detect_file(file)
    if len(faces):
        directory = os.path.splitext(os.path.split(file)[1])[0]
        os.mkdir(directory)
        for i, (x,y,w,h) in enumerate(faces):
            face = original[y:y+h, x:x+w]
            cv2.imwrite(os.path.join(directory, "{0:03}.jpg".format(i)), face)

Por ejemplo, en esta imagen (por Hayden Schiff (IagoQnsi, Wikimedia Commons ))

FC Cincinnati 2016

el script produce el siguiente resultado:

Captura de pantalla del Explorador de Windows

No olvides aceptar tu propia respuesta (puedes tener que esperar hasta que puedas; usa el punto 2 días, no estoy seguro ahora). Hacerlo ayudará a otros en el futuro. si realmente quiere ir más allá, puede encontrar una imagen con una licencia creative commons e incrustar la imagen y los resultados en su respuesta, para que tengamos una idea de lo que hace.
@Mawg: Maravillosa idea :)
@TimPietzcker Bien hecho. Lo siento, no publiqué como respuesta, sentí que la respuesta debería haber incluido cualquier secuencia de comandos que realmente hiciste para extraer las imágenes. Además, ¿tuviste que hacer cambios en el script de detección de rostros como mencioné en la publicación de Reddit o donde pudiste hacer que se ejecutara como está?
Por favor, publique tales ejemplos. Gracias++
@StarGeek: Ah, sí, olvidé ese paso. Lo añadiré momentáneamente.