DOU Проектор: Cluise — как мы с помощью machine learning создаем мобильного стилиста

От редакции:
В рубрике DOU Проектор все желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам есть о чем рассказать — приглашаем поучаствовать. Если нет — возможно, серия вдохновит на создание собственного made in Ukraine продукта. Вопросы и заявки на участие присылайте на editors@dou.ua.

Идея

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

Меня зовут Кирилл Трусковский, я отвечаю за машинное обучение в Сluise — проекте, который создает мобильное приложение, помогающее юзерам комбинировать одежду из своего гардероба и покупать вещи, которые им действительно нужны.

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

Реализация

Начнем с системы распознавания. Для нее мы используем Convolutional neural networks (CNN), как нельзя лучше зарекомендовавшие себя в этой области за последние годы. Предложил такой подход и реализовал первые результаты Тарас Середа. Сейчас Cluise классифицирует вещи по 54 базовым классам одежды. Для обучения CNN нужен датасет с размеченными классами (одна фотография — один класс). Количество вещей, которые загрузили наши пользователи, исчисляется миллионами, потому отобрать данные для обучения было не сложно. Сложно было заставить QA руками задать лейблы для обучающего датасета :)

Всего наша размеченная выборка содержит 150 000 фотографий одежды, из которых 120 000 мы используем как обучающую, приблизительно по 2000 изображения для каждого из класса, и 30 000 для валидации и тестирования.

Далее мы построили архитектуру CNN, которая состояла из последовательных слоев (convolutional layer — activation layer — pooling layer), и заканчивалась тремя fully connected layer и softmax на выходе. В итоге, наша сеть содержала 23 последовательных уровня. Во время обучения мы используем early stopping и делаем снепшот модели каждые 10 000 итераций. Алгоритм обучения — SGD. Как функцию ошибки мы использовали Cross entropy. С переобучением мы боролись, включая в нашу архитектуру dropout layer и применяя data augmentation.

То есть наша текущая версия модели основана на стандартных state of the art подходах к CNN. Время обучения занимает приблизительно 2-3 дня, после чего функция ошибки выходит на плато и дальше не меняется. Мы постоянно экспериментируем с архитектурой и пробуем новые модели и подходы, которые появляются почти каждый день. В данный момент мы строим convolutional variational autoencoder для того, чтобы получить наиболее информативное численное представление фотографии одежды.

Система рекомендаций. Недавно мы выпустили новую версию приложения с системой рекомендаций для магазина. До запуска у нас не было никаких рейтингов или отзывов о товаре, но был гардероб пользователя, то есть подходящим решением для нас была content based recommender. То есть, основываясь на том, что уже есть у пользователя и что ему нравится, мы предлагаем ему похожие вещи для покупки и для создаваемых нами образов. В первой версии мы используем текстовое описание вещей, формируем наиболее предпочтительные описание из пользовательского контента и с помощью алгоритма tf-idf находим наиболее подходящие предложения для гардероба, в магазин и в образы, которые пользователь может составить с уже существующими у него вещами.

На эту идею нас вдохновил курс recommender-systems на Coursera, мы даже используем похожее ПО. С появлением рейтингов мы планируем подключить более сложные алгоритмы для рекомендательных систем. Также в будущем подключим к рекомендации CNN, так как c их помощью можно получить не только классификацию, но и очень информативное численное представление изображения для ранжирования результатов, выданных алгоритмом tf-idf.

Стек технологий:
— C++, cuda и Python — сама модель и обучение;
— AWS GPU instance — как железо для обучения;
— Python (Flask) — для использования в продакшене системы распознавания и рекомендаций;
— Elasticsearch — для поиска и работы tf-idf;
— MongoDB — для хранения данных;
— Docker — для деплоя.

Результаты

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

До недавнего времени мы были сконцентрированы на разработке и уделяли мало внимания продвижению продукта, но в нашем приложении уже сформировалось сообщество пользователей из Европы и Америки, которые регулярно используют функцию Dress me. О Cluise написали Washington Post, TheStar и другие мировые издания, о нем рассказали в эфире популярного американского телешоу The Rachael Ray. На днях нас включили в список 10 лучших стартапов Украины, мы заняли второе место в конкурсе UVCA challenge.

