В этом блоге мы построим поиск живых изображений и запросим его на естественном языке. Например, вы можете искать «слона», или «красивое животное» с списком изображений в качестве ввода. Мы будем использовать мультимодальную модель встраивания для понимания и встраивания изображения, а также построить векторный индекс для эффективного поиска. Мы будем использовать CocoIndex для построения потока индексирования, это ультрапроизводительная рамка трансформации данных в реальном времени. Во время работы вы можете добавлять новые файлы в папку, и она только обрабатывает измененные файлы и будет индексирована в течение минуты. Это значило бы многое для нас, если бы вы могли бросить звезду на Если это урок полезен. CocoIndex на GitHub технологии Кокоиндекс Это ультрапроизводительная система трансформации данных в реальном времени для ИИ. Кокоиндекс Клип ВиТ-Л/14 Это мощная модель языка видения, которая может понимать как изображения, так и тексты.Он обучен выравнивать визуальные и текстовые представления в совместном пространстве встраивания, что делает его идеальным для нашего случая использования поиска изображений. Клип ВиТ-Л/14 В нашем проекте мы используем CLIP для: Создание встраиваний изображений напрямую Преобразование естественных языковых поисковых запросов в одно и то же пространство встраивания Включите семантический поиск, сравнив встраивания запросов с встраиваниями субтитров Крепость является высокопроизводительной векторной базой данных. Мы используем ее для хранения и запроса встраиваний. Крепость Быстрая это современная, быстрая (высокопроизводительная) веб-структура для создания API с помощью Python 3.7+ на основе стандартных подсказок типа Python. Быстрая Предпосылки CocoIndex использует Postgres для отслеживания линейки данных для постепенной обработки. Установка Qdrant. Определение индексационного потока Дизайн Flow Диаграмма потока иллюстрирует, как мы будем обрабатывать нашу кодовую базу: Читать файлы изображений из локальной файловой системы Используйте CLIP, чтобы понять и вставить изображение Хранить встраивания в векторную базу данных для поиска 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 Документация Обработка каждого изображения и сбор информации. 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 ТЭ В этом случае он гарантирует, что мы загружаем модель CLIP и процессор только один раз. @functools.cache @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() является пользовательской функцией, которая использует модель CLIP для преобразования изображения в встраивание векторов. она принимает данные изображения в формате байт и возвращает список плавающих точек, представляющих встраивание изображения. embed_image Функция поддерживает кэширование через параметр. При включении исполнитель сохраняет результаты функции для повторного использования во время переработки, что особенно полезно для вычислительно-интенсивных операций. . 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() Руководитель событий запуска инициализирует приложение, когда оно запускается впервые. load_dotenv(): загружает переменные среды из файла .env, который полезен для конфигурации, таких как ключи API и URL cocoindex.init(): Инициализирует рамку CocoIndex, устанавливая необходимые компоненты и конфигурации Qdrant Client Setup: Creates a new instance QdrantClient 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 Live Updater Setup: Creates a instance for the FlowLiveUpdater 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 Теперь добавьте еще одно изображение в Форекс, например, это Подождите минуту, пока новое изображение будет обработано и индексировано. img Красивая шкурка Если вы хотите следить за прогрессом индексации, вы можете просмотреть его в CocoInsight . cocoindex server -ci main.py Finally - we are constantly improving, and more features and examples are coming soon. If you love this article, please give us a star ⭐ at to help us grow. Thanks for reading! GitHub GitHub