Freedam
IngenieríaParte 6 de 7 · 18 min de lecturaActualizado el

Un rostro no es un nombre

La mayoría de los errores de búsqueda en un gestor de recursos digitales se corrigen fácilmente con otra consulta. El reconocimiento facial es distinto porque un resultado equivocado también afirma algo sobre una persona. Los artículos anteriores tratan la arquitectura de recuperación, la detección de casi duplicados, los índices multilingües y la medición de la búsqueda; este se centra en las restricciones adicionales que impone la identidad.

Si una biblioteca dice que alguien aparece en una fotografía, también puede dar a entender que estuvo en un lugar, con otras personas y en una fecha concreta. La consulta de distancia coseno es sencilla; el requisito difícil es lograr que las decisiones de identidad sean auditables y poder explicar la evidencia que respalda el umbral.

Este artículo describe la pipeline y la medición que respalda su umbral de similitud por defecto de 0,6, usando una biblioteca de 22.944 recursos. Sin la distribución de similitud subyacente, ese valor sería una constante arbitraria.

Tres tareas con costos de error distintos

Antes de elegir un modelo o un umbral, separamos tres tareas que requieren definiciones distintas de lo que es correcto.

Tres tareas de búsqueda de personas y lo que cuesta un error en cada una LA TAREA UNA FALSA COINCIDENCIA CUESTA UN FALLO CUESTA «Todas las fotos aprobadas del CEO, para la prensa.» un equipo de comunicación, con prisa la persona equivocada publicada con el nombre de otra una segunda búsqueda «El conjunto propio de cada ponente, entre 4000 fotogramas.» un fotógrafo de eventos, al entregar unos fotogramas que descartar un fotograma que nadie entrega, y nadie lo nota «Encuentra todas las imágenes mías. Retiro mi consentimiento.» un exempleado, o su abogado la foto de otra persona destruida una imagen que debería haber desaparecido, aún en la biblioteca Solo la tercera tarea es costosa en ambas columnas, y un sistema ajustado para las dos primeras la resuelve mal en cualquier caso.
El mismo índice, la misma métrica de distancia, tres definiciones incompatibles de un buen resultado. La fila inferior es la que decide la arquitectura.

Las dos primeras filas son compromisos de recuperación que pueden usar umbrales distintos. La tercera es una solicitud de auditoría: alguien necesita saber qué registra la biblioteca sobre una persona y qué partes confirmó un humano.

Por eso la auditabilidad da forma a la arquitectura tanto como la precisión.

Separar la detección del reconocimiento

Los términos suelen usarse juntos, pero describen operaciones distintas.

La detección responde si una región contiene un rostro y dónde está. Produce un cuadro delimitador y una confianza, sin asignar una identidad.

El reconocimiento compara un rostro detectado con referencias conocidas y puede asignarlo a una persona, de modo que un error es una afirmación de identidad incorrecta y no un cuadro delimitador impreciso.

Los sistemas que tratan ambas cosas como una sola etapa de la pipeline acaban con una arquitectura en la que la confianza de detección y la confianza de identidad son el mismo número, y no hay ningún punto del flujo en el que un humano pueda intervenir, porque no existe una costura donde hacerlo. freedam conserva la costura. La detección es automática y produce geometría anónima. El reconocimiento es un paso separado, contra un conjunto que construyó una persona.

La pipeline, con la costura entre la geometría anónima y la identidad AUTOMÁTICO · SIN IDENTIDAD IDENTIDAD vista previa W_1024 no el original archivo maestro InsightFace buffalo_l, 640 x 640 en tu propio hardware cuadro + puntuación + 512 números anónimo, y personal una persona da un nombre el único paso que convierte un rostro en una persona una Person, con nombre con un conjunto de referencia los rostros posteriores se comparan con ese conjunto Todo lo que queda a la izquierda del recuadro ámbar ocurre sin que nadie decida nada sobre la identidad. Todo lo que queda a la derecha existe porque alguien escribió un nombre. La costura es el producto: es donde puedes responder «¿quién decidió esto?» con una persona y una marca de tiempo, y no con una versión de modelo.
La detección sigue siendo anónima, y la identidad entra solo cuando una persona vincula un rostro detectado con un nombre.