Мы продолжаем работать над улучшением рекомендательной системы с учетом первых отзывов и работаем над расширением функций приложения. Ищем в команду ML Engineer, Support Manager, QA. Буду благодарен вам за рекомендации.

LinkedIn

55 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Почему украинский стартап Cluise закрыл свое приложение по подбору одежды
ain.ua/...​7/08/14/chto-tam-s-cluise

Не зрозуміло, Cluise це український чи американський стартап?

Кирилл, крутое приложение сделали) Спасибо ) Буду юзать)

Дякую за статтю: крута ідея, гарна реалізація, чудово написано. Можливо варто було б детальніше описати стек технолоій (які використовуєте C++/Python-фреймворки, pandas, scikit-learn, etc?). Успіхів вам!

Очень интересная статья и проект. Удачи вам в развитии!)
Используете ли вы методологию TDD при разработке?
Если у вас есть юнит тесты, то как мокаются данные по изображениям?
Если рассматривать тривиальные задачи то моковые данные можно представить в виде любых типов (строки, обьекты и тд.), как в этом случае поступаете вы когда нужно протестировать логику распознавания какого то образа?

Спасибо! Мы покрываем весь код юнит и integration тестами. Они тестируют базовый функционал, то что сеть работает и отдает ответ в нужном формате. Есть небольшой сет реальных картинок для integration тестов. Тестирование логики распознавания у нас реализуется на этапе обучения сети и не входит в integration и unit тесты смого проекта.

Воу, воу, вы делаете Machine Learning на GPGPU. Не думал, что у нас кто-то таким занимается. Круто.

Молодці!
Таке питання. Ви класифікуєте речі по одній на фото чи й на звичайному фото людини можете розпізнати, у що вона одягнена (тобто скільки на ній речей і які вони)?

По одній речі на фото

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

А почему бы не грабнуть фото вместе с лейблами с какого-нибудь 6pm.com или другого магазина? Если конечно пользователи реально шлют фото в таком же виде как на скриншотах.

Юзеру не всегда будет удобно делать фото в высоком качестве, поэтому мы распознаем в любом качестве.

Попробовала приложуху по назначению :). Предметы моего гардероба распознаёт! Давно хотела цифровую версию моего имущества. Надо набить больше базу моих вещичек и попробовать подбор с учетом погоды.
Из пожеланий — на перспективу было бы хорошо расширить фильтр фич одёжек.
Не очень понятно по какому принципу идет выбор рекомендации что одеть сегодня, ИМХО, было бы хорошо выбрать стиль одежды — кежуал, спортивный, офисный, «парадный» и т.д.
А базу магазинов будете расширять?

Итого — от меня комплимент, мне понравилось, app беру в пользование. Попутного ветра вашей команде и дальнейшего развития.

Спасибо за отзыв! Мы как раз сейчас работаем над моделью для стилей)) База магазинов, конечно будет расширяться.

Здається в статті помилка tf-idf — не алгоритм.

Вообще да, тут имеется в виду как алгоритм, который выдает релевантные документы используя как меру схожести tf-idf. Спасибо за исправление.

Читал о вас на ain.ua еще полгода назад. Молодцы!

Для нашего постсовка это очень круто, хоть ещё и есть чего допилить.
То что вам приходится всё доучивать и экспериментировать на коленке — меня совсем не удивляет. С подобными задачами, на местных, около-русскоязычных просторах, почти всегда так получается: научной базы и кадров почти нет.

Coursera — это конечно хорошо, но реальные модели с 97% эффективности и более весёлым функционалом куда сложнее и вырвиглазнее.

Было бы неплохо ещё перед CNN поставить RBM и возможно какие-то сложенные автоэнкодеры для фильтрации и уменьшения разрешения входных данных в cеть — уменьшило бы размер конвуляционной (или деконвуляционной :p ) сети и обучающей выборки в целом, эффективность конечно бы не сильно поменялась, но RBM позволил бы распознавать скрытые признаки и это не плохо бы сработало для наихудшего случая, да и вероятность переобучения была бы довольно низкой. Да и там можно разложить всё по каналах и избавится от конвуляционки...

Ну, типа так:
people.idsia.ch/...uergen/icann2011stack.pdf
www.iro.umontreal.ca/...g_autoencoders_tr1316.pdf
hal.inria.fr/hal-01256422v1/document

