Detectar automáticamente rostros en una imagen

Detectar automáticamente rostros en una imagen

En mi lugar de trabajo, las fotografías tamaño pasaporte se escanean juntas, luego se cortan en imágenes individuales y se guardan con números de archivo únicos. Actualmente utilizamos Paint.net para seleccionar, cortar y guardar manualmente las imágenes.

He visto que la cámara Cybershot de Sony tiene detección de rostros. Google también me da algo sobre iphoto cuando busco detección de rostros. Picasa también ha sido detectada. ¿Existe alguna forma de detectar automáticamente las caras en un documento, lo que mejoraría la productividad en mi lugar de trabajo al reducir el tiempo necesario para cortar imágenes individuales?

Documento escaneado de muestra (un documento real tiene 5 filas de 4 imágenes cada una = 20 fotografías): (de:http://www.memorykeeperphoto.com/images/passport_photo.jpg, uso justo)

Imagen de muestra

Por ej. En Picasa 3.8, al hacer clic en Ver> Personas, se muestran todas las caras y se me pide que las nombre. ¿Puedo guardar estas imágenes individuales automáticamente con los nombres como imágenes diferentes?

Respuesta1

Recortar fotografías de pasaporte automáticamente parece definitivamente factible. Condiciones de iluminación fijas, siempre mirando hacia adelante, formato de imagen consistente... No creo que se puedan pedir condiciones más favorables para la detección de rostros.

Intenté usardetección facialpara ver los resultados en su imagen de muestra:

salida de detección de cara sin procesar

Los pasaportes vienen en diferentes formatos y tamaños, por lo que se empaquetarán en la superficie plana del escáner de manera irregular, pero supongo que colocarás las fotografías siempre en posición vertical. facedetectnos dará los centros y tamaño de todas las caras. En particular, podemos usar el tamaño de la cara y recortar el área a su alrededor proporcionalmente. Dado que las fotografías de pasaporte tienden a cubrir un área fija de la fotografía, parece una suposición relativamente segura.

Recortar subregiones de una imagen es realmente fácil usandoImagenMagia. Escribí un pequeño (y aproximado) script de shell para automatizar el proceso:

#!/bin/sh
pc=60
files="P1Xb8.jpg"

fileno=1
for file in $files; do
  n=1
  facedetect $file | while read x y w h; do
    border=$(($w * $pc / 100))
    x=$(($x - $border))
    y=$(($y - $border))
    w=$(($w + $border * 2))
    h=$(($h + $border * 2))
    echo $x $y $w $h
    convert "$file" -gravity NorthWest -crop "${w}x${h}+$x+$y" "${fileno}_$n.jpg"
    n=$(($n + 1))
  done
  fileno=$(($fileno + 1))
done

Definí empíricamente un área de borde del 60% (en la segunda línea del guión) del ancho de la cara detectada. Estas son las cuatro imágenes que me salen:

1_1 1_2 1_3 1_4

que ya es bastante bueno. Siempre queda algo de espacio en blanco en la parte superior, que pude eliminar simplemente agregando "-fuzz 10% -trim" en la convertinvocación. Aquí está el resultado de la primera imagen después de eso:

1_1 recortado

No está nada mal para un guión rápido y hay mucho margen de mejora. Por ejemplo, la mayoría de los pasaportes utilizan una orientación vertical, por lo que tienen un factor vertical/horizontal diferente (normalmente 1,3). Además, las caras tienden a moverse ligeramente hacia arriba (probablemente en 1,3). Corregirlos daría como resultado un mejor recorte, evitando por completo la necesidad de recortar el espacio en blanco en la parte superior.

Sería bueno si pudiera publicar (incluso de forma privada) un escaneo de superficie plana de muestra para probar este script con algún resultado real.

Por supuesto, esta sugerencia requiere una instalación de Linux. Pero si entendí correctamente, no es del todo descabellado configurar una instalación dedicada o incluso una máquina virtual para automatizar esta tediosa tarea.

Si la privacidad no es un problema (pero lo dudo), en realidad me interesaría ayudar a escribir una solución decente a cambio de las caras recortadas, que usaría para mejorar el modelo de detección de rostros.

información relacionada