Распознавание лица с помощью OpenCV на Java

1656573862 raspoznavanie licza s pomoshhyu opencv na java

Маниш Бансал

SdxqmAHHWtQJSB6ATScZMziN17wSQPXockbL
Источник: https://statescoop.com

С тех пор как начался бум искусственного интеллекта – или реклама iPhone X с функцией разблокировки лицом появилась на экранах телевизоров – я хотел попробовать эту технологию. Однако, как только я начал искать Google, я обычно находил только примеры кода на Python. И будучи энтузиастом Java в течение семи лет, я был демотивирован, увидев это. Поэтому я наконец-то решил поискать библиотеки с открытым кодом Java для этого.

В настоящее время существуют разные библиотеки Java. Но самым популярным, что я нашел, был OpenCV.

OpenCV — это библиотека компьютерного зрения с открытым исходным кодом, содержащая множество модулей, таких как обнаружение объектов, распознавание лица и дополненная реальность. Хотя эта библиотека написана на C++, она также предлагает проверенные в бою Java-привязки.

Однако есть один вопрос. В рамках выпуска программного обеспечения он предлагает лишь несколько модулей (с привязками Java) из коробки – и распознавание лица не является одним из них. Потому, чтоб употреблять его, необходимо вручную выстроить его.

Подождите! Что? Почему?

Так, причина, на которую ссылается сообщество OpenCV, является то, что модули не полностью стабильны. Потому они не входят в комплект со стандартным выпуском. Поэтому они хранят их здесь в отдельном хранилище.

Если у вас нет или очень мало опыта работы с C++ (как я), вы, вероятно, уже начали испытывать головокружение от самостоятельного создания библиотеки C++. Но не волнуйтесь, я здесь, чтобы держать вас за руку и проводить через этот изнурительный процесс. Так что начнем, а?

Создание OpenCV для Java с нуля

UPSASYdL1mTRl1Y2WO8wo5ORbKIVlJ0SZ4zp
«Птицы, летающие вокруг полупостроенного здания и строительной площадки» от 贝莉儿 NG на Unsplash

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

Во-первых, вам нужно иметь следующее программное обеспечение на вашем ПК. Здесь я создаю 64-разрядную версию библиотеки, поскольку у меня 64-разрядный ПК. Но вы можете создать его и для 32-разрядных.

Необходимое программное обеспечение:

  1. Cmake (я употреблял версию 3.6.0 rc-4).
  2. Ant (используется внутри для создания JAR)
  3. MinGW — W64 GCC-8.1.0
  4. 64-разрядный JDK 1.8

Несколько слов о MinGW: Здесь, чтобы создать библиотеку, нам нужны компиляторы C++. Вы можете использовать инструменты Visual Studio (VS), которые гораздо лучше. Однако у меня не хватило роскоши сделать это, поскольку я создал это на своем офисном ноутбуке, а VS – это лицензионное программное обеспечение, недоступное для людей, использующих Java. Поэтому мне пришлось использовать инструменты с открытым кодом, и лучшим является MinGW (Minimalist GNU for Windows).

Кроме того, очень важно использовать правильную версию MinGW. Загрузите версию x86_64-posix-seh, поскольку в этой версии имеется поддержка потоков. Все остальные версии я не пробовал. Но версия x86_64-win32-sjlj вообще не работает.

Чтобы предоставить большую перспективу, сбор выполняется с помощью утилиты, которая называется сделать который является частью MinGW (bin/mingw32-make.exe). make – это запуск задач для C++, как «Ant» для Java. Но код C++ и сценарии make очень сильно зависят от платформы. Итак, чтобы сделать распространители независимыми от платформы, утилита CMake используется. CMake генерирует зависимые от платформы сценарии создания.

Создание конфигураций сборки с помощью CMake

Шаг 1: Загрузите почтовый архив с исходным кодом opencv и opencv_contrib и распакуйте его в каталог. Далее создайте папку под названием build в том же каталоге (я создал build_posix, как видно на снимках экрана).

Шаг 2: Откройте CMake. Укажите «где находится исходный код» в извлеченной папке opencv. Далее укажите «где построить двоичные файлы» в папку «build», которую вы создали.

3w-kaNsw1jy-wgJj27ivlgUpkB3nWbKhmSAg

Шаг 3: Добавьте 64-разрядную папку JDK 1.8 bin, папку MinGW bin и папку Ant bin в переменную среду «PATH». Это важно, поскольку CMake будет искать конфигурацию в переменной среды. Если этого не сделать, нам придется настроить CMake вручную на шаге 5.

