Home Ciencia y Tecnología La forma más fácil de detectar, codificar y buscar caras usando AI

La forma más fácil de detectar, codificar y buscar caras usando AI

29
0

Cocoíntesis admite el procesamiento multimodal de forma nativa: podría procesar tanto texto como imagen con el mismo modelo de programación y observar en el mismo flujo de usuario (en Copa).

En este weblog, caminaremos por un ejemplo completo de construir una tubería de reconocimiento facial escalable usando CocoIndex. Mostraremos cómo extraer e incrustar caras de las imágenes, estructurar los datos relacionalmente y exportar todo a una base de datos vectorial para consultar en tiempo actual.

Copa Ahora puede visualizar secciones identificadas de una imagen basada en los cuadros delimitadores y facilita la comprensión y evaluación de las extracciones de IA, adjunta sin problemas las características calculadas en el contexto de datos visuales no estructurados.

Si encuentra útil este tutorial, le agradeceríamos mucho si pudiera ⭐ Star Cocoindex en Github.

Casos de uso

  • Búsqueda de fotos
  • Management de acceso basado en la cara y vigilancia
  • Deduplicación visible y detección de identidad
  • Búsqueda multimodal que involucra personas o identidad facial
  • Análisis de gráficos sociales de fotos

Lo que lograremos

La foto tomada de los participantes de esta conferencia a veces tiene derecho “La foto más inteligente jamás tomada”por su representación de los físicos principales del mundo reunidos de una sola vez (Wikipedia)

Conferencia de solvayConferencia de solvay

Esto es lo que queremos lograr:

  • Detectar todas las caras en la imagen y extraer sus cajas delimitadoras
  • Recorte y codifique cada imagen de la cara en una incrustación de la cara de 128 dimensiones
  • Almacene metadatos y vectores en un índice estructurado para admitir consultas como: “Encuentra todas las caras similares a este” o “Buscar imágenes que incluyen a esta persona”

Caras extraídasCaras extraídas

⭐ Puede encontrar el código completo aquí.

Flujo de indexación

Flujo de índiceFlujo de índice

  1. Ingendemos una lista de imágenes.
  2. Para cada imagen, nosotros:
    • Extraer caras de la imagen.
    • Calcule los incrustaciones para cada cara.
  3. Exportamos los siguientes campos a una tabla en Postgres con PGVector:
    • Nombre de archivo, rect, incrustación para cada cara.

Componentes centrales

Ingestión de imágenes

Monitoreamos un photos/ directorio utilizando el incorporado LocalFile fuente. Todos los archivos recién agregados se procesan e indexan automáticamente.

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

Esto crea una mesa con filename y content material campos. 📂

Ingestión de imágenesIngestión de imágenes

Puede conectarlo a sus cubos S3 (con integración SQS, ejemplo) o tienda Azure Blob.

Detectar y extraer caras

Usamos el face_recognition Biblioteca debajo del capó, alimentada por el detector de cara basado en CNN de DLIB. Dado que el modelo es lento en imágenes grandes, nos reducimos las imágenes amplias antes de la detección.

Caras extraídasCaras extraídas

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

    # The mannequin is just too gradual on massive photos, so we resize them if too massive.
    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.peak / ratio)),
            resample=Picture.Resampling.BICUBIC,
        )
    else:
        ratio = 1.0
        img = orig_img

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

    faces: record[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 reserve 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 picture:
    picture["faces"] = picture["content"].remodel(extract_faces)

Después de este paso, cada imagen tiene una lista de caras detectadas y cuadros delimitadores.

Cada cara detectada se recorta de la imagen unique y se almacena como un PNG.

Caras de extracciónCaras de extracción

Extracción de muestra:

Extracción de muestra1Extracción de muestra1

Extracción de muestra:

Extracción de muestra 2Extracción de muestra 2

COMPUTAR INCRISIONES FACALES

Codificamos cada cara recortada usando la misma biblioteca. Esto genera una representación vectorial de 128 dimensiones por cara.

@cocoindex.op.perform(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 = Picture.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

Conectamos la función de incrustación al flujo:

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

¡Después de este paso, tenemos incrustaciones listos para ser indexados!

Recolectar y exportar incrustaciones

Ahora recopilamos datos estructurados para cada cara: nombre de archivo, cuadro delimitador e incrustación.

face_embeddings = data_scope.add_collector()

face_embeddings.acquire(
    id=cocoindex.GeneratedField.UUID,
    filename=picture["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 de coseno sobre los vectores faciales.

CocoIndex admite un interruptor de 1 línea con otras bases de datos vectoriales como Postgres.

Consulta el índice

Ahora puede crear aplicaciones o paneles de búsqueda facial. Por ejemplo:

  • Dada una nueva incrustación de la cara, encuentre las caras más similares
  • Encuentra todas las imágenes faciales que aparecen en un conjunto de fotos
  • Incrustos de clúster para agrupar personas visualmente similares

Para consultar incrustaciones, consulte el proyecto de búsqueda de imágenes.

Si desea ver un ejemplo completo en la ruta de consulta con Picture Match, dale un grito a nuestro grupo.

Apoyarnos

Estamos constantemente agregando más ejemplos y mejorando nuestro tiempo de ejecución. Si le pareció útil, por favor ⭐ Star Cocoindex en Github y compártelo con otros.

¡Gracias por leer!

Háganos saber qué tuberías está construyendo: nos encanta presentarlas.

fuente

LEAVE A REPLY

Please enter your comment!
Please enter your name here