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 de imágenes semántica utilizando OpenAI CLIP, Meta FAISS y Flask. Al combinar las potentes incrustaciones de lenguaje visual de CLIP con la eficiente búsqueda de vecinos más cercanos de FAISS, puedes crear una interfaz web completamente funcional donde puedes recuperar imágenes relevantes utilizando consultas en lenguaje natural.
Ver: ¿Cómo funciona la búsqueda por similitud | Búsqueda visual utilizando OpenAI CLIP, META FAISS y el paquete Ultralytics 🎉?
Vista Previa Visual de la Búsqueda Semántica de Imágenes
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, para proyectar ambos en el mismo espacio de incrustación multimodal. Esto permite la comparación directa entre texto e imágenes utilizando la similitud coseno.
- FAISS (Facebook AI Similarity Search) crea un índice de las incrustaciones de imágenes y permite una recuperación rápida y escalable de los vectores más cercanos a una consulta dada.
- Flask proporciona una interfaz web sencilla para enviar consultas en lenguaje natural y mostrar imágenes coincidentes semánticamente del índice.
Esta arquitectura admite la búsqueda zero-shot, lo que significa que no necesita etiquetas ni categorías, solo datos de imagen y un buen prompt.
Búsqueda Semántica de Imágenes utilizando el paquete de python Ultralytics
Advertencia de la ruta de la imagen
Si estás utilizando 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 servicio de archivos de Flask.
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 i.e "cpu" or "cuda"
)
app.run(debug=False) # You can also use `debug=True` argument for testing
VisualAISearch
clase
Esta clase realiza todas las operaciones de backend:
- Carga o construye un índice FAISS a partir de imágenes locales.
- Extrae incrustaciones de imágenes y texto utilizando CLIP.
- Realiza una búsqueda de similitud utilizando la similitud coseno.
Búsqueda de Imágenes Similares
Advertencia de la ruta de la imagen
Si estás utilizando 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 servicio de archivos de Flask.
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 i.e "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
VisualAISearch
Parámetros
La siguiente tabla describe los parámetros disponibles para VisualAISearch
:
Argumento | Tipo | Predeterminado | Descripción |
---|---|---|---|
data |
str |
'images' |
Ruta al directorio de imágenes utilizado para la búsqueda de similitud. |
Argumento | Tipo | Predeterminado | Descripción |
---|---|---|---|
device |
str |
None |
Especifica 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 cálculo para la ejecución del modelo. |
Ventajas de la búsqueda semántica de imágenes con CLIP y FAISS
La creación de tu propio sistema de búsqueda de imágenes semánticas con CLIP y FAISS ofrece varias ventajas convincentes:
-
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 utilizando lenguaje natural de forma libre, ahorrando tiempo y recursos.
-
Comprensión similar a la humana: A diferencia de los motores de búsqueda basados en palabras clave, CLIP comprende el contexto semántico. Puede recuperar imágenes basadas en consultas abstractas, emocionales o relacionales como "un niño feliz en la naturaleza" o "un horizonte futurista de la ciudad por la noche".
-
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 incrustaciones sin necesidad de ninguna anotación manual.
-
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 incrustaciones.
-
Aplicaciones entre dominios: Ya sea que esté 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, esta pila se adapta a diversos dominios con ajustes mínimos.
Preguntas frecuentes
¿Cómo entiende CLIP tanto imágenes como 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 emparejadas con subtítulos en lenguaje natural. Este entrenamiento le permite mapear tanto imágenes como texto en un espacio de incrustación compartido, de modo que pueda compararlos directamente utilizando la similitud vectorial.
¿Por qué se considera que CLIP es tan potente para las tareas de IA?
Lo que hace que CLIP destaque es su capacidad de generalizar. En lugar de ser entrenado solo para etiquetas o tareas específicas, aprende del lenguaje natural en sí mismo. Esto le permite manejar consultas flexibles como “un hombre montando una moto acuática” o “un paisaje onírico surrealista”, haciéndolo útil para todo, desde la clasificación hasta la búsqueda semántica creativa, sin necesidad de volver a entrenar.
¿Qué hace exactamente FAISS en este proyecto (Búsqueda Semántica)?
FAISS (Facebook AI Similarity Search) es un conjunto 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 sea rápido y fácil encontrar las coincidencias más cercanas a una consulta de texto, perfecto para la recuperación de imágenes en tiempo real.
¿Por qué usar el paquete de python de Ultralytics si CLIP y FAISS son de OpenAI y Meta?
Si bien CLIP y FAISS son desarrollados por OpenAI y Meta respectivamente, el paquete de Ultralytics python 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 i.e "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 incrustaciones de imágenes y texto basadas en CLIP.
- Creación y gestión de índices FAISS.
- Búsqueda semántica eficiente con similitud coseno.
- Carga de imágenes basada en directorios y visualización.
¿Puedo personalizar el frontend de esta aplicación?
Sí, absolutamente. La configuración actual utiliza Flask con un frontend HTML básico, pero puede cambiarlo por su propio HTML o incluso construir algo más dinámico con React, Vue u otro framework de frontend. Flask puede servir fácilmente como la API de backend para su interfaz personalizada.
¿Es posible buscar en videos en lugar de imágenes estáticas?
No directamente, pero hay una solución sencilla. Puede extraer fotogramas individuales de sus videos (por ejemplo, uno cada segundo), tratarlos como imágenes independientes e introducirlos en el sistema. De esta manera, el motor de búsqueda puede indexar semánticamente los momentos visuales de sus videos.