Привет!

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

В этой статье я расскажу, как и зачем мы создавали модель распознавания русского жестового языка и покажу, что из этого получилось.

Intro

Сегодня в России нет достаточного количества специалистов-переводчиков русского жестового языка (РЖЯ), с помощью которого общаются люди с ограничением слуха. По данным Всероссийского общества глухих, нехватка специалистов в этой сфере в России - около 4 тыс. Дефицит обусловлен объективными причинами.

Во-первых, жестовый язык в каждой стране свой. Выучить его один раз и использовать в любой стране мира не получится. Более того, даже в России существует множество диалектов русского жестового языка.

Во-вторых, чаще всего переводчики РЖЯ – это слышащие дети или близкие родственники неслышащих родителей. Таких людей очень мало, а подготовка специалистов со стороны - дорогостоящая и непростая задача.

А между тем, глухие или неговорящие - достаточно большая группа людей, которая посещает государственные учреждения, ходит в магазины, банки и пр. По данным ВОЗ, более 5% населения мира, или 430 миллионов человек, имеют проблемы со слухом (432 миллиона взрослых и 34 миллиона детей). А к 2050 г. с этой проблемой столкнется каждый десятый, или более 700 миллионов человек.

Как же общаться тем, кто говорит на жестовом языке и тем, кто использует звучащую речь? Самый очевидный способ – текстом. Но это не всегда удобно, достаточно медленно, но самое главное - русский жестовый язык сильно отличается по грамматике от русского языка, привычного всем нам. Чтобы наглядно увидеть разницу, можно попробовать дословно перевести любой английский текст на русский и посмотреть на результат.

Сотрудники Сбера ежедневно взаимодействуют со слабослышащими клиентами, которые хотят самостоятельно получать услуги и разбираться в особенностях банковских сервисов и продуктов. Для комфортной коммуникации в офисах Сбера можно подключить переводчика русского жестового языка (РЖЯ) через услугу «Видеозвонок».

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

Русский жестовый язык — это русский язык… или не совсем?

Согласно Википедии*:

Русский жестовый язык (РЖЯ) — национальная лингвистическая система, обладающая собственной лексикой и грамматикой, используемая для общения глухих и слабослышащих, живущих в России, а также на территории Белоруссии, Казахстана и Украины.

РЖЯ — это не только жесты руками. При общении на РЖЯ люди используют пальцы, руки, наклоны туловища, мимику, артикулируют губами. При этом РЖЯ это не просто визуальная интерпретация русского. Он имеет свою грамматику, синтаксис, порядок слов. РЖЯ, как и любой язык, очень динамичный. Жесты изменяются, выходят из употребления, появляются новые. Взрослые люди показывают жесты одним способом, подростки –немного по-другому, используют свой «сленг». Это добавляет сложности задаче создания AI-переводчика.

Раскадровка фразы: "Рад с вами познакомиться"
Раскадровка фразы: "Рад с вами познакомиться"
Раскадровка фразы: "Мне здесь очень нравится"
Раскадровка фразы: "Мне здесь очень нравится"
Под катом - гифки с этими же фразами (5 МБ)

Рад с вами познакомиться
Рад с вами познакомиться
Мне здесь очень нравится
Мне здесь очень нравится

AI-translation

В качестве эксперимента мы попробовали сразу решить задачу перевода из непрерывной речи в текст. Для тестов использовали датасет RWTH-PHOENIX-Weather и модель из статьи Visual Alignment Constraint for Continuous Sign Language Recognition, но получили довольно низкие результаты. Возможно, дело в банальной нехватке данных – ведь модель должна научиться понимать и визуальные признаки, и грамматику жестового языка, а датасетов по жестовым языкам очень мало. Например, в широко используемом датасете RWTH-PHOENIX-Weather всего 1980 предложений.

