
Самый простой способ обнаружить, кодировать и поиск, используя ИИ
29 июля 2025 г.КокосоиндексПоддерживает многомодальную обработку национальной - она может обрабатывать текст и изображение с одной и той же моделью программирования и наблюдать в одном и том же пользовательском потоке (вКоканс)
В этом блоге мы проведем всеобъемлющий пример создания масштабируемого конвейера распознавания лица с использованием кокосового. Мы покажем, как извлекать и встраивать лица из изображений, структурировать данные относительно и экспортировать все в векторную базу данных для запросов в реальном времени.
КокансТеперь может визуализировать идентифицированные разделы изображения на основе ограничивающих коробок и облегчает понимание и оценку извлечения ИИ - беспрепятственно прикрепление вычисленных функций в контексте неструктурированных визуальных данных.
Если вы найдете этот учебник полезным, мы очень оценили его, если бы вы могли ⭐ starКокоиндекс на GitHubПолем
Варианты использования
- Поиск фото
- Контроль доступа на основе лица и наблюдение
- Визуальная дедупликация и обнаружение идентичности
- Мультимодальный поиск с участием людей или идентичности лица
- Анализ социального графа с фотографий
Чего мы достигнем
Фотография, сделанная участниками этой конференции, иногда имеет право"Самая умная фотография, когда -либо сделанная", по его описанию ведущих физиков мира собрался вместе за один выстрел (Википедия)
Вот что мы хотим достичь:
- Обнаруйте все лица на изображении и извлеките их ограничивающие коробки
- Обрезка и кодируйте каждое изображение лица в 128-мерное встраивание лица
- Магазин метаданных и векторов в структурированном индексе для поддержки запросов, таких как: «Найдите все похожие лица для этого» или «Поисковые изображения, которые включают этого человека»
⭐ Вы можете найти полный кодздесьПолем
Индексирование потока
- Мы принимаем список изображений.
- Для каждого изображения мы:
- Извлекать лица из изображения.
- Вычислить встраивание для каждого лица.
- Мы экспортируем следующие поля в таблицу в 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
поля. 📂
Вы можете подключить его к своемуS3 ведра(С интеграцией SQS,пример) илиAzure Blob StoreПолем
Обнаружение и извлечение лиц
Мы используемface_recognition
Библиотека под капотом, основанная на детекторе лица DLIB на основе CNN. Поскольку модель медленно на больших изображениях, мы снижаем широкие изображения перед обнаружением.
@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.
Извлечение образца:
Извлечение образца:
Вычислить построение лица
Мы кодируем каждое обрезанное лицо, используя одну и ту же библиотеку. Это генерирует 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и поделиться этим с другими.
Спасибо за чтение!
Дайте нам знать, какие трубопроводы вы строите - мы хотели бы показать их.
Оригинал