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:
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.
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:
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.
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}
Después de indexar consultas y documentos con incrustaciones de vectores, los documentos similares son los vecinos más cercanos de su consulta en el espacio de incrustaciones. Un algoritmo popular para lograrlo es k-vecino más cercano (kNN), que encuentra los k vectores más cercanos a un vector de consulta. Sin embargo, en los grandes conjuntos de datos que normalmente procesaría en aplicaciones de búsqueda de imágenes, kNN requiere recursos computacionales muy altos y puede generar tiempos de ejecución excesivos. Como solución, la búsqueda del vecino más próximo aproximado (ANN, por sus siglas en inglés) sacrifica la precisión perfecta a cambio de una ejecución eficiente en espacios de incrustación de alta dimensión, a escala.
En Elastic, el extremo _search admite búsquedas de vecinos más cercanos exactas y aproximadas. Utilice el siguiente código para la búsqueda de kNN. Asume las incrustaciones de todas las imágenes en your-image-indexestán disponibles en el campo image_embedding . La siguiente sección explica cómo puede crear las incrustaciones.
# 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 .
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:
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
{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
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.
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}
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:
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 >>