Это довольно расточительные методы, которые лучше и эффективнее реализовывать на ПЛИСках, иначе нужно лезть в GPGPU дебри...

Стоит рассмотреть вариант бустинга деревьев принятия решений как менее ресурсоёмкий, я понимаю что градиентные спуски — это классика, но ваять их с CNN’ом не совсем корректно. Тем более вы смогли бы избавиться от GPGPU зависимости и снизить стоимость хостинга в целом.

Я раньше довольно успешно использовал xgboost для подобных целей
github.com/dmlc/xgboost

Обычно, оно у людей выглядело вот так
RBM (DBN) -> Denoising Autoencoders -> GBDT (gradient boosted descion tree)
и естественно разрешение и глубина сети там была гораааздо меньше ванильного CNN’а, как и размер обучающей выборки. Ну это всё ложится спокойно на Apache Spark / Flink / DataFlow (cloud.google.com/dataflow) без GPGPU геморроя, и с существенно меньшими ценниками на хостинг.

Пробуйте описать это всё на tensorflow — сэкономите кучу времени и нервов при поддержке решения.

Theano медленно и уверенно отмирает, впрочем как и всякие Torch’и и Neon’ы ...

p.s. гугол нынче люто открещивается от классических Deep Learning методов как излишне ресусроёмких, по их опыту могу сказать что чаще используются всякие Марковские модели. Мне даже можно звякнуть в скайп void.nugget и потрындеть, если будет желание.

Чим TensorFlow краще Theano?

Тим що в нього є підтримка Google та IBM з відповідним залізом і кастомними ASIC’ами та FPGA.
Про те яку роль в цьому всьому відіграє Intel історія замовчує, можу сказать лишень що важливу.

Тобто, коли подібні речі набувають великих обертів та коли їх треба масштабувать як горизонтально, так і вертикально — починаються веселощі.

Перший реліз дістрібютед версії TensorFlow був місяць тому. По моєму на великих обертах його ще ніхто не юзав? В межах одного інстанса він сильно тормознутий, покищо. Крім того вся ідея TensorFlow успішно запозичена в Theano, яке існує давно. Також екосистемах Theano сильно більша — майже будьяку реалізацію основних сіток гарантовано можна знайти на Гітхаб, про TensorFlow в цьому плані я мовчу.

Можете сидіть у своїй коробці далі.

Під всякими Марківськими моделями Ви розумієте Графічні моделі?

Під Марківськими моделями я маю на увазі (а не розумію...) моделі побудовані на основі ланцюгів Маркова.

Здається, тут якогось чат-бота тестують... А я повівся))

Не бачу сенсу чому я маю тут пояснювати які є похідні Марківські моделі, та як їх використовувати для розпізнавання образів... беріть, гугліть.

я понимаю что градиентные спуски — это классика, но ваять их с CNN’ом не совсем корректно.
В чому конкретно полягає некоректність? Було б класно побачити лінк на статтю чи аргументацію

Стосовно вдімирання Neon — не впевнений. Ну хоча б тому, що не можуть відмирати фреймворки які в топі бенчмарків :) github.com/...oumith/convnet-benchmarks

Не бачу сенсу тут розпинатись та пояснювати чому описанна в статті модель має мало спільного з класичною конвуляційною мережею...

Бенчмарки хлопчиків з університетів не мають ніякого відношення до проектів трошки великих контор і відповідних стартапів.

Опять таки пруфы можно на источники, из которых Вы черпали информацию о проектах больших контор?

Если вы не знаете что такое три магические буквы NDA — это не мои проблемы.
Погуглить религия не позволяет ?

Т.е. Вы утверждаете, что работаете на грандов айтишной индустрии, обладаете обширной экспертизой, но детали реализации датафлоу «RBM -> Denoising Autoencoders -> GBDT» Вам не позволяет NDA?

Уже пожалел что вообще что-то тут писал...
Желаю вам удачного дня.

Всё ясно.

В статье, как раз, описана самая классическая конволюционная сеть. Стохастический градиентный спуск (как семейство алгоритмов, с инерцией, адаптивным лернинг рейт и т.п) почти всегда юзают с CNN, в чем некорректность?

