Подход к рекомендации похожих модных товаров.

Оглавление:

1. Бизнес-проблема

2. Отображение реальной проблемы как проблемы машинного обучения

3. Обзор набора данных

4. Исследовательский анализ данных и предварительная обработка

5. Модуль 1. Определение позы

6. Модуль 2. Обнаружение модных товаров

7. Модуль 3. Рекомендации по похожим изображениям

8. Заключение

9. Будущие работы

10. Ссылки

1. Деловая проблема:

В настоящее время влиятельные лица электронной моды регулярно публикуют изображения, и пользователи могут захотеть подражать внешнему виду своих влиятельных лиц. Как правило, пользователи заинтересованы в покупке всего внешнего вида модели. Здесь, в этой задаче, учитывая полное изображение позы модели, цель нашего метода состоит в том, чтобы рекомендовать аналогичные модные товары, соответствующие всему набору модных вещей, которые носит модель на полном изображении.

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

2. Отображение реальной проблемы как проблемы машинного обучения:

Мы можем сказать, что это сложно, потому что, в отличие от выполнения рекомендаций для одного основного предмета (по запросу), нам нужно рекомендовать аналогичные товары для каждого модного предмета, присутствующего во всем наборе модных предметов, которые носит модель. Итак, основную проблему можно разделить на следующие этапы:

Этап 1. Обнаружение изображения в полной позе

Это гарантирует, что изображение моды, загруженное пользователем, является полноценным изображением, и нам нужно будет рекомендовать аналогичные продукты для всех предметов моды, представленных на этом изображении.

Этап 2. Обнаружение модных объектов

Здесь мы обнаружим модные объекты, присутствующие на полном изображении.

Этап 3. Рекомендация похожих товаров

На этом этапе мы будем извлекать и рекомендовать аналогичные продукты из нашей базы данных, используя пространство для встраивания.

3. Обзор набора данных:

В этом задании я использовал общедоступный набор данных Street2Shop. Набор данных содержит 404 683 фотографии магазинов, собранных у 25 различных интернет-магазинов, и 20 357 фотографий улиц, что дает в общей сложности 39 479 совпадений предметов одежды между фотографиями улиц и магазинов. Каждая из уличных фотографий содержит местоположение предмета одежды в ограничивающей рамке, и у нас также есть похожее изображение магазина. Мы предпочитаем этот набор данных для решения задачи, потому что этот набор данных состоит как из ограничивающих прямоугольников, так и из похожих изображений, так что этот единственный набор данных можно использовать на всех этапах.

4. Исследовательский анализ данных и предварительная обработка

Набор данных Street2shop состоит из 20 357 изображений улиц и 404 683 соответствующих изображений магазинов. Этот набор данных содержит 11 категорий одежды, таких как сумки, ремни, платья, очки, обувь, головные уборы, леггинсы, верхняя одежда, брюки, юбки, топы.

Здесь, в этом наборе данных, у нас есть текстовый файл с информацией об идентификаторах изображений и URL-адресах изображений, а также файлы JSON, содержащие сведения о модном продукте, такие как идентификатор продукта, тип продукта и расположение ограничивающей рамки.

a) EDA для обнаружения изображения в полной позе

Поскольку набор данных предоставляет ссылки на изображения, мы сначала загружаем все изображения улиц, используя многопроцессорную обработку.

Ниже мы нарисовали распределение категорий объектов на изображениях улиц и магазинов. Из сюжета мы можем заметить, что у нас больше изображений, содержащих одежду и обувь, по сравнению с другими.

Затем мы проанализировали распределение количества товаров, представленных на уличных изображениях, и по приведенному ниже изображению мы можем сказать, что примерно 50% уличных изображений состоят из одного модного предмета.

b) EDA для обнаружения предметов одежды

Во-первых, мы реализовали обнаружение изображений в полных позах, используя предварительно обученный Posenet, и отфильтровали изображения в полных позах из изображений улиц. Теперь мы получаем только 9133 уличных изображения, которые используются при обнаружении модных объектов.

Выше я показал пример изображения, из которого мы можем видеть, что иногда один и тот же объект имеет несколько ограничивающих рамок. Потому что в этом наборе данных они дают ограничивающую рамку каждому изображению в магазине, присутствующему на уличных изображениях. Как правило, один и тот же объект может быть доступен в разных магазинах. Итак, здесь для одного и того же объекта иногда используется несколько product_id. Итак, я удалил лишние ограничивающие рамки для одного и того же объекта, используя оценку IOU.

Затем я проанализировал распределение категорий и отсутствие продуктов на изображениях в полной позе.

