Ultralytics YOLO27:
Get Started

Cómo crear una búsqueda semántica de imágenes con OpenAI CLIP#

Esta guía te explica paso a paso cómo crear un motor de búsqueda semántica de imágenes con OpenAI CLIP y Flask. Al combinar los embeddings visuales y lingüísticos de CLIP con una búsqueda rápida por similitud coseno basada en NumPy, puedes crear una interfaz web que recupere imágenes relevantes a partir de consultas en lenguaje natural, sin necesidad de etiquetas ni categorías.



Ver: Cómo funciona la búsqueda por similitud | Búsqueda visual con OpenAI CLIP y el paquete Ultralytics 🎉

Página web de Flask con una vista general de los resultados de búsqueda semántica

El paquete Python de Ultralytics integra todo este flujo en dos clases, para que puedas poner en marcha una aplicación de búsqueda funcional o ejecutar consultas mediante programación con unas pocas líneas. Esta guía explica por qué es útil la búsqueda semántica, cómo funciona, cómo ejecutar la aplicación web, cómo buscar mediante programación y cómo configurar los parámetros.

Crear tu propio sistema de búsqueda semántica de imágenes con CLIP ofrece varias ventajas importantes:

  • Capacidades de aprendizaje zero-shot: No necesitas entrenar el modelo con tu conjunto de datos. El aprendizaje zero-shot de CLIP te permite consultar cualquier colección de imágenes con texto libre en lenguaje natural, ahorrando tiempo y recursos.
  • Comprensión similar a la humana: A diferencia de la búsqueda por palabras clave, CLIP entiende el contexto semántico y recupera imágenes a partir de consultas abstractas, emocionales o relacionales, como «un niño feliz en la naturaleza» o «el perfil de una ciudad futurista por la noche».
  • Sin etiquetas ni metadatos: Este enfoque solo necesita imágenes sin procesar. CLIP genera embeddings sin necesidad de anotación manual.
  • Búsqueda ligera y exacta: Una única multiplicación de matrices normalizadas en NumPy ordena todas las imágenes por similitud coseno y ofrece resultados exactos en tiempo real para miles de embeddings, sin necesidad de instalar ni gestionar dependencias de búsqueda adicionales.
  • Aplicaciones en distintos ámbitos: Tanto si estás creando un archivo personal de fotos, una herramienta para encontrar inspiración creativa, un motor de búsqueda de productos o un sistema de recomendación de arte, puedes adaptar la misma pila tecnológica con cambios mínimos.

Cómo funciona la búsqueda semántica de imágenes#

El flujo combina tres componentes, cada uno de los cuales se encarga de una fase de la conversión de imágenes y texto en resultados ordenados:

  • CLIP utiliza un codificador visual (p. ej., ResNet o ViT) para las imágenes y un codificador de texto (basado en Transformer) para el lenguaje, y proyecta ambos en el mismo espacio de embeddings multimodal. Esto permite comparar directamente texto e imágenes mediante la similitud coseno.
  • NumPy almacena los embeddings de imágenes en una sola matriz y los compara con un embedding de consulta mediante una única multiplicación de matrices. Así devuelve los vectores más cercanos según su similitud coseno sin depender de sistemas adicionales de indexación.
  • Flask proporciona una sencilla interfaz web para enviar consultas en lenguaje natural y mostrar imágenes del índice que coinciden semánticamente.

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

Como las imágenes y el texto se representan en el mismo espacio vectorial, la recuperación es zero-shot: no necesitas etiquetas ni categorías, solo los datos de imagen y una buena instrucción.

Ejecuta la aplicación web de búsqueda semántica#

La clase SearchApp inicia toda la interfaz de Flask. La primera vez que se ejecuta, descarga un conjunto de imágenes de ejemplo, crea el índice de embeddings y sirve una página en la que puedes escribir una consulta y ver los resultados ordenados.

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, puede 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="images",  # sustitúyelo por una ruta para crear el motor de búsqueda con tus propias imágenes
    device="cpu",  # configura el dispositivo para el procesamiento, p. ej., "cpu" o "cuda"
)

app.run(debug=False)  # También puedes usar el argumento `debug=True` para hacer pruebas

Busca imágenes mediante programación#

La clase VisualAISearch realiza todas las operaciones del backend sin la capa web:

  • Carga o crea un índice de embeddings a partir de imágenes locales.
  • Extrae embeddings de imágenes y texto con CLIP.
  • Realiza búsquedas de similitud mediante la similitud coseno.

Llama al buscador con una consulta en lenguaje natural para obtener una lista de nombres de archivo de imagen coincidentes, ordenados por similitud:

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    data="images",  # sustitúyelo por una ruta para crear el motor de búsqueda con tus propias imágenes
    device="cpu",  # configura el dispositivo para el procesamiento, p. ej., "cpu" o "cuda"
)

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

# Resultados ordenados:
# - 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

Configura los parámetros de VisualAISearch#

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

ArgumentoTipoPredeterminadoDescripción
datastr'images'Ruta al directorio de imágenes que se va a indexar y consultar.
devicestr'cpu'Dispositivo utilizado para la inferencia de CLIP (p. ej., cpu, cuda, 0).
Gestiona tus datos en la nube

Para buscar en colecciones de imágenes a escala de producción sin gestionar archivos locales, puedes organizar y versionar tus imágenes en Ultralytics Platform antes de indexarlas con CLIP.

Conclusión#

Con CLIP y el paquete Python de Ultralytics, puedes poner en marcha un motor de búsqueda semántica de imágenes zero-shot con unas pocas líneas, ya sea como aplicación web de Flask o como backend de búsqueda mediante programación. A partir de aquí, indica tu propio directorio de imágenes en data para indexarlo y, después, descubre otras soluciones de Ultralytics para ampliar tus flujos de trabajo de visión artificial.

Preguntas frecuentes#

  • CLIP (preentrenamiento contrastivo de lenguaje e imagen) es un modelo desarrollado por OpenAI que aprende a relacionar la información visual y lingüística. Se entrena con un enorme conjunto de datos de imágenes acompañadas de descripciones en lenguaje natural. Este entrenamiento le permite representar tanto las imágenes como el texto en un espacio de embeddings compartido, de modo que puedes compararlos directamente mediante similitud vectorial.

  • Lo que distingue a CLIP es su capacidad de generalización. En lugar de entrenarse únicamente para etiquetas o tareas específicas, aprende directamente del lenguaje natural. Esto le permite procesar consultas flexibles como «un hombre montado en una moto acuática» o «un paisaje onírico surrealista», por lo que resulta útil para todo tipo de tareas, desde la clasificación hasta la búsqueda semántica creativa, sin necesidad de volver a entrenarlo.

  • Una vez que CLIP convierte tus imágenes en embeddings, el paquete Ultralytics los normaliza con la norma L2 y los almacena en una única matriz NumPy. Las consultas se ordenan mediante una sola multiplicación de matrices que calcula la similitud coseno entre el embedding de la consulta y el de cada imagen, y después ordena las puntuaciones. Esta búsqueda por fuerza bruta es exacta y rápida para colecciones de imágenes habituales, sin necesidad de instalar ni gestionar dependencias adicionales de bases de datos vectoriales.

  • Aunque OpenAI desarrolla CLIP, el paquete Python de Ultralytics integra la generación de embeddings, la indexación y la búsqueda por similitud coseno en un flujo completo de búsqueda semántica de imágenes, que puedes ejecutar con unas pocas líneas de código:

    from ultralytics import solutions
    
    searcher = solutions.VisualAISearch(
        data="images",  # sustitúyelo por una ruta para crear el motor de búsqueda con tus propias imágenes
        device="cpu",  # configura el dispositivo para el procesamiento, p. ej., "cpu" o "cuda"
    )
    
    results = searcher("a dog sitting on a bench")

    Esta implementación de alto nivel gestiona lo siguiente:

    • Generación de embeddings de imágenes y texto con CLIP.
    • Creación y gestión del índice de embeddings.
    • Búsqueda semántica eficiente mediante similitud coseno.
    • Carga de imágenes desde directorios y visualización.
  • Sí. La configuración actual utiliza Flask con un frontend HTML básico, pero puedes sustituirlo por tu propio HTML o crear una interfaz de usuario más dinámica con React, Vue u otro framework de frontend. Flask puede actuar como API de backend para tu interfaz personalizada.

  • No directamente. Una solución sencilla consiste en extraer fotogramas individuales de los vídeos (p. ej., uno por segundo), tratarlos como imágenes independientes e introducirlos en el sistema. Así, el motor de búsqueda puede indexar semánticamente momentos visuales de tus vídeos.

Comentarios