Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Обращали ли вы когда-нибудь внимание на то, сколько всего в кадре упускает наш мозг при просмотре фильма? Каждый раз, когда вы пересматриваете своё любимое кино, вы замечаете что-то новое.
Возьмём для примера великое – “Назад в будущее”. Главное, что захватывает в фильме, это, конечно, сюжет. Но во сколько лет на какой просмотр вы узнали, что в конце фильма магазин "Две сосны" поменял своё название на "Одинокая сосна"? Это происходит потому, что Марти сбивает дерево на ферме Пибоди, влетев в прошлое на DeLorean DMC-12. В первый раз это тяжеловато увидеть, но это важная деталь сюжета.
А помните ли вы диван, на котором так уютно сидели “Друзья” в квартире Моники и Рейчел? Наверняка, у нас всех в памяти хранится его общий вид, но когда заходишь в магазин и хочешь купить такой же, вряд ли вспомнишь всё в деталях.
В момент просмотра фильма, мы часто сфокусированы на сюжете и происходящем на переднем плане, из-за чего можем упускать детали, без которых фильм может показаться не столь продуманным.
Но не беспокойтесь. В 2021 это больше не проблема, ведь теперь есть платформа компьютерного зрения Layer, которая смотрит кино вместе с вами. От неё никаким деталям не спрятаться и не скрыться. Давайте заглянем “под капот”?
Небольшое отступление
Это статья о компьютерном зрении и искусственных нейронных сетях. Она предполагает некоторое знакомство читателя с вопросом, поскольку текстов по данной тематике сейчас очень много как в нашем блоге, так и на Хабре в целом:
Поэтому какие-то вещи я буду опускать и считать, что читатель с ними уже знаком.
Но в общем же, я всё равно постараюсь сохранить баланс и построить повествование таким образом, чтобы удовольствие получил как подкованный читатель, так и не очень близко знакомый с темой. Так что не важно, кинолюбитель ли вы и зашли сюда узнать о том, как сделана эта классная распознавалка из, например, Okko на SberBox, или вы инженер компьютерного зрения и захотели узнать технические детали реализации, – эта статья будет познавательной для вас.
Здесь я рассказываю, кто мы такие
Мы – команда сервиса Layer внутри SberDevices. Мы занимаемся распознаванием всего-всего на видео и на изображениях, а наш основной продукт – Layer Computer Vision Platform. Выше я закинул приманку с фильмами – это действительно одно из целевых применений нашей технологии, которое уже давно работает. На устройствах Sber наш сервис распознаёт актеров, локации, одежду, мебель, еду и много чего ещё (что-то в будущем) в момент, когда вы смотрите кинотеатр Okko. Распознав, он позволяет вам посмотреть подробную информацию об актёре, купить билет в локацию, поискать похожие предметы одежды в Ozon или Lamoda, заказать у партнеров доставку еды, похожую на ту, что сейчас в кадре.
И хотя сегодня я в основном буду рассказывать на примере фильмов, на самом деле это далеко не всё, с чем мы работаем и как мы работаем. Например, мы подключаем Layer к партнёрам в формате B2B, работаем с телевидением и Youtube, да и чего мы только не делаем.
А если и нет – вы можете предложить нам сделать это.
Доступ к платформе Layer, в основном, предоставляется по веб-API, но возможна и интеграция других уровней.
Говоря простыми словами, вы отправляете в сервис изображение или серию изображений, а он даёт вам в ответ информацию, в зависимости от того, что вы хотите знать.
В данный момент мы работаем с:
Лицами – детекция и распознавание лиц на изображении.
Локациями – определение места действия в кадре, с точностью до метро.
Одеждой – детекция и поиск похожих элементов одежды (в магазинах-партнёрах), присутствующих в кадре.
Мебелью – детекция и поиск похожих элементов интерьера, присутствующих в кадре.
Едой – детекция блюд и пищевых продуктов с фиксированным набором классов в сверхсложных условиях, также есть возможность поиска похожей еды.
Ещё несколько категорий находятся в процессе разработки или тестирования, перечисленное – лишь часть возможностей сервиса. Помните, что в заголовке я заявил, что Layer видит больше, чем ваш глаз? Это правда.
Человек не способен с такой скоростью отслеживать всё это веселье, происходящее во всех категориях предметов в кадре, а наша платформа способна.
Конечно, если рассматривать задачи отдельно, то точность пока не везде лучше человеческой, но по сумме, с учётом скорости распознавания и количества обрабатываемой в момент времени информации, вполне можно заявить – система обходит зрителя.
Здесь я показываю, почему фильмы для алгоритмов – это здорово
Поскольку в основном я тут говорю о платформе в разрезе фильмов, расскажу подробнее почему распознавать что-либо в фильмах это особенно весело и задорно:
Кинематографу около ста лет и только промышленных фильмов, без учёта арт, грайнд и прочего хауса, а главное, без учёта сериалов, уже вышло более 330 000. Все они из разных эпох, сняты с использованием разной техники, у них разное качество, цвет и прочее.
В отличие от ADAS-задач или задач видео-аналитики, работа над распознаванием сущностей в кадре усложняется тем, что визуальный ряд фильмов ограничивается только лишь фантазией режиссера \ сценариста \
ИИ. Поэтому приходится жить и действовать в условиях, когда пришельцы могут быть с телом-помидором. И никак заранее не получится подготовить сеть к таким ситуациям. А с контекстом у алгоритмов пока сложновато.Никто в своём уме не начнёт делать красивое боке (оптическое размытие заднего фона и объектов, не попавших в ГРИП) в камере на Тесле или в системе видеонаблюдения. В фильме это обязательно будет. Объекты, интересующие нас, могут при этом оставаться вне фокуса. Все прочие оптические, компьютерные эффекты
итрипы режиссёратакже создают проблемы.Сцены в фильмах обрываются и начинаются беспощадно, нередко подбрасывая сюрпризы. Например, там, где лежал апельсин, иногда может возникнуть баскетбольный мяч – по закону подлости тоже оранжевый и тоже круглый. Переход сцен, в целом, отлавливается по тому факту, что кадры сменились слишком резко, но не всегда. Так же резко сцена может вернуться и к предыдущей, но система уже потеряла все отслеживания.
Кино снимают все нации, с, зачастую, очень разной культурой и мировоззрением, а значит нельзя ожидать, что, например, еда или одежда будут ограничены вашим пониманием этого термина. Например:
Здесь я углубляюсь в технические детали
Итак, как же всё в Layer устроено?
Я не буду касаться той части, которая не про компьютерное зрение и алгоритмы. Безусловно, в таком огромном и сложном сервисе есть развесистый бэкенд и фронтенд, и их устройство заслуживает отдельной статьи, а может и не одной. И они будут.
Поговорим сейчас про ML-часть.
Все задачи, как вы догадываетесь, разные. Локации, еда, одежда, лица, мебель – несравнимые вещи, у всех в кадре свои законы. Локации, чаще всего, сменяются одна за другой, при этом герой иногда весь фильм может проходить в одной и той же одежде, она не часто сменяется резко. Зато она есть в подавляющем большинстве фильмов, а вот еда фигурирует нечасто и очень редко нормально различима (реже, чем вы думаете, обратите внимание при следующем просмотре). Кроме того, актёры, которые появятся на экране, заранее известны, а локации и еда – нет. Людей в кадре можно продолжать отслеживать и когда лицо пропало, но всё ещё видно тело, а куда делась еда – уже не узнать. И так далее.
Но кое-что всё же объединяет эти задачи. Чтобы что-то распознавать, это нужно сначала найти. Поэтому в любой из задач, в той или иной мере, первый этап – работа детектора. Обычно речь идёт о чем-то таком: подали на вход изображение – на выходе получили описывающие прямоугольники и классы объектов в них. Но в реальности детекторы мы используем в разных категориях и задачах очень разные: есть более универсальные, есть более специализированные, есть те, которые выдают эмбеддинги для объектов, и те, которые определяют маску объекта внутри описывающего прямоугольника. Но все они в итоге служат одной цели: найти объект, локализовать его позицию и формы как можно точнее, а также присвоить ему класс.
Без детектора в том или ином виде никак не обойтись. А вот происходящее за ним может сильно варьироваться в зависимости от целей и задач. Я покажу это на примере мебели: сначала мы посмотрим на базовый пайплайн с его вариациями, а затем поговорим о более “продвинутых” улучшениях, которые есть в нашем коммерческом решении.
Есть три шага, которые могут быть (или не быть, в зависимости от задачи) после этапа детекции (или даже вместо него) и формируют простейшую последовательность действий для подобных решений.
Шаг 1. Однажды найденное желательно не терять и отслеживать между кадрами, потому, что нужно работать с сущностями объектов, а не просто отдельными изображениями. Зная id объекта "сквозь" кадры, можно сократить объём вычислений, но, что ещё важнее, повысить точность работы при помощи агрегации результатов. Для человека такие вещи зачастую очевидны, а для алгоритмов компьютерного зрения представляют страшную проблему.
Используются для решения этой проблемы очень разные алгоритмы. Они могут быть основаны как на оптических потоках или корреляционных фильтрах (так называемые классические), так и на нейросетях. Но общая цель везде одна и проста – узнать, куда объект из текущего кадра денется на следующем.
Если говорить о конкретно нашем модуле мебели, то мы в основном используем SORT и Deep SORT базированные трекеры. В двух словах, такие алгоритмы работают не через сдвиги изображений или отслеживание конкретного объекта, а через связывание объектов на двух кадрах, например, по пересечению их прямоугольников или внешней похожести. Несмотря на то, что SORT основан на древнейших идеях, его к классике часто не относят из-за того, что применять стали позже других. По какой причине – никому не известно. Видимо, все просто на время его “потеряли”, но теперь, когда он показал себя блестяще в ряде задач и победил в соревновании трекеров MOT в 2016 году, все о нём резко вспомнили. В целом, эти алгоритмы намного понятнее, интерпретируемее, стабильнее и, если их правильно готовить, качественнее, чем другие подходы.
Шаг 2. Чтобы найденное затем распознать, его нужно загнать в специализированную сеть-энкодер и получить точные эмбеддинги. Если к этому моменту их ещё нет, потому что, возможно, мы уже отслеживаем объект и не хотим ещё раз их считать (или, наоборот, очень хотим).
Напомню, эмбеддинги – это векторы чисел, которые по сути являются математическим отображением визуального представления объекта. Эти векторы, в зависимости от метода, можно различным образом сравнивать между собой и получать меру "похожести" объектов:
Существует множество методов, как обучать подобные энкодеры. Но везде цель достигается через целевые функции. Они указывают модели, что объекты должны быть "сжаты" в N-мерное пространство так, чтобы похожие располагались в нём на более близком расстоянии друг к другу, а непохожие – дальше.
И уж коль скоро такое расстояние может быть посчитано, то пространство называется метрическим. А весь подход – метрическим обучением.
Целевых функций для метрического обучения придумано множество, поскольку основная суть подхода в них. Покажу на примере Triplet Loss, поскольку эта целевая функция очень наглядная:
Математически это выглядит так:
Формула немного упрощена для наглядности и в ней всё крайне просто:
х – это вход, изображение;
f(x) – преобразование входного изображения к вектору размерности N, т.е. к эмбеддингам;
i – индекс входа;
a – изображение-якорь, текущее изображение, от которого отталкиваемся;
p – позитивный пример изображения, близкого к якорному;
n – негативный пример изображения, далёкого от якорного.
Соответственно, уменьшая первую часть формулы (уменьшая расстояние между якорем и позитивным примером) и увеличивая расстояние во второй части (увеличивая расстояние между якорем и негативным примером), штраф от целевой функции уменьшается и таким образом мы обучаем сеть нужному нам преобразованию. При этом подходе признаки будут сжиматься в Евклидово пространство, а это значит, что расстояние между двумя точками (нашими объектами) можно взять самым простым и привычным для школьной геометрии образом, т.е. через модуль разницы их координат.
Шаг 3. Может быть так, что “в лоб” метрическое обучение не заработает и непохожие изображения будут оказываться близкими, а похожие – не особо. Помимо очевидных причин, вроде того, что данных слишком мало или сеть не тянет задачу, может возникнуть необходимость в преобразовании изображений объектов перед энкодером. Например, их может понадобиться выровнять, т.е. изменить таким образом, чтобы объекты имели максимально возможное совпадение визуальных признаков в 2D- или 3D-пространстве:
Может быть и так, что распознаванию мешают другие объекты, попавшие в описывающий прямоугольник, и без масок не обойтись:
Продравшись сквозь все эти неприятности и применив или не применив описанные выше решения, в конце концов, мы получаем хорошие и рабочие эмбеддинги каждого объекта. Теперь мы можем сравнивать этот объект с эталонами в базе:
На изображении выше представлено получение расстояний с помощью другого подхода для метрического обучения – CosFace, где сеть учат кодировать признаки на поверхность гиперсферы и меру похожести затем можно получить как косинус угла между векторами. Такие угловые метрики сейчас более популярны и считаются стабильнее, чем, например, описанный выше, хотя экспериментальные результаты в разных статьях, как обычно, не всегда сходятся. Мы тоже используем в основном такой тип метрик. Проходим по базе и находим самые близкие по эмбеддингам товары:
На примере сверху показано по одному лучшему товару, но на деле, как правило, пользователь предпочитает видеть некий топ наиболее похожих. Часто это 5 или 10 лучших совпадений. Но мы покажем всё, что есть:
Вот мы и прошли основные моменты на пути распознавания объектов в кадре на примере мебели. Но помимо этих основных пунктов, есть ещё масса нюансов, которые важно учитывать. Перечислю лишь некоторые из них:
Сильные отклонения в визуальных представлениях и\или качестве между искомым изображением и изображениями в индексе могут привести к тому, что все расстояния съедут или не будут работать вообще.
Hint: Лучше всего решать на этапе обучения, сразу объясняя модели, что так может и будет происходить, но помимо этого можно оценивать качество, можно ввести оценку неуверенности для эмбеддингов в модель. Здесь очень много путей для улучшений и этот пункт - один из ключевых моментов всего метрического обучения.В самом индексе миллионы или даже десятки миллионов товаров. Многие из них похожи на искомый, но не являются желательным ответом. При этом искать нужно моментально, а ассортимент постоянно обновляется: что-то пропадает из наличия, что-то появляется, а актуальными нужно быть всегда.
Hint: С поиском всё решаемо, например: https://arxiv.org/abs/1702.08734. А вот с остальным – исключительно инженерное искусство разработки.В задаче могут быть проблемы с контекстом. Например, шкаф может продаваться и отдельно, и в составе гарнитура. Что именно ищут – вопрос.
Качество распознавания сильно зависит от качества работы детектора и точности описывающего прямоугольника. Любая неточность – и в объект захватывается лишнее: фон или, что хуже, другой объект. Маски решают эту проблему лишь частично, зато добавляют новых.
Фильмы – это ~24 кадра в секунду и 120 - 300 тысяч кадров в сумме. А значит, что у многих объектов возникнет ситуация, когда надо получить результат не с 1 изображения, а с серии. Часто - очень большой серии. И если даже объекты отслеживать, но не агрегировать правильным образом их эмбеддинги, то можно получить противоречащие результаты.
Hint: Даже не пытайтесь усреднять все полученные для объекта векторы :) Огромная ошибка, которую очень любят совершать по неопытности. А вот грамотное взвешивание эмбеддингов может хорошо помочь.
Не обязательно все эти проблемы возникнут. Всё очень сильно зависит от задачи и конкретного случая. Какие-то сложности и вовсе не проявятся, другие окажутся критичными для такого применения.
Увы, но развитие темы выходит за рамки запланированного и разумного объема. Возможно, что в будущем я углублюсь в детали и посвящу отдельные статьи перечисленным пунктам, поскольку решений в каждом очень много и рассуждать хочется долго.
Кроме того, я не стал затрагивать другие важные вопросы промышленной системы. Безусловно, всё описанное выше работает под огромной нагрузкой и при этом должно исполняться в реальном времени. Чтобы обеспечить это, мы потрудились и с научной, и с инженерной точки зрения. Хотелось бы рассказать вам в будущем и об этом.
И, как говорил один хитрый сыщик, ещё кое-что. Эта статья – в некотором роде анонс. На момент выпуска текста, мебели ещё нет в общедоступном применении, но всё уже работает, и в скором времени эта функциональность станет доступна всем пользователям умных устройств Sber. Мы будем очень рады вашим тестам и фидбеку. Хотя, быть может, что вы читаете этот текст не из 2021, и в вашем времени Layer давно стал неотъемлемой частью просмотра кино дома? :)
Здесь я прощаюсь
Если вам хочется узнать о нас больше, то мы есть в социальных сетях, у нас есть различные видео и один большой подкаст, где я много говорю о Layer. Я собрал эти ссылки в одном месте, и вы можете посмотреть \ послушать всё это вот тут.
А ещё мы всегда ищем новые кадры! Если компьютерное зрение – ваша профессия и вы хотите стать частью команды, пишите мне в Телеграм.
P.S. Несколько благодарностей:
- Александру Коновалову - за потрясающие иллюстрации к этому посту.
- Кристине Лавренюк - за огромный вклад в мотивацию и редактуру.