підтримує мультимодальну обробку натурально - він міг обробляти як текст, так і зображення з однією і тією ж моделлю програмування і спостерігати в одному потоці користувачів (в ) КокоІндекс Кокосові КокоІндекс Кокосові У цьому блозі ми пройдемо повний приклад побудови масштабованого трубопроводу розпізнавання обличчя за допомогою CocoIndex. Ми покажемо, як витягувати і вставляти обличчя з зображень, структурувати дані реляційно та експортувати все в векторну базу даних для запитів в реальному часі. тепер може візуалізувати ідентифіковані розділи зображення на основі граничних ящиків і полегшує розуміння та оцінку екстракцій AI - бездоганно прикріплюючи обчислювані функції в контексті неструктурованих візуальних даних. Кокосові Кокосові If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex на GitHub Використовуйте випадки Фото пошуку Контроль доступу та моніторинг на основі обличчя Візуальна дедуплікація та виявлення ідентичності Мультимодальне пошук, що включає людей або особистість обличчя Соціальний графічний аналіз з фотографій Що ми досягнемо Фотографії, зроблені учасниками цієї конференції, іноді мають право , за його зображення провідних світових фізиків, зібраних разом в один знімок ( ) «Найрозумніша картина, яку коли-небудь знімали» Вікіпедія Ось що ми хочемо досягти: Визначте всі обличчя на зображенні і витягніть їх кордони Використовуйте і кодуйте кожен зображення обличчя в 128-вимірне вбудовування обличчя Зберігайте метадані та вектори в структурованому індексі для підтримки запитів, таких як: «Знайти всі обличчя, схожі з цією особою» або «Знайти зображення, які включають цю особу». Ви можете знайти повний код . Тут Індексація потоку Ми склали список зображень. For each image, we: Extract faces from the image. Compute embeddings for each face. We export the following fields to a table in Postgres with PGVector: Filename, rect, embedding for each face. Основні компоненти Зображення інгредієнтів Ми спостерігаємо за Використовуючи вбудований Всі нові файли автоматично обробляються та індексуються. 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 Ви можете підключити його до свого (за допомогою інтеграції SQS, ) або . S3 Букет Приклад Магазин Azure Blob Виявлення та вилучення обличчя Ми використовуємо Бібліотека під капотом, що підтримується детектором обличчя dlib на основі CNN. Оскільки модель повільна на великих зображеннях, ми знижуємо широкі зображення перед виявленням. face_recognition @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-лінійний перемикач з іншими векторними базами даних, такими як . Поштовхи Знайдіть індекс Тепер ви можете створювати додатки для пошуку обличчя або панелі. Наприклад: З огляду на нове вбудовування обличчя, знайдіть найбільш схожі обличчя Знайдіть всі зображення обличчя, які з'являються в наборі фотографій Кластерні вбудовані, щоб групувати візуально схожих людей Щоб уникнути затримки, перевірте . Проект пошуку зображень Якщо ви хочете побачити повний приклад на шляху запиту з відповідністю зображень, введіть крик на . Наша група Підтримай нас Ми постійно додаємо більше прикладів і покращуємо наш час роботи. Якщо ви знайшли це корисним, будь ласка ⭐ зірка І поділитися ним з іншими. CocoIndex на GitHub Дякую за читання! Дайте нам знати, які трубопроводи ви будуєте - ми хотіли б їх демонструвати.