Юрий Бабуров

Speaking Detection

Описание проекта

Данный проект появился для решения задачи выделения важных моментов видео и подготовки из этого видео дайджеста, состоящего лишь из картинок и текста. Зачастую, подобную "текстовую версию" можно прочитать и понять в 3-4 раза быстрее, чем исходное видео. Также, мне кажется, забавно будет смотреть на "текстовую версию" фильмов, обработанных подобным образом -- в идеале, могли бы получиться автоматически сгенерированные комиксы.

Один из компонентов для этой задачи -- нейросеть, которая определяет, говорит ли человек в кадре, используя только изображение (не используя звук). В текущей версии я добавляю на экран пометку SPEAKING для обозначения того, что человек, обозначенный рамкой, в текущий момент что-то говорит.

В основе нейросети -- предобученная ResNet18, у которой дообучается только часть слоёв. Нейросеть тренировалась на датасете VIDTIMIT ( http://conradsanderson.id.au/vidtimit/#downloads ).
По результатам тестирования, нейросеть достаточно быстро научилась на этом датасете распознаванию с точностью около 95%.
К сожалению, оказалось, что датасет из 100 тысяч картинок маловат для этой задачи, поскольку включает в себя кадры с изображением лишь 43 разных лиц: на практике точность получается меньше, и качество распознавания сильно зависит от человека.
Надо будет доучивать на втором датасете после конкурса :)
Тем не менее, во многих случаях нейросеть уже позволяет определить, говорит или молчит человек на конкретном кадре.

Состав команды:

  • Юрий Бабуров, Программист

Комментарии

Ivan Panin

А с музыкальными инструментами модель теоретически могла бы сработать? Типа https://www.youtube.com/watch?v=FMEk8cHF-OA

Юрий Бабуров

Привет. Моя текущая модель -- сможет так делать, но придётся разметить данные -- она всё-таки делает классификацию. А модель от deepmind сама определяет корреляцию между кусками изображения и звуком, а потом выбирает элементы с максимальной корреляцией.
Смотри также ответ Якову, там практически такая же идея.
Кстати, смущает, что они не показывают скрипку, играющую другую мелодию, отличающуюся от реальной мелодии -- возможно, сеть научилась просто классифицировать музыкальные инструменты!

Юрий Бабуров

Вообще, такое делается, недавно на одной из крупных конференций показывали замечательные примеры. Но они пока не open-source.
А первый шаг для отличного проекта -- хороший большой датасет для задачи.
Поэтому, мне кажется, данная нейросеть будет очень полезной именно для составления подобного датасета, на основе которого любой сможет легко сделать чтение по губам или своё говорящее лицо по тексту и фотографии.
Именно мне чуть больше интересна именно задача получения текста из аудио-видео ряда. Она очень полезная, но для достижения очень высокого качества требуется и видеоряд, и текст -- одного только звука мало. А вот получившийся текст низкого качества -- просто бесполезен.

Юрий Бабуров

(Это ответ на комментарий Ивана)

Иван Федоров

Согласен. Особенно, если рассматривать китайский язык, одно слово произносится с разной интонацией и от этого имеет разное значение...

Яков Филин

В таком случае - задача вот так решается https://ai.googleblog.com/2018/04/looking-to-listen-audio-visual-speech.html?m=1

Юрий Бабуров

Да, а ещё, после сбора более крупного датасета, можно сделать две нейросети, одну для видео, другую для аудио -- совместно обучаемые, которые будут предсказывать сигнал друг друга (что очень похоже на нейросеть в работе гугла). Такие модели сейчас очень интересно изучать, и мне кажется, за ними будущее в области более качественного распознавания речи для различных конференций. Хотелось бы сделать такое решение и отдать его всем желающим  для самостоятельного использования.

Иван Федоров

Идею можно дальше раскрутить - например, сейчас проект может уже распознавать без звука, что человек говорит. Звук нужно подрубать и тогда можно будет сопоставить что речь и положение губ при произношении (это уже вроде даже сделано, нейронки по губам умеют читать). И к примеру, если человеку нужно провести видеопрезентацию, то он может просто записать текст и скинуть свое фото, а сеть будет давай эффект, как будто он все это говорит в реальном времени. Так можно будет проводить видеопрезентации, не присутствуя на них, ибо зачастую говорить приходится заказчикам одно и то же, а тут как никак время сэкономишь)

