Компьютерное зрение: распознавание одежды на фотографии с помощью мобильного приложения

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

    Сама идея не то что бы новая, но качественно никем не реализованная. На рынке уже несколько лет есть проект www.snapfashion.co.uk, но релевантность его поиска очень низкая, подбор происходит в основном по определению цвета изображения. Например, красное платье он сможет найти, но платье с определенным фасоном или рисунком уже нет. Аудитория этого проекта, к слову, не растет, мы это связываем с тем, что поиск определенно низкой релевантности и, по сути, ничем не отличается, если вы выберете на сайте магазина цвет при поиске по их каталогу.

    В 2013 году появился проект www.asap54.com, и здесь поиск чуть лучше. Упор стоит на цвет и некоторые небольшие опции, указываемые вручную из специального каталога (короткое платье, длинное платье, платье средней длинны). Этот проект, столкнувшись с трудностями визуального поиска, слегка завернул в сторону социальных сетей, где модники могут делиться своими «луками» в одежде, из «шазама для одежды» в «инстаграм для модников».

    Несмотря на то, что проекты в этой области существуют, определенно остается непокрытой потребность поиска по картинке, очень актуальная сегодня. И решение данной проблемы созданием мобильного приложения, как это сделали SnapFashion и Asap54, наиболее отвечает тенденциям e-commerce рынка: по различным прогнозам доля мобильных продаж в США с 11% в 2013 году может вырасти да 25-50% в 2017. Такой стремительный рост мобильной торговли предвещает и рост популярности самых разных приложений, помогающих совершать покупки. И скорее всего магазины будут сами вкладываться в разработку, продвижение подобных приложений, а также активно сотрудничать с ними.

    Проанализировав конкурентов, мы решили, что нужно попробовать самим разобраться с этой темой и запустили проект Sarafan www.getsarafan.com.
    Фирменный стиль изначально хотели сделать ярким. Проработали множество вариантов:
    image

    В итоге остановились на стиле с яркими красками.
    image

    Для старта выбрали клиент под iOS (под iPhone). Дизайн в виде красок, работает через Rest-сервис, на главном экране приложения выбор: сделать фотографию или выбрать из галереи.
    image

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

    Визуальный поиск

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

    Итак, главная проблема нашего поиска – это так называемый семантический разрыв (semantic gap). Т.е. разница между тем, какие изображения (в данном случае изображения одежды) считают похожими человек и машина. Например, человек хочет найти черную футболку с коротким рукавом:
    image
    Человек без труда скажет, что в списке ниже это второе изображение. Однако машина, скорее всего, выберет изображение 3, на котором женская футболка, но сцена имеет очень похожую конфигурацию и одинаковое цветовое распределение.
    image

    Человек ожидает, что результатом поиска будут позиции с тем же типом (футболка, майка, джисы …), приблизительно того же фасона и приблизительно с тем же цветовым распределением (цвет, текстура или рисунок). Но на практике обеспечить выполнение всех трех условий оказалось проблематично.

    Начнем с самого простого, изображение со схожим цветом. Для сравнения изображений по цвету чаще всего используют метод цветовых гистограмм. Идея метода цветовых гистограмм для сравнения изображений сводится к следующему. Все множество цветов разбивается на набор непересекающихся, полностью покрывающих его подмножеств. Для изображения формируется гистограмма, отражающая долю каждого подмножества цветов в цветовой гамме изображения. Для сравнения гистограмм вводится понятие расстояния между ними. Существует много разных методов формирования цветовых подмножеств. В нашем случае их разумно было бы формировать из нашего каталога изображений. Однако даже для такого простого сравнения требуется выполнения следующих условий:
    — Изображения в каталоге должны содержать одну только вещь на легко отделимом фоне;
    — Нам нужно эффективно различать фон и интересующую нас область одежды на фотографиях пользователя.
    На практике первое условие не выполняется никогда. О попытках решить эту проблему мы расскажем позже. Со вторым условием сравнительно проще, т.к. выделение интересующей области на изображении пользователя происходит с его активным участием. Например, существует довольно эффективный алгоритм удаления фона – GrabCut (http://en.wikipedia.org/wiki/GrabCut). Мы исходили из соображения, что интересующая нас область на изображении находится ближе к центру обведенной пользователем области, чем к ее границе и фон в данной области изображения будет относительно однородным по цвету. С использованием GrabCut и некоторых эвристик, удалось получить алгоритм, работающий корректно в большинстве случаев.

    Теперь о выделении интересующей нас области на изображениях каталога. Первое что приходит в голову – сегментировать изображение по цвету. Для этого подойдет например алгоритм watershed (http://en.wikipedia.org/wiki/Watershed_(image_processing)).
    Однако изображение красной юбки в каталоге может иметь несколько вариантов:
    image

    Если в первом и втором случае сегментировать интересующую область сравнительно легко, то в 3-м случае в мы выделим еще и пиджак. Для более сложных случаев этот метод не сработает, например:
    image

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

    Вместо этого изображение разбивается на суперпиксели (superpixel), тут стоит посмотреть в сторону алгоритмов n-cuts и turbopixel.
    image

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

    Итак, задача разметки изображений каталога свелась к поиску сочетания суперпикселей, которые соответствуют вещи данного типа. Это уже задача машинного обучения. Идея была следующая, взять множество размеченных вручную изображений, обучить на ней классификатор и классифицировать различные области сегментированного изображения. Область с максимальным откликом считать интересующей нас областью. Но тут надо снова определиться, как сравнивать изображения, т.к. простое сравнение по цвету гарантированно не сработает. Придется сравнивать форму или некий образ сцены. Как казалось на тот момент, для этих целей подойдет дескриптор gist (http://people.csail.mit.edu/torralba/code/spatialenvelope/). Дескриптор gist – это некая гистограмма распределения краев в изображении. Изображение делится на равные части сеткой какого-либо размера, в каждой ячейке считается и дискретизируется распределение краев разной ориентации и разного размера. Полученные в результате n-мерные вектора мы можем сравнивать.

    Была создана обучающая выборка, вручную было размечено множество изображений разных классов (около 10). Но, к сожалению, даже при кросс-валидации не удалось добиться точности классификации выше 50%, меняя параметры алгоритма. Частично виной тому является то, что рубашка с точки зрения распределения краев будет мало чем отличаться от куртки, частично то, что обучающая выборка была недостаточно большая (обычно gist применяется для поиска по очень большим коллекциям изображений), частично то, что для данной задачи он, возможно, вообще не применим.

    Еще один метод сравнения изображений – сравнение локальных особенностей. Его идея в следующем – выделить значимые точки на изображениях (локальные особенности), каким-либо образом описать окрестности данных точек и сравнивать количество совпадений особенностей у двух изображений. В качестве дескриптора использовали SIFT. Но сравнение локальных особенностей так же дало плохие результаты, большей частью из-за того, что данный метод предназначен для сравнения изображений одной и той же сцены, снятой с разного ракурса.

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

    Когда стало понятно, что разметить каталог у нас не получилось, мы попытались сделать классификатор для изображений пользователя, т.е. автоматически определять тип вещи которую хотел найти пользователь (футболка, джинсы и т.п.). Главная проблема – это отсутствие обучающей выборки. Изображения каталога не подходят, во-первых из-за того что они остались не размечены, а во-вторых они представлены в довольно ограниченном наборе пространственных представлений и нет гарантии что пользователь предоставит изображения в похожем представлении. Чтобы получить большой набор пространственных представлений для вещи мы снимали человека в этой вещи на видео, затем вырезали вещь и строили обучающую выборку по набору кадров. При этом вещь была контрастная и легко отделялась от фона.
    image
    К сожалению, этот подход быстро отклонили, когда стало понятно, сколько видео нужно снять и обработать, чтобы охватить все возможные фасоны одежды.

    Компьютерное зрение — это очень обширный сегмент, но нам (пока что) не удалось прийти к желаемому результату с высокорелевантным поиском. Мы не хотим сворачивать в сторону, добавляя дополнительные побочные функции, а будем биться, создавая поисковый инструмент. Мы будем рады услышать любые советы и комментарии.
    Anetika
    Компания
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 14

      0
      Давно думал о примерно таком же сервисе, но мне кажется что сейчас было бы проще и дешевле разработать класификатор одежды с формализованными правилами для людей и просто прогонять картинки через амазон Mechanical Turk.
        0
        А какое время отклика у данного сервиса? Хотелось бы классифицировать изображения в реальном времени.
          +3
          Делал исследования по этой теме в рамках PhD.

          Резюме по работе с Amazon Mechanical Turk (AMT) следующее (в общем + именно для проекта по поиску изображений одежды):
          1. Работники на AMT маркетплейсе отвечают в 10-20% случаев невпопад. Нужно выстраивать пайплайны по коррекции ошибок. Несколько вариантов: (а) голосование, (б) прайминг на правильные ответы, (с) детектирование «спаммеров» через контрольные вопросы. Есть еще много других.
          2. Несмотря на то, что работников на AMT около 400 000 (как описывается в ряде статей), активных работников (ядро/MAU) всего из 10000 — 20000 работников. В итоге latency на ответ при простейших подходах оставляет желать лучшего (20 мин — 6 часов). Задачи очень быстро сваливаются за первые 3 SERPа (search engine result page) и за них никто не берется.
          3. Предындексация всей коллекции работниками заранее тоже не пройдет, так как изображений слишком много (особено в e-commerce), поэтому такой вариант тоже не проходит.
          4. Мы разработали успешный пайплайн, который позволяет за сумму в $5 полностью отранжировать коллекцию из 1000 картинок с полным проходом и гарантиями или скажем 10000 с вероятностными оценками на уровень ошибок поиска совпадений (работники тоже ошибаются) и с откликом в 1-5 минут. Меньше сделать не получится в реальном времени. Придумали довольно простые, но интересные способы работы с краудом (а) модель резервуара, (б) модель страйка, (в) модель чекина ©.

          По задаче глобально:
          1. Классический object recognition, построенный скажем на deep learning, работает на 20 000 категорий качественно. На вход чисто эмпирически нужно по 1000 примеров на каждый класс, то есть размер сета около 1000 * 20000 = 20 000 000 составляет выборка для обучения такой «машинки» (числа из рисерч статей). Но надо учитывать 2 ограничения (а) у стартапа таких бюджетов скорее всего нет, (б) 20000 категорий это достаточно грубо — существует значительно больше типов объектов.
          2. При способе создания обучающего множество посредством множественных проекций получается датасет с сильно мультиколлинеарностью (другими словами он «сидит» в меньшей размерности и повторные изображения того же объекта не добавляют большой пользы). Нужен другой способ генерации обучающего множества, удовлетворяющей 2 ограничениям (а) экономически реализуемый, (б) с хорошей обобщающей силой.
          3. Нужно находить шаблоны и разбивать все типы одежды на классы — в подклассах задача решаемая. В общем случае, думаю, пока технологии и край науки не готовы.

          Андрей, я на FB добавил во френды. Если есть интерес, можем пообщаться.
            0
            интересное исследование!
            а вы над какой темой работали?
        0
        Сразу нужно иметь ввиду что вид объекта спереди отличается от вида сбоку. Т.е на самом деле это разные образы, и никакой алгоритм распознавания не скажет что на фотографиях спереди и сбоку один и тот же объект, потому что там разные образы.
        Если вопрос стоит как сделать распознавание объектов похожей формы но разных масштабов, то на ум приходит такой алгоритм:
        -пользователь жмет пальцем в объект, программа вычисляет средний цвет в том месте куда он нажал ( тут надо попробовать сначала с черно-белыми вариантами картинки).
        -далее на основе среднего цвета вычисляются контуры объекта ( т.е точки которые отличаются от среднего цвета с внешней стороны)
        -на основании этих точек вычисляется средняя точка, это будет собственная система координат объекта
        -затем точки, которые образуют контур получают относительные координаты, т.е например расстояние от центральной точки до самой близкой граничной принимается за 1, а остальные точки получают расстояние в этих единицах.
        -далее сохраняем эти точки в массиве так чтобы номер точки в массиве соответствовал ее углу в полярных координатах
        -в такой форме можно сравнивать объекты простым вычитанием одного массива из другого
        -если объект повернут относительно того что сохранено в памяти то надо сначала найти точку с той же относительной координатой с которой начинается объект в памяти и считать от нее.
          0
          Ну сразу в голову приходит контр-пример: одежда с рисунком. На практике будет еще куча проблем с текстурами, полосками, разным освещением и т.п.
          Нам надо сравнивать не одинаковые изображения похожих масштабов.
          Сразу нужно иметь ввиду что вид объекта спереди отличается от вида сбоку. Т.е на самом деле это разные образы, и никакой алгоритм распознавания не скажет что на фотографиях спереди и сбоку один и тот же объект, потому что там разные образы.

          Такие алгоритмы существуют, но в нашем случае все упирается в размер обучающей выборки.
          0
          интересную задачу вы себе поставили.
          это практически реконструкция 3D по одной фотографии с учетом предыдущего опыта — имхо круче чем facial reconstruction. В FR все-таки лицо представляет собой хоть и 3D но более-менее жесткую систему.
          держите нас в курсе!
            0
            Спасибо. Будем отписываться в этом блоге.
            +1
            Работал на похожем проекте. К сожалению, с детальной мат частью я не знаком, так как подключился к работе на заключительном этапе, когда требовалось отрисовать результаты распознавания с помощью шейдера. В кратце: есть некторая библиотека, которая выполняет обработку одного статичного изображения и выдает некоторые данные (выполняется только для одного кадра). Есть шейдер, который работает с этими данными но уже в динамике (т.е применительно к видеопотоку). Все это выполняется в реалтайме:
              0
              Даже сложно представить за сколько миллиардов такой сервис купили бы Google или Amazon. Другими словами, задача очень нетривиальная и на неё есть большой спрос.
                0
                Хоть кто бы накинул немного миллиардов денег, а то все сами да сами:-)
                  0
                  kickstarter
                0
                Слишком много подводных камней + не очень понятно как монетизировать данный сервис (ждать того самого момента, когда одна девушка увидит классно одетую другую девушку, и ей захочется купить точно такой-же наряд + она сможет ее качественно сфотографировать + она будет знать о вашем сервисе… sounds unrealistic....). Мне кажется, что здесь классический вариант «Мы сами придумали проблему и будем ее решать».

                Девушки (это ведь ваша ЦА) очень успешно покупают одежду в интернете и без данной технологии. Более того, подавляющее большинство из них «в теме» и могут определять марки и коллекции получше любого алгоритма.

                p.s. Девушка которая постоянно покупает в интернете, мне подсказывает, что это бред, и что для таких целей она пользуется look-book-ами.

                p.s.s. Прошу воспринимать мой пост как ценную информацию о которой стоит задуматься, а не как беспричинную критику.
                  0
                  Состав, силуэт, бренд, пол, желаемая цена и кучу всего просто невозможно узнать по фотографии.
                  Глобальная база всего на свете, с которой можно сравнивать распознанный образец, отчасти решит эту задачу, но и то не полностью.
                  На этом ролике обозначен подход при котором можно делать очень и очень релевантный поиск
                  www.youtube.com/watch?v=4AyzV9bJ3OE

                  До последнего думал что сервис digup.me это ваша же разработка. Оказалось нет.

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое