¿Estás visitando desde Perú?
Ingresá a Linware Perú ⯈
Continuar en Linware Perú ⯈
×
¿Qué estás buscando?
BUSCAR!
BLOG
5 componentes técnicos de la búsqueda de similitud de imágenes
Publicada el 14/03/2023

En la primera parte de esta serie de publicaciones de blog, se presenta la búsqueda de similitud de imágenes y revisamos una arquitectura de alto nivel que puede reducir la complejidad y facilitar la implementación. Este blog explica los conceptos subyacentes y las consideraciones técnicas de cada componente necesario para implementar una aplicación de búsqueda de similitud de imágenes. Aprender más acerca de:

  1. Modelos integrados: modelos de aprendizaje automático que generan la representación numérica de sus datos necesarios para aplicar la búsqueda vectorial
  2. Punto final de inferencia: API para aplicar los modelos de incrustación a sus datos en Elastic
  3. Búsqueda vectorial: cómo funciona la búsqueda por similitud con la búsqueda del vecino más cercano
  4. Genera incrustaciones de imágenes: escala la generación de representaciones numéricas a grandes conjuntos de datos
  5. Lógica de la aplicación: cómo se comunica el front-end interactivo con el motor de búsqueda de vectores en el back-end

Profundizar en estos cinco componentes le brinda un plan de cómo puede implementar experiencias de búsqueda más intuitivas aplicando la búsqueda vectorial en Elastic.

 

1. Modelos de incrustación

Para aplicar la búsqueda de similitud al lenguaje natural o datos de imágenes, necesita modelos de aprendizaje automático que traduzcan sus datos a su representación numérica, también conocida como incrustaciones de vectores. En este ejemplo:

  • El modelo “transformador” de la PNL traduce el lenguaje natural a un vector.
  • El modelo OpenAI CLIP (Contrastive Language-Image Pre-training) vectoriza imágenes.

Los modelos de transformadores son modelos de aprendizaje automático entrenados para procesar datos de lenguaje natural de varias maneras, como traducción de idiomas, clasificación de texto o reconocimiento de entidades nombradas. Están capacitados en conjuntos de datos extremadamente grandes de datos de texto anotados para aprender los patrones y estructuras del lenguaje humano. 

 

La aplicación de similitud de imágenes encuentra imágenes que coinciden con descripciones textuales dadas en lenguaje natural. Para implementar ese tipo de búsqueda de similitud, necesita un modelo que haya sido entrenado tanto en texto como en imágenes y que pueda traducir la consulta de texto en un vector. Esto se puede usar para encontrar imágenes similares. 

 

Obtenga más información sobre cómo cargar y usar el modelo NLP en Elasticsearch >>

 

CLIP es un modelo de lenguaje a gran escala desarrollado por OpenAI que puede manejar tanto texto como imágenes. El modelo está entrenado para predecir la representación textual de una imagen, dado un pequeño fragmento de texto como entrada. Esto implica aprender a alinear las representaciones visuales y textuales de una imagen de manera que permita al modelo hacer predicciones precisas. 

 

Otro aspecto importante de CLIP es que es un modelo de "disparo cero", lo que le permite realizar tareas para las que no ha sido entrenado específicamente. Por ejemplo, puede traducir entre idiomas que no ha visto durante el entrenamiento o clasificar imágenes en categorías que no ha visto antes. Esto convierte a CLIP en un modelo muy flexible y versátil.

 

Usará el modelo CLIP para vectorizar sus imágenes, usando el punto final de inferencia en Elastic como se describe a continuación y ejecutando la inferencia en un gran conjunto de imágenes como se describe en la sección 3 más adelante.

 

2. El punto final de la inferencia

Una vez que el modelo NLP se carga en Elasticsearch, puede procesar una consulta de usuario real. Primero, debe traducir el texto de la consulta a un vector utilizando el punto final _infer de Elasticsearch. El punto final proporciona un método integrado para usar el modelo NLP de forma nativa en Elastic y no requiere consultar un servicio externo, lo que simplifica significativamente la implementación .

 
POST _ml/trained_models/sentence-transformers__clip-vit-b-32-multilingual-v1/deployment/_infern{n  "docs" : [n    {"text_field": "A mountain covered in snow"}n    ]n}
 
 
#  Run kNN search against  obtained abovenPOST <your-image-index>/_searchn{n  "fields": [...],n  "knn": {n    "field": "image_embedding",n    "k": 5,n    "num_candidates": 10,n    "query_vector": <query-embedding>n  }n}Lee mas
 
 

