Время прочтения: 3 мин.
В современном мире технологии развиваются стремительными темпами. Что вчера казалось невозможным, сегодня уже стало обыденность. Кто-то использует эти технологии для увеличения своей прибыли, другие же пытаются приспособить их для людей, которые по каким-либо причинам лишены частей тела, зрения, слуха или голоса. Так, например, появились слуховые аппараты, биопротезы и бионические глаза. Мы же затронем тех, кто не может разговаривать привычным для нас способом, и использует для этого язык жестов.
Для работы с распознаванием языка жестов используют нейронные сети, а если быть точнее одну из их разновидностей. Долгая краткосрочная память (Long short-term memory; LSTM) – разновидность особой архитектуры рекуррентных нейронной сети, способная к обучению на долговременную зависимость.
LSTM были специально разработаны для задач, где необходима долговременная зависимость, отсутствующая у RNN сетей. Запомнить информацию на долгий период времени – это то, для чего они были созданы.
Схематически рассмотрим принцип работы и различия RNN и LSTM:
Структура рекуррентной нейронной сети похожа на цепочку повторяющихся друг за другом модулей нейронной сети. Структура такого одного модуля в RNN совсем проста, например, он может состоять только из одного слоя с функцией активации tanh (гиперболический тангенс).
Структура LSTM, как и RNN, также напоминает цепочку, но внутренняя наполненность модуля выглядит иначе. Они содержат целых четыре слоя, вместо одного, и они взаимодействуют между собой особенным образом.
Реализацию LSTM можно рассмотреть на примере библиотекиSignLanguageRecognition(https://github.com/JanBinkowski/SignLanguageRecognition), релиз которой состоялся 15 ноября 2021 года, и в настоящий момент она активно разрабатывается.
Библиотека базируется на модели, построенной на архитектуре рекуррентной нейронной сети, состоящей из 6 слоев:
— 3 слоя LSTM;
— 3 полносвязных слоя.
Сама модель выглядит следующим образом:
model = Sequential()
model.add(LSTM(64, return_sequences=True, activation='relu', input_shape=(30, 126)))
model.add(LSTM(128, return_sequences=True, activation='relu'))
model.add(LSTM(64, return_sequences=False, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(actions.shape[0], activation='softmax'))
Принцип построения моделей нейронных сетей для Распознавания языка жестов (Sign Language Recognition) в целом одинаковый, сначала идут слои LSTM, а затем полносвязные слои (Dense).
В данной библиотеки реализована технология точного отслеживания положения рук и пальцев. Программа определяет 21 ключевую точку руки в 3D пространстве (высоту, глубину и длину) и на основании этого классифицирует жесты, которые показывает рука.
Подход реализован с помощью MediaPipe - кроссплатформенным фреймворком с открытым кодом для построения пайплайнов обработки данных (видео, аудио, временные ряды).
На данный момент в библиотеки реализовано 3 жеста: буквы a, b, c.
Чтобы запустить пакет SignLanguageRecognition, его необходимо установить локально с помощью pip:
pip install SignLanguageRecognition
Для запуска пакета используем код:
from SignLanguageRecognition import signLanguageRecognizer
signLanguageRecognizer.signLanguageRecognizerMethod()
Этот код откроет новое окно для работы с библиотекой, как указано на скриншотах выше.
Исходный код открыт, что позволяет обучать модель любой вариации языка жестов. Аналогичным образом работают системы Sign—to—Speech (https://github.com/ml-collective/sign-to-speech-for-sign-language-understanding) и Action Detection (https://github.com/nicknochnack/ActionDetectionforSignLanguage). Последняя позволяет довольно быстро обучить модель распознаванию произвольных жестов, в том числе не статичных, что выводит на новый уровень общение между людьми, а также между человеком и машиной.