El detector es un sidecar de InsightFace autoalojado que ejecuta el paquete de modelos buffalo_l con un tamaño de detección de 640 por 640 en CPU. Su endpoint /detect acepta los bytes de una imagen y devuelve cuadros, puntuaciones de detección y embeddings ArcFace de 512 dimensiones. Las imágenes permanecen dentro del despliegue, una propiedad importante en el tratamiento de datos de las fotografías de empleados y clientes.

El sidecar admite hasta 50 rostros por imagen, mientras que la aplicación conserva como máximo 20. La detección se ejecuta en su propia cola con un tiempo de espera de cinco minutos, tres intentos y esperas de 10, 60 y 300 segundos. Un fallo no bloquea el resto de la importación, así que los recursos siguen disponibles aunque el procesamiento de rostros termine más tarde.

Elegir la entrada del detector

La exhaustividad (recall) en rostros depende en parte de la versión derivada que se pasa al detector, por lo que esta entrada previa merece la misma atención que una decisión de texto en el momento de indexar.

El detector recibe la vista previa W_1024 y no el archivo original. Los maestros de un DAM suelen ser de 40 u 80 megapíxeles, así que usar la vista previa acota el costo de transferencia y procesamiento y queda por debajo del límite de importación del sidecar.

El costo probable es la exhaustividad en rostros pequeños. A continuación se muestra la distribución medida de tamaños de los rostros detectados en una biblioteca.

Anchos medidos de rostros detectados y puntuaciones de detección en una biblioteca de 22.944 recursos ANCHO DEL ROSTRO DETECTADO, EN PÍXELES DE LA VISTA PREVIA DE 1024 PÍXELES 0 150 300 450 600 750 mín. 9 percentil 10: 115 mediana 247 media 265 máx. 708 LO QUE SE ENCONTRÓ 20.549 imágenes en la biblioteca 741 contienen un rostro detectado (3,6 %) 774 rostros en total: 708 imágenes con uno, 33 con dos PUNTUACIÓN DE DETECCIÓN mínima 0,506 · media 0,760 · máxima 0,909 ningún rostro se guardó sin embedding la mayoría de las imágenes de esta biblioteca no contienen personas El rostro de 9 píxeles es el extremo interesante. Un rostro así de pequeño en la vista previa medía quizá 35 píxeles en el original. Un rostro de la mitad de ese tamaño sencillamente no aparece en esta tabla: nada posterior puede encontrar a una persona que el detector nunca vio.
Medido sobre una réplica de una biblioteca. Esta distribución abarca solo los rostros detectados, así que no puede medir los rostros que se pierden por usar la vista previa.

No pudimos medir directamente el costo en exhaustividad porque la réplica contiene la base de datos pero no los archivos originales. Una comparación adecuada ejecutaría las mismas imágenes a resolución completa y en W_1024; por eso este artículo informa de la distribución de tamaños detectados sin afirmar una cifra de exhaustividad para los rostros que la vista previa pudo haber perdido.

Reducir la escala no puede añadir detalle visual, de modo que el compromiso favorece un procesamiento acotado, probablemente a costa de parte de la exhaustividad en rostros pequeños, aunque su magnitud sigue sin medirse.

El embedding es una plantilla biométrica

Por cada rostro detectado, el sidecar devuelve 512 números de coma flotante, normalizados, procedentes de la cabeza de reconocimiento de ArcFace. En la base de datos es una columna vector(512) junto al cuadro delimitador, la probabilidad de detección y una similitud de reconocimiento que admite nulos, con un índice HNSW sobre la distancia coseno restringido a las filas que realmente tienen un embedding.

Esos 512 números son una plantilla biométrica. No se pueden ver directamente como una imagen, pero pueden identificar a una persona y requieren los controles de acceso, la política de retención y el ciclo de eliminación propios de los datos biométricos, y no los de una columna de caché genérica.

También se guarda una miniatura recortada de 150 por 150, con un 20 % de margen alrededor del cuadro, calidad JPEG 85 y sin metadatos, para que quien revise pueda ver a qué rostro se refiere una fila sin abrir el original.

En la biblioteca medida, la tabla faces, el índice HNSW y el almacenamiento de vectores fuera de línea ocupan 3,3 MB para 774 rostros, unos 4,3 kB por rostro. Es poco comparado con los propios archivos multimedia, aunque la sensibilidad de los datos no guarda relación con su tamaño de almacenamiento.

Por qué no agrupamos rostros automáticamente

