170 чтения

Как создать поиск живых изображений с помощью модели зрения и запроса с помощью естественного языка

к LJ7m2025/05/22
Read on Terminal Reader

Слишком долго; Читать

В этом блоге мы построим поиск живого изображения и запросим его на естественном языке. Например, вы можете искать «слона» или «красивое животное» с списком изображений в качестве ввода. Мы будем использовать мультимодальную модель встраивания, чтобы понять и встраивать изображение, и построить векторный индекс для эффективного поиска.
featured image - Как создать поиск живых изображений с помощью модели зрения и запроса с помощью естественного языка
LJ HackerNoon profile picture
0-item
1-item

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

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

Это значило бы многое для нас, если бы вы могли бросить звезду наCocoIndex на GitHubЕсли это урок полезен.


технологии

Кокоиндекс

КокоиндексЭто ультрапроизводительная система трансформации данных в реальном времени для ИИ.

Клип ВиТ-Л/14

Клип ВиТ-Л/14Это мощная модель языка видения, которая может понимать как изображения, так и тексты.Он обучен выравнивать визуальные и текстовые представления в совместном пространстве встраивания, что делает его идеальным для нашего случая использования поиска изображений.

В нашем проекте мы используем CLIP для:

  1. Создание встраиваний изображений напрямую
  2. Преобразование естественных языковых поисковых запросов в одно и то же пространство встраивания
  3. Включите семантический поиск, сравнив встраивания запросов с встраиваниями субтитров

Крепость

Крепостьявляется высокопроизводительной векторной базой данных. Мы используем ее для хранения и запроса встраиваний.

Быстрая

Быстраяэто современная, быстрая (высокопроизводительная) веб-структура для создания API с помощью Python 3.7+ на основе стандартных подсказок типа Python.

Предпосылки

  • CocoIndex использует Postgres для отслеживания линейки данных для постепенной обработки.
  • Установка Qdrant.

Определение индексационного потока

Дизайн Flow

flow design

Диаграмма потока иллюстрирует, как мы будем обрабатывать нашу кодовую базу:

  1. Читать файлы изображений из локальной файловой системы
  2. Используйте CLIP, чтобы понять и вставить изображение
  3. Хранить встраивания в векторную базу данных для поиска

1 Включите изображения.

@cocoindex.flow_def(name="ImageObjectEmbedding")
def image_object_embedding_flow(flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope):
    data_scope["images"] = flow_builder.add_source(
        cocoindex.sources.LocalFile(path="img", included_patterns=["*.jpg", "*.jpeg", "*.png"], binary=True),
        refresh_interval=datetime.timedelta(minutes=1)  # Poll for changes every 1 minute
    )
    img_embeddings = data_scope.add_collector()

flow_builder.add_sourceбудет создаваться таблица с подполями (filename,content), мы можем ссылаться наДокументацияДля большей подробности.

ingestion

Обработка каждого изображения и сбор информации.

2.1 Вставьте изображение с помощью клипа

@functools.cache
def get_clip_model() -> tuple[CLIPModel, CLIPProcessor]:
    model = CLIPModel.from_pretrained(CLIP_MODEL_NAME)
    processor = CLIPProcessor.from_pretrained(CLIP_MODEL_NAME)
    return model, processor

ТЭ@functools.cacheВ этом случае он гарантирует, что мы загружаем модель CLIP и процессор только один раз.

@cocoindex.op.function(cache=True, behavior_version=1, gpu=True)
def embed_image(img_bytes: bytes) -> cocoindex.Vector[cocoindex.Float32, Literal[384]]:
    """
    Convert image to embedding using CLIP model.
    """
    model, processor = get_clip_model()
    image = Image.open(io.BytesIO(img_bytes)).convert("RGB")
    inputs = processor(images=image, return_tensors="pt")
    with torch.no_grad():
        features = model.get_image_features(**inputs)
    return features[0].tolist()

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

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

Затем мы будем обрабатывать каждое изображение и собирать информацию.

with data_scope["images"].row() as img:
    img["embedding"] = img["content"].transform(embed_image)
    img_embeddings.collect(
        id=cocoindex.GeneratedField.UUID,
        filename=img["filename"],
        embedding=img["embedding"],
    )



