Автоматически распознавать лица на снимке

Автоматически распознавать лица на снимке

На моем рабочем месте фотографии паспортного размера сканируются вместе, затем разрезаются на отдельные изображения и сохраняются с уникальными номерами файлов. В настоящее время мы используем Paint.net для ручного выбора, вырезания и сохранения изображений.

Я видел, что в камере Sony Cybershot есть функция распознавания лиц. Google также выдает мне что-то об iphoto при поиске функции распознавания лиц. В Picasa тоже есть функция распознавания лиц. Есть ли способы автоматического определения лиц в документе, которые повысили бы производительность на моем рабочем месте за счет сокращения времени, необходимого для нарезки отдельных изображений.

Образец отсканированного документа (реальный документ имеет 5 рядов по 4 изображения в каждом = 20 фотографий): (из:http://www.memorykeeperphoto.com/images/passport_photo.jpg, добросовестное использование)

образец изображения

Например, в Picasa 3.8 при нажатии «Вид» > «Люди» отображаются все лица и предлагается дать им имена. Могу ли я автоматически сохранять эти отдельные фотографии с именами как разные фотографии?

решение1

Автоматическая обрезка фотографий на паспорт звучит определенно выполнимой. Фиксированные условия освещения, всегда лицом вперед, постоянный формат изображения... Я не думаю, что можно было бы желать более благоприятных условий для распознавания лиц.

Я пытался использоватьfacedetectчтобы увидеть результаты на вашем образце изображения:

необработанный вывод facedetect

Паспорта бывают разных форматов и размеров, поэтому они будут упакованы на планшете сканера нерегулярно, но я предполагаю, что вы всегда будете размещать фотографии вертикально. facedetectдаст нам центры и размер всех лиц. В частности, мы можем использовать размер лица и пропорционально обрезать область вокруг него. Поскольку фотографии на паспорт, как правило, занимают фиксированную область фотографии, это кажется относительно безопасным предположением.

Обрезать части изображения очень просто с помощьюImageMagick. Я написал небольшой (и грубый) скрипт для автоматизации процесса:

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

Я эмпирически определил область границы в 60% (во второй строке скрипта) от ширины обнаруженного лица. Вот четыре изображения, которые я получаю:

1_1 1_2 1_3 1_4

что уже довольно хорошо. Всегда остается немного пустого пространства сверху, которое я смог удалить, просто добавив "-fuzz 10% -trim" в вызове convert. Вот результат первого изображения после этого:

1_1 обрезано

Неплохо для быстрого сценария, и есть много возможностей для улучшения. Например, большинство паспортов имеют портретную ориентацию, поэтому имеют разный вертикальный/горизонтальный фактор (обычно 1,3). Кроме того, лица, как правило, слегка смещены вверх (вероятно, на 1,3). Исправление этих ошибок приведет к лучшему кадрированию, избежав необходимости полностью обрезать белое пространство вверху.

Было бы неплохо, если бы вы могли опубликовать (пусть даже в частном порядке) пример планшетного сканирования, чтобы протестировать этот скрипт на реальных выходных данных.

Конечно, это предложение требует установки Linux. Но если я правильно понимаю, не так уж неразумно настроить специальную установку или даже виртуальную машину для автоматизации этой утомительной задачи.

Если конфиденциальность не является проблемой (в чем я сомневаюсь), мне было бы интересно помочь написать достойное решение в обмен на обрезанные лица, которые я бы использовал для улучшения модели распознавания лиц.

Связанный контент