Друзья, здесь я покажу, как создать REST API для распознавания лиц с помощью Node.js, Express Js, MongoDB и face-api.js. Это основные пакеты, которые мы собираемся использовать, однако нам понадобятся и другие пакеты, которые я покажу позже в этой статье. Я буду кодировать, чтобы показать вам, как это работает, и основной целью этого API является постоянное хранение данных о лицах в базе данных, и его преимущество в том, что даже если сервер не работает или недоступен, у нас есть данные, хранящиеся в базу данных. Поэтому нам не придется каждый раз обучать модель. Прежде чем мы начнем, пожалуйста, убедитесь, что вы понимаете следующие темы

  • Node.js
  • Express.js
  • MongoDB + Мангуст
  • Асинхронные функции

Назначение API

В наши дни распознавание лиц становится важной функцией. Недавно мне пришлось работать над проектом, в котором требовались функции поиска изображений на основе распознавания лиц, и это называется TalaashUnlock. Работая над этим проектом, я не мог найти достаточно ресурсов для интеграции сервера с моделью распознавания лиц и хранения данных в базе данных. Есть несколько сервисов, которые можно использовать для найма, но нам нужно построить с помощью Rest API, так как мы хотим сделать его независимым от системы. Более того, некоторые API распознавания лиц устаревают. К счастью, я нашел пакет под названием face-api.js, который смог решить эту проблему, но у него не было достаточно документации для реализации с сервером и базой данных. Поэтому я решил написать эту статью. Ниже я добавлю ссылку на документацию по face-api.js, модели и весь код API этой статьи.

  1. Ссылка на документацию Face-api.js
  2. Ссылка на Git-репозиторий
  3. Ссылка на модели

Вот простая архитектура того, как это работает -

Чтобы эта статья была короткой, я покажу только основные функции, необходимые для использования распознавания лиц в приложениях общего назначения. Эти особенности -

  • Получение нескольких изображений лица и этикетки.
  • Извлечение признаков из изображений и сохранение их в базе данных с метками.
  • Проверка лиц при загрузке нового изображения и предоставление наиболее похожего изображения.

Запуск экспресс-сервера

Сначала давайте начнем с импорта пакетов, необходимых для нашего API. Вот список зависимостей, которые вам нужно установить с помощью менеджера пакетов npm — express, mongoose, express-fileupload, face-api.js, canvas

После установки пакетов мы можем импортировать их в наш основной файл сервера, в моем случае это файл app.js. Затем мы запускаем наш экспресс-сервер, подключаем его к базе данных и слушаем нужный порт. Мы также должны добавить экспресс-загрузку файлов в качестве промежуточного программного обеспечения на наш сервер.

Инициация моделей

Теперь, когда наш сервер работает, нам нужно загрузить нашу модель. Поскольку мы используем предварительно обученные модели пакета face-api.js, нам нужно загрузить их сохраненные модели и инициировать наш API-интерфейс лица с моделями. Для этого убедитесь, что вы можете скачать модели, я прикрепил ссылку выше для их загрузки, затем вы можете сохранить их в папке в корневом каталоге сервера. Для себя я назову эту папку моделью, имя зависит от вас, затем, используя следующий код, я загружу модель. Я добавил это сразу после добавления файла в качестве промежуточного программного обеспечения.

Определение схемы MongoDB

Чтобы хранить наши данные в базе данных MongoDB, нам нужно сначала создать базу данных, а также определить схему в нашем коде. Я не буду показывать здесь, как создать базу данных, но следующий код — это то, как я определил схему для наших данных о лицах. Важно обратить внимание на типы данных схемы: мы храним метки в виде строк, а описания — в виде массива (на самом деле массив содержит объекты).

/create-face маршрут и сохранение данных в базе данных

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

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

Мы принимаем изображения и помечаем их как входные данные для этой функции. Затем мы оборачиваем функцию с помощью try-catch, чтобы при возникновении каких-либо ошибок в процессе приложение не вылетало. После этого мы определяем массив для хранения всех описаний перед загрузкой в ​​базу данных, и мы просматриваем каждое из изображений, чтобы прочитать изображение с помощью функции canvas.loadImage(). Затем мы передаем данные изображения в методы face-api и определяем особенности лиц. Затем описание извлекается из признаков и помещается в массив описаний. Поэтому после извлечения всех функций изображения мы сохраняем данные в базе данных в соответствии со схемой и возвращаем true, если задача выполнена.

Основной метод готов, теперь мы можем запустить маршрут. Ниже приведен код маршрута:

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

req.files работает, только если вы используете пакет express-fileupload, о котором я упоминал ранее. В противном случае вам нужно будет загрузить изображения другими способами. Также в этом примере я показал загрузку только 3 изображений лица, но для большей точности можно использовать больше.

Маршрут /fetch-face и распознавание лиц

Эта часть очень важна, и мы должны быть очень осторожны. Сначала мы получаем все данные о лицах из базы данных. Но данные, которые мы получаем, — это просто объекты в массивах. Чтобы наша модель читала описания для каждого изображения, оно должно быть объектом LabeledFaceDescriptors. Однако для этого нам нужно передать описания как Float32Array. Поэтому для каждого из данных лица мы прокручиваем каждое из описаний, которые являются объектами. Мы превращаем эти типы объектов в Array, а затем в Float32Array. Затем мы запускаем фейсматчер и считываем изображение, которое было передано в функцию для выполнения распознавания. Мы запускаем функции обработки и обнаружения на основе документации API лица и возвращаем результаты.

Теперь мы можем определить маршрут для проверки лиц. Далее маршрут-

Тестирование

Наш API готов к работе, теперь давайте проверим его с помощью Postman. Postman — отличный инструмент для бесплатного тестирования API. Вы можете скачать это здесь".

Сначала я загрузил 3 изображения одного и того же человека с таким ярлыком -

Пожалуйста, обратите внимание на указанные детали. Если они не совпадают с вашим кодом, сервер ответит ошибкой. Вы должны получить такой ответ, если все прошло хорошо -

В базе данных у вас должны быть документы, подобные следующим, для каждого из загруженных лиц:

Теперь я могу загрузить тестовое изображение и посмотреть, сможет ли API распознать, чье это лицо.

Результат, который я получаю, таков -

Прошу прощения, если статья получилась слишком длинной, но это была моя первая статья. Надеюсь, вам понравился контент. Если это было полезно, поставьте звездочку на моем github и поделитесь этим блогом с другими. Если у вас возникнут проблемы с этим кодом, вы можете связаться со мной в Instagram по адресу @rakesh_openai.

Огромное спасибо !!!!