Pavel Mochalov

Прикольно. Теперь роботы смогу понимать, что ты с ними разговариваешь))

Юрий Бабуров

Павел, спасибо за добрые слова.
Вообще, у меня есть ещё одно потенциальное применение для данной модели: камера, которая способна вести запись только тех моментов, когда человек что-либо говорит, и только тех лиц, которые говорят.
Назовём это "проект "говорящие головы" :)
Это позволит очень сильно экономить на размере базы данных архивов различных выступлений, разговоров и переговоров, когда важна именно смысловая компонента сказанного и нужно видеть говорящего, но не нужна вся сцена с мяукающими котиками на заднем плане и бегающим туда-сюда роботом-пылесосом.
Что скажете, будет такое востребовано?

Яков Филин

А чем плох тот же LipNet, что по губам читает для этой задачи?

Юрий Бабуров

Яков, добрый день. Вы задали отличный вопрос, позволяющий лучше понять задачу и решения, стоящие за ней.
Вообще, определение говорящего нужно для правильной раскадровки и определения сцен, а также для дальнейшего аудио-визуального голоса говорящего человека в кадре, это позволит увеличить точность распознавания транскрипта, что будет очень важно для лекций или любых других видеоматериалов со сложной терминологией.
Я считаю, что задачу аудиовизуального распознавания данная сеть не должна пытаться решать, она должна быть ориентирована для получения материала для принятия решения о хорошей раскадровке "текстового представления". Потому что если делать аудио-визуальное распознавание, я бы действовал по-другому.
Поэтому возникает вопрос, как же связать LipNet и сам факт говорения.
LipNet -- это решение, использующее датасет GRID, имеющее определённую архитектуру или реализацию.
Давайте по порядку.
Датасет GRID для задачи определения говорения плохо подходит, потому что там:
1) 36 спикеров, то есть, ещё меньше, чем в использованном мной VIDTIMIT.
2) говоря, люди, находясь в одной позе смотрят в камеру, т.е. там нет лиц, повёрнутых боком, как в VIDTIMIT, и там съёмки не проходили в три разных дня.
Плюсом только размер: В VIDTIMIT 430 средних предложений, в GRID же 7000 более коротких предложений.
Итого: для нейросети будет намного больше примеров для положительного класса (когда человек говорит), но не будет отрицательных примеров (когда человек не говорит).
В явном виде не подойдёт и их реализация: их нейросеть говорит, что именно человек сказал, но не говорит, в какой момент он это сказал. Также она игнорирует смех и другие голосовые эмоциональные реакции. Вообще, это пока открытый вопрос, какие настройки предпочтительны для моей модели распознавания говорения: обращать внимание на смех или нет.
Но, тем не менее, часть пайплайна LipNet, связанную с распознаванием лиц и области рта, возможно, стоило бы использовать.
Если же вы говорите про архитектуру LipNet, то, в принципе, можно было использовать их архитектуру, и сравнить её по точности с ResNet. Кажется, у них нет опубликованных моделей, предлагается учить их самому. А у ResNet опубликованная модель есть, поэтому мне было проще взять за основу предобученные первые слои из ResNet. Если же препарировать обученную LipNet, наверняка можно будет выделить модель определения говорения с неплохой точностью. Наверняка она будет не настолько точно настроенная, чтобы  работать только с английским языком, это тоже нужно учитывать, но этот фактор не должен получиться сильно значительным, я оцениваю его вклад в качество как меньше 1%.
То есть в целом, как направление развития -- ваша мысль весьма продуктивна.
Но я рассматривал чуть другую, намного более доступную версию для той же самой идеи:
Мы можем подготовить датасет, в котором люди говорят, и говорящий на весь клип только один, и определить моменты их говорения просто по уровню голосового сигнала, не забыв убрать моменты, когда говорящий отсутствует в кадре. После этого разметить корпус по факту наличия звука в текущий момент плюс-минус 100 мс (т.к. в звуке "т" пауза перед произнесением самого звука занимает порядка 80-90 мс).
Я планирую подготовить и подключить такой датасет в будущем.