Búsqueda semántica de imágenes con OpenAI CLIP y Meta FAISS

Introducción

Esta guía te explica cómo construir un motor de búsqueda semántica de imágenes usando OpenAI CLIP, Meta FAISS y Flask. Al combinar los potentes embeddings visuales-lingüísticos de CLIP con la búsqueda eficiente de vecinos más cercanos de FAISS, puedes crear una interfaz web totalmente funcional donde recuperar imágenes relevantes mediante consultas en lenguaje natural.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

Vista previa visual de la búsqueda semántica de imágenes

Vista general de la página web de Flask con resultados de búsqueda semántica

Cómo funciona

  • CLIP utiliza un codificador de visión (por ejemplo, ResNet o ViT) para imágenes y un codificador de texto (basado en Transformer) para el lenguaje, con el fin de proyectar ambos en el mismo espacio multimodal de embeddings. Esto permite la comparación directa entre texto e imágenes utilizando la similitud de coseno.
  • FAISS (Facebook AI Similarity Search) crea un índice de los embeddings de las imágenes y permite una recuperación rápida y escalable de los vectores más cercanos a una consulta determinada.
  • Flask proporciona una interfaz web sencilla para enviar consultas en lenguaje natural y mostrar imágenes con coincidencia semántica desde el índice.

Esta arquitectura admite la búsqueda zero-shot, lo que significa que no necesitas etiquetas ni categorías, solo datos de imágenes y un buen prompt.

Búsqueda semántica de imágenes utilizando el paquete de Python de Ultralytics
Advertencia sobre la ruta de las imágenes

Si utilizas tus propias imágenes, asegúrate de proporcionar una ruta absoluta al directorio de imágenes. De lo contrario, es posible que las imágenes no aparezcan en la página web debido a las limitaciones de Flask para servir archivos.

from ultralytics import solutions

app = solutions.SearchApp(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cpu"  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

Clase VisualAISearch

Esta clase realiza todas las operaciones de backend:

  • Carga o construye un índice FAISS a partir de imágenes locales.
  • Extrae embeddings de imágenes y texto usando CLIP.
  • Realiza la búsqueda de similitud utilizando la similitud de coseno.
Búsqueda de imágenes similares
Advertencia sobre la ruta de las imágenes

Si utilizas tus propias imágenes, asegúrate de proporcionar una ruta absoluta al directorio de imágenes. De lo contrario, es posible que las imágenes no aparezcan en la página web debido a las limitaciones de Flask para servir archivos.

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Parámetros de VisualAISearch

La siguiente tabla describe los parámetros disponibles para VisualAISearch:

ArgumentoTipoPredeterminadoDescripción
datastr'images'Ruta al directorio de imágenes usado para la búsqueda de similitud.
ArgumentoTipoPredeterminadoDescripción
devicestrNoneEspecifica el dispositivo para la inferencia (p. ej., cpu, cuda:0 o 0). Permite a los usuarios seleccionar entre CPU, una GPU específica u otros dispositivos de computación para la ejecución del modelo.

Ventajas de la búsqueda semántica de imágenes con CLIP y FAISS

Construir tu propio sistema de búsqueda semántica de imágenes con CLIP y FAISS ofrece varias ventajas convincentes:

  1. Capacidades Zero-Shot: No necesitas entrenar el modelo en tu conjunto de datos específico. El aprendizaje zero-shot de CLIP te permite realizar consultas de búsqueda en cualquier conjunto de datos de imágenes mediante lenguaje natural de forma libre, ahorrando tiempo y recursos.

  2. Comprensión similar a la humana: A diferencia de los motores de búsqueda basados en palabras clave, CLIP entiende el contexto semántico. Puede recuperar imágenes basadas en consultas abstractas, emocionales o relacionales como "un niño feliz en la naturaleza" o "el horizonte de una ciudad futurista por la noche".

    Flujo de trabajo de recuperación de imágenes de OpenAI Clip

  3. Sin necesidad de etiquetas ni metadatos: Los sistemas tradicionales de búsqueda de imágenes requieren datos cuidadosamente etiquetados. Este enfoque solo necesita imágenes sin procesar. CLIP genera embeddings sin necesidad de ninguna anotación manual.

  4. Búsqueda flexible y escalable: FAISS permite una búsqueda rápida de vecinos más cercanos incluso con conjuntos de datos a gran escala. Está optimizado para la velocidad y la memoria, lo que permite una respuesta en tiempo real incluso con miles (o millones) de embeddings.

    Flujo de trabajo de creación de vectores de embedding de Meta FAISS

  5. Aplicaciones en diversos dominios: Ya sea que estés construyendo un archivo de fotos personal, una herramienta de inspiración creativa, un motor de búsqueda de productos o incluso un sistema de recomendación de arte, este stack se adapta a diversos dominios con ajustes mínimos.

Preguntas frecuentes

¿Cómo entiende CLIP tanto las imágenes como el texto?

CLIP (Contrastive Language Image Pretraining) es un modelo desarrollado por OpenAI que aprende a conectar información visual y lingüística. Está entrenado en un conjunto de datos masivo de imágenes combinadas con subtítulos en lenguaje natural. Este entrenamiento le permite asignar tanto imágenes como texto a un espacio de embedding compartido, para que puedas compararlos directamente usando la similitud vectorial.

¿Por qué CLIP se considera tan potente para las tareas de IA?

Lo que hace que CLIP destaque es su capacidad para generalizar. En lugar de ser entrenado solo para etiquetas o tareas específicas, aprende del propio lenguaje natural. Esto le permite manejar consultas flexibles como “un hombre montando una moto de agua” o “un paisaje surrealista de ensueño”, lo que lo hace útil para todo, desde la clasificación hasta la búsqueda semántica creativa, sin necesidad de reentrenamiento.

¿Qué hace exactamente FAISS en este proyecto (búsqueda semántica)?

FAISS (Facebook AI Similarity Search) es un kit de herramientas que te ayuda a buscar a través de vectores de alta dimensión de manera muy eficiente. Una vez que CLIP convierte tus imágenes en embeddings, FAISS hace que encontrar las coincidencias más cercanas a una consulta de texto sea rápido y fácil, perfecto para la recuperación de imágenes en tiempo real.

Why use the Ultralytics Python package if CLIP and FAISS are from OpenAI and Meta?

Aunque CLIP y FAISS son desarrollados por OpenAI y Meta respectivamente, el paquete de Python de Ultralytics simplifica su integración en un pipeline completo de búsqueda semántica de imágenes en un flujo de trabajo de 2 líneas que simplemente funciona:

Búsqueda de imágenes similares
from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

Esta implementación de alto nivel maneja:

  • Generación de embeddings de imágenes y texto basada en CLIP.
  • Creación y gestión de índices FAISS.
  • Búsqueda semántica eficiente con similitud de coseno.
  • Carga de imágenes basada en directorios y visualización.

¿Puedo personalizar el frontend de esta aplicación?

Sí. La configuración actual utiliza Flask con un frontend HTML básico, pero puedes reemplazarlo con tu propio HTML o construir una interfaz de usuario más dinámica con React, Vue u otro framework de frontend. Flask puede servir como la API de backend para tu interfaz personalizada.

¿Es posible realizar búsquedas en videos en lugar de imágenes estáticas?

No directamente. Una solución sencilla es extraer fotogramas individuales de tus videos (por ejemplo, uno cada segundo), tratarlos como imágenes independientes y alimentarlos al sistema. De esta manera, el motor de búsqueda puede indexar semánticamente los momentos visuales de tus videos.

Comentarios