Вот как я разработал это маленькое веб-приложение, которое запускает 3D-оценщик поз и классификатор поз в веб-браузере. Проект основан на документе Распознавание жестового языка с помощью сингальской дактилоскопии с помощью компьютерного зрения, который представляет собой исследование разработки переводчика жестового языка в реальном времени с использованием небольшого набора обучающих данных. Экспериментальная установка реализована на Python и способна работать со скоростью 30 кадров в секунду на рабочем столе. В основном он делает две вещи: создает трехмерный скелет руки из изображения или видеокадра и классифицирует его, чтобы идентифицировать знак, который он представляет.

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

Есть несколько ограничений, которые формируют дизайн.

Прежде всего, это должно быть в реальном времени.

Давайте подумаем о настройке, в которой мы запускаем веб-сервер, который предоставляет полезные функции программы Python через веб-API. Мы можем легко использовать среду Python, такую ​​как Flask или Django, для настройки веб-сервера с REST API, инкапсулирующим исследовательский проект. Но успех этого будет зависеть главным образом от двух факторов.

Достаточная скорость сети

  • если мы ожидаем работать со скоростью 30 кадров в секунду, у нас есть не более ~ 33,3 мс, чтобы отправить изображение или представление позы на сервер и получить результаты обратно. Это без учета времени, затрачиваемого на локальной машине на такие задачи, как чтение видеопотока, обработка и отображение результатов, а также время, затрачиваемое на классификацию, которая сама по себе занимает ~33,3 мс в экспериментальной установке!
  • повышение скорости классификации не является частью этого проекта. Таким образом, наше ограничение составляет задержка сети + классификация ‹= 33,3 мс.
  • отправка представления позы вместо изображения сэкономит пропускную способность, но все же ‹ 33,3 мс не является реалистичным значением в большинстве обычных сетей.

Сервер может масштабироваться по мере увеличения числа одновременных пользователей.

  • Это не невозможно, но требует некоторой избыточной и расширяемой вычислительной мощности, что приводит к большему количеству оборудования и увеличению стоимости.

Мы могли бы решить обе эти проблемы, если бы перенесли обработку на сторону клиента. Это означает, что все должно работать в браузере. Что подводит нас ко второму ограничению.

Он должен быть написан на языке, который может работать в веб-браузере.

Я буду честен, я не знаю никакого другого языка, кроме JavaScript, который подходит. Но даже если бы были альтернативы, следующие факторы делают JS очень хорошим кандидатом:

  • Оценщик позы, использованный в исследовании, имеет JS реализацию.
  • Существуют решения для машинного обучения, такие как TensorFlow, доступные в виде пакетов JS (могут быть полезны при реализации классификатора).
  • Доступно множество инструментов для создания достойного пользовательского интерфейса (даже для тех, у кого мало опыта во фронтенд-разработке).

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

Мы не хотим обучать модели в веб-приложении. Нужно только запустить классификацию с использованием обученной модели.

Он должен использовать модели, обученные с помощью Python.

Это звучит как облом, но на самом деле это не так. Рассмотрим подробнее модель классификации. Он в основном имеет 2 шага. На шаге 1 имеется ансамбль, состоящий из 3 моделей, а на шаге 2 используется классификатор на основе правил.

Классификатор на основе правил может быть легко реализован на JS.

Возвращаясь к классификатору шага 1, это ансамбль, состоящий из моделей K-ближайшего соседа, логистической регрессии и случайного леса. Я нашел этот замечательный инструмент под названием m2cgen, который может преобразовать некоторые модели, обученные с помощью Scikit-learn, в код JS. С его помощью LR- и RF-модели могут быть преобразованы в JS-функции, которые принимают значения признаков в качестве входных параметров и возвращают класс, т. е. соответствующий признак.

Единственная часть головоломки, которой не хватает, — это модель KNN. Пакет m2cgen не поддерживал его. Однако есть обходной путь. Модель KNN мало отличается от двух других, когда дело доходит до обучения. Он не запускает итеративный процесс обучения, но хранит данные обучения и оценивает входящие данные на основе их расстояния до данных обучения. Для этого не очень сложно написать JS-скрипт. И еще проще использовать то, что кто-то уже написал. Поэтому я использовал мл-кнн. Средство оценки позы возвращает массив, содержащий 21 элемент, которые представляют собой трехмерные координаты ориентиров (местоположений суставов) руки. Затем остается только предварительно обработать входные данные и построить вектор признаков для взаимодействия с моделью классификации. Оценщик доступен в виде модуля NodeJS на NPM.

Первая фаза завершена. Осталось подключить оценщик позы к веб-камере через браузер. К счастью, я не первый, кто попробовал это. Поиск в Google дает пару полезных примеров, которые можно попробовать. Я использовал реагировать-веб-камеру, чтобы получить доступ к веб-камере и передать видео в оценщик позы. Вот и все! У нас есть полнофункциональное веб-приложение со встроенной в него моделью машинного обучения. Но мы еще не закончили. Классификатор обучается на ограниченном наборе данных, и он мог бы использовать больше примеров, чтобы улучшить себя. Таким образом, когда пользователи пробуют знаки, а модель пытается их классифицировать, она также отправляет несколько образцов на внутренний сервер, которые сохраняются для дальнейшего улучшения модели. Это реализовано как дополнительная функция, которую пользователь может включать и отключать в пользовательском интерфейсе.

Исходный код проекта доступен на Github. Если вы разработчик и хотите улучшить это, это для вас!