Если у вас есть несколько JDK в вашей системе, и у вас уже есть другой JDK в «PATH», и вы не хотите добавлять JDK 1.8 в «PATH», вы можете пропустить это. Но настройте его вручную на шаге 5.

Шаг 4: Нажмите кнопку «Настройка» и выберите «MinGw Makefiles» и «Готово». После этого CMake начнет настраивать ваш проект. Это займет некоторое время, и по завершении настройки он покажет текущие доступные конфигурации.

Если вам интересно, правильно ли конфигурации, сгенерированные для вас, вы можете обратиться к журналам, которые были сгенерированы для меня здесь, и сравнить.

1yaCLCiHsbLeyhIyjrWmIfMJfH2VO0bXcdk9

Шаг 5: Теперь наступает важнейшая часть – изменение конфигураций. Для установки конфигурации сначала установите флажки «Сгруппировано» и «Дополнительно».

HNOpUBXPSjKz6lJcJiTQcZxlxLPWVRSD6yKR
  • Убедитесь, что ANT_EXECUTABLE (ищите ANT_EXECUTABLE в окне поиска) и все пять конфигураций JAVA указывают на 64-разрядный JDK 1.8. Если шаг 3 выполнен правильно, это будет правильно. В противном случае исправьте их.
zKNLlpIu8mRydVeelgHNLs4CevTolRnHxTrP
  • Снимите флажки Python (ищите «Python») в группах «BUILD» и «INSTALL», поскольку нам не нужны сборки Python.
zXNIv3AOYlE5jS7KKgBm3Gkp7rBZA2PfrGkS
  • Отключите WITH_MSMF и WITH_IPP & WITH_TBB. Эти библиотеки доступны только для VS.
  • Отредактируйте «OPENCV_EXTRA_MODULES_PATH» в группе «OPENCV» и установите его в папку «modules» в исходной папке «opencv_contrib», которую вы распаковали ранее.
Vxz1vQr2-CoYNCn2HMyrkN0FjuI6pvTEZlOm

Затем снова нажмите кнопку «Настроить». Это позволит произвести окончательные настройки. Вы можете обратиться к журналам, которые были созданы для меня здесь.

Примечание: Обязательно сравните свои журналы «Настройки», сгенерированные с журналами, которыми я поделился в pastebin выше. Если вы найдете некоторые майор разницу, тогда сначала попробуйте исправить свои конфигурации и снова нажмите «Настроить». Иначе есть вероятность, что ваш сборник терпит неудачу, и его будет сложнее наладить.

Шаг 6: После этого нажмите кнопку «Создать». Это займет несколько секунд, затем закройте CMake.

Составление OpenCV

Теперь, если все сгенерированные выше конфигурации верны, эта задача будет легкой (2–3 часа!). Просто откройте командную строку, перейдите в папку «build» и выполните следующую команду.

mingw32-make.exe  -j5 > buildLogs.txt

здесь, -j5 добавляется, что предписывает утилите make выполнять пять задач параллельно. Это сделает ваш сборник быстрее, по крайней мере, теоретически.

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

Примечание: Порядок операторов журнала может быть не таким, как для вас, поскольку сборка проходит в пяти параллельных потоках.

После завершения сборки вы можете проверить папки bin и lib в вашем каталоге build. Внутри «bin» вы будете иметь все ваши opencv*.exe и libopencv*.dll и ваш скомпилированный JAR. Кроме того, «lib» будет иметь вашу основную dll (libopencv_javaxxx.dll) вместе с некоторыми зависимыми файлами.

mIygBsHnPC5flruoL8nFf3yEAF7P96QMYh6l
папка «bin» после успешной компиляции
ORUBTFMX5NhE0AjRxAfiLfoTAW4o3OnDR1VX
папка «lib» после успешной компиляции

Практически с OpenCV API распознавание лица

e3jIAxwvVbVXoR2L0sOeAUQ352nzncBolZYX
Фото от rawpixel на Unsplash

Теперь, когда вы создали библиотеку, вам нужно сначала настроить переменные среды, а также библиотеку пользователя в Eclipse.

  1. Создайте переменную OPENCV_JAVA_BIN и укажите ее на папку bin, созданную в вашем каталоге build.
  2. Создайте OPENCV_JAVA_LIB и укажите его на папку «lib», созданную в вашем каталоге «build».
  3. Добавьте обе вышеупомянутые переменные в переменную «PATH».
  4. Откройте Eclipse и создайте новую библиотеку пользователей, которую вы будете использовать для проекта распознавания лица. Выделите «Окно» > «Настройкиes”. В меню перейдите в раздел «Java» > «Путь к сборке» > «Библиотеки пользователей» и выберите «Новый…». Введите имя библиотеки, например opencv, и выберите новую библиотеку пользователя. Выберите «Добавить внешние JAR-файлы» и выберите «opencv-3xx.jar» со своего компьютера.