Para obtener más información sobre kNN en Elastic, consulte nuestra documentación: https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html .

 
 

4. Genera incrustaciones de imágenes

Las incrustaciones de imágenes mencionadas anteriormente son fundamentales para un buen rendimiento de su búsqueda de similitud de imágenes. Deben almacenarse en un índice separado que contenga las incrustaciones de imágenes, lo que se conoce como your-image-index en el código anterior. El índice consta de un documento por imagen junto con campos para el contexto y el vector denso (incrustación de imágenes) interpretación de la imagen. Las incrustaciones de imágenes representan una imagen en un espacio de menor dimensión. Las imágenes similares se asignan a puntos cercanos en este espacio. La imagen sin procesar puede tener varios MB de tamaño, dependiendo de su resolución.

Los detalles específicos de cómo se generan estas incorporaciones pueden variar. En general, este proceso implica extraer características de las imágenes y luego mapearlas en un espacio de menor dimensión utilizando una función matemática. Esta función generalmente se entrena en un gran conjunto de datos de imágenes para aprender la mejor manera de representar las características en el espacio de menor dimensión. La generación de incrustaciones es una tarea de una sola vez.

En este blog, emplearemos elCLIP modelo para este fin. Es distribuido por OpenAI y proporciona un buen punto de partida. Es posible que deba entrenar un modelo de incrustación personalizado para casos de uso especializados para lograr el rendimiento deseado, según qué tan bien se representen los tipos de imágenes que desea clasificar en los datos disponibles públicamente que se usan para entrenar el modelo CLIP.

La generación de incrustaciones en Elastic debe ocurrir en el momento de la ingesta y, por lo tanto, en un proceso externo a la búsqueda, con los siguientes pasos:

  1. Cargue el modelo CLIP.
  2. Para cada imagen:
    1. Carga la imagen.
    2. Evalúa la imagen usando el modelo.
    3. Guarde las incrustaciones generadas en un documento.
    4. Guarde el documento en el almacén de datos/Elasticsearch.

El pseudocódigo hace que estos pasos sean más concretos y puedes acceder al código completo en el repositorio de ejemplo.

 
...nimg_model = SentenceTransformer('clip-ViT-B-32')n...nfor filename in glob.glob(PATH_TO_IMAGES, recursive=True):n    doc = {}n    image = Image.open(filename)n    embedding = img_model.encode(image)n    doc['image_name'] = os.path.basename(filename)n    doc['image_embedding'] = embedding.tolist()n    lst.append(doc)n...Lee mas
 
 
El documento después del procesamiento podría tener el siguiente aspecto. La parte crítica es el campo " image_embedding " donde se almacena la representación vectorial densa.
 
{n   "_index": "my-image-embeddings",n   "_id": "_g9ACIUBMEjlQge4tztV",n   "_score": 6.703597,n   "_source": {n     "image_id": "IMG_4032",n     "image_name": "IMG_4032.jpeg",n     "image_embedding": [n       -0.3415695130825043,n       0.1906963288784027,n       .....n       -0.10289803147315979,n       -0.15871885418891907n       ],n     "relative_path": "phone/IMG_4032.jpeg"n   }n}Lee mas
 
 

5. La lógica de la aplicación

Sobre la base de estos componentes básicos, finalmente puede juntar todas las piezas y trabajar a través de la lógica para implementar una búsqueda interactiva de similitud de imágenes. Comencemos conceptualmente, con lo que debe suceder cuando desea recuperar de forma interactiva imágenes que coincidan con una descripción dada.

Para consultas textuales, la entrada puede ser tan simple como una sola palabra como rosas o una descripción más extensa como "una montaña cubierta de nieve". O también puede proporcionar una imagen y solicitar imágenes similares a la que tiene.

