Я взял нетрадиционный проект и предложил нестандартное решение, но все же CCExtractor принял мой другой и непроверенный подход и дал мне возможность поработать над их самой популярной идеей проекта - а именно. Признание бедняка.

Вы можете прочитать мое Предложение GSoC l, чтобы узнать больше о моем подходе и причинах выбора пути Nodejs для проекта AI / ML вместо использования популярных фреймворков Python.

Проэкт

Poor Man’s Rekognition (PMR) стремится предоставить бесплатную альтернативу Amazon Rekognition с открытым исходным кодом. Подрывная технология, такая как распознавание лиц, должна быть доступна всем, а не только для более привилегированных. Amazon Rekognition - довольно сложная система. Чтобы начать PMR, я сосредоточился на обнаружении и распознавании лиц. Есть много библиотек, особенно в Python, которые предоставляют эти функции, но для практического использования им требуется много дорогостоящего оборудования. В течение всего лета моей целью было заставить все работать на ЦП, но при этом обеспечить разумную производительность для REST API. Для достижения этой цели я выбрал Nodejs и C ++.

Разделение на 3 проекта

Мой проект GSoC охватывает 3 подпроекта и, следовательно, 3 разных репозитория:

  1. Nodoface: дополнение Nodejs C ++ (привязка) к библиотекам C ++, которое помогло достичь высокой производительности процессора для алгоритмов машинного обучения.
  2. PMR-Core: библиотека Nodejs (с поддержкой TypeScript), которая объединяет библиотеки Nodoface и ML, недоступные в C ++. Например, нет модели ArcFace на C ++ или Nodejs. Это предоставляет полностью все необходимое для создания Amazon Rekognition, такого как API.
  3. PMR-Server: REST API для PMR-Core. Это обеспечивает конечные точки, аналогичные Amazon Rekognition. Любой вызов API генерирует ответ, более или менее идентичный Rekognition. Однако этот подпроект не завершен.

Nodoface

Статус: завершено

Более важными функциями в Nodoface являются детектор лиц MTCNN и операции ввода / вывода для файлов изображений и видео. В REST API реализованы и другие функции, которые в настоящее время не используются.

Заметный прирост производительности процессора:

Все показатели измерены на процессоре Intel i7 8-го поколения Quadcore с тактовой частотой 1,9 ГГц на машине Fedora.

Детектор MTCNN представляет собой привязку его реальной реализации из библиотеки C ++ OpenFace 2.0. Вот результат одного из невидимых данных:

Полный список функций, реализованных в Nodoface, можно найти в хранилище.

PMR-Core

Статус: завершено *

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

Основной целью PMR-Core было обеспечение распознавания и классификации лиц. Он использует Nodoface для эффективной обработки изображений и видео, а также часто используемых алгоритмов обнаружения лиц. Для распознавания лиц я предложил реализовать ArcFace с использованием TFJS, но, к сожалению, мои попытки обучить ArcFace не увенчались успехом. Я реализовал потерю ArcFace в TensorflowJS, но у меня не хватило времени, чтобы обучить архитектуру ResNet, используя потерю ArcFace. Но мне пришлось двигаться вперед, и поэтому я использую предварительно обученную модель Facenet из face-api.js (без среды узла с обезьяной исправления). Избегая глобального API face-api.js (хотя это довольно хороший дизайн), FaceRecognitionNet используется в PMR-Core для вычисления вложений, так что его можно легко заменить на ArcFace в будущем.

Для классификации используется простой KNN-классификатор, принимающий вложения как векторы признаков. Однако точность на LFW слишком низкая из-за небольшого соотношения образцов / классов. Всего 483 уникальных человека, у которых есть 10 и более образцов. Большинство удостоверений имеют только 2 или 1 образец. Вот одно из прогнозов:

Я могу использовать больший набор данных, но с KNN весь набор данных должен быть загружен в память. LFW, несмотря на то, что это небольшой набор данных, только вложения со всех лиц, хранящиеся в виде компактного файла JSON, заполняют мой ноутбук с 16 ГБ ОЗУ. Я должен использовать другой классификатор или полагаться на иерархическую кластеризацию для повышения точности классификации.

PMR-Сервер

Статус: частично выполнено

Теперь наступает та часть, где я могу показать много результатов :)

PMR-Server использует PMR-Core (также косвенно и Nodoface) для обработки своего запроса и асинхронно генерирует вывод в виде 1) ответа JSON и 2) загружаемого изображения / видео с нарисованными ограничивающими рамками и метками для визуализации. Для изображений вводом является JSON, содержащий строковое представление изображения в формате base64. Он декодируется в экземпляр Image (привязка cv :: Mat в Nodoface). Видео отправляются по прямому URL-адресу загрузки в теле сообщения POST.

Сервер использует метод «отправки и опроса». Каждый раз при получении запроса сервер отправляет «задание» и немедленно отправляет ответ со статусом задания. Например:

Первоначально статус работы по умолчанию будет «В ОЖИДАНИИ». На «ResultUrl» можно вызывать опрос до тех пор, пока статус задания не изменится на «ЗАВЕРШЕНО». В этот момент ответ будет содержать такие вещи, как BoundingBox и Labels, предсказанные PMR-Core. Кроме того, ResultUrl изменяется на ссылку для вывода изображения / видео с нарисованной визуализацией. Изменения статуса задания обновляются в базе данных PostgreSQL. Когда статус завершен, фактический результат JSON с прогнозами также сохраняется в БД. При опросе ResultUrl ответ JSON извлекается из БД.

Вот один из таких результатов:

Обратите внимание, что ResultUrl указывает на визуализацию, показанную выше как «Изображение 2».

Для тех, кому интересно, вот схема БД:

В большинстве случаев статус задания становится «ЗАВЕРШЕНО» в течение нескольких миллисекунд. Зачем тогда использовать опрос? Поскольку, если какой-либо ввод (например, видео или большое изображение) требует больше времени для обработки, сервер будет заблокирован этим запросом. Он может принимать другие запросы только после отправки ответа на текущий запрос. «Диспетчеризация и опрос» гарантирует, что сервер всегда доступен для приема новых запросов. Опять же, очень нетрадиционный подход, но он необходим для задач с интенсивным использованием ЦП, подобных нашей. Другой вывод на изображении с большим количеством лиц:

Ярлыки в основном неправильные из-за небольшого количества данных, доступных KNN. Хотя он правильно классифицировал «Дженнифер Энистон», оценка уверенности составляет всего 25%, потому что есть только одна выборка актрисы и K = 4.

На момент написания этого документа DetectFaces и RecognizeCelebrities - это функциональные действия, предоставляемые сервером. Я также добавил поддержку видео (действие CelebrityInVideo), но генерируется только ответ JSON, видеовыход не может быть записан из-за проблем с кодированием в моей установке OpenCV.

Будущая работа

Дальнейшая работа будет включать переход на лучший классификатор и / или использование кластеризации для больших наборов данных, таких как YouTube Faces или MS Celebs. В большинстве случаев одного набора данных недостаточно. Я также работаю над развертыванием проекта в AWS в течение последних нескольких дней, но еще не завершил это экономически эффективным способом и таким образом, чтобы не нарушить кодовую базу. После развертывания я продолжу работу над этим проектом в свободное время. Я верю, что только Nodoface поможет многим людям разработать собственные сервисы. Кроме того, по мере добавления дополнительных функций в PMR-Server его необходимо будет разделить на микросервисы. Это большая работа, но, надеюсь, многие пожнут плоды!

Больше информации

Вы можете прочитать мои заметки здесь, чтобы узнать технические подробности и проблемы, с которыми я столкнулся на этом пути.