Самый простой способ обнаружить, кодировать и поиск, используя ИИ

Самый простой способ обнаружить, кодировать и поиск, используя ИИ

29 июля 2025 г.

КокосоиндексПоддерживает многомодальную обработку национальной - она может обрабатывать текст и изображение с одной и той же моделью программирования и наблюдать в одном и том же пользовательском потоке (вКоканс)

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

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

Если вы найдете этот учебник полезным, мы очень оценили его, если бы вы могли ⭐ starКокоиндекс на GitHubПолем

Варианты использования

  • Поиск фото
  • Контроль доступа на основе лица и наблюдение
  • Визуальная дедупликация и обнаружение идентичности
  • Мультимодальный поиск с участием людей или идентичности лица
  • Анализ социального графа с фотографий

Чего мы достигнем

Фотография, сделанная участниками этой конференции, иногда имеет право"Самая умная фотография, когда -либо сделанная", по его описанию ведущих физиков мира собрался вместе за один выстрел (Википедия)

Solvay Conference

Вот что мы хотим достичь:

  • Обнаруйте все лица на изображении и извлеките их ограничивающие коробки
  • Обрезка и кодируйте каждое изображение лица в 128-мерное встраивание лица
  • Магазин метаданных и векторов в структурированном индексе для поддержки запросов, таких как: «Найдите все похожие лица для этого» или «Поисковые изображения, которые включают этого человека»

Extracted Faces

⭐ Вы можете найти полный кодздесьПолем

Индексирование потока

Index Flow

  1. Мы принимаем список изображений.
  2. Для каждого изображения мы:
    • Извлекать лица из изображения.
    • Вычислить встраивание для каждого лица.
  3. Мы экспортируем следующие поля в таблицу в Postgres с PGVector:
    • Имя файла, прямое, встраивание для каждого лица.

Основные компоненты

Проглатывание изображений

Мы контролируемimages/каталог с использованием встроенногоLocalFileисточник. Все недавно добавленные файлы автоматически обрабатываются и индексируются.

python
CopyEdit
@cocoindex.flow_def(name="FaceRecognition")
def face_recognition_flow(flow_builder, data_scope):
    data_scope["images"] = flow_builder.add_source(
        cocoindex.sources.LocalFile(path="images", binary=True),
        refresh_interval=datetime.timedelta(seconds=10),
    )

Это создает стол сfilenameиcontentполя. 📂

Image Ingestion

Вы можете подключить его к своемуS3 ведра(С интеграцией SQS,пример) илиAzure Blob StoreПолем

Обнаружение и извлечение лиц

Мы используемface_recognitionБиблиотека под капотом, основанная на детекторе лица DLIB на основе CNN. Поскольку модель медленно на больших изображениях, мы снижаем широкие изображения перед обнаружением.

Extracted Faces

@cocoindex.op.function(
    cache=True,
    behavior_version=1,
    gpu=True,
    arg_relationship=(cocoindex.op.ArgRelationship.RECTS_BASE_IMAGE, "content"),
)
def extract_faces(content: bytes) -> list[FaceBase]:
    orig_img = Image.open(io.BytesIO(content)).convert("RGB")

    # The model is too slow on large images, so we resize them if too large.
    if orig_img.width > MAX_IMAGE_WIDTH:
        ratio = orig_img.width * 1.0 / MAX_IMAGE_WIDTH
        img = orig_img.resize(
            (MAX_IMAGE_WIDTH, int(orig_img.height / ratio)),
            resample=Image.Resampling.BICUBIC,
        )
    else:
        ratio = 1.0
        img = orig_img

    # Extract face locations.
    locs = face_recognition.face_locations(np.array(img), model="cnn")

    faces: list[FaceBase] = []
    for min_y, max_x, max_y, min_x in locs:
        rect = ImageRect(
            min_x=int(min_x * ratio),
            min_y=int(min_y * ratio),
            max_x=int(max_x * ratio),
            max_y=int(max_y * ratio),
        )

        # Crop the face and save it as a PNG.
        buf = io.BytesIO()
        orig_img.crop((rect.min_x, rect.min_y, rect.max_x, rect.max_y)).save(
            buf, format="PNG"
        )
        face = buf.getvalue()
        faces.append(FaceBase(rect, face))

    return faces

Мы преобразуем содержание изображения:

with data_scope["images"].row() as image:
    image["faces"] = image["content"].transform(extract_faces)

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

Каждое обнаруженное лицо обрезано с исходного изображения и хранится как PNG.

Extract Faces

Извлечение образца:

Sample Extraction1

Извлечение образца:

Sample Extraction 2

Вычислить построение лица

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

@cocoindex.op.function(cache=True, behavior_version=1, gpu=True)
def extract_face_embedding(
    face: bytes,
) -> cocoindex.Vector[cocoindex.Float32, typing.Literal[128]]:
    """Extract the embedding of a face."""
    img = Image.open(io.BytesIO(face)).convert("RGB")
    embedding = face_recognition.face_encodings(
        np.array(img),
        known_face_locations=[(0, img.width - 1, img.height - 1, 0)],
    )[0]
    return embedding

Мы подключаем функцию встраивания в поток:

with image["faces"].row() as face:
    face["embedding"] = face["image"].transform(extract_face_embedding)

После этого шага мы встраивались, готовые к индексированию!

Собирать и экспортировать встраивания

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

face_embeddings = data_scope.add_collector()

face_embeddings.collect(
    id=cocoindex.GeneratedField.UUID,
    filename=image["filename"],
    rect=face["rect"],
    embedding=face["embedding"],
)

Мы экспортируем в коллекцию Qdrant:

face_embeddings.export(
    QDRANT_COLLECTION,
    cocoindex.targets.Qdrant(
        collection_name=QDRANT_COLLECTION
    ),
    primary_key_fields=["id"],
)

Теперь вы можете запустить запросы сходства косинуса по векторам лица.

CocoIndex поддерживает 1-линейный переключатель с другими векторными базами данных, такими какПостгресПолем

Запросить индекс

Теперь вы можете построить приложения для поиска лица или панели мониторинга. Например:

  • Учитывая новое лицо, найдите самые похожие лица
  • Найдите все изображения лица, которые появляются в наборе фотографий
  • Кластерные встроены в групповые визуально похожие люди

Для запроса встраиваний, проверьтеПроект поиска изображенийПолем

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

Поддержите нас

Мы постоянно добавляем больше примеров и улучшаем наше время выполнения. Если вы нашли это полезным, пожалуйста, ⭐ StarКокоиндекс на GitHubи поделиться этим с другими.

Спасибо за чтение!

Дайте нам знать, какие трубопроводы вы строите - мы хотели бы показать их.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE