В центре внимания сообщества

Поиск татуировок с текстом: проект с открытым исходным кодом, созданный с Джиной

Кевин Цендер

Большое спасибо члену нашего сообщества Кевину Цендеру за его удивительный проект по поиску татуировок и его рецензию ниже! Подробнее читайте в его блоге The Snakepit.



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

В этом руководстве будет создана поисковая система с «глубоким обучением», которая извлекает изображения на основе коротких текстовых запросов. Мы будем искать по смыслу, а не только по необработанным ключевым словам. Например, изображения татуировок, которые содержат «концепцию» текстового запроса, например «братья марио». Все это без какой-либо ручной маркировки наборов данных или обучения пользовательских объектов. Войдите на сцену справа, Джина и CLIP.

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

Традиционный способ поиска

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

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

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

Это действительно ограничивает.

Новый способ поиска

Но что, если бы вы могли получить изображения, содержащие кошек, БЕЗ маркировки их как изображения кошек и БЕЗ обучения какого-либо пользовательского детектора объектов для кошек?

Как было бы здорово, если бы мы могли представлять и изображения, и текст запроса в одном и том же пространстве для встраивания, позволяя сравнивать изображения и текстовые данные «яблоки с яблоками», даже если изображения и текст — это совершенно разные типы данных?

Среди миллиона других возможностей Jina позволяет это сделать.

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

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

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

Для того чтобы это стало возможным, необходимы две важные части: 1) поток индексации и 2) поток запросов.

  1. Поток индексирования: для разбивки и извлечения богатого смысла из набора данных с использованием моделей нейронных сетей.
  2. Поток запроса/поиска: для получения данных от пользователя и поиска соответствующих результатов.

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

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

Часть 1 из 2: определение процесса индексации

В первом разделе мы узнали, что всем приложениям Jina требуются два критически важных компонента: 1) индексированные данные и 2) способ поиска наших индексированных данных.

Индексирование и поиск. Арахисовое масло и желе, детка.

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

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

Чтобы реализовать этот рабочий процесс в Jina, нам нужно составить наш первый `Flow`.

Потоки подобны «великим кукловодам» экосистемы Jina. Потоки — это то, что управляет нашими исполнителями, которые молниеносно выполняют тяжелые операции над массивами документов.

Мы назовем этот первый поток потоком индексации, и он отвечает за кодирование и индексирование изображений в базу данных.

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

Если весь этот жаргон звучит запутанно, я вас выслушаю.

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

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

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

Теперь давайте фактически индексируем наши данные. Оформить блокнот здесь.

Яхтзи! Мы успешно проиндексировали наши данные! Оформить блокнот здесь.

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

Подклассы Executors, унаследованные от базового класса Executor, привязаны к нашему потоку с помощью декоратора `@requests` и работают с нашими DocumentArray способами, которые мы определяем в наших реализациях конечных точек «/index» и «/search».

Еще одно служебное замечание, прежде чем мы перейдем к этапу поиска.

Я просто хочу отметить, что Исполнители, такие как CLIPEncoder, являются просто классами Python, унаследованными от базового класса Executor. Подклассы Executors, унаследованные от базового класса Executor, привязаны к нашему потоку с помощью декоратора '@requests' и работают с нашими DocumentArrays в способы, которые мы определяем в наших реализациях конечных точек «/index» и «/search».

Теперь, когда наши изображения проиндексированы, давайте перейдем к поиску их по тексту!

Часть 2 из 2: определение потока поиска

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

Чтобы реализовать этот рабочий процесс в Jina, нам нужно составить наш второй `Flow`.

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

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

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

Теперь, без лишних слов, давайте на самом деле ищем наши данные.

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

Заключение

В этом руководстве мы создали нейронную поисковую систему с «глубоким обучением», которая извлекает изображения на основе коротких текстовых запросов. Наша система нейронного поиска на базе Jina позволяет нам искать на основе значения, а не только по необработанным ключевым словам, извлекая изображения татуировок, которые содержат «концепцию» текстового запроса, например «Братья Марио». Мы сделали все это без ЛЮБОЙ ручной маркировки наборов данных или обучения пользовательских объектов.

Окунитесь в захватывающий мир нейронного поиска с Jina’s Learning Bootcamp. Получите сертификат и станьте частью Зала славы Джины! 🏆

Следите за новостями о будущих продуктах и ​​функциях от Jina AI! 👋