Извлечение отдельных снимков головы из группового фото

Я ищу инструмент, который сделает групповое фото (с высоким разрешением), автоматически найдет все лица и извлечет их как отдельные снимки. Есть такой инструмент? Распознавание лиц довольно стандартно, но автоматическое извлечение их в виде отдельных файлов — это то, с чем я еще не сталкивался.

Я бы тоже не возражал, если бы инструмент был бесплатным/дешевым :)

на какой ОС он должен работать?
О верно. Спасибо за вопрос. Я бы предпочел Windows, но iOS или OS X тоже подойдут.
Если у вас есть какие-либо способности к написанию сценариев, в OSX вы можете использовать FaceDetect для извлечения координат, которые затем могут быть переданы в ImageMagick для извлечения.
@StarGeek: Вау, это выглядит многообещающе — это скрипт Python, поэтому он должен работать и в Windows (где я чувствую себя более комфортно).
Требуется немного работы, чтобы сделать его пригодным для использования в Windows. Проверьте этот пост Reddit , который я сделал, в котором подробно описаны шаги, которые мне пришлось пройти, чтобы заставить его работать.
@StarGeek: Это сработало отлично — не могли бы вы превратить это в ответ (может быть, даже включить соответствующие части поста на Reddit)? Для установки opencv команда pip install opencv-pythonработала нормально.

Ответы (1)

Благодаря @StarGeek ( соответствующий пост на Reddit ) я смог написать для этого небольшой скрипт.

Чтобы настроить среду на Python 3 (на компьютере с Windows 10 с использованием Anaconda), я выполнил следующие шаги:

  • pip install opencv-python
  • Скачать и извлечьfacedetect
  • Переименовать facedetectвfacedetect.py
  • В файле facedetect.pyотредактируйте строку

DATA_DIR = '/usr/share/opencv/'

на правильный путь. На моей Windows 10 это было:

DATA_DIR = 'C:/Anaconda3/Lib/site-packages/cv2/data/'; если у вас установлен Python только для текущего пользователя, это может выглядеть примерно так

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

  • Наконец, измените строку

'HAAR_FRONTALFACE_ALT2': 'haarcascades/haarcascade_frontalface_alt2.xml'

к

'HAAR_FRONTALFACE_ALT2': 'haarcascade_frontalface_alt2.xml',

  • Поместите изображения для обработки в тот же каталог, что иfacedetect.py
  • Запустите следующий скрипт в этом каталоге:
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)

Например, на этом изображении (Хейден Шифф (IagoQnsi, Wikimedia Commons ))

ФК Цинциннати 2016

скрипт выдает следующий вывод:

Скриншот Проводника Windows

Не забудьте принять свой собственный ответ (многим придется подождать, пока вы не сможете; используйте точку 2 дня, сейчас не уверен). Это поможет другим в будущем. если вы действительно хотите пойти дальше, вы можете найти изображение с лицензией Creative Commons и вставить изображение и результаты в свой ответ, чтобы мы поняли, что оно делает.
@Mawg: Замечательная идея :)
@TimPietzcker Отлично сделано. Извините, что не опубликовал в качестве ответа, я чувствовал, что ответ должен был включать любые сценарии, которые вы действительно сделали для извлечения изображений. Кроме того, вам пришлось вносить изменения в скрипт FaceTect, как я упоминал в сообщении Reddit, или где вы смогли заставить его работать как есть?
Пожалуйста, публикуйте такие примеры. Спасибо++
@StarGeek: Ах, да, я забыл этот шаг. Добавлю это на мгновение.