- PVSM.RU - https://www.pvsm.ru -
В этой статье я хочу рассказать о том, как мы создали систему поиска похожей одежды (точнее одежды, обуви и сумок) по фотографии. То есть, выражаясь бизнес-терминами, рекомендательный сервис на основе нейронных сетей.
Как и большинство современных IT-решений, можно сравнить разработку нашей системы со сборкой конструктора Lego, когда мы берем много маленьких деталек, инструкцию и создаем из этого готовую модель. Вот такую инструкцию: какие детали взять и как их применить для того, чтобы ваша GPU смогла подбирать похожие товары по фотографии, — вы и найдете в этой статье.
Из каких деталей построена наша система:
В конце статьи будут описаны все “грабли”, на которые мы наступили во время разработки и рекомендации, как их нейтрализовать.
Задача и основной use-case системы звучит довольно просто и понятно:
Говоря проще, цель нашей системы — ответить на знаменитый вопрос: “А у вас нет такого же, только с перламутровыми пуговицами?”
Перед тем как бросаться в омут кодинга, разметки и обучения нейронных сетей, необходимо довольно четко определиться с теми категориями, которые будут внутри вашей системы, то есть те категории, которые будет детектировать нейронная сеть. Тут важно понимать, что, чем шире и детальнее список категорий, тем он является более универсальным так как большое количество узких небольших категорий типа mini-dress, midi-dress, maxi-dress всегда можно в “одно касание” объединить в одну категорию типа dress, НО НЕ наоборот. Другими словами, рубрикатор нужно хорошо продумать и составить в самом начале проекта, чтобы потом не переделывать по 3 раза одну и ту же работу. Мы составляли рубрикатор, взяв за основу несколько крупных магазинов, таких как Lamoda.ru, Amazon.com, и постарались сделать его с одной стороны максимально широким, с другой стороны максимально универсальным для того, чтобы в дальнейшем проще было связать категории детектора с категориями различных интернет магазинов (о том, как сделать эту связку я подробнее расскажу в разделе краулера и индексатора). Вот пример того, что получилось.
Пример категорий рубрикатора
В нашем каталоге на данный момент всего 205 категорий: женская одежда, мужская одежда, женская обувь, мужская обувь, сумки, одежда для новорожденных. Полная версия нашего классификатора доступна по ссылке [1].
Для того чтобы искать в дальнейшем похожие товары, нам необходимо создать обширную базу того, среди чего мы будем искать. По нашему опыту качество поиска похожих изображений напрямую зависит от размера поисковой базы, которая должна превышать как минимум 100К изображений, а лучше 1М изображений. Если вы добавите в базу 1-2 небольших интернет-магазина, то скорее всего не получите впечатляющих результатов просто потому что в 80% случаев ничего действительно похожего на искомую вещь нет в вашем каталоге.
Итак, чтобы создать большую базу изображений нужно обрабатывать каталоги различных интернет-магазинов, вот что включает в себя этот процесс:
Пример файла маппинга категорий: классификатора-категорий каталога
Для того чтобы найти что-то похожее на то, что наш глаз обнаружил на фотографии, нам необходимо это “что-то” сначала задетектировать (то есть локализовать и выделить объект). Мы прошли долгий путь по созданию детектора, начиная с обучения каскадов OpenCV, которые вообще не заработали на данной задаче, и заканчивая современной технологией детектирования и классификации R-FCN [2] и классификатора на основе нейронной сети ResNet [3].
В качестве данных, которые использовались для обучения и тестирования (так называемые обучающая и тестовая выборки), мы брали всевозможные изображения из интернета:
Разметка проводилась при помощи самописного инструмента, результатом разметки стали наборы изображений и *.seg-файлов к ним, в которых хранятся координаты объектов и метки классов для них. В среднем на каждую категорию было размечено от 100 до 200 изображений, общее число изображений по 205 классам составило 65 000.
После того, как готова обучающая и тестовая выборки, мы делали перепроверку разметки, отдавая все изображения другому оператору. Это позволило отфильтровать большое количество ошибок, которые сильно влияет на качество обучения нейронной сети, то есть детектора и классификатора. Затем мы запускаем обучение нейронной сети стандартными средствами и “снимаем” очередной снепшот нейронной сети “с пылу с жару” через несколько дней. В среднем время обучения детектора и классификатора на объеме данных 65 000 изображений на GPU порядка Titan X составляет примерно 3 дня.
Готовую нейронную сеть необходимо как-то проверить на качество, то есть оценить стала ли текущая версия сети лучше предыдущей и на сколько. Как это делали мы:
Пример таблицы-отчета по качеству детектора и классификатора
После того как мы задетектировали предметы гардероба на фотографии, запускаем механизм поиска похожих изображений, вот как он функционирует:
Нейронные сети для формирования нейросетевых векторов по форме и цвету обучаются следующим образом.
Пример разметки изображений по цвету для получения нейросетевых векторов признаков по цвету.
Интересно, что подобная технология отлично работает даже на сложных фонах, то есть когда фрагменты вещей вырезаются не четко по контуру (маской), а по прямоугольной рамке, которую определил разметчик.
Поиск похожих сделан на основе извлечения бинарных векторов признаков из нейронной сети таким образом: берётся выход предпоследнего слоя, сжимаем, нормализуем и бинаризуем. В нашей работе мы сжимали до 128-битного вектора. Можно делать немного по-другому, например как описано в статье Yahoo «Deep Learning of Binary Hash Codes for Fast Image Retrieval [5]», но суть всех алгоритмов примерно одна — похожие изображению ищутся при помощи сравнения свойств, которыми оперирует нейронная сеть внутри слоев.
Изначально в качестве технологии поиска похожих изображений мы использовали хеши или дескрипторы изображений, основанные (точнее рассчитанные) по определенным математическим алгоритмам, таким как оператор Собеля (или контурный хеш), алгоритм SIFT (или особые точки), построение гистограммы или сравнение количества углов на изображении. Эта технология работала и давала какой-то более или менее вменяемый результат, но ни в какое сравнение с технологией поиска похожих изображений на основе свойств, выделенных нейронной сетью хеши не идут. Если попробовать объяснить разницу в 2х словах, то алгоритм сравнения изображений на основе хешей — это “калькулятор”, который настроили на сравнение картинок по какой-то формуле и он непрерывно работает. А сравнение с помощью признаков из нейронной сети — это “искусственный интеллект”, обученный человеком решать определенную конкретную задачу определенным образом. Можно привести такой грубый пример: если вы будете искать хешами свитер в черно-белую полоску, то вы с большой вероятностью найдете в качестве похожих просто все черно-белые вещи. А если будете искать при помощи нейронной сети, то:
Мы создали простое и удобное WEB-JSON-API для общения нашей системы с любыми устройствами и системами, что, конечно, не является каким-либо новшеством, а скорее хорошим крепким стандартом разработки.
Для визуальной проверки результатов, а также для демонстрации системы заказчикам мы разработали простенькие интерфейсы:
Данная технология вполне готова и пригодна для использования, сейчас она функционирует у одного из наших заказчиков в интернет-магазине в качестве рекомендательного сервиса. Также недавно мы взялись за разработку подобной системы в другой отрасли (то есть работаем теперь с другими типами товаров).
Из ближайших планов: перевод сети на Mask-CNN, а также переразметка и доразметка изображений для повышения качества работы детектора и классификатора.
В заключении хочется сказать, что по нашим ощущениям подобная технология и вообще нейронные сети способны решить до 80% сложных и высокоинтеллектуальных задач, с которыми ежедневно встречается наш
Автор: Эдуард Лебедев
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/obrabotka-izobrazhenij/307431
Ссылки в тексте:
[1] по ссылке: http://likethis.me/files/Fashion_Classifier_Ru.pdf
[2] R-FCN: https://arxiv.org/pdf/1605.06409.pdf
[3] ResNet: https://arxiv.org/abs/1512.03385
[4] по ссылке: http://likethis.me/files/QualityReport_fashion205_r_0,0001thr_26.07.xlsx
[5] Deep Learning of Binary Hash Codes for Fast Image Retrieval: http://www.iis.sinica.edu.tw/~kevinlin311.tw/cvprw15.pdf
[6] http://demo.likethis.me/: http://demo.likethis.me/
[7] по ссылке: http://likethis.me/files/visualsearch-android-client.apk
[8] мозг: http://www.braintools.ru
[9] Источник: https://habr.com/ru/post/438542/?utm_source=habrahabr&utm_medium=rss&utm_campaign=438542
Нажмите здесь для печати.