Las herramientas de fotos para el gran público suelen agrupar los embeddings por similitud, presentan cada grupo como una persona sin nombre y piden al usuario que ponga los nombres. Elegimos no tomar la agrupación como punto de partida porque crea agrupaciones de identidad antes de que una persona haya afirmado que el sujeto debe existir en la biblioteca.

freedam no lo hace, y la razón es la tercera fila de la figura 1.

Agrupar desconocidos frente a comparar con un conjunto de referencia sembrado por una persona PRIMERO AGRUPAR, DESPUÉS NOMBRAR El sistema propone identidades por su cuenta. Cada persona de la biblioteca se convierte en una entidad duradera, con nombre o sin él, haya preguntado alguien por ella o no. «¿Quién decidió que son la misma persona?» solo tiene como respuesta una versión de modelo. PRIMERO SEMBRAR, DESPUÉS COMPARAR Los rostros detectados quedan sin asignar. Una persona existe solo porque alguien la creó y le asoció un rostro. La comparación se hace solo con rostros que una persona ya asignó. «¿Quién decidió?» se responde con un id de usuario y una marca de tiempo. El modelo de la derecha luce peor en las demos y mejor ante las preguntas. No puede mostrar un muro con todas las personas de tu biblioteca, porque no sabe quién está en tu biblioteca. Eso es lo buscado: aquí una identidad la afirma una persona; no la produce un parámetro de agrupación.
Ambos enfoques usan los mismos embeddings y la misma distancia. Se diferencian solo en quién puede afirmar que dos rostros son la misma persona.

Ese diseño tiene una salvedad importante.

La decisión humana se toma una vez por persona, no una vez por rostro. Alguien selecciona un rostro, le pone un nombre y se crea una Person. Desde ese momento la persona tiene un conjunto de referencia, y los rostros que se detecten después se comparan con él automáticamente: todo lo que supere el umbral de similitud se asigna sin más confirmación. También existe una coincidencia masiva opcional en el momento de la asignación, que incorpora de una vez a la nueva persona los rostros sin asignar que ya existen.

Un humano no confirma cada rostro. Un humano crea una persona a partir de un rostro confirmado, y después el sistema extiende esa decisión a rostros similares de forma automática. Esto ofrece menos garantías que la confirmación rostro por rostro, pero mantiene la primera afirmación de identidad fuera de un paso de agrupación automática.

Eso hace que el umbral de similitud sea especialmente importante.

Medir el umbral de 0,6

El umbral es un ajuste del tenant, face_recognition.recognition_threshold, con valor por defecto 0,6 y limitado al rango de cero a uno. Los rostros con una similitud coseno igual o superior a ese valor respecto al rostro de referencia de una persona se asignan a esa persona.

El valor por defecto solo tiene sentido con la distribución que lo respalda. Por eso comparamos todos los pares posibles entre los 774 rostros de la biblioteca medida: 299.151 pares, sin muestreo.

Similitud coseno en los 299.151 pares de rostros, con dos modos separados PROPORCIÓN DE LOS 299.151 PARES, SEGÚN LA SIMILITUD COSENO 0 2 % 4 % 6 % 8 % cuatro barras recortadas al 8 %; valores reales 7,6; 23,3; 29,0; 16,6 % -0,2 0,0 0,2 0,4 0,6 0,8 1,0 0,167 par más alto de rostros de una misma foto 0,6 por defecto valle PARES IGUAL O POR ENCIMA DE 0,3031.295 0,3531.162 0,4030.814 0,5029.170 0,6023.691 0,7013.016 0,804391 de 299.151 Dos modos con casi nada entre ellos. El modo izquierdo son pares de personas distintas, con su pico justo por encima de cero. El modo derecho son pares de la misma persona. El fondo entre ambos, cerca de 0,30, contiene 133 pares: el 0,04 %. Un umbral en cualquier punto de esa depresión se comporta igual, lo que hace que la elección sea segura y no afortunada.
Todos los pares de 774 rostros reales, de forma exhaustiva, sin muestreo. Las cuatro barras más altas se recortan para que el modo derecho se lea bien; sus porcentajes reales se imprimen a su lado.

Las similitudes forman dos poblaciones. Los pares interpretados como personas distintas se agrupan justo por encima de cero, con una mediana de 0,029, mientras que los pares de la misma persona se agrupan alrededor de 0,65 a 0,70. Una depresión cerca de 0,30 contiene el 0,04 % de todos los pares.

Esas etiquetas siguen siendo una interpretación, así que buscamos una fuente estructural de no coincidencias conocidas.

