Небольшое интро, в котором многие себя узнают
Как часто, листая продуктовый каталог в интернет-магазине одежды, вы не находили товар нужного вам оттенка?
Наткнувшись на юбку мечты, вы перебираете в уме все имеющиеся в арсенале аксессуары и понимаете, что ничего подходящего нет. Нужно срочно искать нечто как минимум идеальное для этого образа! Но как перебирать товары вручную? Как отфильтровать их по ограниченному набору предлагаемых цветов?
А теперь представьте, что вас пригласили на свадьбу с заранее определенной палитрой желательных цветов для костюма. Согласитесь, вероятность успеха в поисках не так велика в условиях, если нужно подобрать, например, светло-пурпурный.
И вопрос работы с оттенками является важным не только при подборе гардероба.
Сфера интерьерного дизайна неразрывно связана с цветовыми решениями при согласовании элементов декора, выборе краски, обоев и отделочных материалов;
Цифровой дизайн работает с логотипами, баннерами, интерфейсами, в которых также важна колористика;
Индустрия красоты: подбор оттенков косметики, которые будут гармонировать с кожей и одеждой клиента;
Искусство: анализ цветовой палитры произведений искусства, реставрация картин, создание новых произведений с учетом цветовых гармоний;
Реклама: создание ярких и запоминающихся материалов с учетом психологии восприятия цвета;
Автомобили и мотоциклы: поиск краски для маскировки царапин или полной перекраски, чтобы цвет точно соответствовал оригиналу; выбор аксессуаров — диски, накладки, коврики и чехлы, которые соответствуют цвету транспортного средства.
С подобными трудностями выбора так или иначе сталкивался каждый из нас.
Как специалисту по Data Science мне стало интересно изучить тему распознавания, сравнения и поиска по оттенкам еще и с профессиональной точки зрения.
Очевидно, что давно пора переложить функционал по маркировке цвета товаров в интернет-магазинах на уже окрепшие плечи ИИ. Но как его научить «видеть» границы перехода одного оттенка в другой без передачи всех существующих кодировок и названий?
К слову, определить точное количество оттенков в мире невозможно из-за многообразия комбинаций длины волны и интенсивности света, индивидуальных особенностей зрения и прочих факторов. Теоретически, их количество может быть бесконечным, но в данной статье я буду оперировать значением в 16,7 млн оттенков, которые насчитывает стандарт RGB.
Основная часть, в которой вы поймете, при чем тут макароны с сыром, якоря и влюбленная жаба
Одна из важнейших задач технологий компьютерного зрения – представление изображений в виде семантически релевантных «эмбеддингов» (англ. embeddings, они же — «вектора признаков»). Эти данные используются для решения широкого круга задач, например, поиска изображений, детекция объектов на фото и видео, классификация, кластеризация.
Цвет в этом представлении — один из фундаментальных атрибутов, сложность определения которого обусловлена влиянием множества вышеупомянутых факторов.
Большинство подходов к описанию цветов основано на их названиях - лингвистических единицах и конструкциях, количество которых различается в разных языках. В большинстве работ по компьютерному зрению рассматриваются 11 основных терминов английского языка: черный, синий, коричневый, серый, зеленый, оранжевый, розовый, фиолетовый, красный, белый и желтый.
Однако, помимо привычных обозначений в жизни вы можете встретить (возможно, чуть реже) и такие: «лягушка в обмороке», «цвет пергидрольной блондинки», «макароны и сыр» и даже «цвет Хабрахабра»:
Такое многообразие подчеркивает сложность проблемы. Очевидно, что для управления большим количеством представителей RGB необходимо отказаться от стандартной задачи классификации на основе машинного обучения, которая подразумевает использование текстовых или категориальных лейблов на этапе обучения модели.
Ныряем вглубь Deep Learning
На этом этапе я введу понятие «Сверточная нейронная сеть для создания векторных представлений» или Embedding Convolutional Neural Network, проще — Embedding CNN.
Понятнее будет описать ее в сравнении с Classification CNN («классифицирующая сверточная нейронная сеть»), традиционно используемой для решения задач классификации изображений на основе на основе глубокого обучения (Deep Learning).
Classification CNN предназначена для задач классификации, где цель — определить, к какому классу относится входной объект. ⮚ В выходном слое такой сети обычно используется softmax или sigmoid функция, которая преобразует выходные значения в вероятности принадлежности к каждому классу. | Embedding CNN используется для создания векторных представлений (эмбеддингов) входных данных, которые сохраняют семантическую близость между объектами. ⮚ Вместо того, чтобы прямо предсказывать класс, Embedding CNN обучается сохранять структуру данных в низкоразмерном пространстве эмбеддингов; ⮚ Обычно не использует функцию активации в выходном слое. |
При проектировании архитектуры своей Embedding CNN я решила использовать Triplet Loss Architecture («Архитектура нейронной сети с триплетной функцией потерь»), на обучение в которую передаются наборы из трех объектов (триплеты):
● anchor («якорь») – якорное изображение, относительно которого производится сравнение;
● positive («позитивное представление») – изображение, которое должно быть распознано как похожее;
● negative («негативное представление») – изображение, которое должно быть распознано как непохожее.
Глобальная цель обучения модели состоит в том, чтобы научить её извлекать признаки из данных таким образом, чтобы схожие объекты были приближены друг к другу в пространстве признаков, а несхожие объекты — удалены друг от друга.
Определяющий компонент этой архитектуры — «Триплетная функция потерь» (Triplet Loss). Она минимизирует разницу между расстоянием у похожих объектов и расстоянием у разных объектов, прибавляя заданное пороговое значение(margin).
В процессе обучения происходит её минимизация, что способствует улучшению способности модели определять эмбеддинги. Такая архитектура является видом Distance-Based Networks (сетей, основанных на измерении расстояний) и решает задачи Distance Metric Learning (обучения метрикам расстояния).
Триплетные архитектуры активно используются в системах распознавания лиц, когда необходимо не только классифицировать лицо, но и сохранить сходство между разными фотографиями одного человека, учитывая различия в возможных атрибутах, таких как возраст, освещение, выражение лица и т.д.
После выбора архитектуры нейросети, написания слоев и встраивания триплетной функции потерь (в данном случае оказалось лучшим решением использовать подвид semi-hard triplet loss), я подошла к этапу компиляции и обучения модели. Возник вопрос: на чем и как ее обучить?
Вернемся к исходной задаче: у нас есть интернет-магазин с коллекцией изображений одежды, и мы хотим подобрать вещи идентичных или очень близких цветов. У нас есть датасет — каталог товаров. Что использовать в качестве позитивных, негативных и якорных изображений, если наша цель — различие оттенков, а не категорий одежды? Где взять основополагающие якоря?
Будем генерировать их сами!
Если извлечь заданное количество доминирующих цветов на фото, рассчитать процент их пиксельного присутствия на изображении, применив метод кластеризации K-means, можно сгенерировать цветное изображение, состоящее из пикселей идентичных цветов и сохраняющее пропорции распределения. Оно будет в полной мере отображать уникальный набор цветов и оттенков для каждого изображения, выступающего как positive в обучающем триплете. В качестве negative я подтягивала рандомно извлеченную картинку из всего датасета.
Вот как выглядят якоря на практике после реализации механизма:
Итак, модель была успешно запущена на обучение.
Часть, в которой мы увидим работу нашего AI фэшн-стилиста-колориста
После обучения модели осталось реализовать механизм подбора похожих изображений с использованием метода k ближайших соседей (k-Nearest Neighbors algorithm, k-NN). Для этого мы будем вычислять евклидово расстояние (Euclidean distance) между векторами признаков, которые получим, пропустив пул изображений каталога товаров через модель.
Ниже представлена визуализация проекции эмбеддингов датасета в многомерном пространстве скрытых слоев модели:
Метод kNN сравнивает расстояния между эмбеддингами в векторном пространстве и выдает заданное количество k наиболее похожих (близких) изображений.
Вот что у меня получилось после реализации механизма. Результаты поиска отсортированы в порядке убывания метрики схожести:
Модель на этапе обучения «видела» только одежду. Будет ли она справляться с подбором товаров из других категорий?
Да, и еще как. Нейросеть научилась различать именно цветовую палитру, не привязываясь к объектам на обучающей выборке.
Прогоним через модель ту часть датасета, в котором находятся аксессуары, получим их эмбеддинги и произведем тот же способ подбора похожих для выбранного товара, сравнивая уже с пулом эмбеддингов аксессуаров. Вот что получаем:
А теперь отойдем от ограничений палитры цветов в каталоге товаров и попробуем выбрать любой желаемый оттенок из палитры RGB. Например, возьмем ранее упомянутый «цвет Хабрахабра» (RGB: 120,162,183) и подберем для него одежду и аксессуары. Создадим изображение, полностью окрашенное в этот цвет:
Затем пропустим его через триплетную модель для извлечения эмбеддингов, применим знакомый механизм подбора похожих изображений и получим следующий результат:
Качество такого подбора ограничено лишь количеством товаров в магазине и их цветовым разнообразием.
Цель достигнута: триплетная модель способна различать оттенки без их текстового описания. Уникальность этого подхода заключается в том, что для её обучения не потребовалось категоризировать и размечать каждое изображение индивидуально.
Так, погружение в глубокое обучение позволило решить задачу поиска идеального сочетания вещей, а я вместе с тем поняла, что быть шопоголиком-Data Scientist-ом даже полезно: в попытках решить задачу подбора идеального образа можно приобрести ценный опыт работы с нейросетями и научиться «общаться» с ними без слов.
Автор статьи: Елизавета Курочкина, Data Scientist в компании Neoflex