Aunque está utilizando diferentes modalidades para formular su consulta, ambas se ejecutan utilizando la misma secuencia de pasos en la búsqueda de vectores subyacente, es decir, utilizando una consulta (kNN) sobre documentos representados por sus incrustaciones (como vectores "densos"). Hemos descrito los mecanismos en secciones anteriores que permiten a Elasticsearch ejecutar búsquedas vectoriales muy rápidas y escalables necesarias en grandes conjuntos de datos de imágenes. Consulte esta documentación para obtener más información sobre cómo ajustar la búsqueda de kNN en Elastic para lograr eficiencia.

  • Entonces, ¿cómo se puede implementar la lógica descrita anteriormente? En el siguiente diagrama de flujo, puede ver cómo fluye la información: la consulta emitida por el usuario, como texto o imagen, es vectorizada por el modelo de incrustación, según el tipo de entrada: un modelo NLP para descripciones de texto, mientras que el modelo CLIP para imágenes.  
  • Ambos convierten la consulta de entrada en su representación numérica y almacenan el resultado en un tipo de vector denso en Elasticsearch ([número, número, número...]).
  • La representación vectorial se usa luego en una búsqueda kNN para encontrar vectores similares (imágenes), que se devuelven como resultado.
 
 

Inferencia: Vectorizar consultas de usuario

La aplicación en segundo plano enviará una solicitud a la API de inferencia en Elasticsearch. Para la entrada de texto, algo como esto:

 
POST _ml/trained_models/sentence-transformers__clip-vit-b-32-multilingual-v1/deployment/_infern{n  "docs" : [n    {"text_field": "A mountain covered in snow"}n    ]n}
 
 

Para las imágenes, puede usar el código simplificado a continuación para procesar una sola imagen con el modelo CLIP, que necesitaba cargar en su nodo de aprendizaje automático de Elastic con anticipación:

 
model = SentenceTransformer('clip-ViT-B-32')nimage = Image.open(file_path)  nembedding = model.encode(image)
 
 

Obtendrá una matriz de 512 valores de Float32, como esta:

 
{n  "predicted_value" : [n    -0.26385045051574707,n    0.14752596616744995,n    0.4033305048942566,n    0.22902603447437286,n    -0.15598160028457642,n    ...n  ]n}
 
 

Buscar: Para imágenes similares

La búsqueda funciona igual para ambos tipos de entrada. Envíe la consulta con la definición de búsqueda kNN contra el índice con incrustaciones de imágenes my-image-incrustaciones . Coloque el vector denso de la consulta anterior ( "query_vector": [ ... ] ) y ejecute la búsqueda.

 
GET my-image-embeddings/_searchn{n  "knn": {n    "field": "image_embedding",n    "k": 5,n    "num_candidates": 10,n    "query_vector": [n    -0.19898493587970734,n    0.1074572503566742,n    -0.05087625980377197,n    ...n    0.08200495690107346,n    -0.07852292060852051n  ]n  },n  "fields": [n    "image_id", "image_name", "relative_path"nn  ],n  "_source": falsen}Lee mas
 
 

La respuesta de Elasticsearch le brindará las mejores imágenes coincidentes según nuestra consulta de búsqueda kNN, almacenada en Elastic como documentos.

 

El siguiente gráfico de flujo resume los pasos por los que se mueve su aplicación interactiva mientras procesa una consulta de usuario:

  1. Cargue la aplicación interactiva, su interfaz.
  2. El usuario selecciona una imagen que le interesa.
  3. Su aplicación vectoriza la imagen aplicando el modelo CLIP, almacenando la incrustación resultante como un vector denso.
  4. La aplicación inicia una consulta kNN en Elasticsearch, que toma la incrustación y devuelve sus vecinos más cercanos.
  5. Su aplicación procesa la respuesta y muestra una (o más) imágenes coincidentes.
 
 

Ahora que comprende los componentes principales y el flujo de información necesarios para implementar una búsqueda interactiva de similitud de imágenes, puede recorrer la parte final de la serie para aprender cómo hacerlo realidad. Obtendrá una guía paso a paso sobre cómo configurar el entorno de la aplicación, importar el modelo NLP y finalmente completar la generación de incrustación de imágenes. Luego podrá buscar imágenes con lenguaje natural, sin necesidad de palabras clave. 

Comience a configurar la búsqueda de similitud de imágenes >>

Ir al Blog