Чтение по губам для украинского языка
Костров Евгений
Что это?

Что это?
Чтение по губам - процесс использования только визуальной информации о движении губ для преобразования речи в текст
Области применения
- Помощь слабослышащим людям
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
- Автоматическая синхронизация аудио и видео
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
- Автоматическая синхронизация аудио и видео
- Беззвучная диктовка текста
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
- Автоматическая синхронизация аудио и видео
- Беззвучная диктовка текста
- Субтитры к немому кино
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
- Автоматическая синхронизация аудио и видео
- Беззвучная диктовка текста
- Субтитры к немому кино
- Субтитры с границами каждого слова
Области применения
- Помощь слабослышащим людям
- Распознавание речи в шумных пространствах
- Идентификация говорящего
- Автоматическая синхронизация аудио и видео
- Беззвучная диктовка текста
- Субтитры к немому кино
- Субтитры с границами каждого слова
- Шпионские истории
Сложности
- Омофемы (homophemes) - слова, которые звучат по разному, но включают в себя идентичные движения губами
Сложности
- Омофемы (homophemes) - слова, которые звучат по разному, но включают в себя идентичные движения губами
- Отсутствие наборов данных
Сложности
- Омофемы (homophemes) - слова, которые звучат по разному, но включают в себя идентичные движения губами
- Отсутствие наборов данных
- Вариации произношения (акценты, скорость речи, бормотание)
Сложности
- Омофемы (homophemes) - слова, которые звучат по разному, но включают в себя идентичные движения губами
- Отсутствие наборов данных
- Вариации произношения (акценты, скорость речи, бормотание)
- Ухудшение картинки (плохое освещение, сильные тени, движение, разрешение, ракурс и т.д.)
Данные
- Собраны с 15 каналов на ютубе
-
До обработки:
- 2300 видео
- ~ 10 дней
-
После обработки:
- 470 видео
- ~ 27 часов

- 4x1060 3Gb
- core i7 3770 @ 3.40GHz × 8
- 32 GB RAM
Работа с данными
Работа с данными
Скачивание
Разрезание
Формат данных

Фильтрация
Фильтрация
-
Чистка текста:
- фильтрация по языку
- текст в скобках
- ударения
- римские цифры в пропись
- спецсимволы
Фильтрация
- Чистка текста:
- фильтрация по языку
- текст в скобках
- ударения
- римские цифры в пропись
- спецсимволы
- Фильтрация по длительности отрезка
Фильтрация
- Чистка текста:
- фильтрация по языку
- текст в скобках
- ударения
- римские цифры в пропись
- спецсимволы
- Фильтрация по длительности отрезка
- Фильтрация по распределению
Фильтрация по распределению

Фильтрация по распределению


Фильтрация по распределению



Извлечение лиц
Извлечение лиц
- Нормализация фреймрейта
Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
Детекция лиц

*Multi-task Cascaded Convolutional Networks
Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
- Вырезание области лица
Вырезание лиц

Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
- Вырезание области лица
- Масштабирование до 112х112
Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
- Вырезание области лица
- Масштабирование до 112х112
- Нахождение ключевых точек
Ключевые точки

*The Face Alignment Network (FAN)
Ключевые точки

Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
- Вырезание области лица
- Масштабирование до 112х112
- Нахождение ключевых точек
- Определение активности
Определение активности

Определение активности


Извлечение лиц
- Нормализация фреймрейта
- Определение лица на каждом фрейме
- фильтрация, если лиц больше одного
- Вырезание области лица
- Масштабирование до 112х112
- Нахождение ключевых точек
- Определение активности
- Преобразование в оттенки серого
Упаковка в TFRecord
Чтение TFRecord
Случайные аугментации:
- Отражение по горизонтали
- Изменение яркости
- Изменение контраста
- Изменение качества JPEG
- Поворот
- Cutout
Модель
3D-2D-CNN BLSTM with character CTC
LipReading with 3D-2D-CNN BLSTM-HMM and word-CTC model - https://arxiv.org/abs/1906.12170

CTC Loss

*Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
CTC Loss

Метрика
Character Error Rate:

LSTM vs Conv1d (TC)

LSTM vs Conv1d (TC)

Архитектура


Архитектура
model.add(Input(shape=(None, 112, 112, 1), name="input"))
model.add(BatchNormalization(name="batch_norm_input"))
model.add(Conv3D(128, (10, 5, 5), strides=(1, 2, 2), padding="same", name="conv_3d_1", kernel_initializer=he_normal(seed=SEED)))
model.add(ReLU(name="relu_1"))
model.add(BatchNormalization(name="batch_norm_1"))
model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), padding="valid", name="max_pool_3d_1"))
model.add(Conv3D(64, (10, 5, 5), strides=(1, 2, 2), padding="same", name="conv_3d_2", kernel_initializer=he_normal(seed=SEED)))
model.add(ReLU(name="relu_2"))
model.add(BatchNormalization(name="batch_norm_2"))
model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), padding="valid", name="max_pool_3d_2"))
model.add(Conv2D(256, (5, 5), strides=(1, 1), padding="same", name="conv_2d_1", kernel_initializer=he_normal(seed=SEED)))
model.add(ReLU(name="relu_3"))
model.add(BatchNormalization(name="batch_norm_3"))
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding="same", name="conv_2d_2", kernel_initializer=he_normal(seed=SEED)))
model.add(ReLU(name="relu_4"))
model.add(BatchNormalization(name="batch_norm_4"))
channels = 7
model.add(Conv1D(filters=400, kernel_size=7, strides=1, name="conv1d_1", kernel_initializer='lecun_normal'))
model.add(Dropout(0.2, noise_shape=(channels, 1, 400)))
model.add(BatchNormalization(scale=False))
model.add(Activation('selu'))
model.add(AlphaDropout(0.1))
model.add(Reshape((-1, model.output_shape[2]*model.output_shape[3]*model.output_shape[4]), name="reshape"))
model.add(Dense(100, activation='relu', use_bias=False, kernel_initializer='he_normal'))
model.add(Dense(400, activation='sigmoid', use_bias=False, kernel_initializer='he_normal'))
model.add(Dense(36, name="last"))Оптимизатор

Adam, lr=1e3
Предтренировка
Curriculum Learning подход
- 10 эпох сортированных данных
- 5 эпох сортированных батчей в окне
- батчи в случайном порядке
Результаты, но не те

Результаты на данный момент

Ukrainian lip reading
By __
Ukrainian lip reading
- 9