Los pares de detecciones de rostros distintas dentro de una misma fotografía proporcionan no coincidencias sin necesidad de nombres. Hay 33 pares así en esta biblioteca, con valores de -0,021 a 0,167 y una media de 0,057; ninguno llega a 0,35 ni se acerca al umbral de 0,6.

Es una muestra pequeña de una sola biblioteca y un solo estilo visual, pero aporta un respaldo independiente a la ubicación de la población de menor similitud.

La misma tabla contiene además 1647 pares con una similitud coseno exactamente igual a 1,0 entre recursos distintos, lo que indica fotografías repetidas. Esto da una conexión incidental con el trabajo sobre casi duplicados y muestra también que los medios repetidos pueden afectar a las distribuciones de pares de rostros.

Qué cambia cuando se mueve el umbral

La distribución también nos permite medir si mover el umbral cambia la alcanzabilidad o, sobre todo, la cantidad de asignaciones automáticas.

Bajar el umbral apenas cambia la alcanzabilidad pero aumenta mucho los vínculos trazados ROSTROS CON AL MENOS UNA COINCIDENCIA, DE 774 PARES VINCULADOS 0,80 728 4391 0,70 747 13.016 0,60 758 23.691 0,50 763 29.170 0,35 766 31.162 DE 0,60 A 0,35 8 rostros más pasan a ser alcanzables. Es el 1,0 % del corpus. EL MISMO CAMBIO traza 7471 vínculos adicionales entre rostros. Es un aumento del 32 % en las afirmaciones hechas.
La alcanzabilidad se satura casi de inmediato. Todo lo que queda por debajo de las primeras centésimas del control se gasta en la densidad del grafo, no en si alguien se puede encontrar.

Con 0,6, 758 de los 774 rostros tienen al menos una coincidencia en la biblioteca. Bajar el umbral a 0,35 eleva esa cifra a 766, mientras que el número de pares aceptados como la misma persona sube de 23.691 a 31.162.

En este corpus, el umbral cambia el volumen de afirmaciones mucho más que la alcanzabilidad. Al llegar a la depresión, la mayoría de los rostros que tienen otra coincidencia ya son alcanzables, así que bajar el valor crea sobre todo más asignaciones automáticas de identidad y, con ellas, más oportunidades de falsas coincidencias.

El valor por defecto de 0,6 queda por encima de la depresión, en el flanco ascendente de la población de la misma persona. En comparación con 0,35, renuncia a ocho rostros alcanzables y rechaza 7471 asignaciones de pares adicionales. Por eso lo tratamos como un límite a las afirmaciones automáticas y no como un simple control de exhaustividad.

Los dieciséis rostros sin ninguna coincidencia, con cualquier umbral, aparecen una sola vez, de modo que ningún ajuste de similitud puede conectarlos con otra referencia. La interfaz debe dejar espacio para esos casos únicos en lugar de sugerir que todo rostro detectado puede identificarse automáticamente.

Los conjuntos de referencia que crecen pueden cambiar resultados anteriores

Asignar un rostro a una persona agranda el conjunto de referencia de esa persona, y un conjunto de referencia mayor puede coincidir con rostros que antes no tenían coincidencia posible. Un rostro fotografiado de perfil puede no coincidir con la única referencia frontal con la que se comparó y luego coincidir sin problema una vez añadida una foto de perfil. Por eso, tras cualquier asignación, el sistema vuelve a evaluar los rostros sin asignar en el entorno del que acaba de asignarse, y un comando aparte recorre todos los rostros sin asignar de la biblioteca contra todas las personas conocidas.

Como resultado, añadir una referencia puede cambiar las coincidencias de imágenes que ya estaban en la biblioteca, sin una nueva importación ni una nueva detección. La identidad se representa con un conjunto que crece y no con una única referencia fija.

Esto ayuda a encontrar fotografías anteriores cuando hay una referencia mejor, pero también significa que una revisión de protección de datos debe tener en cuenta la coincidencia retroactiva. Aquí importa un umbral conservador, porque una referencia nueva puede aplicar asignaciones automáticas en toda la biblioteca existente.

Los nombres de personas usan el motor de búsqueda normal

