Привет, Хабр! Меня зовут Алексей Мельников, я продакт онлайн-кинотеатра KION, который МТС запустил в апреле прошлого года. Отвечаю за направление искусственного интеллекта (ИИ) в продукте. В этой статье я расскажу о том, как работает фича пропуска титров и заставок в онлайн-кинотеатрах и поделюсь личным опытом привлечения ИИ к этому делу.
Рассказ дополнят мои коллеги: Алексей Некрасов (znbiz) – Lead направления Python в МТС, в KION выступил в роли архитектора от MTS AI при внедрении решения на базе ИИ и Али Алиев – ML инженер и разработчик алгоритма на базе ИИ от MTS AI.
Пропуск титров и заставок – удобная штука для пользователей: она экономит время и позволяет по минимуму отвлекаться от просмотра. Особенно это актуально для сериалов, где заставка зачастую повторяется из серии в серию, а титры так и вовсе одинаковые. И (будем честны) их обычно никто не смотрит до конца, зрители просто включают следующую серию.
Для нас эта история началась в 2020 году. Тогда мы уже знали, что функционал пропуска титров есть у IVI, Netflix, Кинопоиск, Hulu, Amazon Prime Video. Но мы не знали, как у этих сервисов происходит разметка – «руками» или с помощью ИИ. Их статистика, естественно, нам тоже была недоступна.
Мы видели, что пользователи KION очень часто перематывают начальные заставки фильмов и особенно сериалов, замечали, что на титрах юзеры зачастую заканчивают просмотр. Нам очень хотелось протестировать фичу с пропуском и показать ее ценность для пользователей в цифрах.
Интересный момент – влиятельная американская студия Imaginary Force (участвовала в создании сериалов Stranger Things и Mad Men) запустила флешмоб против пропуска титров #DontSkipTheTitles. Произошло это сразу после появления фичи для пропуска у Netflix в 2018 году.
Многие киноделы были против пропуска титров и заставок, так как в отдельных случаях это целое искусство с высоким бюджетом. Протест был актуален до 2019 года и постепенно сошел на нет, желание пользователей пропускать титры победило :)
С чего мы начали
Задачи по пропуску титров и автоматизации разметки появились у нас одновременно. Мы не хотели заниматься ручной разметкой титров, так как на эту задачу уходило очень много времени у видеоинженеров, и сразу решили передать работу нашему «коллеге» – ИИ.
Так совпало, что выпуск фичи сопровождался запуском нового онлайн-кинотеатра KION. На старте проекта вышло много оригинального контента, который размечали «руками».
Мы изучили поведение пользователей и выяснили, что они перематывают начало и конец фильма или серии. После выпуска фичи с пропуском контента на Originals (оригинальный контент снятый Kion) от зрителей стали приходить просьбы разметить и остальной контент. Если в ручной разметке происходил сбой – мы получали много обращений, что нужно поправить разметку или ее вовсе нет. То есть наша фича «зашла» пользователям и зрители уже не представляли KION без функции пропуска.
Проблемы и их решения
Мы знали что задача предстоит очень сложная, так как одновременно нам предстояло запустить ребрендинг KION, а также показать новый контент с разметкой и фичей пропуска титров. Помню, как после вечерней презентации проектов Originals всему российскому медиа-сообществу на Мосфильме, мы с командой поехали не по домам, а в офис. Все для того, чтобы ночью выкатить в прод огромное количество кода: начиная от ребрендинга и заканчивая фичами типа пропуска титров.
Почему ИИ?
Мы сразу решили, что разметку будем делать с применением ИИ. Во-первых, ручной труд потребовал бы отдельных бюджетов, найма и контроля. Во-вторых, – в МТС есть наработанные технологии ИИ, грех было бы не задействовать их. Разработку фичи в клиентских приложениях мы начали делать одновременно с работами по автоматизации разметки. Ее разделили на два участка:
- cамо распознавание и работа ML-инженеров;
- Получение заданий на разметку, скачивание на сервера ML, обработка, отправка результатов на бек KION, публикация.
Для обработки контента были закуплены видеокарты Tesla V100 от Nvidia (еще по старым ценам… эх, ностальгия). Их установили в ЦОД в Московской области, так как оказалось, что мы не можем поставить эти видеокарты у себя в офисе, им нужно повышенное энергопотребление.
Теслы стоят в серверах Huawei FusionServer G5500 у которых четыре блока питания переменного тока по 2000 Вт. Один сервер потребляет 8кВТ, на все 6 серверов нужно было 48 кВТ
Технические особенности реализации
Для того, чтобы рассказать о технической стороне вопроса, я пригласил коллегу – Алексея Некрасова.
«Если смотреть на техническое решение «в лоб», то нам нужно взять серию, прогнать ее через ML-модель, найти начальные и конечные титры и вернуть результат. К примеру, в json-формате. Для такого решения можно взять ETL-систему, например, Airflow, и построить в ней нужный нам DAG (ориентированный ациклический граф).
Но вот здесь начинаются проблемы:
Мы перегрузили канал между нашим сервером и хранилищем фильмов, так как начали загружать фильмы десятками потоков;
После загрузки серий на нашем сервере закончилось место. Чтобы разметить хотя бы одну серию из сезона, нужно загрузить все доступные серии в этом сезоне для качественной разметки. А сериалов на обработку ставится большое количество. Кто-нибудь знает, сколько весит «Лунтик и его друзья»?
Нам понадобился веб-сервер, который будет взаимодействовать с основным сервисом от KION и дальше передавать задачи в ETL-систему.
В итоге мы решили отказаться от ETL-системы, так как посчитали, что можно решить нашу задачу с помощью нескольких микросервисов и всё упаковать в k8s (kubernetes).
Веб-сервис общается с сервисами от KION, принимает задачи на обработку и выдает результат. Получилась простая CRUD-обвязка вокруг модели с задачами на обработку контента. Демон-загрузчик (программа, работающая в фоновом режиме) предзагружает необходимый контент для обработки, чтобы видеокарты не простаивали. В этом демоне реализовали возможность регулирования нагрузки на сеть, а также мониторинг контента, который больше не нужен и его можно удалить. Демон-оркестратор интегрируется с API k8s и поднимает на обработку нужные ML-модели в таком количестве, чтобы максимально загрузить видеокарты».
У нас получилась вот такая схема (это ее упрощенное изображение):
Что под капотом?
Тут подробно расскажет мой коллега Али Алиев:
«Для реализации функционала нам нужно было найти одинаковые кадры в разных эпизодах сериала. Так как интро и титры обычно меняются каждый сезон, то было решено запускать алгоритм как раз в пределах одного сезона.
Если рассмотреть классические методы компьютерного зрения, то есть два основных способа сравнения кадров:
- Сравнения гистограмм. Гистограмму можно рассматривать как график, который дает общее представление о распределении интенсивности изображения. Это график со значениями пикселей (в диапазоне от 0 до 255, но не всегда) по оси X и соответствующим количеством пикселей в изображении по оси Y.
- Сравнения векторов признаков, когда на основе специальных алгоритмов формируется набор параметров для изображения. Подробнее об этом можно почитать на сайте OpenCV, там же и есть список популярных алгоритмов.
С учетом специфики нашей задачи, где нужно сравнивать несколько тысяч относительно похожих друг на друга кадров, разница между которыми 40 мс, и при этом многие из этих кадров размыты, то использование классических методов извлечения вектора признаков нам не подходит.
В интернете на момент октября 2021 года отсутствовала информация о готовых решениях, которые были внедрены в другие подобные продукты. Автоматический подход в сериалах был реализован в Plex Media Server, где задача решается с помощью распознавания саундтрека в интро и титрах. Работает это посредственно.
Мы решили использовать нейронную сеть для получения фичей из кадров, которые затем планировали сравнить. В идеале алгоритм должен сравнивать значения каждого кадра с другими кадрами из остальных эпизодов сезона, затем сгруппировать кадры, которые были найдены в других эпизодах и выдать временные метки этих сцен.
Вот разбор нашего алгоритма.
У нас есть файлы с эпизодами сериалов. Чтобы прогнать нейронную сеть, нам нужно извлечь каждый кадр и затем передать его в эту сеть. Декодирование каждого кадра исходных файлов сериала – тяжелая задача, в среднем для каждого сезона нам приходится декодировать 1 200 000 кадров.
Для этого лучшего всего подходят аппаратные декодеры NVDEC, установленные на видеокартах NVIDIA TESLA A100, которые используются для запуска нейронных сетей. В качестве программной реализации для декодирования видео выбрали ffmpeg, ведь помимо извлечения кадров нам нужно еще и сжать изображение до входных параметров нейронной сети на этой же видеокарте. Для решения проблемы мы могли бы использовать готовый фреймворк от NVIDIA Data Loading Library (DALI), но скудный набор дополнительных параметров склонил чашу весов в сторону ffmpeg.
Так как размечать датасет под такую задачу почти невозможно – мы решили использовать архитектуру, которая не требует разметки при обучении (unsupervised learning). Из всех протестированных архитектур была выбрана SwAV (Swapping Assignments between Views). Подробнее про архитектуру SwAV можно почитать здесь.
После прогона каждого кадра через нейронную сеть мы получили массив из 256 чисел FP32. Чтобы найти одинаковые или похожие кадры, нам нужно каким-то образом сравнивать массив векторов признаков. Для сравнения мы вычисляем евклидово расстояние между векторами признаков 2 кадров из разных эпизодов. Если дистанция ниже определенного порога – считаем, что эти кадры одинаковые. Как показывает опыт, даже в одинаковых сценах из разных эпизодов не всегда совпадают результаты нейронной сети, поэтому качественным образом сравнивать кадры не получится. Из-за этого пришлось для поиска использовать весь сезон сразу. То есть нужно сравнивать каждый кадр одного эпизода со всеми кадрами из других эпизодов.
Если брать в расчет, что в каждом сезоне сериала в среднем 20 эпизодов, а в каждом эпизоде примерное 40 минут контента, – можно подсчитать, что в среднем у нас получается 60 000 кадров за эпизод. При таком раскладе нужно провести несколько миллиардов сравнений. К счастью, для таких вычислений имеется библиотека FAISS, которая может работать как на процессоре, так и на видеокарте.
Изначально была использована версия без поддержки видеокарты, где каждый сезон считался в среднем за 60-70 минут. После использования ресурсов видеокарты время расчетов сократилось до 4-5 минут. Как происходит дальнейшая обработка – рассказать, к сожалению, нельзя, NDA не дает.
Обработка каждого сезона со всеми тремя этапами занимает в среднем 40-60 минут. Самым затратным этапом нашего алгоритма стал процесс декодирования кадров из эпизодов, остальные ступени занимают меньше 20% от всего времени обработки».
Что это дало пользователям?
Эффект от фичи заметен в двух плоскостях.
Первая – это метрики. Здесь мы увидели странный результат на мобильных устройствах. Наша основная метрика смотрения дала небольшую просадку в разрезе сессий, где участвовали фильмы с разметкой титров. После глубокого анализа мы пришли к выводу, что на мобильных устройствах люди обычно смотрят по одной серии. Если мы стали пропускать заставки и титры – мы срезали время смотрения. Тем не менее, мы раскатили фичу на всех после АБ-теста, так как пользователи уже не представляли KION без этой возможности.
А вот на больших экранах (компьютеры, приставки, смарт-тв) мы заметили увеличение смотрения среди размеченных сериалов – сидя дома на диване с комфортом люди смотрят больше, если им предлагать пропускать заставку, титры и автоматом запускать новую серию. Также мы увидели увеличение средней длинные сессии наших пользователей.
Вторая плоскость – удобство и привычки пользователей. К хорошим вещам люди быстро привыкают, поэтому иногда приходится пренебрегать своими KPI ради пользователей.
Что будет дальше?
Мы планируем развивать фичу пропуска титров – внедрить возможности пропуска повторов прошлых серий и предфинальных титров. Например, когда в фильмах Marvel идут титры, которые прерывают скрытые сцены. ИИ будет находить эти скрытые сцены и выделять их.
Эти и другие новые фишки скоро покажем в KION, увидимся там ;)
Если у вас есть вопросы – пишите их в комментариях к статье, обязательно отвечу!
Комментарии (13)
Tinkz
18.04.2022 14:50+1тот, кто придумает "перематывать на середину" в самом популярном жанре - озолотится)
akmelnikov Автор
18.04.2022 23:41Это точно) особенно если перематывать на самый популярный фрагмент видео.
P.s. Поговаривают порхаб так уже умеет делать.
timiryazevec
18.04.2022 19:11Спасибо за статью, интересно было почитать. У меня возможно странный вопрос, но для чего было сравнивать все 40 минут (60 000 кадров) если речь идёт о титрах вначале и в конце? Зная продолжительность эпизода/фильма ( которое мы сохраняем в какую нибудь специальную переменную для этого) мы берём 5 минут видео в начале и 5 минут в конце, тем самым экономим время обработки ну и в принципе ресурсы. Или я все же упустил какой то важный нюанс?
aliyev_ali
18.04.2022 22:51Процесс поиска по всем кадрам позволяет найти рекапы(повторы из прошлых эпизодов). Можно посмотреть своими глазами на примере сериалов "Мост" или "Чикаго в огне" на KION.
andreykglotov
18.04.2022 19:12А была какая-то страховка на тот случай, если заставка в пределах одного сезона поменяется?
И еще интересно, можно было бы не весь эпизод оценивать, а, например, первые и последние пять минут, где вероятнее всего встретить заставку и титры?
aliyev_ali
18.04.2022 22:48Как раз процесс поиска кадров каждого эпизода со всеми остальными эпизодами помогает нам избавиться от этой проблемы. Если конечно заставка не меняется каждый эпизод, а например каждый 4-5 эпизодов, то проблем не будет.
Stan_1
19.04.2022 09:25Есть фильмы и сериалы, где титры могут перемежаться с полезными вставками. Пример - фильмы с Джеки Чаном, где после титров идут кадры со съемки. Или сериал друзья, где минуты 3 идет интро, а потом минуты 4 - музыкальная заставка. В 5 минут можно не уложиться.
vassabi
18.04.2022 19:27... если кто-то смотрел оригинальные Big Bang Theory - там есть после каждой серии вставки от https://bigbangtheory.fandom.com/wiki/Chuck_Lorre_Productions
А ваша титрорезка их тоже режет или оставляет?
PS: и кстати титры - это один из источников сведений об актерах (если они там были например в где-то эпизодах) ...
aliyev_ali
18.04.2022 22:42Да, их тоже находим. Алгоритму без разницы, текст или какая-то другая картинка. Важно, чтобы это было и в других эпизодах сезона.
houk
Статья познвательно-полезная.
P/S/ можно было бы улушить форматирование текста + добавить ссылки (...можно посмотреть здесь...).
akmelnikov Автор
Спасибо за обратную связь, рад что статья была полезной.
Ссылки добавили, форматирование текста улучшили)