Detectar automaticamente rostos em uma foto

Detectar automaticamente rostos em uma foto

No meu local de trabalho, as fotografias tamanho passaporte são digitalizadas juntas, depois cortadas em imagens individuais e salvas com números de arquivo exclusivos. Atualmente usamos o Paint.net para selecionar, cortar e salvar manualmente as imagens.

Eu vi que a câmera Cybershot da Sony tem detecção de rosto. O Google também me dá algo sobre o iphoto ao pesquisar por detecção de rosto. O Picasa também tem detecção de rosto. Existe alguma maneira de detectar automaticamente os rostos em um documento, o que melhoraria a produtividade no meu local de trabalho, reduzindo o tempo necessário para cortar imagens individuais.

Exemplo de documento digitalizado (um documento real tem 5 linhas de 4 imagens cada = 20 fotos): (de:http://www.memorykeeperphoto.com/images/passport_photo.jpg, uso justo)

imagem de amostra

Por exemplo. No Picasa 3.8, ao clicar em Exibir> Pessoas, todos os rostos são mostrados e sou solicitado a nomeá-los. Posso salvar essas imagens individuais automaticamente com os nomes como imagens diferentes.

Responder1

Cortar fotos de passaporte automaticamente parece definitivamente viável. Condições fixas de iluminação, sempre voltado para frente, formato de imagem consistente... Não creio que se possa pedir condições mais favoráveis ​​para detecção de rostos.

Eu tentei usardetecção facialpara ver os resultados em sua imagem de amostra:

saída de detecção de rosto bruta

Os passaportes vêm em diferentes formatos e tamanhos, por isso serão embalados na mesa do scanner de forma irregular, mas presumo que você colocará as fotos sempre na vertical. facedetectnos dará os centros e o tamanho de todas as faces. Em particular, podemos usar o tamanho do rosto e cortar a área ao seu redor proporcionalmente. Como as fotos do passaporte tendem a cobrir uma área fixa da fotografia, parece ser uma suposição relativamente segura.

Cortar sub-regiões de uma imagem é muito fácil usandoImagemMagick. Eu escrevi um pequeno (e aproximado) script de shell para automatizar o processo:

#!/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

Defini empiricamente uma área de borda de 60% (na segunda linha do script) da largura da face detectada. Estas são as quatro imagens que recebo:

1_1 1_2 1_3 1_4

o que já é muito bom. Sempre resta algum espaço em branco na parte superior, que consegui remover apenas adicionando "-fuzz 10% -trim" na convertinvocação. Aqui está o resultado da primeira imagem depois disso:

1_1 cortado

Nada mal para um roteiro rápido e há muito espaço para melhorias. Por exemplo, a maioria dos passaportes usa orientação retrato, tendo portanto um fator vertical/horizontal diferente (geralmente 1,3). Além disso, os rostos tendem a ser ligeiramente movidos para cima (provavelmente em 1,3). A correção resultaria em um corte melhor, evitando a necessidade de aparar totalmente o espaço em branco na parte superior.

Seria bom se você pudesse postar (mesmo em particular) um exemplo de digitalização de mesa para testar esse script em relação a alguma saída real.

Claro, esta sugestão requer uma instalação do Linux. Mas se bem entendi, não é totalmente irracional configurar uma instalação dedicada ou mesmo uma máquina virtual para automatizar essa tarefa tediosa.

Se a privacidade não for um problema (mas duvido), eu estaria realmente interessado em ajudar a escrever uma solução decente em troca dos rostos cortados, que usaria para melhorar o modelo de detecção de rostos.

informação relacionada