Cuando una persona tiene nombre, ese nombre se escribe en el documento de búsqueda del recurso: el mismo documento de texto por idioma de el primer artículo, construido por el mismo constructor, indexado por el mismo índice BM25 por idioma y fusionado con las mismas puntuaciones vectoriales mediante la misma fusión por posición recíproca. Los nombres se deduplican sin distinguir mayúsculas, y el campo lleva un peso configurable como cualquier otro, de modo que una organización que considere que las personas son más importantes que los nombres de archivo puede indicarlo numéricamente.

Los rostros sin nombre no contribuyen al documento de búsqueda ni al diccionario, así que no se pueden encontrar mediante una consulta por nombre. Esto se garantiza por la ausencia de una entrada de índice y no por una exclusión en el momento de la consulta.

La consecuencia es que buscar el nombre de un colega usa la maquinaria que describe toda esta serie, con todas sus propiedades: las garantías de exhaustividad bajo topes, el informe de exhaustividad, la fusión multilingüe y el panel que la mide. No hay un subsistema aparte de búsqueda de rostros que analizar, ni un segundo modelo de relevancia, ni un ranking paralelo que mantener coherente con el primero.

La frontera es, por tanto, simple: la detección produce geometría anónima, un humano introduce un nombre y la ruta existente de búsqueda de texto recupera ese nombre confirmado.

Lo que le diríamos a cualquiera que construya esto

  • Separa la detección del reconocimiento en la arquitectura, no solo en el vocabulario. Si no hay una costura entre la geometría anónima y la identidad afirmada, la decisión humana no tiene dónde vivir y no hay forma de responder «¿quién decidió esto?».
  • Diseña para la solicitud de retirada, no para la demo. La tarea con un costo alto tanto en la columna de falsa coincidencia como en la de fallo es la que fija tu arquitectura. Todo lo demás es un umbral.
  • Publica la distribución o no publiques el umbral. Un valor de similitud por defecto sin las distribuciones de impostores y genuinos que lo respalden es una constante mágica, y se copiará en el sistema de otra persona, donde significará algo distinto.
  • Busca etiquetas que tus datos te den gratis. Dos rostros de una misma fotografía son dos personas distintas. Ese único hecho estructural produjo un conjunto de validación sin anotación, sin costo y sin posibilidad de error de etiquetado.
  • Comprueba si tu umbral es siquiera un control de exhaustividad. El nuestro mueve la alcanzabilidad un 1 % y el volumen de afirmaciones un 32 % en el mismo intervalo. Son productos distintos, y el ajuste parece el primero.
  • Sé consciente de que un conjunto de referencia vuelve retroactiva la identidad. Cuando añadir un rostro cambia lo que el sistema dice de imágenes importadas hace años, es un comportamiento real con un público real, y debe ser una decisión documentada y no descubierta.
  • Decide pronto a qué se vincula el ciclo de vida de una plantilla. Dar a los datos biométricos su propio ciclo de vida independiente y atarlos a algo que ya controlas son opciones defendibles. Deslizarse hacia una de ellas sin elegir, no.
  • Di lo que no puedes hacer. No pudimos medir el costo de detectar sobre una vista previa reducida, así que este artículo no contiene ese número. Un artículo que se inventara uno valdría menos que uno que admite la laguna.

Dónde vive esto en el producto

La detección de rostros y la búsqueda de personas se ejecutan en el mismo despliegue que todo lo demás: el sidecar de InsightFace, la instancia de PostgreSQL que contiene los vectores, los workers de las colas. Ninguna imagen ni ninguna plantilla se envía a un servicio de terceros, lo cual explica en buena parte que todo el sistema sea práctico de autoalojar y es la diferencia entre una función que un equipo legal puede aprobar y una que no.

Una vez que una persona tiene nombre, se puede buscar en todos los lugares a los que llega la búsqueda: la galería, la API REST, el SDK de TypeScript y cualquier agente de IA conectado por MCP. Quién puede ejecutar esas búsquedas es una cuestión de control de acceso y no de rostros, y la resuelve el mismo modelo de permisos que rige cualquier otro recurso de la biblioteca.

Todos los números de este artículo proceden de una sola biblioteca, con los 299.151 pares comparados y no muestreados. Otra mezcla de fotografía, iluminación y encuadre puede producir otra distribución y otro umbral, así que lo transferible es el método: calcular la distribución local de pares y usar no coincidencias conocidas por su estructura para validar su interpretación.

A continuación en esta serie: búsqueda conversacional, donde un modelo de lenguaje se coloca delante de todo esto y recibe una única tarea que no tiene nada que ver con mirar imágenes.

Para desarrolladores

Sigue leyendo