2.3 Собирать вставки

Экспортируйте вставки в таблицу в Qdrant.

img_embeddings.export(
    "img_embeddings",
    cocoindex.storages.Qdrant(
        collection_name="image_search",
        grpc_url=QDRANT_GRPC_URL,
    ),
    primary_key_fields=["id"],
    setup_by_user=True,
)

3 Выберите индекс

Вставьте запрос с помощью CLIP, который перемещает как текст, так и изображения в одно и то же пространство встраивания, позволяя искать кросс-модальное сходство.

def embed_query(text: str) -> list[float]:
    model, processor = get_clip_model()
    inputs = processor(text=[text], return_tensors="pt", padding=True)
    with torch.no_grad():
        features = model.get_text_features(**inputs)
    return features[0].tolist()

Определите конечную точку/searchВыполняет семантический поиск изображений.

@app.get("/search")
def search(q: str = Query(..., description="Search query"), limit: int = Query(5, description="Number of results")):
    # Get the embedding for the query
    query_embedding = embed_query(q)
    
    # Search in Qdrant
    search_results = app.state.qdrant_client.search(
        collection_name="image_search",
        query_vector=("embedding", query_embedding),
        limit=limit
    )
    

Это ищет базу данных векторов Qdrant для схожих встраиваний.limitРезультаты

# Format results
out = []
for result in search_results:
    out.append({
        "filename": result.payload["filename"],
        "score": result.score
    })
return {"results": out}

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

Применение

Быстрый огонь

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
# Serve images from the 'img' directory at /img
app.mount("/img", StaticFiles(directory="img"), name="img")

Настройка приложений FastAPI с средним программным обеспечением CORS и статическими файлами, обслуживающими приложение, настроены на:

  • Разрешать перекрестные запросы любого происхождения
  • Сервирование файлов статических изображений из каталога «img»
  • Управление конечными точками API для функций поиска изображений
@app.on_event("startup")
def startup_event():
    load_dotenv()
    cocoindex.init()
    # Initialize Qdrant client
    app.state.qdrant_client = QdrantClient(
        url=QDRANT_GRPC_URL,
        prefer_grpc=True
    )
    app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow)
    app.state.live_updater.start()

Руководитель событий запуска инициализирует приложение, когда оно запускается впервые.

  1. load_dotenv(): загружает переменные среды из файла .env, который полезен для конфигурации, таких как ключи API и URL
  2. cocoindex.init(): Инициализирует рамку CocoIndex, устанавливая необходимые компоненты и конфигурации
  3. Qdrant Client Setup:
    • Creates a new QdrantClient instance
    • Configures it to use the gRPC URL specified in environment variables
    • Enables gRPC preference for better performance
    • Stores the client in the FastAPI app state for access across requests
  4. Live Updater Setup:
    • Creates a FlowLiveUpdater instance for the image_object_embedding_flow
    • This enables real-time updates to the image search index
    • Starts the live updater to begin monitoring for changes

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

фронта

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

Пора веселиться!

  • Create a collection in Qdrant

    curl -X PUT 'http://localhost:6333/collections/image_search' \
    -H 'Content-Type: application/json' \
    -d '{
        "vectors": {
        "embedding": {
            "size": 768,
            "distance": "Cosine"
        }
        }
    }'
    
  • Setup indexing flow

    cocoindex setup main.py
    

    It is setup with a live updater, so you can add new files to the folder and it will be indexed within a minute.

  • Run backend

    uvicorn main:app --reload --host 0.0.0.0 --port 8000
    
  • Run frontend

    cd frontend
    npm install
    npm run dev
    

Иди вhttp://localhost:5174Два поисковых


Example Search


More Example Search


Теперь добавьте еще одно изображение вimgФорекс, например, этоКрасивая шкуркаПодождите минуту, пока новое изображение будет обработано и индексировано.


Squirrel Search


Если вы хотите следить за прогрессом индексации, вы можете просмотреть его в CocoInsightcocoindex server -ci main.py .


Indexing status


Finally - we are constantly improving, and more features and examples are coming soon. If you love this article, please give us a star ⭐ at GitHub to help us grow. Thanks for reading!

GitHub

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks