soporta el procesamiento multi-modal nativamente - podría procesar tanto texto como imagen con el mismo modelo de programación y observar en el mismo flujo de usuario (en ) de CocoIndex CocoInsight CocoIndex CocoInsight En este blog, pasaremos por un ejemplo completo de la construcción de un tubo de reconocimiento facial escalable utilizando CocoIndex. Mostraremos cómo extraer e incorporar caras de imágenes, estructurar los datos de forma relacional y exportar todo a una base de datos vectorial para consultas en tiempo real. Ahora puede visualizar secciones identificadas de una imagen basándose en las cajas de límite y hace que sea más fácil comprender y evaluar las extracciones de IA - adjuntando sin problemas características calculadas en el contexto de datos visuales no estructurados. CocoInsight CocoInsight If you find this tutorial helpful, we’d greatly appreciate it if you could ⭐ star . CocoIndex on GitHub CocoIndex en GitHub Uso de casos Foto de búsqueda Control y vigilancia de acceso basados en la cara Deduplicación visual y detección de identidad Búsqueda multimodal que involucre a personas o identidad facial Análisis de gráficos sociales a partir de fotos Lo que lograremos Las fotografías tomadas de los participantes de esta conferencia a veces tienen el , por su descripción de los principales físicos del mundo reunidos en un solo tiro ( ) "La imagen más inteligente jamás tomada" Wikipedia Aquí está lo que queremos lograr: Detecta todas las caras en la imagen y extrae sus cajas de límite Cultivar y codificar cada imagen de rostro en una incorporación de rostro de 128 dimensiones Almacena metadatos y vectores en un índice estructurado para apoyar consultas como: "Encuentra todas las caras similares a esta" o "Buscando imágenes que incluyan a esta persona" Puedes encontrar el código completo . Aquí Índice de flujo Introducimos una lista de imágenes. 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. Componentes básicos Imagen Ingestión Seguimos vigilando un Directorios utilizando el built-in Todos los archivos recién añadidos se procesan y indexen automáticamente. 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), ) Se crea una mesa con y Campos filename content Puedes conectarlo a tu (Con la integración SQS, ) o . S3 Buckets ejemplo Tienda Azure Blob Detección y extracción de caras Nosotros utilizamos el biblioteca bajo el capó, alimentado por el detector de rostros basado en CNN de dlib. Dado que el modelo es lento en imágenes grandes, reducimos las imágenes amplias antes de la detección. 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 Transformamos el contenido de la imagen: with data_scope["images"].row() as image: image["faces"] = image["content"].transform(extract_faces) Después de este paso, cada imagen tiene una lista de caras detectadas y cajas de límite. Cada cara detectada es arrancada de la imagen original y almacenada como un PNG. Extracción de muestras: Extracción de muestras: Compute Face Embeddings Codificamos cada cara cortada usando la misma biblioteca. Esto genera una representación vectorial de 128 dimensiones por cara. @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 Introducimos la función de embalaje en el flujo: with image["faces"].row() as face: face["embedding"] = face["image"].transform(extract_face_embedding) Después de este paso, tenemos las incorporaciones listas para ser indexadas! Recogida y exportación de embebidos Ahora recopilamos datos estructurados para cada cara: nombre de archivo, casilla de límite y incorporación. face_embeddings = data_scope.add_collector() face_embeddings.collect( id=cocoindex.GeneratedField.UUID, filename=image["filename"], rect=face["rect"], embedding=face["embedding"], ) Exportamos a una colección Qdrant: face_embeddings.export( QDRANT_COLLECTION, cocoindex.targets.Qdrant( collection_name=QDRANT_COLLECTION ), primary_key_fields=["id"], ) Ahora puede ejecutar consultas de similitud cosina sobre vectores faciales. CocoIndex admite un interruptor de línea con otras bases de datos vectoriales como . Postgres Queremos el índice Ahora puede crear aplicaciones de búsqueda facial o dashboards. Dado un nuevo rostro incorporado, encontrar las caras más parecidas Encuentra todas las imágenes de rostro que aparecen en un conjunto de fotos Cluster embeddings para agrupar a personas visualmente similares Para la búsqueda de embeddings, compruebe . Proyecto de búsqueda de imagen Si desea ver un ejemplo completo en el camino de la consulta con la coincidencia de la imagen, haga un llamado en . Nuestro Grupo Apoyanos Estamos constantemente añadiendo más ejemplos y mejorando nuestro tiempo de ejecución. Si ha encontrado esto útil, por favor ⭐ estrella y compartirlo con otros. CocoIndex en GitHub ¡Gracias por leer! Déjenos saber qué tuberías están construyendo - nos encantaría mostrarlas.