framework
Visual Alignment Constraint for Continuous Sign Language Recognition (http://arxiv.org/abs/2104.02330)

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

Чтобы научить модель понимать РЖЯ мы решили собрать датасет непрерывной русской жестовой речи. Для этого выбрали примерно 7.5 тысяч фраз на повседневные темы, на которые люди могут общаться в магазине, на улице, в быту. Мы тщательно профильтровали их от профессиональных терминов. Затем попросили носителей РЖЯ (студентов МГТУ им. Баумана и переводчиков РЖЯ Сбера) записать видео с этими фразами. Получилось порядка 70 часов видео и примерно 240 тысяч жестов (из них около 2600 уникальных). Часть видео мы разметили до уровня отдельных жестов. Поэтому наш датасет с рабочим названием SLT_RSL можно использовать и для классификации отдельных жестов.

С точки зрения машинного обучения – это задача action recognition. Модель получает на вход N кадров, на выходе выдаёт вероятность принадлежности видео одному из M классов.

Мы пробовали различные архитектуры: Video Swin Transformer, MViTv2: Improved Multiscale Vision Transformers. Они отлично работают на тестовых данных, показывая высокие метрики, но при использовании в реальных условиях лучше всего себя показала модель S3D (статьякод).

Архитектура модели S3D. https://arxiv.org/pdf/1712.04851.pdf
Архитектура модели S3D. https://arxiv.org/pdf/1712.04851.pdf

Под «реальными условиями» мы имеем в виду, что далеко не всегда в модель будут прилетать кадры, где обязательно есть жест. Жеста может не быть совсем или присутствовать только начало или конец жеста, видео может быть смазанным, очень светлым, очень тёмным, человек может быть в кадре под необычным углом, очень далеко или очень близко.

Всё это требует определённого постпроцессинга результатов работы модели.

Например, нам нужно распознать фразу «Большое спасибо за встречу». На вход мы получим последовательность из M кадров, которые мы должны нарезать на семплы из N кадров (в нашем случае это 32 кадра) и эти семплы подавать в модель.

Важное замечание: поскольку мы говорим про модель распознавания отдельных жестов, а слова “большой”, “большая”, “большое” показываются одним жестом, мы приводим все эти жесты к одной (нормальной) форме. Поэтому в идеальном случае, модель распознавания должна выдать: “Большой спасибо за встреча”.

Фраза: «Большое спасибо за встречу»
Фраза: «Большое спасибо за встречу»

Для лучшего распознавания отдельных жестов можно варьировать ширину окна (количество кадров для одного прогноза) и степень пересечения семплов – например, для следующего прогноза мы можем сместиться всего на 1 кадр относительно предыдущего или сразу на всю ширину окна. В случае большого пересечения семплов (например, если мы смещаемся только на 1 кадр, т.е. stride  = 1) прогнозы модели могут выглядеть так:

Нет жеста, нет жеста, БОЛЬШОЙ, БОЛЬШОЙ, БОЛЬШОЙ, нет жеста, нет жеста, СПАСИБО, СПАСИБО, СПАСИБО, СПАСИБО, нет жеста, нет жеста, нет жеста, ЗА, ЗА, нет жеста, нет жеста, нет жеста, ВСТРЕЧА, ВСТРЕЧА, ВСТРЕЧА, ВСТРЕЧА, ВСТРЕЧА, нет жеста, нет жеста.

Поэтому необходимо добавить систему фильтрации, позволяющую убирать повторяющиеся слова. А также изменить порог (threshold) – степень уверенности модели в правильности распознавания жеста.

При большом пересечении окон, модель вызывается очень часто, что ведёт к повышенным затратам вычислительных ресурсов. Поэтому для получения высоких метрик на тестовых данных мы использовали небольшой stride, а при работе в реальном времени – увеличивали его для получения необходимого быстродействия. 

Чтобы оценить качество модели, мы использовали общедоступный датасет Slovo. Для этого мы использовали модель S3D, предобученную на датасете Kinetics400, а затем дообучили её на тренировочной части Slovo.

Датасет

Кол-во классов (жестов)

Mean accuracy, %

Slovo

1001

55.86

Средняя точность 55.86% - это даже чуть лучше результата модели Swin Large (55.66 %), имеющую 197 миллионов параметров (см. оригинальную статью авторов Slovo). 

Следующий шаг – сделать модель быстрее.

Делаем модель быстрой

Мы оценивали производительность модели в количестве прогнозов в секунду (predictions per second или PPS). Исходная S3D модель из PyTorch выдавала в среднем 0,2 прогноза в секунду, т.е. на распознавание одного примера, состоящего из 32 кадров, мы тратили 5 секунд. Можно, конечно, перенести инференс модели на GPU, но мы хотели, чтобы наша модель работала даже на устройствах без специализированных ускорителей. 

Одним из самых простых и при этом действенных способов ускорить модель является ее конвертация в формат ONNX. 

ONNX (Open Neural Network Exchange) - библиотека, реализующая хранение и обработку нейросетей, изначально называлась Toffe и разрабатывалась командой Pytorch (Meta**). В 2017 проект был переименован в ONNX, и с тех пор совместно поддерживается Microsoft, Meta* и другими большими компаниями. Вот хорошая статья о библиотеке.

В нашем случае, конвертация .pth -> .onnx дала прирост с 0.2 до 2 – 2.5 PPS (Intel(R) Core(TM) i5-6600 CPU @3.30GHz). 

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

https://onnxruntime.ai/getting-started

В части аппаратного ускорения нас интересует OpenVINO. Ставится просто через pip. Есть разные способы использовать этот фреймворк, но нас интересует способ использования вместе с ONNX Runtime. Сессия модели инициализируется следующим способом:

session = rt.InferenceSession(path_to_model, providers=[ ])

В документации можно увидеть доступные провайдеры: CPUExecutionProvider, CUDAExecutionProvider, OpenVINOExecutionProvider, позволяющие использовать аппаратное ускорение CPU, GPU и, собственно, OpenVino. В итоге, строчка кода будет выглядеть так:

session = rt.InferenceSession(path_to_model, providers=[“OpenVINOExecutionProvider”])

Если раньше модель при работе на CPU обеспечивала 2-2.5 прогноза в секунду (на Intel(R) Core(TM) i5-6600 CPU @3.30GHz), то использование OpenVINO повышает количество прогнозов до 3-3.5 PPS.

Опенсорс

Сегодня мы выкладываем в опенсорс одну из наших моделей, обученных в процессе работы над AI-сурдопереводом. Модель понимает 1598 жестов, включая отдельный класс “нет жеста” и даже на CPU распознаёт до 3 жестов в секунду.

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

Код выложен под лицензией creative commons 4.0,  поэтому вы можете его свободно модифицировать и применять, в том числе для создания собственных сервисов на базе модели.

Команда проекта

Работа над проектом ведется в Центре развития технологий AI во благо общества. Это R&D команда Sber AI, которая занимается исследованиями в сфере применения AI для устойчивого развития.

Центр располагается на Федеральной территории Сириус, что значительно расширяет возможности исследовательской и научной деятельности.

Хочу поблагодарить команду, которая продолжает развивать проект по русскому жестовому языку: Олег Артюгин, Александр Туленков, Леонид Верховцев, Руслан Муртазин, Дмитрий Милевич, Юлия Земцова, Елена Дроздова.

Отдельная благодарность коллегам из подразделений Сбера, отвечающих за развитие комфортной инклюзивной среды – Александру Пименову и Константину Львову.

Контакты для связи

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

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

*- иностранный владелец ресурса нарушает закон РФ

** - признана экстремистской организацией и запрещена на территории РФ

Комментарии (7)


  1. AlexMeet
    23.11.2023 12:58

    Да заинтересован в повседневной реализации данной технологии в общении с глухими и слабослышащими. Есть похожие разработки у https://adaptis.pro/ , но пока в реальной работе на мобилке не работает


    1. ArtOleg
      23.11.2023 12:58

      Попробуй модель на мобилке, мы делали её достаточно легкой. Можно в чате по ссылке детали обсудить


    1. grifmg
      23.11.2023 12:58

      Адаптис занимается прямой задачей - переводом звучащей речи на РЖЯ, а распознаванием речи - НГТУ.


  1. dlinyj
    23.11.2023 12:58

    Очень годная статья. Спасибо, прочитал с удовольствием.


  1. galapagos
    23.11.2023 12:58
    +2

    Казалось бы, почему глухим не показывать просто бегущую строку?

    А нет, для большинства из них наш письменный язык мёртв. Они плохо понимают его. Большинство слов языка слышащих они не понимают. И наоборот, много слов чисто своих.

    Однажды я попросил сурдопереводчика перевести нативно глухого докладчика сходу на русский. Оказалось просто совершенно другой язык.


  1. KOMMEHTATOP
    23.11.2023 12:58

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


    1. ru1z
      23.11.2023 12:58
      +1

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

      Потеря cлуха чаще не генетические вроде как, глухих от рождения будет %. Остальные - приобретенные.