Выбрано из pyimagesearch, автор: Adrian Rosebrock, собрано сердцем машины.
В этой статье описываются три метода создания пользовательского набора данных для распознавания лиц: сбор данных изображений лиц с помощью OpenCV и инструментов веб-камеры, загрузка изображений лиц программно и сбор изображений лиц вручную.
В следующих нескольких сообщениях в блоге автор познакомит вас с моделью «компьютерное зрение + глубокое обучение» для выполнения задач распознавания лиц. Однако, чтобы обучить модель, которая может распознавать лица в потоке изображения или видео, нам сначала нужно собрать набор данных изображений лиц.
Если вы используете заранее подготовленный набор данных, такой как Labeled Faces in the Wild (LFW), вы можете избежать этой тяжелой работы. Вы можете создать собственное приложение для распознавания лиц, используя методы, описанные в нашем следующем блоге.
Однако для большинства людей лица, которые мы хотим идентифицировать, часто не включены ни в один из существующих наборов данных, таких как наши собственные изображения, изображения друзей, семьи или коллег.
Чтобы выполнить эту задачу, нам нужно собрать образцы лиц, которые мы хотим распознать, и каким-то образом их количественно оценить.
Этот процесс часто называют «регистрацией распознавания лиц». Мы называем это «регистрацией», потому что во время этого процесса мы будем регистрировать и регистрировать пользователя как реальный образец в наших наборах данных и приложениях.
В этой статье будет рассмотрен первый шаг процесса регистрации: создание пользовательского набора данных для распознавания лиц.
Как создать собственный набор данных для распознавания лиц
В этом уроке мы рассмотрим 3 способа создания пользовательского набора данных для распознавания лиц. Первый метод использует OpenCV и инструменты веб-камеры для выполнения двух задач: (1) обнаружение лиц на видео; (2) сохранение образцов изображений лиц или видеокадров на диск.
Во втором методе мы обсудим, как программно загружать изображения лиц.
Наконец, мы обсудим, как вручную собирать изображения лиц и когда этот подход уместен.
Давайте начнем создавать набор данных для распознавания лиц!
Способ 1: Регистрация лиц через OpenCV и веб-камеру
Рисунок 1: Используя OpenCV и веб-камеру, мы можем обнаруживать лица в видеопотоке и сохранять образцы на диск. Этот процесс можно использовать для создания локального набора данных распознавания лиц.
Этот метод работает в следующих ситуациях:
1. Вам необходимо создать «живую» систему распознавания лиц;
2. Вам необходимо иметь физический доступ к определенным людям, чтобы собирать данные об их лицах.
Такая система особенно полезна для компаний, школ или других организаций, где люди физически присутствуют в поле каждый день.
Для того, чтобы собрать образцы изображений лиц этих людей, нам может понадобиться разместить их в специальном помещении с заранее установленной видеокамерой, чтобы: (1) обнаружить (x, y) лиц в видеопотоке Координаты; ( 2) Записать видеокадр с лицом пользователя на диск. Нам могут даже потребоваться дни или недели, чтобы сделать все вышеперечисленное для сбора образцов лица в следующих ситуациях:
- различные условия освещения
- разное время суток
- Различные настроения и эмоциональные состояния
Собирая образцы лиц в разных ситуациях, мы можем создать более разнообразный и репрезентативный набор данных изображений лиц для конкретных пользователей.
Затем мы создаем собственный набор данных для распознавания лиц, используя простой скрипт Python. Этот скрипт Python может выполнять следующие задачи:
1. Подключитесь к нашей веб-камере;
2. Обнаружение лиц;
3. Запишите видеокадр с лицом на диск.
Чтобы получить код, используемый в этой статье, перейдите к разделу «Загрузки» этой статьи.
Когда будете готовы, откройте файл build_face_dataset.py и давайте пошагово расшифруем код:
В строках 2-7 импортируем нужные пакеты. Особенно нужные нам пакеты Opencv и imutils. Чтобы узнать, как установить Opencv, обратитесь к этому руководству по установке, предоставленному мной (Woohoo.py image search.com/OpenCV-tutu...). Пакет imutils можно легко установить или обновить с помощью инструмента pip:
$ pip install --upgrade imutils
Если вы используете виртуальную среду Python, не забудьте использовать команду workon!
После установки среды мы обсудим два параметра командной строки, которые необходимо использовать:
Аргументы командной строки анализируются во время выполнения пакетом argparse (который автоматически устанавливается при установке среды Python). Если вы не знакомы с argparse и аргументами командной строки, я настоятельно рекомендую вам быстро просмотреть этот пост в блоге (woohoo.py изображение search.com/2018/03/12/…).
У нас есть два аргумента командной строки, которые нам нужно использовать:
- --cascade: путь на диске к файлу каскада Хаара.
- --output: путь к выходной папке. Изображения лиц будут храниться в этой папке, поэтому я рекомендую назвать эту папку именем владельца лица. Например, если вы собрали изображения лица «Джона Смита», вы можете сохранить все изображения в папке набора данных/john_smith.
Далее мы загрузим файл конкатенации Хаара для лица и инициализируем видеопоток:
В строке 18 мы загружаем каскадный детектор Хаара OpenCV. Этот детектор выполнит тяжелую работу в следующем покадровом цикле.
Мы инициализируем и запускаем наш видеопоток в строке 24.
Примечание. Если вы используете Raspberry Pi, закомментируйте строку 24 и раскомментируйте строку 25.
Чтобы камера разогрелась, мы просто останавливаем программу на 2 секунды (строка 26).
Мы также инициализируем общий счетчик, представляющий количество изображений лиц, хранящихся на диске (строка 27).
Теперь давайте покадрово зациклим на видеопотоке:
В строке 30 мы запускаем цикл (нажмите клавишу «q», чтобы выйти из цикла).
Из этой строки мы берем видеокадр, создаем копию кадра и изменяем размер изображения (строки 34-36).
Теперь пришло время выполнить распознавание лиц!
Мы можем обнаруживать лица в видеокадрах с помощью метода detectMultiScale. Для этой функции требуются следующие параметры:
- изображение: изображение в градациях серого;
- scaleFactor: указывает, насколько изображение уменьшается при каждом масштабе;
- minNeighbor: чтобы обеспечить достоверность обнаружения, этот параметр указывает, сколько смежных точек обнаружения должно быть у каждого прямоугольного ограничивающего прямоугольника-кандидата;
- minSize: Наименьший возможный размер изображения.
К сожалению, иногда нам нужно настроить этот метод, чтобы исключить ложные срабатывания или обнаружить полное лицо, но для обнаружения «крупных» изображений лиц эти параметры очень важны.Хорошая отправная точка.
Сказав это, вы также ищете более продвинутый и надежный метод? В предыдущей записи блога (woohoo.py изображение search.com/2018/02/26/…), я реализовал распознавание лиц с помощью OpenCV и глубокого обучения. Вы можете легко обновить сценарии в этой статье с помощью описанных в статье методов глубокого обучения, в которых используются предварительно обученные модели. Преимущество этого метода в том, что нет необходимости корректировать параметры и обучение проходит очень быстро.
Результатом этого метода распознавания лиц является список прямоугольников (прямоугольных ограничивающих рамок). В строках 44 и 45 мы зацикливаем прямоугольники и рисуем прямоугольную рамку над фреймом для отображения.
На последнем шаге мы сделаем две вещи в цикле: (1) отобразим видеокадр на экране; (2) обработаем отклик на нажатие клавиши. Конкретный код выглядит следующим образом:
В строке 48 мы выводим видеокадр на экран, а затем в строке 49 получаем ключевое значение.
В зависимости от того, была ли нажата «k» или «q», мы бы:
- Если нажата клавиша «k», мы сохраняем видеокадр и сохраняем его на диск (строки 53-56), а также увеличиваем значение счетчика (строка 58), представляющее общее количество полученных кадров. Нам нужно нажимать клавишу «k» в каждом кадре, который мы хотим сохранить. Я рекомендую сохранять изображения лиц, снятые в разных условиях, например, под разными углами, в разных областях кадра, в очках/без очков и т. д.
- Если нажата клавиша «q», цикл завершается, и скрипт готов к выходу (quit).
Если ни одна клавиша не нажата, мы возвращаемся к началу цикла и получаем кадр из видеопотока.
В конце концов мы распечатаем окончательное количество изображений, хранящихся на терминале, и очистим:
Теперь давайте запустим скрипт и соберем изображения лиц!
Убедитесь, что вы загрузили код и каскад Hal из раздела «Загрузки» этой статьи.
Выполните следующие команды на вашем терминальном устройстве:
$ python build_face_dataset.py --cascade haarcascade_frontalface_default.xml \
--output dataset/adrian
[INFO] starting video stream...
[INFO] 6 face images stored
[INFO] cleaning up...
После запуска скрипта мы обнаружили, что в подпапке adrian папки набора данных хранится 6 изображений:
$ ls dataset/adrian
00000.png 00002.png 00004.png
00001.png 00003.png 00005.png
Я рекомендую хранить образцы изображений лиц в подпапке с именем человека, которому принадлежит изображение.
Таким образом, вы можете улучшить организацию своего пользовательского набора данных распознавания лиц.
Способ 2. Программная загрузка изображений лиц
Рисунок 2. Другой способ создать набор данных для распознавания лиц (если человек является публичной фигурой или появился в Интернете) — выполнить поиск изображения в Google с помощью сценария или использовать API поиска изображений, использующий изображение Bing. Скрипт Python.
Если вы не можете сфотографировать человека в полевых условиях или он является публичной фигурой с сильным присутствием в Интернете (в некоторой степени), вы можете программно загрузить его лицо через API на различных платформах. Какой API выбрать, во многом зависит от того, чьи изображения лиц вы хотите собирать.
Например, если человек публикует сообщения в Twitter или Instagram, вы можете использовать один из этих (или других) API социальных сетей для получения изображений лиц.
Другой вариант — использовать поисковую систему, такую как Google или Bing:
- Используйте метод из этой статьи (woohoo.py изображение search.com/2017/12/04/…), вы можете вручную + программно загружать образцы изображений для заданного запроса с помощью Google Images.
- На мой взгляд, лучшим вариантом может быть использование API-интерфейса поиска изображений Bing, который полностью автоматизирован и не требует ручного вмешательства. Я реализовал этот полностью автоматизированный метод в этом посте (woohoo.py изображение search.com/2018/04/09/…).
Используя последний метод, я могу загрузить 218 изображений лиц из «Парка Юрского периода» и «Мира Юрского периода».
Пример команды для загрузки изображения лица Оуэна Грейди через Bing Image Search API выглядит следующим образом:
$ mkdir dataset/owen_grady
$ python search_bing_api.py --query "owen grady" --output dataset/owen_grady
Теперь давайте посмотрим на весь набор данных (после удаления изображений, не содержащих лица человека):
$ tree jp_dataset --filelimit 10
jp_dataset
├── alan_grant [22 entries]
├── claire_dearing [53 entries]
├── ellie_sattler [31 entries]
├── ian_malcolm [41 entries]
├── john_hammond [36 entries]
└── owen_grady [35 entries]
6 directories, 0 files
Всего за 20 минут (включая время на удаление ложноположительных образцов) мне удалось собрать собственный набор данных о лицах для Парка Юрского периода/Мира Юрского периода:
Рис. 3. Пример набора данных для распознавания лиц, созданного программным путем с помощью Python и Bing Image Search API. Здесь изображены шесть персонажей из фильмов о Парке Юрского периода.
Способ 3: ручной сбор изображений лиц
Рисунок 4: Ручная загрузка изображений лиц — наименее желательный вариант, но вы не должны забывать об этом. Вы можете использовать этот метод, когда человек не часто появляется в сети или когда изображение не имеет тегов.
Последний и наименее желательный способ создать собственный набор данных для распознавания лиц — вручную найти и сохранить образцы изображений лиц.
Этот метод, очевидно, самый утомительный и требует больше всего человеческих часов — обычно мы предпочитаем «автоматизированное» решение, но в некоторых случаях вам придется делать это вручную.
При таком способе нужно вручную проверить:
- Результаты поиска из поисковых систем (например, Google и Bing)
- Профили в социальных сетях (Facebook, Twitter, Instagram, SnapChat и т. д.)
- Сервисы обмена фотографиями (Google Фото, Flickr и т. д.)
Затем вручную сохраните эти образы на диск.
В этих сценариях у пользователей обычно есть какой-либо общедоступный профиль, но гораздо меньше изображений, чем при программном обходе.
PyImageSearch Gurus (бесплатно) Демонстрационный курс
Рисунок 5: В классе PyImageSearch Gurus (woohoo.py image search.com/py изображения ухо…), вы научитесь создавать систему безопасности с распознаванием лиц. Когда неавторизованный злоумышленник садится за ваш стол, он уведомляет вас текстовым сообщением (с изображениями).
Суммировать
В этой статье описаны три подхода к созданию пользовательских наборов данных о лицах для задач распознавания лиц.
Какой метод вы выберете, полностью зависит от вашего собственного приложения для распознавания лиц.
Если вы создаете «живую» систему распознавания лиц, например, для класса, компании или другой организации, вы можете предложить пользователям войти в комнату, предназначенную для сбора образцов изображений лиц, и продолжить там. Захват изображений лиц из видеопотоков ( Способ 1).
С другой стороны, если вы создаете систему распознавания лиц, включающую общественных деятелей, знаменитостей, спортсменов и т. д., в Интернете, вероятно, достаточно образцов их лиц. В этом случае вы можете использовать существующий API для загрузки образцов изображения лица программно (способ 2).
Наконец, если лица, которые вы пытаетесь идентифицировать, не имеют общедоступных онлайн-профилей (или имеют очень ограниченные профили), вам может потребоваться вручную собирать наборы данных о лицах и управлять ими (метод 3). Это, очевидно, самый ручной и утомительный метод, но в некоторых случаях вам может понадобиться использовать этот метод, если вы хотите распознать определенные лица.
Оригинальная ссылка:woohoo.py изображение search.com/2018/06/11/…