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

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

Идея

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

Меня зовут Кирилл Трусковский, я отвечаю за машинное обучение в С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. Буду благодарен вам за рекомендации.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



55 коментарів

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чим TensorFlow краще Theano?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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