Тема ВКР: "Реализация нейросетевого классификатора для визуального распознавания речи"
Во время подготовке ВКР была проведена большая исследовательская работа в области визуального распознавания речи. В результате исследования была выбрана статья, в которой описана вычислительно эффективная архитектура. Основной целью ВКР являлось реализовать архитектуру, описанную в статье, со всей необходимой программной функциональностью. Задача не являлась тривиальной, поскольку открытый код модели не был доступен, а в самом тексте статьи совсем не много конкретики. Дополнтельно было разработано веб-приложения для использования уже обученной модели.
Репозиторий https://github.com/sadevans/EfLipSystem содержит в себе разработанное веб-приложение для взаимодействия с обученной моделью. Архитектура модели подгружается в качестве сабмодуля. Серверная часть написана на Django, клиентская - на Vanilla JS.
Для того, чтобы установить необходимую среду разработки, необходимо:
docker build -t lipread:latest .
docker compose --env-file .env-file up -d
- Файл
setup.py
отвечает за сборку бэкенд части проекта. - В папке
model
находится сабмодуль - проект с моделью. - Модуль
pipelines
содержит в себе пайплайн, который является связующим звеном между бэкенд частью проекта и моделью. В модулеpipelines
содержится файлpipelines.py
, который реализует логику обработки данных для подачи в модель, вызов модели, вызов обработки результирующего видео. - Модуль
pipelines/utils
содержит в себе скрипт обработки результирующего видео - наложение области интереса и субтитров на исходное видео. - Модуль
pipelines/data
содержит в себе скрипты для обработки входного видеофайла для его подачи в модель. - Модуль
pipelines/detectors
содержит в себе скрипты для обнаружения лиц на кадре и поиска ключевых точек с помощью детектора mediapipe. - Модуль
backend/lipread/templates
содержит в себе html шаблон веб-страницы. - Модуль
backend/lipread/static
содержит в себе .css и .js скрипты. - Модуль
backend/lipread/lipread
содержит в себе базовые файлы фреймворка Django. - Модуль
backend/lipread/lipread/core
содержит в себе основную бэкенд логику проекта. В корне этого модуля содержатся стандартные скрипты, генерируемые Django.
Схема работы состоит из трех этапов:
- Кадры исходного видео поступают из веб-приложения от клиента и прередобрабатываются. Итогом выполнения этого шага является область интереса на кадрах видео.
- Область интереса обрабатывается модель. Результатом этого шага является текст. произнесенный на видео.
- Затем текст и область интереса накладываются на исходное видео и отдаются обратно в клиентскую часть веб-приложения.
Рассмотрим каждый шаг подробнее.
На этом этапе с помощью mediapipe
находится лицо человека на кадре, координаты его bounding box'а сохраняются для последующего использования. После этого ищутся ключевые точки лица, их в этом случае 4 - правый глаз, левый глаз, кончик носа и середина рта. Далее с помощью найденных ключевых точек на кадрах видео обрезается область интереса размером 88х88 пикселей.
На данном этапе используется обученная модель, архитектура которой представлена ниже.
Модель состоит из блока 3D сверточной сети, отмасштабированной EfficientNetV2, энкодера трансформера и блока временной сверточной сети (TCN). Розовым на рисунке обозначена внешняя часть сети (frontend), выполняющая извлечение признакв, оранжевым - внутренняя часть сети (backend), отвечающая за обработку признаков.
Модель предсказывает логарифм вероятности принадлежности произнесенного на видео слова к одному из 500 классов, представленных в датасете LRW. Подробнее про модель можно посмотреть вот тут: https://github.com/sadevans/EfLipReading . В репозитории представлена реализация статьи (открытый код модели отсутсвовал, мною все было реализовано с нуля).
На этом этапе на исходном видео выделяется лицо обнаруженного человека в boundind box (который мы сохранили на первом этапе). Также для демонстрации на исходное видео накладывается область и текст, предсказанный моделью.