Как искать изображения

Создание индекса для умного поиска

Для кого

Интернет магазины, маркетплейсы

Тип контента

Картинки, фотографии товаров

Индустрии

Все индустрии

Дата публикации

30 дек. 2024 г.

В мире искусственного интеллекта и машинного обучения существует множество потрясающих инструментов, которые могут решить различные задачи. В этой статье мы покажем, как создать индекс для умного поиска изображений, используя некоторые из этих инструментов: OpenAI CLIP, Hugging Face Transformers, Pinecone и Python.


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


Умный поиск изображений - это технология, которая позволяет пользователям находить изображения на основе текстовых запросов или других изображений. Для достижения этого мы обучим модель, которая будет преобразовывать изображения и текст в векторные представления (или "эмбеддинги"). Эти эмбеддинги затем будут индексироваться и использоваться для поиска наиболее похожих изображений.

Наши инструменты


Мы будем использовать следующие инструменты:

  1. OpenAI CLIP: Модель CLIP была обучена на большом объеме изображений и текстовых описаний из интернета, что позволяет ей эффективно преобразовывать изображения и текст в векторные представления.

  2. Hugging Face Transformers: Мы будем использовать модель перевода Helsinki-NLP/opus-mt-ru-en для перевода русского текста на английский, так как модель CLIP обучена на английском языке.

  3. Pinecone: Pinecone - это сервис векторного поиска, который позволяет нам индексировать векторные представления и осуществлять поиск с высокой точностью и скоростью.4. Python: Наш выбор для скриптинга и анализа данных.

Разработка индекса для поиска изображений


Для создания индекса нам нужно выполнить несколько ключевых шагов:

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

  2. Генерация эмбеддингов: Мы будем использовать модель CLIP для преобразования каждого изображения и его описания в векторное представление.

  3. Объединение эмбеддингов: Мы объединим эмбеддинги изображения и текста, чтобы создать более информативное представление каждого изображения.

  4. Индексация эмбеддингов: Затем мы проиндексируем эмбеддинги в Pinecone, чтобы мы могли эффективно выполнять поисковые запросы.

  5. Поиск: После индексации мы можем использовать модель CLIP и Pinecone для выполнения поисковых запросов, преобразуя запросы в эмбеддинги и ища наиболее близкие эмбеддинги в нашем индексе.


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

#1. Импорт необходимых библиотек
#Сначала нам нужно импортировать необходимые библиотеки.

import open_clip
import torch
from transformers import MarianMTModel, MarianTokenizer
from PIL import Image
import pinecone
import os
import requests
from io import BytesIO
from lxml import etree
from tqdm import tqdm
    
#2. Проверка доступного устройства
#Мы проверяем, доступна ли GPU для наших вычислений. Если нет, мы будем использовать CPU.

device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)
    
#3. Настройка модели перевода
#Мы будем использовать модель MarianMT для перевода с русского на английский. Модель и её токенизатор загружаются и перемещаются на доступное устройство.

model_name = 'Helsinki-NLP/opus-mt-ru-en'
tr_tokenizer = MarianTokenizer.from_pretrained(model_name)
tr_model = MarianMTModel.from_pretrained(model_name).to(device)
    
#4. Инициализация Pinecone
#Мы инициализируем Pinecone с помощью вашего API-ключа. Затем создаем новый индекс в Pinecone, если он еще не существует.

api_key = "YOUR_API_KEY"
pinecone.init(api_key, environment="us-central1-gcp")
index_name = "clip-embeddings"
if index_name not in pinecone.list_indexes():
    pinecone.create_index(
      index_name,
      dimension=1536,
      metric="cosine",
      pod_type="s1"
    )
index = pinecone.Index(index_name)
    
#5. Работа с XML лентой
#Мы загружаем XML ленту, извлекаем нужные поля и загружаем изображения.

from open_clip import tokenizer
url = "https://www.stolplit.ru/yml/mb_moscow.xml"
response = requests.get(url)
xml_content = response.content
root = etree.fromstring(xml_content)
print('Загружено')
    
#6. Обработка и загрузка изображений в Pinecone
#Мы обрабатываем изображения, вычисляем векторные представления и загружаем их в Pinecone. Это происходит в партиях для повышения эффективности.

offers = root.xpath("//offers/offer")
BATCH_SIZE = 100
offers = offers[59500:]
    
#7. Вычисление эмбеддингов и загрузка в Pinecone
#Мы предобрабатываем изображения, вычисляем эмбеддинги и объединяем их. Затем мы загружаем эмбеддинги в Pinecone.

with torch.no_grad():
    image_embeddings = im_model.encode_image(preprocessed_images)
    text_embeddings = im_model.encode_text(text_inputs)
combined_embeddings = torch.cat((image_embeddings, text_embeddings), dim=1)
    
#8. Загрузка в Pinecone
#Мы готовим данные и загружаем их в Pinecone.


upserts = []
for name, name_en, autoname_en, embedding, image_url, image_descr, product_url in zip(image_names, image_names_en, image_autocapts_en, combined_embeddings, image_urls, image_descriptions, product_urls):
    idx_s = str(hash(image_url))
    image_descr = image_descr if image_descr is not None else ""
    upserts.append({
        "id": idx_s,
        "values": embedding.tolist(),
        "metadata": {"name_ru": name, "name_en": name_en, "autoname_en":autoname_en, "image_url": image_url, 'image_descr': image_descr, 'product_url':product_url},
    })
index.upsert(upserts)

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

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

Наш специалист свяжется с вами и подскажет, какие сервисы помогут решить ваши задачи.

Заполняя форму, вы соглашаетесь на обработку персональных данных и получение информационных сообщений от компании ООО Экспертнэт Рус.

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

Наш специалист свяжется с вами и подскажет, какие сервисы помогут решить ваши задачи.

Заполняя форму, вы соглашаетесь на обработку персональных данных и получение информационных сообщений от компании ООО Экспертнэт Рус.

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

Наш специалист свяжется с вами и подскажет, какие сервисы помогут решить ваши задачи.

Заполняя форму, вы соглашаетесь на обработку персональных данных и получение информационных сообщений от компании ООО Экспертнэт Рус.