Современный семантический поиск по изображениям

Улучшенный семантический поиск изображений в современности

Статья-инструкция о том, как использовать Python, Pinecone, Hugging Face и модель Open AI CLIP для создания семантического поискового приложения для ваших облачных фотографий.

Изображение автора

Вы хотите найти «ту самую фотографию» несколько лет назад. Вы помните некоторые детали обстановки. Apple Photos не предлагает семантический поиск, а Google Photos ограничен несколькими предопределенными классификаторами предметов. Ни одно из них не справится с таким поиском. Я продемонстрирую проблему с помощью двух необычных запросов в моем Google Photos: «торт из пончиков на день рождения» и «поврежденная губа от битвы снежками». Затем я расскажу, как создать свое собственное семантическое поисковое приложение для изображений.

Пример #1

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

Запрос в Google Photos: «торт из пончиков на день рождения»

Результаты: Шесть фотографий тортов без пончиков, за которыми следует та, которую я хотел.

Изображение автора

Запрос в семантическом поисковом приложении: «торт из пончиков на день рождения»

Результаты: Две изображения и видео, которые именно мне нужны.

Изображение автора

Пример #2

Я поехал на снег с моим подростковым сыном и большой группой его друзей. Они забрались на вершину заброшенного железнодорожного туннеля. «Бросьте снежки одновременно, и я сделаю видео в замедленной съемке!» — кричал я. Это был не самый блестящий момент, так как я не предвидел очевидного, что я стану мишенью для двадцати подростков с сильными руками.

Запрос в Google Photos: «поврежденная губа от битвы снежками»

Результаты:

Изображение, созданное автором

Текущая модель классификации изображений в Google ограничена словами, на которых она была обучена.

Запрос в семантическом поисковом приложении: «поврежденная губа от битвы снежками»

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

Изображение автора

Модель OpenAI CLIP и архитектура приложения

CLIP позволяет модели научиться ассоциировать пиксели изображения с текстом и дает ей возможность искать такие вещи, как «торты из пончиков» и «поврежденные губы» — вещи, которые вы никогда бы не подумали включить в обучение классификатора изображений. CLIP означает Constastive Language-Image Pretraining. Это многомодельная модель с нулевой декларированностью. Она была обучена на миллионах изображений с описательными подписями.

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

Источник: Никос Карфитас, Towards Data Science

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

Изображение, созданное автором

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

Изображение, созданное автором

Создание приложения

Код и вспомогательные файлы для этого приложения можно найти на GitHub по адресу https://github.com/joshpoduska/llm-image-caption-semantic-search. Используйте их для создания семантического поискового приложения для ваших облачных фотографий.

Приложение работает локально на ноутбуке с достаточным объемом памяти. Я проверял его на MacBook Pro.

Компоненты, необходимые для создания приложения

  • Pinecone или аналогичная векторная база данных для хранения вложений и семантического поиска (бесплатная версия Pinecone достаточна для этого учебника)
  • Модели и конвейеры Hugging Face
  • Модель OpenAI CLIP для создания вложений изображений и текстовых запросов (доступно из Hugging Face)
  • API Google Photos для доступа к вашим личным фотографиям Google

Полезная информация перед началом

Доступ к вашим изображениям

API Google Photos имеет несколько ключевых полей данных, которые следует отметить. Смотрите справочник API для получения более подробной информации.

  • Id неизменяем
  • baseUrl позволяет получить доступ к байтам медиафайлов. Они действительны в течение 60 минут.

Комбинация библиотек pandas, JSON и requests может быть использована прямолинейно для загрузки DataFrame с идентификаторами изображений, URL-адресами и датами.

Генерация векторных представлений изображений

С помощью Hugging Face и модели OpenAI CLIP этот шаг является самым простым во всем приложении.

from sentence_transformers import SentenceTransformerimg_model = SentenceTransformer('clip-ViT-B-32')embeddings = img_model.encode(images)

Создание метаданных

Семантический поиск часто улучшается с помощью фильтров метаданных. В этом приложении я использую дату фотографии для извлечения года, месяца и дня. Они сохраняются как словарь в поле DataFrame. Запросы Pinecone могут использовать этот словарь для фильтрации поисков по метаданным в словаре.

Вот первая строка моего pandas DataFrame с полями изображений, векторами и словарем метаданных.

Image by the author

Загрузка векторных представлений

Существуют оптимизации Pinecone для асинхронной и параллельной загрузки. Базовая функция загрузки проста, как показано ниже.

index.upsert(vectors=ids_vectors_chunk, async_req=True)

Запрос векторных представлений

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

text_model = SentenceTransformer('sentence-transformers/clip-ViT-B-32-multilingual-v1')

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

# создание вектора запросаxq = text_model.encode(query).tolist()# запрос результатовxc = index.query(xq,                filter= {                "year": {"$in":years_filter},                "month": {"$in":months_filter}                        },                top_k= top_k,                include_metadata=True)

Заключение

Модель CLIP – удивительная. Это общая модель без обучения, которая научилась ассоциировать изображения с текстом таким образом, чтобы избавиться от ограничений обучения классификатора изображений на заранее определенные классы. Когда мы сочетаем это с мощью векторной базы данных корпоративного уровня, такой как Pinecone, мы можем создавать семантические приложения поиска изображений с низкой задержкой и высокой точностью. Это лишь одно из захватывающих приложений генеративного искусственного интеллекта, которые появляются ежедневно.