Привет, Хабр! Это Александр Капитанов и Александр Нагаев из SberDevices. Эта статья написана по мотивам доклада для Highload++. Расскажем, как мы создавали переводчик с языка, на котором нельзя говорить и писать.
Мы работаем в RnD CV Team и занимаемся задачами компьютерного зрения: генерацией, матированием и редактированием изображений, сегментацией, портретной гармонизацией, заменой лиц, распознаванием жестов. А с недавних пор ещё и задачей распознавания русского жестового языка.
Поговорим про мотивацию — что сподвигло нас заниматься задачей и решать данную проблему. Также затронем теорию РЖЯ или жестового языка — подозреваю, что мало кто с ней знаком. Расскажем, как мы собирали собственный датасет для распознавания русского жестового языка и затронем тему обучения моделей для решения данной задачи. Также поделимся с вами результатом и немного расскажем про семейство наших моделей signflow.
Мотивация
Летом 2022 года наша команда выпустила датасет HAGRID, который состоит из 19 статичных жестов и в общей сложности включает в себя полмиллиона статичных изображений.
Нам сразу же начали приходить отзывы от коммьюнити и вопросы, подходит ли данный датасет для задачи распознавания жестового языка, и существуют ли онлайн-переводчики, которые решают данную задачу? Если на первый вопрос мы точно могли ответить, что нет, датасет статичный, а жесты динамические, то на второй вопрос у нас просто не было ответа. И мы ушли в ресёрч.
В приложении СБОЛ, если вы предоставите документы об инвалидности по слуху, у вас есть возможность позвонить сурдопереводчику-консультанту, который ответит на вопросы по видеосвязи. Либо можно приехать в офис, заранее договорившись о том, чтобы пригласили сурдопереводчика, и он мог нивелировать барьер коммуникации с консультантом.
Нам самим стало интересно, а что, если в течение недели кому-то понадобится помощь сурдопереводчика? Магическое число 60 — это количество сурдопереводчиков в Москве. Хотя в Москве около 40 000 слабослышащих, и из них 10% — это глухие люди.
Следующий возникший вопрос — существует ли вообще что-либо, что позволяет хотя бы в какой-то мере решать данную задачу? Но сколько мы ни искали, находили только заголовки, что учёные создали переводчик по распознаванию русского жестового языка. Но дальше текста, к сожалению, мы ничего не нашли: ни исходного кода, ни веб-приложения.
Также мы столкнулись с ещё одной большой проблемой — отсутствием хороших, открытых датасетов.
На самом деле, датасеты есть, но мы считаем их не очень подходящими для нашей задачи. В таблице ниже мы собрали все датасеты по распознаванию жестового языка со всех стран.
Они собраны тремя способами:
Ручной способ. Это значит, что вы приглашаете сурдопереводчика, либо носителя жестового языка, записываете его на камеру и, таким образом, собираете данные. Но у этого способа есть много проблем — это долго, ведь каждого человека нужна записывать отдельно. А ещё такого человека нужно найти и привести. И это достаточно дорого.
Скачанные датасеты. Мы нашли в интернете видеозаписи и какую-то часть, менее половины датасетов, удалось собрать таким способом. Просто люди распарсили сайты вроде Spreadthesing, где находятся шаблоны перевода жестов на разные языки мира. А ещё пригодились видеохостинги по типу Youtube.
Краудсорсинг. Это когда вы используете платформу краудсорсинга для параллельного сбора данных. Человек может просто сидеть дома, зарегистрироваться и предоставлять данные. Всего один датасет собран таким способом — fluency signers. Из этого большого пула датасетов всего лишь четыре собраны для решения задачи русского жестового языка.
Давайте разберём их подробнее.
Первый датасет RuSLan собрали в 2020 году и состоит из 164 классов, которые в жестовом языке называются глоссы. Это значит, что один жест можно перевести или абстрагировать, как одно слово из русского языка. Датасет был собран с помощью 13 пользователей и состоит всего лишь из 13 видеоданных. Основная проблема этих датасетов в том, что в выборке мало людей. Чтобы модели могли обобщаться на показывание жестов, нужно показывать им разное количество людей, и нужно огромное количество данных.
Можете заметить, что у нас в таблице есть рекордсмен – 43 000 видео собрано датасетом fluent signers. Но и у него есть проблемы — очень мало классов.
Количество классов можно интерпретировать как размер вашего словаря, то есть сколько жестов вы можете переводить на слова русского языка. Рекордсмен здесь — датасет RSL. Он включает в себя 1 000 классов жестов, которые можно получить.
Но если рассмотреть эти датасеты по порядку по их преимуществам, то датасет RusLan, к сожалению, проигрывает во всём.
Датасет K-RSL состоит из большого количества видео, но записан всего лишь 10 людьми и в нём небольшое количество слов.
Датасет RSL состоит из 1 000 слов, 35 000 видео. Это достаточно много. Но записаны на этих видео всего 5 человек. Данный датасет не подойдёт, потому что модель выучит лишь этих пятерых людей и не сможет предсказывать жесты правильно на других людях.
И последний датасет — fluent signers. В нём собрано очень много видео, но, к сожалению, в датасете очень маленький словарь всего в 278 слов. Зато в его создании приняло участие 50 человек, что достаточно много. А нам нужно собрать датасет, который будет идеален во всём, и удовлетворять всем критериям.
Что такое РЖЯ и как его понимать
Давайте поговорим о том, что такое РЖЯ и как его понимать. Термин «РЖЯ» расшифровывается как русский жестовый язык, это лингвистическая система. Она обладает своей лексикой, грамматикой, правилами. РЖЯ используется для общения глухих и слабослышащих людей. Когда мы исследовали и искали подходы к переводу жестового языка на русский язык, то обнаружили очень много проблем. Давайте разберём их по порядку.
Дактиль
Дактиль – это прямая интерпретация индивидуальных жестов в буквы русского алфавита. На изображении выше — жесты русской дактильной азбуки. Дактиль нужен для того, чтобы показывать имена собственные. Есть слова, для которых невозможно подобрать жест. Например, фамилия, имя, отчество, кличка моей собаки, кличка кошки, название, марка машины, станции метро, название рейса. Для этого используется дактиль. Но также дактиль используется для тех слов, для которых просто ещё не придумали жест.
Ведущая рука
Все мы с вами — правши или левши, и можем делать свои задачи, например, писать той рукой, которой удобнее. Так же и у глухих, слабослышащих. Они показывают жесты либо левой, либо правой рукой. Но здесь понадобится небольшое уточнение: если человек начинает показывать жесты левой рукой, то он и дальше должен показывать жесты левой рукой. Иначе, если он будет руки чередовать, это будет то же самое, как если мы с вами будем переключаться с русского на английский или немецкий в одном предложении. Так его просто не поймут.
Диалекты
Следующая и самая большая проблема жестовых языков – это их разнородность. Например, в России существует три основных диалекта: центральный (московский), петербургский и дальневосточный (новосибирский). На разных диалектах некоторые жесты показываются по-разному. Но диалекты – это не главная проблема.
Вариативность жестов
Вы можете показать одно и то же слово по-разному. Так как жестовый язык появился задолго до создания интернета, то сформировалось очень много разных диалектов. Люди из центральной части России не могли общаться с людьми с Дальнего Востока, и они придумали жесты сами. Например, жест хлеб показывается в Москве как буханка. А на Дальнем Востоке — как «резать». Кажется, в этом есть логика. Впоследствии эти жесты из маленьких диалектов собрались в группы трёх больших диалектов. А ещё до появления смартфонов был жест «писать», который показывался как писать письмо, например, ручкой. Но после появления телефонов этот жест приобрел новый вариант в контексте. Например, напиши мне письмо и напиши мне в Telegram — это разные жесты, то есть появился новый жест «телефон, написать». Но до того, как появился новый жест «телефон», его показывали дактилем.
Составные жесты
Жест теленок показывается из двух простых жестов: маленькая и корова. Также есть жест меню, который показывается из двух жестов — «еда» и «список».
Собираем датасет
И вот мы нашли проблемы, вроде бы с ними разобрались. Настало время собирать свой датасет для задачи русского жестового языка.
Мы выявили несколько проблем с тем, чтобы собрать хороший датасет:
Где искать людей, которые владеют жестовым языком — не искать же их на улице?
Как получить правильный жест — конкретный вариант в определённом диалекте?
Как правильно объяснить задачу: зачем мы это делаем, и что нам нужно?
Как поощрять людей за то, что они нам представляют эти данные?
Что мы сделали, чтобы решить проблемы:
Нашли людей, владеющих жестовым языком и поощряли их с помощью краудсорсинг сервисов типа ABC Elementary.
Собрали шаблоны, распарсив Spreadthesing, который состоит из шаблонов слов для многих языков мира. Также распарсили видеохостинги — такие, как Rutube, и Youtube.
Собрали небольшой пул слов из самых распространенных слов русского языка, для которых не нашли жеста, и попросили переводчиков либо носителей жестового языка записать шаблоны.
Расписываем правила
Мы решили полностью отказаться от составных и дактильных жестов. Дактильные жесты – это буквы жестового языка. Объясним, почему мы собирали только простые жесты. Как вы можете заметить, составной жест состоит из 2 или 3 простых жестов. Дактильные слова состоят из набора букв, которые также можно собирать по отдельности, как простые жесты.
Также, помимо самих жестов, мы расписали правила для данных. Нам нужно получить видео определённого формата и качества:
Расположение. Руки не должны выходить за кадр, так как руки – это самая важная часть тела, которая передает всю информацию о жесте.
Вариации жестов. Нам нужен жест строго по шаблону. Как уже писали ранее, мы хотим получить именно те жесты, которые показываются на шаблонах.
Скорость. Люди, владеющие жестовым языком с юности, показывают жесты очень быстро. Их скорость буквально достигает 2–3 жеста в секунду. Думаем, если вы видели, как общаются глухие или слабослышащие, то могли заметить, как быстро они показывают жесты. А те, люди, которые начали изучать жестовый язык позже, сначала думают, какой жест сейчас нужно правильно показать и только потом показывают. Точно также как у нас с вами бывает, когда мы говорим на иностранном языке. Было бы неправильно, заставить людей, которые показывают жесты медленно, показывать их быстрее. Поэтому мы попросили людей, которые хорошо показывают жесты, снизить скорость показа до средней.
Ставим задачу
Глухие и слабослышащие воспринимают только текст, так как могут его прочитать, благодаря этому и благодаря краудсорсинг-платформам мы добавили обучение. Обучение представляет собой несколько примеров заданий и того, как их выполнять. Также мы добавили экзамен и ханипоты.
Выше — пример, как выглядит экзамен. Мы показываем видео, на котором человек показывает жест, и предоставляем очень много классов с одним правильным ответом. Пользователь допускается до выполнения заданий и сбора данных, только когда выполнит более 80% задач экзамена правильно. Но мы все прекрасно понимаем, что краудсорсинг-сервисы не проверяют людей на гугление и другие виды читерства, поэтому добавили ханипоты.
Ханипоты — это те же задания вроде «какой жест показан в видео», но мы заранее знаем правильный ответ. Если пользователь провалил несколько ханипотов, то отправлялся в бан. Ведь это значит, что он либо прокликивает задания, либо не знает жестового языка.
О том, как мы размечали данные и подготавливали их к обучению модели, рассказывала моя коллега Карина с докладом «Рецепт идеальной разметки в computer vision».
В итоге мы собрали датасет SLOVO
Состоит из более чем 20 000 видео и 1 000 классов.
Участие приняли более 200 человек.
Датасет состоит преимущественно из HD и Full HD-видео, записанных с фреймрейтом 30 FPS, чтобы у всех была одинаковая скорость.
Длина всего датасета — примерно 20 часов. А средняя длительность одного жеста — 1,5 секунды. И это очень долго, ведь за полторы секунды можно успеть показать три и более жестов.
Модели для решения задач РЖЯ
Теперь разберём, какие модели можно обучать на этом сете.
Первое, что приходит в голову, это использовать модели из компьютерного зрения. Я думаю, многие из вас слышали про задачу классификации изображений, например: что на изображении — кошечка или собачка. Эта задача решается путем свёрточных нейронных сетей либо визуальных трансформеров, как на примере выше.
Визуальные трансформеры обрабатывают картинку кусочками, то есть патчами. На первом примере вы можете заметить, что сначала обрабатывается картинка с четырьмя патчами, а потом для того, чтобы не терять контекст всего изображения и собирать эту информацию, патчи уменьшаются и захватывают изображение на пересечении. Благодаря этому визуальный трансформер начинает понимать, что происходит на изображении.
Но у нас не картинка, а видео. Ответ на вопрос, что делать в такой ситуации — прост и сложен одновременно. Мы просто добавляем наши свёртки и еще одну размерность, то есть глубину. Если у нас для картинок была квадратная матрица, то для видео у нас — куб. Захватывали три кадра и выбирали информацию о последовательности. Далее ещё три кадра, и ещё, и так далее.
Вторым шагом мы обрабатывали последовательность там, где было пересечение этих кадров. Как вы можете заметить, тот же самый алгоритм, та же самая идея, только добавлена новая размерность Т, то есть последовательность.
Самая важная вещь в обучении — аугментации, их у нас два типа.
«Горизонтальный флип» — применили, чтобы решить проблему ведущей руки — правой или левой. Наш горизонтальный флип сломал систему правых и левых жестов и они могут показываться рандомно: либо правые, либо левые. Это нужно учитывать и правильно разбираться в данных. Вот, например, жест сердце:
Ухудшение качества картинки. Нужно для того, чтобы можно было в дальнейшем использовать модель на стриминге с веб-камер плохого качества либо при недостаточном освещении. Сами понимаете, что тогда появляется шум, если, например, мало света, или другие искажения. Мы использовали такие:
Изменения цветовой схемы, так называемый color джиттер. Например, у вас дома может быть жёлтый тёплый свет, либо на подоконнике могут стоять цветы, освещённые ультрафиолетовой лампой и комната будет светиться синим.
Рандом кроп, которым захватили 80% изображений. Мы это сделали, чтобы не выбирать позицию человека, находящегося в центре кадра. Так как мы собирали наш датасет на краудсорсинг-платформах, люди записывали себя на телефон, то есть ставили его перед собой, отходили и показывали какой-то жест. Но, как мы понимаем, в реальной жизни, мы можем стоять немного правее, либо немного левее камеры. Эту проблему нужно было решить. Для этого мы подавали на вход модели изображение шириной и высотой 224*224. На самом деле, это большое количество пикселей, и его вполне хватает, чтобы наш визуальный трансформер смог извлекать информацию из последовательности. Также мы подавали на вход 32 кадра размером 224*224. Из такого количества данных можно извлечь много полезной информации.
Использовали два типа сэмплирования с шагом 1 и 2. Это нужно, например, если вы собрали датасет с разной частотой кадров. И какое-то количество видео собрано в 30 FPS, а какое-то — в 60 FPS. И для 30 FPS вы обрабатываете каждый кадр последовательно. А 60 FPS, вы обрабатываете через один, то есть эти 60 в 1 секунде сворачиваете к 30 в 1 секунде. Мы использовали это, чтобы подавать на вход модели либо меньше данных, либо больше данных, чтобы она не переобучалась под определенный фреймрейт. Учили модель 120 эпох. Эпоха — один полный проход по всем данным датасета.
Итак, на вход нашей модели мы подаём тензор размера: каналы*длина последовательности*высота*ширина. Мы использовали для базового подхода модель MVIT –Multiscale Visual Transformer.
На самом деле, модель достаточно большая и состоит из трёх скейл блоков, которые уменьшают размерность изображения в три раза. И в конце у нас есть один линейный слой, который решает основную задачу распознавания жестового языка.
В более компактном виде это выглядит так: у нас есть энкодер, состоящий из 16 последовательных блоков, которые потом группируются в три скейла, и один линейный слой.
Наша модель состоит из огромного энкодера и одного линейного слоя, который в пропорциях составляет примерно 0,01% всех весов модели.
И на выходе получили вероятности предсказанных моделью жестов.
Мы обучили хорошую модель на нашем датасете. Хорошую, потому что мы отрисовали карты внимания и увидели, как модель смотрит на видео с жестом. Как вы можете заметить, сеть смотрит в основном на руки. Это основная часть тела, которая передает информацию о жесте. На первом видео показан жест — «Кубок». Следующий жест — «список». Можете заметить, что это достаточно сложный жест, но модель смотрит на руки и обращает внимание в основном на движение рук по мере всего показа. Последний жест — это «тортик». Он показывается очень легко, и модель также смотрит в основном на руки.
Результаты
Написали две статьи: одну подали на очень крутую computer vision конференцию CVPR в Канаде и выступили с онлайн докладом. Вторую отправили на конференцию ICVS в 2023, которая проходила в Вене — её единогласно приняли организаторы и мы вживую рассказали о том, чего мы смогли достичь.
Но после поездок на научные конференции, мы задумались. Если у нас есть хороший энкодер и, по сути, задачу распознавание жестового языка решает один линейный слой, то давайте попробуем обучить нашу модель для распознавания жестовых языков других стран.
Сначала мы заморозили наш энкодер и обучили один линейный слой на датасете WLASL-100, и за 30 эпох выбили SOTA (State Of The Art).
Но у данного датасета существует еще второй вариант: WLASL-2000, который состоит из 2 000 слов. Это огромный словарь и нам пришлось доучивать энкодер на этом датасете. Спустя примерно неделю мы победили все решения, которые были загружены до этого. И оказалось, что мы лучше всех в мире распознаем американский жестовый язык.
Модель, которая была построена на русском жестовом языке, отлично себя показывает и на других жестовых языках. Поэтому мы с гордостью можем поставить наш датасет наравне с самыми крутыми и популярными датасетами для задачи компьютерного зрения: такие как Image Net для классификации, СОСО-датасет для детекции, Kinetics-700 для action recognition, SA-1B — датасет, на котором обучалась модель Segment Anything. И наш датасет Slovo для задачи распознавания жестового языка попадает в этот список.
Семейство моделей Sign Flow
Возьмём хорошо обученный энкодер и уберем всё остальное из модели. Это очень крутой фича-экстрактор, который понимает, что происходит на картинке, и хорошо интерпретирует это в фичи. Давайте просто поставим к нему вместо линейного слоя текстовый декодер, чтобы наш энкодер подавал в него фичи последовательности, а текстовый декодер на основе рекуррентной сети предсказывал последовательность слов.
С помощью такой модели, мы сможем решить задачу перевода полноценного русского жестового языка в предложения, а не слов по отдельности.
Если мы можем подставить текстовый декодер, то сможем подставить и спич декодер. Например, из модели Tacotron.
Благодаря этому мы сможем озвучивать жесты, показанные слабослышащими либо глухими людьми.
Концептуально идея выглядит так.
У нас есть крутой предобученный энкодер в виде сети MVIT и три головы, которые предсказывают последовательность слов, прямой перевод и WaveForm для озвучивания жестов.
Но для полноценного перевода с русского жестового языка и потом с русского языка на жестовый язык этого мало. Нам нужен 3D аватар, который сможет показывать жесты, и модель, которая сможет предсказывать последовательность действий.
По итогу мы можем создать полноценную систему двустороннего перевода жестового языка на русский язык и обратно.
К сожалению, в мире существует очень много текстовых переводчиков с разных языков мира, но нет ни одного переводчика с жестового языка. Именно к решению этой задачи мы и стремимся. И по итогу сможем убрать барьер, с которым сейчас сталкиваются глухие и слабослышащие в простой потребности коммуникации и передачи информации.
Что мы ещё писали про переводчик жестового языка: