Búsqueda semántica de imágenes con OpenAI CLIP y Meta FAISS
Introducción
Esta guía le guiará a través de la construcción de un motor de búsqueda semántica de imágenes utilizando OpenAI CLIP, Meta FAISS y Flask. Combinando las potentes incrustaciones de lenguaje visual de CLIP con la eficiente búsqueda de vecino más cercano de FAISS, puedes crear una interfaz web totalmente funcional en la que recuperar imágenes relevantes mediante consultas de lenguaje natural.
Vista previa 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 las imágenes y un codificador de texto (basado en Transformer) para el lenguaje, con el fin de proyectar ambos en el mismo espacio de incrustación multimodal. Esto permite la comparación directa entre texto e imágenes mediante la similitud del coseno.
- FAISS (Facebook AI Similarity Search) construye un índice de las imágenes incrustadas y permite una recuperación rápida y escalable de los vectores más cercanos a una consulta determinada.
- Flask proporciona una sencilla interfaz web para enviar consultas en lenguaje natural y mostrar imágenes del índice que coincidan semánticamente.
Esta arquitectura admite la búsqueda sin disparos, lo que significa que no se necesitan etiquetas ni categorías, sólo datos de imagen y una buena indicación.
Búsqueda semántica de imágenes con el paquetePython Ultralytics
Advertencia de ruta de imagen
Si utiliza sus propias imágenes, asegúrese 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 imágenes e incrustaciones de texto mediante CLIP.
- Realiza la búsqueda de similitud utilizando la similitud coseno.
Búsqueda de imágenes similares
Advertencia de ruta de imagen
Si utiliza sus propias imágenes, asegúrese 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 muestra los parámetros disponibles para VisualAISearch
:
Argumento | Tipo | Por defecto | Descripción |
---|---|---|---|
data |
str |
images |
Ruta al directorio de imágenes utilizado para la búsqueda de similitudes. |
Argumento | Tipo | Por defecto | Descripción |
---|---|---|---|
device |
str |
None |
Especifica el dispositivo para la inferencia (por ejemplo, cpu , cuda:0 o 0 ). Permite a los usuarios seleccionar entre CPU, un GPU específico 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
Construir su propio sistema de búsqueda semántica de imágenes con CLIP y FAISS ofrece varias ventajas convincentes:
-
Capacidades Zero-Shot: No es necesario entrenar el modelo en un conjunto de datos específico. El aprendizaje cero de CLIP le permite realizar consultas de búsqueda en cualquier conjunto de datos de imágenes utilizando lenguaje natural de forma libre, lo que ahorra tiempo y recursos.
-
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".
-
Sin necesidad de etiquetas ni metadatos: Los sistemas tradicionales de búsqueda de imágenes requieren datos cuidadosamente etiquetados. Este enfoque sólo necesita imágenes en bruto. CLIP genera incrustaciones sin necesidad de anotaciones manuales.
-
Búsqueda flexible y escalable: FAISS permite una búsqueda rápida del vecino más próximo incluso con conjuntos de datos a gran escala. Está optimizado para ofrecer velocidad y memoria, lo que permite responder en tiempo real incluso con miles (o millones) de incrustaciones.
-
Aplicaciones multidominio: Tanto si está creando un archivo personal de fotos, una herramienta de inspiración creativa, un motor de búsqueda de productos o incluso un sistema de recomendación de obras de arte, esta pila se adapta a diversos dominios con unos 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. Se entrena con un enorme conjunto de datos de imágenes emparejadas con leyendas en lenguaje natural. Este entrenamiento le permite mapear tanto las imágenes como el texto en un espacio de incrustación compartido, de modo que puede compararlos directamente utilizando la similitud vectorial.
¿Por qué se considera que CLIP es tan potente para tareas de IA?
Lo que hace que CLIP destaque es su capacidad de generalización. En lugar de ser entrenado sólo para etiquetas o tareas específicas, aprende del propio lenguaje natural. Esto le permite manejar consultas flexibles como "un hombre montando en moto acuática" o "un paisaje onírico surrealista", 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 conjunto de herramientas que te ayuda a buscar en vectores de alta dimensión de forma muy eficiente. Una vez que CLIP convierte tus imágenes en incrustaciones, 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é utilizar Ultralytics si CLIP y FAISS son de OpenAI y Meta?
Mientras que CLIP y FAISS han sido desarrollados por OpenAI y Meta respectivamente, el paquetePython Ultralytics simplifica su integración en un completo canal 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 imágenes y textos incrustados basada en CLIP.
- Creación y gestión de índices FAISS.
- Búsqueda semántica eficiente con similitud coseno.
- Carga y visualización de imágenes basadas en directorios.
¿Puedo personalizar la interfaz de esta aplicación?
Sí, puedes hacerlo. La configuración actual utiliza Flask con un frontend HTML básico, pero usted es libre de cambiar su propio HTML o incluso construir algo más dinámico con React, Vue, u otro marco frontend. Flask puede servir fácilmente como la API de backend para su interfaz personalizada.
¿Es posible buscar a través de vídeos en lugar de imágenes estáticas?
No directamente, pero hay una solución sencilla. Puedes extraer fotogramas individuales de tus vídeos (por ejemplo, uno cada segundo), tratarlos como imágenes independientes e introducirlos en el sistema. De este modo, el motor de búsqueda puede indexar semánticamente los momentos visuales de tus vídeos.