Cómo crear un buscador semántico de imágenes con OpenAI CLIP#
Esta guía te explica cómo crear un motor de búsqueda semántica de imágenes usando OpenAI CLIP y Flask. Al combinar los [embeddings](https://ultralytics-translation-2.invalid 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.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

El paquete de Python de Ultralytics encapsula 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 en 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.
¿Por qué usar la búsqueda semántica de imágenes?#
Crear tu propio sistema de búsqueda semántica de imágenes con CLIP ofrece varias ventajas destacadas:
- Capacidades zero-shot: No necesitas entrenarlo con tu conjunto de datos. El aprendizaje zero-shot de CLIP te permite consultar cualquier colección de imágenes con lenguaje natural de forma libre, 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 de noche».
- Sin etiquetas ni metadatos: Este enfoque solo necesita imágenes sin procesar. CLIP genera embeddings sin ninguna anotación manual.
- Búsqueda ligera y exacta: Una única multiplicación de matrices normalizadas en NumPy clasifica cada imagen según su similitud coseno, ofreciendo resultados exactos con respuesta en tiempo real para miles de embeddings y sin necesidad de instalar ni gestionar dependencias de búsqueda adicionales.
- Aplicaciones en distintos ámbitos: Tanto si estás creando un archivo fotográfico personal, una herramienta de inspiración creativa, un motor de búsqueda de productos o un sistema de recomendación de arte, la misma pila se adapta con cambios mínimos.
Cómo funciona la búsqueda semántica de imágenes#
El flujo combina tres componentes, cada uno encargado de una etapa para convertir imágenes y texto en resultados clasificados:
- CLIP utiliza un codificador visual (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 embeddings multimodal. Esto permite comparar directamente texto e imágenes mediante la similitud coseno.
- NumPy almacena los embeddings de las imágenes como una única matriz y los clasifica frente al embedding de una consulta con una sola multiplicación de matrices, devolviendo los vectores más cercanos por similitud coseno sin ninguna dependencia adicional de indexación.
- Flask proporciona una interfaz web sencilla para enviar consultas en lenguaje natural y mostrar imágenes coincidentes semánticamente a partir del índice.

Como las imágenes y el texto se sitúan en el mismo espacio vectorial, la recuperación es zero-shot: no necesitas etiquetas ni categorías, solo datos de imágenes y un buen prompt.
Ejecuta la aplicación web de búsqueda semántica#
La clase SearchApp inicia la interfaz completa de Flask. En la primera ejecución 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 clasificados.
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 del servicio de archivos de Flask.
from ultralytics import solutions
app = solutions.SearchApp(
data="images", # replace with a path to build the 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 testingBusca 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 mediante CLIP.
- Realiza búsquedas por similitud utilizando la similitud coseno.
Llama al buscador con una consulta en lenguaje natural para obtener una lista de nombres de archivo de imágenes coincidentes, ordenados por similitud:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # replace with a path to build the search engine with your own images
device="cpu", # 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.2680Configura los parámetros de VisualAISearch#
La tabla siguiente describe los parámetros disponibles para VisualAISearch:
| Argumento | Tipo | Predeterminado | Descripción |
|---|---|---|---|
data | str | 'images' | Ruta al directorio de imágenes que se indexará y consultará. |
device | str | 'cpu' | Dispositivo utilizado para la inferencia de CLIP (por ejemplo, cpu, cuda, 0). |
Para buscar 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 de Python de Ultralytics, puedes poner en marcha un motor de búsqueda semántica de imágenes zero-shot en 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í, apunta data a tu propio directorio de imágenes para indexarlo y, después, explora otras soluciones de Ultralytics para ampliar tus flujos de trabajo de visión por ordenador.
Preguntas frecuentes#
CLIP (preentrenamiento contrastivo de imágenes y lenguaje) es un modelo desarrollado por OpenAI que aprende a conectar la información visual y lingüística. Se entrena con un conjunto de datos masivo de imágenes emparejadas con descripciones en lenguaje natural. Este entrenamiento le permite asignar tanto imágenes como texto a un espacio de embeddings compartido, para que puedas 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 gestionar consultas flexibles como «un hombre montando en una moto de agua» o «un paisaje onírico surrealista», lo que lo hace ú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 de Ultralytics los normaliza con L2 y los almacena en una única matriz de NumPy. Una consulta se clasifica mediante una multiplicación de matrices que calcula la similitud coseno entre el embedding de la consulta y cada embedding de 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 CLIP ha sido desarrollado por OpenAI, el paquete de Python de Ultralytics encapsula 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 funciona con unas pocas líneas de código:
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # replace with a path to build the search engine with your own images device="cpu", # configure the device for processing, e.g., "cpu" or "cuda" ) results = searcher("a dog sitting on a bench")Esta implementación de alto nivel gestiona:
- Generación de embeddings de imágenes y texto basada en CLIP.
- Creación y gestión del índice de embeddings.
- Búsqueda semántica eficiente con similitud coseno.
- Carga de imágenes basada en 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 frontend. Flask puede servir como API backend para tu interfaz personalizada.
No directamente. Una solución sencilla consiste en 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 momentos visuales de tus vídeos.