Image search is now live!
Юджин Ян рассказывает о запуске обратного поиска по изображениям (reverse image search) — продолжении его проекта по созданию API для классификации товаров. Сервис позволяет загрузить картинку и найти визуально похожие товары из каталога, что удобно, когда нужно отыскать предмет, название которого неизвестно (например, плюшевую игрушку, оказавшуюся Domo). Под капотом признаки изображений извлекаются предобученными нейросетями (например, VGG16 даёт матрицу из 25 088 чисел с плавающей точкой на изображение), после чего вычисляется сходство векторов. Автор описывает основные трудности: большой размер признаков, эффективный расчёт похожести и непривычная для него вёрстка интерфейса. Также он перевёл сервер datagene.io с dev-сервера Flask на uWSGI + nginx и упомянул, что начал курс Computer Vision в Georgia Tech OMS CS. Позже API было отключено ради экономии на облаке.
Image search is now live!
Поиск по изображениям теперь работает!
[ deeplearning python production 🛠 ] · чтение на 4 мин
After finishing the image classification API, I wondered if I could go further. How about building a reverse image search engine? You can try it out here: Image Search API. (Github repositiory)
Закончив API для классификации изображений, я задумался, нельзя ли пойти дальше. Что насчёт создания движка обратного поиска по изображениям? Можете попробовать его здесь: Image Search API. (Репозиторий на Github)
Update: API discontinued to save on cloud cost.
Обновление: API отключён ради экономии на облачных расходах.
This is part of a series of posts on building a product classification API:
Это часть серии постов о создании API для классификации товаров:
Сбор и форматирование данных (часть 1) Очистка и подготовка данных (часть 2) Разработка API (часть 3) Демо классификации изображений Демо поиска по изображениям
What is reverse image search?
Что такое обратный поиск по изображениям?
In simple terms, given an image, reverse image search finds other similar images—this would be helpful in searching for similar looking products.
Проще говоря, по заданному изображению обратный поиск находит другие похожие изображения — это полезно при поиске визуально похожих товаров.
How do I use it?
Как им пользоваться?
“My son has this plushie he really likes, but I don’t know what the name is… How can I find similar plushies?”
«У моего сына есть плюшевая игрушка, которую он очень любит, но я не знаю, как она называется… Как мне найти похожие игрушки?»
Till today, I have no idea what this is called, nor did I bother to look it up.
До сегодняшнего дня я понятия не имел, как это называется, да и не удосужился выяснить.
Simply browse and upload an image, select a category (optional, defaults to all categories), and search for similar products. Similar to image classification, this works best with product images with a white background, as that’s what the catalog images look like.
Просто выберите и загрузите изображение, укажите категорию (необязательно, по умолчанию — все категории) и ищите похожие товары. Как и в случае с классификацией изображений, лучше всего это работает с изображениями товаров на белом фоне, поскольку именно так выглядят изображения в каталоге.
Why look up the name when you can just search via the image?
Зачем искать название, когда можно просто искать по самому изображению?
The results are not bad huh? I was surprised how powerful it was. (I found out that it’s called a Domo through this search).
Результаты неплохи, да? Я был удивлён, насколько это мощно. (Через этот поиск я узнал, что игрушка называется Domo.)
Reverse image search is useful for finding products based on visual features (i.e., style, shape, colour). Have a certain sofa style you like? Or a pair of shoes? Or a jacket? Search for it via reverse image search.
Обратный поиск по изображениям полезен для поиска товаров по визуальным признакам (то есть стилю, форме, цвету). Понравился определённый стиль дивана? Или пара обуви? Или куртка? Найдите это через обратный поиск по изображениям.
Frankly, I was amazed it found more sofas with those "dimples".
Честно говоря, я был поражён, что он нашёл другие диваны с такими же «вмятинами».
(Note: You may find that it sometimes returns no/terrible results. Given the catalog only has ~200k products, there are instances where there are no results, or the results returned are the best (though terrible), given the catalog images)
(Примечание: иногда вы можете обнаружить, что он не возвращает результатов или возвращает ужасные. Поскольку в каталоге всего ~200 тыс. товаров, бывают случаи, когда результатов нет вовсе или возвращённые результаты — лучшее из возможного (хоть и ужасное) с учётом изображений каталога.)
For products where “how-it-looks” is the key search criteria, reverse image search provides great user experience, making it easy for users to quickly find what they want. If searching for products based on features not reflected in images (e.g., memory size, battery life, etc), regular search would work better.
Для товаров, где «как это выглядит» является ключевым критерием поиска, обратный поиск по изображениям обеспечивает отличный пользовательский опыт, позволяя пользователям быстро находить желаемое. Если же искать товары по признакам, не отражённым на изображениях (например, объём памяти, время работы от батареи и т. д.), лучше подойдёт обычный поиск.
How does it work?
Как это работает?
Извлекаем признаки из изображений товаров с помощью (предобученных) нейросетей. По новому изображению извлекаем признаки и вычисляем сходство изображения с существующими. Показываем изображения, наиболее похожие на новое, вплоть до некоторого порога (иногда в нашем каталоге просто нет похожих изображений).
Challenges faced
С какими трудностями я столкнулся
Извлекаемые признаки могут оказаться весьма большими по размеру! Например, VGG16 возвращает numpy-матрицу из 25 088 32-битных чисел с плавающей точкой для каждого изображения. С теми изображениями, с которыми я работаю, признаки могут разрастаться до 4–7-кратного размера изображения, что ведёт к возможным проблемам масштабирования при хранении и вычислении сходства изображений. Эффективное вычисление сходства между признаками изображений (то есть векторами) оказалось непростой задачей. Я перепробовал множество мер и методов сходства и несколько реализовал с нуля на numpy, чтобы найти оптимальный баланс между скоростью и использованием памяти. И всё равно я не считаю это достаточно быстрым. Отдача изображений в HTML через приличный пользовательский интерфейс была для меня сложной задачей. Я не фронтендщик и не HTML-специалист, и мне пришлось многому научиться, чтобы интерфейс выглядел так, как сейчас, — и тут ещё много места для улучшений.
Web Server updates
Обновления веб-сервера
Previously, datagene.io was running on Flask’s development server. While it worked well and didn’t fail, I wanted to improve on it by using uWSGI + nginx. From the front-end, you probably won’t notice any difference. The key difference is that it runs on multiple processes now—more than one user can be served simultaneously (not that it happens anyway haha).
Раньше datagene.io работал на сервере для разработки Flask. Хотя он работал хорошо и не падал, я хотел его улучшить, перейдя на uWSGI + nginx. Со стороны фронтенда вы, вероятно, не заметите никакой разницы. Ключевое отличие в том, что теперь он работает на нескольких процессах — одновременно может обслуживаться более одного пользователя (не то чтобы это вообще случалось, ха-ха).
P.S. I’ve just started my first course in the Georgia Tech OMS CS—Computer Vision. It’s been a blast so far and I really enjoy learning about the fundamentals of working with images. Unfortunately, it also means that I may not have time to add new features to datagene.io and write as often.
P.S. Я только что начал свой первый курс в Georgia Tech OMS CS — Computer Vision. Пока всё это безумно увлекательно, и мне очень нравится изучать основы работы с изображениями. К сожалению, это также означает, что у меня может не быть времени добавлять новые функции в datagene.io и писать так часто.
If you found this useful, please cite this write-up as:
Если этот материал оказался вам полезен, пожалуйста, ссылайтесь на него так:
Yan, Ziyou. (Jan 2017). Image search is now live!. eugeneyan.com. https://eugeneyan.com/writing/image-search-is-now-live/.
Yan, Ziyou. (Jan 2017). Image search is now live!. eugeneyan.com. https://eugeneyan.com/writing/image-search-is-now-live/.
or
или
@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/}
}
@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/} }
Join 11,800+ readers getting updates on machine learning, RecSys, LLMs, and engineering.
Присоединяйтесь к 11 800+ читателям, получающим обновления о машинном обучении, RecSys, LLM и инженерии.