После этого есть нет нужды чтобы связать родную библиотеку, поскольку это было добавлено к вашим переменным «путям» на шаге 3.

Когда вы закончите эту настройку, вы можете клонировать мой репозиторий Git отсюда и импортировать проект в свою рабочую область Eclipse. Кроме того, вам нужно будет добавить JDK 1.8, а также библиотеку пользователя opencv (только созданную выше) в этот проект. Когда вы закончите, вы будете готовы протестировать свою недавно созданную библиотеку OpenCV.

На момент написания этого проекта в этом проекте есть три программы.

  • Привет Мир: вы можете запустить это, чтобы проверить правильность настройки библиотеки OpenCV. Если это не работает должным образом, вам нужно разобраться сначала. Единственные проблемы, с которыми вы столкнетесь на этом этапе, касаются переменных системной среды или настройки библиотеки пользователя.
  • FaceDetection: Вы можете использовать это для проверки модуля распознавания лица. Это другой модуль от распознавания лица. Это модуль, поставляемый вместе со стандартным выпуском OpenCV. На момент написания этой статьи мы можем предоставить изображение как вход в программу, и она обнаружит все лица внутри изображения. Исходное изображение имеет зелёные прямоугольники, нарисованные на всех обнаруженных гранях.
TzyLTh-v5ie9SpRVJH2rHyK3OPSpSHpvYWFJ
Входное изображение для обнаружения лица
csQYwDeXAiOBbv6AWCOxhlLMvqZ1wyaf0GRz
Исходное изображение программы распознавания лица
  • Распознавание лиц: модуль OpenCV facerec включает три алгоритма:
  1. Собственные лица
  2. Fisherfaces
  3. Гистограммы локальных бинарных шаблонов.

Техническую информацию по всем этим алгоритмам можно найти в этой официальной статье. Для демонстрационных целей, я покажу вам, как использовать алгоритм Eigenfaces.

Сначала нужно скачать данные о тренировках из базы данных лица. Эти данные содержат десять разных изображений для каждого из 40 отдельных предметов (400 изображений). Для некоторых объектов изображения были сделаны в разное время, изменяя освещение, выражение лица (открытые/закрытые глаза, улыбается/не улыбается) и детали лица (очки/без очков). После извлечения их на компьютере вам нужно подготовить файл .csv, содержащий путь к каждому изображению вместе с соответствующей меткой.

Чтобы облегчить это, у меня есть один TrainingData.txt в моем хранилище Git. Однако вам нужно отредактировать файл и изменить пути к изображениям в соответствии с местоположением каталога вашего компьютера.

Примечание: загруженная база данных лиц содержит изображение в формате .pgm. Этот формат есть Не поддерживается с помощью Windows. Чтобы фактически конвертировать их в .jpg, я добавил PGMToJPGConverter в свое хранилище. Вы можете использовать это для преобразования изображений и реального просмотра данных обучения.

После этого можно запустить программу распознавания лица. Ниже приведены шаги, выполняемые в программе:

  1. Библиотека OpenCV загружается как обычно.
  2. Файл .csv читается и создается два списка массивов. Один для матрицы изображений, а другой для соответствующих меток.
  3. Из 400 входных изображений последняя запись в структуре данных списка удаляется и сохраняется для дальнейшего тестирования обученной модели.
  4. После этого остальные 399 изображений используются для обучения алгоритму Eigenfaces.
  5. После завершения обучения модели просят предусмотреть метку изображения, которое мы удалили на шаге 3.
3h2mUCWnXzKQeFfIMJpFMIGxLoAM80Bp6tP0
Выход программы распознавания лица

Здесь мы можем заметить, что алгоритм способен предусмотреть метку нашего испытуемого со значением доверия 1807 года. Чем ниже значение, тем лучше предсказание. Также можно выполнить это упражнение с помощью двух других алгоритмов. Код C++ можно скачать здесь и здесь.

Обновление (27 декабря 2018 г.): Если вы считаете создание привязок openCV java болезненным, у меня для вас есть хорошие новости. Недавно я нашел более простой способ получить все зависимости openCV для java. Для получения полной информации см. другую статью.

Приветствую!! ? Вы дошли до конца. И если вам понравилась «эта статья, нажмите кнопку хлопка ниже». Для меня это многое значит и помогает другим людям увидеть историю.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *