newsmode
search
Меню
arrow_back Назад

Image search is now live!

auto_awesomeКраткое саммари

Юджин Ян рассказывает о запуске обратного поиска по изображениям (reverse image search) — продолжении его проекта по созданию API для классификации товаров. Сервис позволяет загрузить картинку и найти визуально похожие товары из каталога, что удобно, когда нужно отыскать предмет, название которого неизвестно (например, плюшевую игрушку, оказавшуюся Domo). Под капотом признаки изображений извлекаются предобученными нейросетями (например, VGG16 даёт матрицу из 25 088 чисел с плавающей точкой на изображение), после чего вычисляется сходство векторов. Автор описывает основные трудности: большой размер признаков, эффективный расчёт похожести и непривычная для него вёрстка интерфейса. Также он перевёл сервер datagene.io с dev-сервера Flask на uWSGI + nginx и упомянул, что начал курс Computer Vision в Georgia Tech OMS CS. Позже API было отключено ради экономии на облаке.

Поиск по изображениям теперь работает!

[ deeplearning python production 🛠 ] · чтение на 4 мин

Закончив API для классификации изображений, я задумался, нельзя ли пойти дальше. Что насчёт создания движка обратного поиска по изображениям? Можете попробовать его здесь: Image Search API. (Репозиторий на Github)

Обновление: API отключён ради экономии на облачных расходах.

Это часть серии постов о создании API для классификации товаров:

Что такое обратный поиск по изображениям?

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

Как им пользоваться?

«У моего сына есть плюшевая игрушка, которую он очень любит, но я не знаю, как она называется… Как мне найти похожие игрушки?»

До сегодняшнего дня я понятия не имел, как это называется, да и не удосужился выяснить.

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

Зачем искать название, когда можно просто искать по самому изображению?

Результаты неплохи, да? Я был удивлён, насколько это мощно. (Через этот поиск я узнал, что игрушка называется Domo.)

Обратный поиск по изображениям полезен для поиска товаров по визуальным признакам (то есть стилю, форме, цвету). Понравился определённый стиль дивана? Или пара обуви? Или куртка? Найдите это через обратный поиск по изображениям.

Честно говоря, я был поражён, что он нашёл другие диваны с такими же «вмятинами».

(Примечание: иногда вы можете обнаружить, что он не возвращает результатов или возвращает ужасные. Поскольку в каталоге всего ~200 тыс. товаров, бывают случаи, когда результатов нет вовсе или возвращённые результаты — лучшее из возможного (хоть и ужасное) с учётом изображений каталога.)

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

Как это работает?

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

С какими трудностями я столкнулся

Извлекаемые признаки могут оказаться весьма большими по размеру! Например, VGG16 возвращает numpy-матрицу из 25 088 32-битных чисел с плавающей точкой для каждого изображения. С теми изображениями, с которыми я работаю, признаки могут разрастаться до 4–7-кратного размера изображения, что ведёт к возможным проблемам масштабирования при хранении и вычислении сходства изображений. Эффективное вычисление сходства между признаками изображений (то есть векторами) оказалось непростой задачей. Я перепробовал множество мер и методов сходства и несколько реализовал с нуля на numpy, чтобы найти оптимальный баланс между скоростью и использованием памяти. И всё равно я не считаю это достаточно быстрым. Отдача изображений в HTML через приличный пользовательский интерфейс была для меня сложной задачей. Я не фронтендщик и не HTML-специалист, и мне пришлось многому научиться, чтобы интерфейс выглядел так, как сейчас, — и тут ещё много места для улучшений.

Обновления веб-сервера

Раньше datagene.io работал на сервере для разработки Flask. Хотя он работал хорошо и не падал, я хотел его улучшить, перейдя на uWSGI + nginx. Со стороны фронтенда вы, вероятно, не заметите никакой разницы. Ключевое отличие в том, что теперь он работает на нескольких процессах — одновременно может обслуживаться более одного пользователя (не то чтобы это вообще случалось, ха-ха).

P.S. Я только что начал свой первый курс в Georgia Tech OMS CS — Computer Vision. Пока всё это безумно увлекательно, и мне очень нравится изучать основы работы с изображениями. К сожалению, это также означает, что у меня может не быть времени добавлять новые функции в datagene.io и писать так часто.

Если этот материал оказался вам полезен, пожалуйста, ссылайтесь на него так:

Yan, Ziyou. (Jan 2017). Image search is now live!. eugeneyan.com. https://eugeneyan.com/writing/image-search-is-now-live/.

или

@article{yan2017image, title = {Image search is now live!}, author = {Yan, Ziyou}, journal = {eugeneyan.com}, year = {2017}, month = {Jan}, url = {https://eugeneyan.com/writing/image-search-is-now-live/} }



Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.