На IVI пользователи выбирают кино для просмотра, ориентируясь в первую очередь на постер и название фильма. Обычно правообладатель предоставляет один постер для каждого фильма и сериала, но бывают ситуации, когда могут понадобиться дополнительные/альтернативные изображения. Их создание — трудоемкая задача, потому что с помощью этих изображений нужно передать содержимое контента. Чтобы упростить её, мы прибегаем к генерации синтетических постеров. В этой статье я немного приоткрою занавес и расскажу о том, как мы удаляем визуальный мусор в процессе создания постеров.
Проанализировав множество фильмов, мы выбрали три типа наиболее часто встречающихся объектов, которые необходимо находить и обрезать:
чёрные грани;
текст (хардсабы);
логотипы.
Черные грани
Со стороны кажется, что нет ничего проще, чем обрезка черных граней, и можно делать это на этапе кодирования. К сожалению, это не всегда так. Например, в фильме “Отель «Гранд Будапешт»” соотношение сторон основной картинки меняется от 16:9 к 4:3 и к 21:9. Этот прием используется для обозначения временного периода: 4:3 в 1932-м, 21:9 в 1968-м и 16:9 в 1985-м.
Аналогичный художественный прием используется и в фильме «Мамочка», где большую часть экранного времени используется соотношение сторон 4:3, но в конце оно меняется на 16:9.
Детектировать чёрные грани в отдельном кадре несложно: нужно проверить по отдельности каждую из четырех его граней— верхнюю, правую, нижнюю и левую. При проверке изначально выбирается крайняя полоска пикселей кадра, суммируется яркость всех пикселей в этой полоске по всем цветовым каналам (красный, зеленый, синий) и делится на количество пикселей в полоске. Если полученное значение средней яркости ниже заданного порога, то черная грань есть и нужно сканировать следующую полоску, что ближе к центру — и так до тех пор, пока не найдётся полоска, чья яркость выше заданного порога. Это и будет конец черной грани. Проиллюстрирую:
Таким же образом можно отсечь чрезмерно темные куски по краям кадра.
Текст: хардсабы
Если говорить про текст, мусорным для нас является только тот, который нанесен поверх кадра. Текст, являющийся частью кадра, не выделяется и потому уместен. Приведу пример:
В случае с текстом нам нужен максимально простой детектор, так как естественный текст в кадре — например, на элементах окружения — не является визуальным мусором. Поэтому нет смысла гоняться за SoTA архитектурами, можно взять что-то простое и быстрое. Мы используем EAST (Efficient and Accurate Scene Text), он удобен еще и тем, что реализован в Open-CV и его можно быстро встроить в проект.
Пайплайн EAST состоит всего из двух этапов: полносвязной сети и Thresholding & Non-Maximum Suppression (далее NMS).
В Open-CV реализация EAST использует для извлечения признаков ResNet-50. Сеть обучена на датасетах детекции текста в сцене ICDAR 2013 и ICDAR 2015 — это 1229 фотографий с локализованным на них текстом. На выходе получаем тепловую карту вероятности текста в отдельных местах и набор описаний прямоугольников в формате RBOX. RBOX содержит координаты верхнего левого и нижнего правого угла прямоугольника, а также угол поворота. Далее отбрасываем прямоугольники, степень уверенности в которых ниже заданного порога, и применяем NMS для избавления от дублей. В результате получаем набор прямоугольников с текстом.
Мы установили большой порог уверенности, таким образом после фильтрации большинство надписей в обстановке не детектятся.
Логотипы
Существует два вида задач детекции логотипов:
детекция логотипа на объекте в кадре;
детекция логотипа, наложенного поверх кадра.
Нас интересует детекция логотипов, наложенных поверх кадров. Чаще всего они встречаются в сериалах, так свой логотип оставляет правообладатель. Иногда поверх изображения также наложены иконки возрастных ограничений: «18+» и им подобные, далее их тоже будем считать логотипами.
Уточним условия нашей задачи:
логотипы не являются частью изображения, а наложены поверх;
логотип может быть полупрозрачным;
как правило, логотип не меняет положение в кадре на протяжении всего видео;
в кадре может быть от одного до 4-х логотипов в разных углах.
Можно провести аналогию логотипа с ватермаркой, как на изображениях с фотостоков, и представить, что набор кадров из одного видео — это набор изображений с одинаковой ватермаркой.
В On the Effectiveness of Visible Watermarks описывается метод детекции ватермарок и восстановления оригинальных изображений. Восстановление изображений нас не интересует, т.к. логотипы могут быть непрозрачными, а метод детекции будет разобран далее. Ключевой его момент — использование алгоритма выделения контуров изображений.
Возьмем в качестве алгоритма выделения контуров изображений оператор Собеля. Оператор Собеля вычисляет новое значение для каждого пикселя в зависимости от его соседей с помощью маски 3*3.
Если стало интересно, можете почитать ещё про алгоритмы выделения контуров на Хабре или на Вики.
Теперь разберем, как с помощью оператора Собеля можно детектировать логотипы. Картинки были осветлены для большей наглядности.
1. Возьмем несколько десятков равноудаленных друг от друга кадров из видео.
2. Применим к изображениям фильтр оператором Собеля раздельно по оси Х и по оси У - это позволит определить границы объектов.
3. После усреднения получившихся картинок получаем заметный логотип на практически полностью чёрном фоне.
4. Складываем градиенты по Х и по У.
5. Блюрим изображение, чтобы избавиться от случайных выбросов.
6. Переводим изображение в черно-белое.
7. Считаем, что всё белое - логотип, остальное — нет. Осталось создать описывающие прямоугольники.
8. Разбиваем изображение на 4 равные части на случай нескольких логотипов в разных углах, как тут:
9. В каждой четверти находим минимальный прямоугольник, охватывающий все белые пиксели. Если белых пикселей нет, то логотипа нет.
10. Готово, логотипы распознаны.
Финал
Теперь, когда все детекторы нежелательных объектов готовы, нам нужны ещё две вещи для обрезки кадра в постер: детектор лиц и алгоритм обрезки.
В результате работы детектора мы получаем координаты одного прямоугольника, охватывающего лицо. Кадры без лиц отбрасываем, так как считаем их плохими кандидатами на постеры.
Постеры должны иметь заранее заданное соотношение сторон, содержать целиком лицо и не содержать визуальный мусор.
Постер получается путём сужения прямоугольника, описывающего лицо, до прямоугольника с целевым соотношением сторон и его последующим расширением до тех пор, пока не упремся в нежелательные объекты или границы кадра.
Далее приведу несколько примеров преобразований «исходный кадр → детекция → постер без названия/логотипа».
После того, как кадры были избавлены от визуального мусора, начинается следующий этап пайплайна, но это уже совсем другая история… о которой мы обязательно расскажем, но уже в другой раз.
vanyas
Но ведь сабы и логотипы мало задетектить, надо еще их аккуратно удалить, воссоздав на их месте часть картинки. Хотелось бы услышать об этом
ultrar Автор
Мы выбрали более простой путь и обрезаем картинку так чтобы она их не содержала. Да, это уменьшает разрешение кадра, но, при необходимости, после этого применяется апскейл до нужного разрешения.
Если же оказывается что логотип или сабы перекрывают лицо, то такой кадр помечается непригодным для постера.
n0isy
Это же видео. Логотипы не проще ли детектить, усреднив(или даже min() ) X кадров ?
Кстати, хард сабы тоже статичны...
ultrar Автор
Для детекции логотипов используется усреднение кадров, посмотрите ещё раз пункты 1-3 в описанном в статье алгоритме. (после тестов мы пришли к тому что в большинстве случаев достаточно взять 30 равноудалённых по времени кадров для детекции логотипа)
Не очень понимаю что вы имеете в виду под тем что хардсабы статичны. То что если они есть в видео, то они на всём его протяжении занимают одну и ту же область? Это так, но они могут быть только на небольшом количестве кадров => не хотелось бы обрезать эту область на всех кадрах.