Время прочтения: 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()

Этот код откроет новое окно для работы с библиотекой, как указано на скриншотах выше.

Исходный код открыт, что позволяет обучать модель любой вариации языка жестов. Аналогичным образом работают системы SigntoSpeech (https://github.com/ml-collective/sign-to-speech-for-sign-language-understanding) и Action Detection (https://github.com/nicknochnack/ActionDetectionforSignLanguage). Последняя позволяет довольно быстро обучить модель распознаванию произвольных жестов, в том числе не статичных, что выводит на новый уровень общение между людьми, а также между человеком и машиной.