Обнаружение символов жестового языка в режиме реального времени с помощью MediaPipe и Keras

Язык жестов — это форма общения, используемая в основном слабослышащими или глухими людьми. Этот тип языка на основе жестов позволяет людям легко передавать идеи и мысли, преодолевая барьеры, вызванные проблемами со слухом.

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

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

Многие большие обучающие наборы данных для языка жестов доступны на Kaggle, популярном ресурсе по науке о данных. Тот, который используется в этой модели, называется Язык жестов MNIST и представляет собой общедоступный бесплатный набор данных с информацией о пикселях примерно для 1000 изображений каждого из 24 букв ASL, за исключением J и Z, поскольку они основаны на жестах.

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

Приведенный выше код начинается с изменения формы всех файлов обучающих изображений MNIST, чтобы модель понимала входные файлы. Наряду с этим переменная LabelBinarizer() берет классы в наборе данных и преобразует их в двоичные файлы, что значительно ускоряет обучение модели.

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

После обработки изображений необходимо скомпилировать модель CNN для распознавания всех классов информации, используемых в данных, а именно 24 различных групп изображений. Нормализация данных также должна быть добавлена ​​к данным, в равной степени уравновешивая классы с меньшим количеством изображений.

Обратите внимание на инициализацию алгоритма с добавлением переменных, таких как модель Conv2D, и сжатие до 24 функций. Мы также используем методы пакетной обработки, чтобы позволить CNN более эффективно обрабатывать данные.

Наконец, определение функций потерь и метрик вместе с подгонкой модели к данным создаст нашу систему распознавания жестового языка. Важно распознать команду model.save() в конце оператора из-за продолжительности времени, необходимого для построения модели. Повторное обучение модели для каждого использования может занять несколько часов.

В этом коде есть что распаковать. Давайте рассмотрим его по частям.

Строка 1:

Функция model.compile() принимает множество параметров, три из которых отображаются в коде. Параметры оптимизатора и потери работают вместе с оператором эпохи в следующей строке, чтобы эффективно уменьшить количество ошибок в модели за счет постепенного изменения методов вычисления данных.

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

Строка 4:

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

Строка 5:

Из всех операторов в коде функция model.save() может быть самой важной частью этого кода, так как потенциально может сэкономить часы времени, когда реализации модели.

Разработанная модель точно обнаруживает и классифицирует символы жестового языка с точностью обучения около 95%.

Теперь, используя две популярные библиотеки обработки видео в реальном времени, известные как Mediapipe и Open-CV, мы можем принимать данные с веб-камеры и запускать нашу ранее разработанную модель в видеопотоке в реальном времени.

Для начала нам нужно импортировать необходимые пакеты для программы.

Команда ОС, запущенная в начале, просто блокирует ненужные предупреждения от библиотеки Tensorflow, используемой Mediapipe. Это делает будущий вывод, предоставляемый программой, более понятным для понимания.

Прежде чем мы инициируем основной цикл кода while, нам нужно сначала определить некоторые переменные, такие как сохраненная модель и информация о камере для Open-CV.

Каждая из установленных здесь переменных сгруппирована в одну из четырех категорий. Категория в начале относится непосредственно к модели, которую мы обучали в первой части этой статьи. Второй и третий разделы кода определяют переменные, необходимые для запуска Mediapipe и Open-CV. Последняя категория используется в основном для анализа кадра при обнаружении и создания словаря, используемого при перекрестных ссылках данных, предоставленных моделью изображения.

Следующая часть этой программы — основной цикл while True, в котором выполняется большая часть программы.

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

Идея ограничивающей рамки является важнейшим компонентом всех форм классификации и анализа изображений. Коробка позволяет модели сфокусироваться непосредственно на части изображения, необходимой для функции. Без этого алгоритм находит закономерности не в тех местах и ​​может привести к неверному результату.

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

Почти готово! Предпоследняя часть программы — захват одного кадра по сигналу, его обрезка до размеров ограничительной рамки.

Этот код очень похож на последнюю часть программы. Это связано главным образом с тем, что процесс изготовления ограничивающей рамки одинаков в обеих частях. Однако в этом аналитическом разделе кода мы используем функцию изменения формы изображения из Open-CV, чтобы изменить размер изображения до размеров ограничивающей рамки, а не создавать визуальный объект вокруг него. Наряду с этим мы также используем NumPy и Open-CV для изменения изображения, чтобы оно имело те же характеристики, что и изображения, на которых обучалась модель. Мы также используем pandas для создания фрейма данных с пиксельными данными из сохраненных изображений, поэтому мы можем нормализовать данные так же, как мы делали это для создания модели.

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

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

Через этот раздел кода проходит много информации. Мы будем разбирать эту часть кода одну за другой.

Первые две строки рисуют предсказанные вероятности того, что изображение руки относится к любому из различных классов из Кераса. Данные представлены в виде 2-х тензоров, из которых первый тензор содержит информацию о вероятностях. Тензор — это, по сути, набор векторов признаков, очень похожий на массив. Тензор, создаваемый моделью, является одномерным, что позволяет использовать его с библиотекой линейной алгебры NumPy для преобразования информации в более понятную форму.

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

После этого шага мы используем понимание списка, чтобы упорядочить и отсортировать значения от самого высокого к самому низкому. Затем это позволяет нам взять первые несколько элементов в списке и назначить им 3 символа, которые ближе всего соответствуют показанному изображению на языке жестов.

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

Как показано, модель точно предсказывает персонажа, показываемого с камеры. Наряду с предсказанным символом программа также отображает достоверность классификации из модели CNN Keras.

Разработанная модель может быть реализована различными способами, при этом основное использование — это устройство для субтитров для вызовов, связанных с видеосвязью, таких как Facetime. Чтобы создать такое приложение, модель должна запускаться покадрово, постоянно предсказывая, какой знак будет отображаться. Используя другие системы, мы также можем распознавать, когда человек не показывает никаких знаков или переключается между знаками, чтобы более точно судить о словах, показываемых с помощью ASL. Эту реализацию можно использовать для объединения отображаемых букв, чтобы в конечном итоге распознавать слова и даже предложения, создавая полностью функционирующий язык жестов для переводчика текста. Такое устройство значительно упростило бы доступ к преимуществам виртуального общения для людей с нарушениями слуха.

Эта программа позволяет легко и просто общаться с языка жестов на английском с помощью моделей анализа изображений Keras. Код для этого проекта можно найти в моем профиле GitHub, ссылка на который приведена ниже:

mg343/Sign-Language-Detection (github.com)