Есть довольно много статей где описывают использование нескольких разных видов сетей и алгоритмов совместно, вот в случае с банальным RBM -> CNN -> SVM там используется частенько мультисэмплирование, которое не очень хорошо дружит с градиентными спусками и люди «наизобретали» других методов. Если добавить сюда побустяные деревья принятия решений, то обучение подобного превращается в довольно нетривиальную задачу.

RBM (DBN) -> Denoising Autoencoders -> GBDT (gradient boosted descion tree)
WTF?!

Пруфы можно на источники, где хотя бы приблизительно описано как это «выглядело у людей»?

Нет ни малейшего желания кому-то что-то, тем более Вам, тут доказывать.

Зачем доказывать? Просто немного прояснить то, что Вы написали.

Вы сами попросили у меня «пруфов» а не спросили конкретно что не понятно.
«WTF?!» собственно не очень содержательно — не находите ?

Лично мне процитированный датафлоу не то чтобы непонятен, но кажется абсолютно бессмысленным. Отсюда и реплика. Если Вы или кто-либо ещё из топика сможет объяснить, в чём суть предложенной методологии в контексте распознавания образов и рекомендательных систем, что подаётся на входы, что ожидается на выходах каждого узла и какой от этого профит, то я буду крайне благодарен. Крайне желательно не общими словами, а с приведением конкретных ссылок на научные публикации или же статьи о конкретных реализациях у «людей». Спасибо.

После всего вышесказанного реально нет ни малейшего желания.
Можно было бы и проявить хоть грамм уважения, и не вести себя как «какой-то хрен с горы пришёл — жить нас учит».

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

Желаю Вам удачного дня.

Згадана вами публікація розповідає про кейс Спарс данних, що для зображень не завжди підходить. Саме тому там перед Автоенкодером вставляються RBM, для зображень це ж очевидно не обовязково.

Если чуть не поленится и погуглить — можно найти довольно много других статей где RBM используется как входящий слой для CNN для распознавания сокрытых образов и зависимостей, можно даже найти статьи где эт всё используется для кластеризации признаков в наборах изображений...

Theano медленно и уверенно отмирает, впрочем как и всякие Torch’и и Neon’ы ...
с этим совсем не согласен.

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

«Отмирает» в плане качества поддержки и популярности в новых проектах которые хоть как-то имеют отношение к коллаборативной фильтрации и рекомендательным системам. Там если вспомнить про фейсбук с ихней apache giraph’ной эпопеей — вообще весело ... Так что тут дело практики, а не религии.

В больших объёмах оно совсем по другому выглядит...

Вот, честно, кроме «Спасибо» больше ничего не хотел услышать.

Вот, честно, кроме «Спасибо» больше ничего не хотел услышать.
Этой фразой можно заменить все ваши комментарии написанные в качестве ответа кому-либо в этом топике. ))

Я не привык игнорировать людей, хотя бы из-за безусловного уважения, хотя тут аудитория ведёт себя так, будто его ещё нужно заслужить.

Який фреймворк для глибокого навчання використовуєте?

Прототипи будуємо за допомогою caffe та lasagne (theano)

Keras не пробовали?
Мне он показался самым удобным и целостным из текущего зоопарка либ (в качестве бек-енда там есть и Theano и Tensorflow)

Да Keras удобный. Пробовали его с Theano как бэкендом, но lasagne больше понравилась, тут уже кому с чем удобнее

Интересный продукт, молодцы!

Хватает вам 150000 изображений для обучения?

Приведите пример одного из 54 классов одежды? Не совсем понятно, как вы используете TL-IDR для рекомендаций, если описание вещи — это один из 54 классов. Или после классификации вы делаете дополнительный анализ цвета, текстуры?

На AWS используете один инстанс? Сколько стоит одно обучение? Где берёте деньги? :)

Как построен процесс разработки, эксперименты?

Привет! Спасибо
С 150000 есть некоторое переобучение, данных пока действительно мало, но самый распространенные вещи которые к нам загружают мы распознаем нормально.
Из классов одежды — например джинсовая куртка.
У каждой вещи есть много деталей, кроме ее класса, например цвет и т.д. все их сравнивает TF-IDF.
Процесс разработки scrum, только с большим уклоном на рисерч, если есть какая то идея или появились новые модели, команда может делать прототип и оценивать результаты.

Подписаться на комментарии