Из приведенных выше графиков мы можем сказать, что категории распределения такие же, как и в предыдущем случае, и при распределении количества объектов мы получили около 5000 изображений, содержащих один объект. Но, как правило, на изображениях в полный рост мы получаем более одного предмета одежды. Итак, мы проанализировали изображения в полной позе, которые поднимают один объект.

Из приведенного выше графика видно, что около 3000 изображений в полных позах содержат объекты с одним платьем. Ниже мы показали примеры изображений с полной позой, которые содержат один объект.

Здесь мы можем заметить, что изображения содержат один объект, каждый из которых плохо аннотирован. Итак, мы удалили изображение, содержащее один объект, и теперь у нас есть около 3000 предварительно обработанных изображений для задачи обнаружения объектов.

c) EDA для рекомендации аналогичных продуктов

Как было предложено в бумажке, мы решили обучить триплетную сеть рекомендации похожих товаров. Итак, используя ссылку на изображение, мы получили около 40 тысяч триплетных изображений.

Мы показали образец изображения триплета ниже.

5. Модуль 1: Определение позы

Наша проблема связана с рекомендацией аналогичных товаров для всего набора представленных модных товаров, а не аналогичных товаров для конкретного модного предмета. Во-первых, нам нужно убедиться, что изображение должно быть в полной позе. Затем мы можем обработать это изображение для обнаружения различных предметов моды. Поэтому нам нужно оценить и определить положение ключевых частей тела. Другими словами, для данного изображения человека оценка позы может отображать положение его/ее локтей, плеч, коленей, лодыжек и т. д. Это можно использовать для прогнозирования того, стоит ли человек, идет или танцует. . Для этой задачи мы использовали предварительно обученную модель Posenet, чтобы убедиться, что данное изображение является изображением с полной позой.

Что такое Posenet?

PoseNet — это модель машинного обучения, которая оценивает позу человека в режиме реального времени. PoseNet можно использовать для оценки либо одной позы, либо несколько поз. Я использовал только алгоритм оценки одной позы, потому что в соответствии с нашей задачей мы в основном используем изображения одного человека. Когда входное изображение передается ему, мы получаем смещение ключевой точкии тепловую карту ключевой точки.

Модель Posenet вернет два вектора: оценки достоверности ключевых точек (глубина 17) и смещение ключевых точек (depth17*2). Поскольку глубина равна ни одной из ключевых точек, мы получаем позицию, используя эти два вектора. Во-первых, мы можем получить индекс x, y ключевых точек на тепловой карте с наивысшим баллом для каждого канала. Затем, чтобы получить ключевые точки каждого канала, индексы x и y умножаются на выходной шаг, а затем добавляются к соответствующему вектору смещения, который находится в том же масштабе, что и исходное изображение.

keypointPositions = HeatmapPositions * outputStride + offsetVectors

Используя эти ключевые точки, мы можем предсказать, является ли изображение полной позой или нет, используя простое условное предложение if-else. Ниже мы предоставили некоторые примеры изображений в полной позе, которые мы получили из модели Posenet.

Пример вывода модели Posenet

6. Модуль 2: Обнаружение предметов моды

Далее нам нужно обнаружить различные предметы моды, присутствующие на изображении. Существует множество алгоритмов обнаружения объектов, которые мы можем использовать, например, RCNN, Faster RCNN, YOLO. Мы использовали модели на основе YOLO для обнаружения предметов моды.

Почему Yolo?

Yolo достигает высокой точности, а также может работать в режиме реального времени. Алгоритм смотрит на изображение только один раз в том смысле, что для прогнозирования требуется только один проход прямого распространения через нейронные сети.

Подробнее о YOLO читайте здесь.

Чтобы обучить пользовательскую модель обнаружения объектов YOLOV4, мы сначала загружаем все изображения в Colab. Затем клонируйте репозиторий AlexeyAB на диск и создайте файлы конфигурации обучения и тестирования, внеся следующие изменения в пользовательский файл конфигурации. Пользовательский файл конфигурации находится в каталоге darknet/cfg и называется yolov4-custom.cfg.

  • измените партию на партию = 32 для поезда и 1 для теста.
  • изменить подразделения линии на подразделения = 16 (поезд), 1 (тест)
  • установить размер сети width=608 height=608 или любое значение, кратное 32
  • изменить max_batches на (classes*2000, но не менее количества обучающих изображений и не менее 6000), т.е. max_batches=2200, если вы тренируетесь на 3 занятия
  • измените шаг строки на 80% и 90% от max_batches, т.е. шагов=4800,5400

  • измените [filters=255] на filter=(classes + 5)x3 в 3 [convolutional] перед каждым слоем [yolo], имейте в виду, что он должен только быть последним [сверточным] перед каждым из [йоло] слоев.
  • измените class=80 на ваше количество объектов в каждом из 3 [yolo]-слоев.

Итак, если классы = 1, то должны быть фильтры = 18. Если классы=2, то напишите фильтры=21.

Затем нам нужны файлы .txt для каждого изображения, и эти текстовые файлы будут хранить идентификатор класса и ограничивающую рамку для всех объектов, присутствующих в конкретном изображении. затем нам нужно создать train.txt и test.txt, в которых будут храниться пути соответствующих изображений.

Внесите изменения в make-файл, чтобы включить OPENCV и GPU.

Запустите команду make для сборки даркнета.

Загрузите предварительно обученный вес YOLOv4 Training-

Теперь обучите свой собственный детектор.

Результаты модели обнаружения модных изделий YoloV4

После запуска 8000 эпох мы получаем Mean Aсреднее P разрешение 87%. Чем выше mAP, тем лучше для обнаружения объектов. Ниже мы предоставили несколько образцов изображений для вывода, из которых видно, что модель правильно определяет все модные предметы, присутствующие на изображении. Следовательно, мы можем сказать, что модель yolov4 работает достаточно хорошо.

7. Модуль-3: Рекомендация по похожему изображению

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

Что такое тройная сеть?

Как следует из названия, триплетная сеть состоит из трех идентичных сверточных нейронных сетей (CNN) с общими весами, каждую из которых можно рассматривать как ветвь. Для его обучения требуются триплеты изображений (A, P, N) такие, что первые два (A, P) семантически подобны, а третий (N) не похож на первые два. Целью обучения сети является минимизация следующих взвешенных потерь триплетов. Как правило, триплет пытается сблизить вложения якоря (A) и положительного (P), удаляясь от отрицательного (N).

Чтобы получить вложения для вычисления схожести изображений, мы обучили триплетную сеть на основе ResNet, а также использовали взвешенную потерю триплетов, как указано в бумаге. Чтобы сформировать триплеты, первое изображение представляет собой обрезанный объект модной вещи, взятый из изображения улицы, а второе изображение принадлежит изображению магазина этого продукта. Третье изображение выбирается случайным образом и содержит изображение другого предмета одежды того же типа. Затем мы обучили триплетную сеть следующим образом.

После обучения вышеуказанной модели мы заметили, что потеря сходится медленнее и после 7–10 эпох начинает переобучать. Итак, чтобы правильно обучить модель, мы попробовали разные базовые модели, параметры и разные планировщики скорости обучения, но эти методы не сработали. Затем из анализа делаем вывод, что все триплеты не полезны для обучения. Триплеты, которые не подчиняются условию триплетов, известны как жесткие и полутвердые триплеты, и эти типы триплетов важны для правильного обучения триплетной модели. Только 30% троек относятся к этому типу. Итак, чтобы решить эту проблему, мы сначала обучили первую эпоху на полном наборе троек, а затем для других эпох мы тренируемся только с использованием жестких и полусложных троек из всего набора данных, используя вес предыдущей эпохи. После использования полужесткого метода майнинга триплетов потери сходятся быстрее и дают хорошую производительность.

Вывод:

Чтобы получить похожие продукты из базы данных, мы использовали косинусное сходство. Выше мы предоставили несколько образцов изображений рекомендуемых аналогичных продуктов. Здесь мы видим, что модель триплетов с полужестким майнингом триплетов работает достаточно хорошо.

8. Будущие работы

  1. В этой функции мы можем поэкспериментировать с сетью условного сходства, чтобы улучшить производительность триплетной сети.
  2. Мы также реализуем метод хеширования с учетом местоположения, чтобы получать похожие изображения намного быстрее.

9. Заключение

Я предоставил видео развертывания выше. Я надеюсь, что дал вам хорошее представление о проблеме и о том, как я подошел к этой проблеме. Поскольку я новичок в науке о данных и ведении блога, я ожидаю, что читатели будут немного великодушны и проигнорируют незначительные ошибки, которые я мог допустить. Не стесняйтесь оставлять комментарии, если считаете, что это может улучшить этот блог, я обязательно постараюсь внести необходимые изменения.

Подробный код вы можете найти на GitHub.

Спасибо, что прочитали!

10. Ссылки

  1. https://arxiv.org/pdf/2008.11638.pdf

2. https://www.tensorflow.org/lite/examples/pose_estimation/overview

3. https://www.analyticsvidhya.com/blog/2021/06/simplest-way-to-do-object-detection-on-custom-datasets/

4. https://becominghuman.ai/explaining-yolov4-a-one-stage-detector-cdac0826cbd7

5. https://towardsdatascience.com/image-similarity-using-triplet-loss-3744c0f67973

6. https://omoindrot.github.io/triplet-loss

7. https://www.appliedaicourse.com/

Вы также можете найти меня и связаться со мной вLinkedIn.