Откриване на знаци на езика на знаците в реално време с помощта на 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, можем да вземем вход от уеб камера и да изпълним нашия предварително разработен модел на видео поток в реално време.

За да започнем, трябва да импортираме необходимите пакети за програмата.

Командата на OS, стартирана в началото, просто блокира ненужните предупреждения от библиотеката Tensorflow, използвана от Mediapipe. Това прави бъдещия резултат, предоставен от програмата, по-ясен за разбиране.

Преди да инициираме основния цикъл while на кода, трябва първо да дефинираме някои променливи, като например запазен модел и информация за камерата за Open-CV.

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

Следващата част от тази програма е основният цикъл while True, в който се изпълнява голяма част от програмата.

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

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

Например, по време на процеса на обучение, липсата на ограничителна кутия може да доведе до това, че моделът съпоставя характеристиките на изображение като часовник или стол с етикет. Това може да накара програмата да забележи часовника, намиращ се в изображението, и да реши какъв знак от езика на знаците се показва единствено въз основа на факта, че има часовник.

Почти готово! Предпоследната част от програмата е заснемането на един кадър по сигнал, изрязването му до размерите на ограничителната кутия.

Този код изглежда много подобен на последната част от програмата. Това се дължи главно на факта, че процесът, включващ производството на ограничителната кутия, е еднакъв и в двете части. Въпреки това, в този раздел за анализ на кода, ние използваме функцията за преоформяне на изображение от Open-CV, за да преоразмерим изображението до размерите на ограничителната кутия, вместо да създаваме визуален обект около него. Заедно с това, ние също използваме NumPy и Open-CV, за да модифицираме изображението, за да има същите характеристики като изображенията, на които моделът е бил обучен. Също така използваме pandas, за да създадем рамка с данни с пикселните данни от запазените изображения, така че можем да нормализираме данните по същия начин, както направихме при създаването на модела.

Към горната част на кода може да забележите странната последователност от дефинирани променливи. Това се дължи на естеството на синтаксиса на библиотеката на камерата. Когато едно изображение се обработва и променя от Open-CV, промените се правят върху използваната рамка, като по същество се запазват промените, направени в изображението. Дефинирането на множество променливи с еднаква стойност прави така, че рамката, показана от функцията, да е отделна от картината, върху която се изпълнява моделът.

И накрая, трябва да стартираме обучения модел върху обработеното изображение и да обработим изходната информация.

През този раздел на кода се минава много информация. Ще анализираме тази част от кода една по една.

Първите два реда чертаят прогнозираните вероятности, че изображение на ръка е някой от различните класове от Keras. Данните са представени под формата на 2 тензора, от които първият тензор съдържа информация за вероятностите. Тензорът по същество е колекция от вектори на характеристики, много подобни на масив. Тензорът, произведен от модела, е едномерен, което му позволява да се използва с библиотеката за линейна алгебра NumPy за анализиране на информацията в по-питонична форма.

Оттук нататък използваме създадения преди това списък с класове под променливата letterpred, за да създадем речник, съпоставящ стойностите от тензора с ключовете. Това ни позволява да съпоставим вероятността на всеки знак с класа, на който съответства.

Следвайки тази стъпка, ние използваме разбиране на списък, за да подредим и сортираме стойностите от най-високата към най-ниската. След това това ни позволява да вземем първите няколко елемента в списъка и да ги обозначим с 3 знака, които най-много съответстват на показаното изображение на езика на знаците.

Накрая използваме for цикъл, за да преминем през всички двойки ключ:стойност в речника, създаден, за да съпоставим най-високите стойности със съответните им ключове и да отпечатаме резултата с вероятността за всеки знак.

Както е показано, моделът точно предсказва героя, който се показва от камерата. Заедно с прогнозирания знак, програмата показва и достоверността на класификацията от модела на CNN Keras.

Разработеният модел може да бъде реализиран по различни начини, като основната употреба е устройство за надписи за разговори, включващи видео комуникация като Facetime. За да се създаде такова приложение, моделът трябва да работи кадър по кадър, предвиждайки какъв знак се показва по всяко време. Използвайки други системи, можем също да разпознаем кога дадено лице не показва знак или преминава между знаци, за да преценим по-точно думите, показани чрез ASL. Това внедряване може да се използва за свързване на букви, които се показват, за да разпознаете в крайна сметка думи и дори изречения, създавайки напълно функциониращ преводач на жестомимичен език към текст. Такова устройство значително би улеснило достъпа до предимствата на виртуалната комуникация за хора с увреден слух.

Тази програма позволява проста и лесна комуникация от жестомимичен език на английски чрез използването на модели за анализ на изображения Keras. Кодът за този проект може да бъде намерен в моя профил в GitHub, свързан по-долу:

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