Link to this sectionCómo crear una búsqueda semántica 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 de lenguaje visual de CLIP con una rápida búsqueda de similitud de coseno potenciada por NumPy, puedes construir 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 envuelve todo este flujo de trabajo detrás de dos clases, por lo que puedes lanzar una aplicación de búsqueda funcional o ejecutar consultas mediante programación en unas pocas líneas. Esta guía cubre 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.
Link to this section¿Por qué utilizar la búsqueda semántica de imágenes?#
Construir tu propio sistema de búsqueda semántica de imágenes con CLIP ofrece varias ventajas interesantes:
- Capacidades zero-shot: No necesitas entrenar 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 humana: A diferencia de la búsqueda por palabras clave, CLIP entiende el contexto semántico y recupera imágenes de consultas abstractas, emocionales o relacionales como "un niño feliz en la naturaleza" o "el horizonte 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 por similitud de coseno, ofreciendo resultados exactos con respuesta en tiempo real entre miles de embeddings y sin dependencias de búsqueda adicionales que instalar o gestionar.
- Aplicaciones en diferentes ámbitos: Ya sea que estés creando un archivo personal de fotos, una herramienta de inspiración creativa, un motor de búsqueda de productos o un sistema de recomendación de arte, la misma pila tecnológica se adapta con cambios mínimos.
Link to this sectionCómo funciona la búsqueda semántica de imágenes#
El flujo de trabajo combina tres componentes, cada uno encargado de una etapa para convertir imágenes y texto en resultados clasificados:
- 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 embedding multimodal. Esto permite una comparación directa entre texto e imágenes utilizando la similitud de coseno.
- NumPy almacena los embeddings de las imágenes como una matriz única y los clasifica frente a un embedding de consulta con una sola multiplicación de matrices, devolviendo los vectores más cercanos por similitud de coseno sin necesidad de dependencias de indexación adicionales.
- Flask proporciona una interfaz web sencilla para enviar consultas en lenguaje natural y mostrar imágenes que coincidan semánticamente con el índice.

Debido a que tanto las imágenes como el texto terminan en el mismo espacio vectorial, la recuperación es zero-shot: no necesitas etiquetas ni categorías, solo datos de imagen y una buena consulta.
Link to this sectionEjecuta la aplicación web de búsqueda semántica#
La clase SearchApp lanza la interfaz completa de Flask. En la primera ejecución, descarga un conjunto de imágenes de muestra, construye el índice de embeddings y sirve una página donde puedes escribir una consulta y ver los resultados clasificados.
Advertencia sobre la ruta de las imágenes
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 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 testingLink to this sectionBusca imágenes mediante programación#
La clase VisualAISearch realiza todas las operaciones de backend sin la capa web:
- Carga o construye un índice de embeddings a partir de imágenes locales.
- Extrae embeddings de imágenes y texto usando CLIP.
- Realiza una búsqueda de similitud utilizando la similitud de coseno.
Llama al buscador con una consulta en lenguaje natural para obtener una lista de nombres de archivos de imagen coincidentes, clasificados por similitud:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
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.2680Link to this sectionConfigura los parámetros de VisualAISearch#
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 por 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 computación para la ejecución del modelo. |
Para buscar en colecciones de imágenes a escala de producción sin gestionar archivos locales, puedes organizar y versionar tus imágenes en la Plataforma Ultralytics antes de indexarlas con CLIP.
Link to this sectionConclusión#
Con CLIP y el paquete de Python de Ultralytics, puedes montar un motor de búsqueda semántica de imágenes zero-shot en solo unas líneas, ya sea como una aplicación web Flask o como un backend de búsqueda programático. A partir de aquí, apunta data a tu propio directorio de imágenes para indexarlo y luego explora otras Soluciones Ultralytics para construir sobre tus flujos de trabajo de visión artificial.
Link to this sectionFAQ#
Link to this section¿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 con 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 embedding compartido, para que puedas compararlos directamente usando la similitud vectorial.
Link to this section¿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 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 onírico surrealista", haciéndolo útil para todo, desde clasificación hasta búsqueda semántica creativa, sin necesidad de reentrenamiento.
Link to this section¿Cómo se clasifican las imágenes frente a una consulta de texto?#
Una vez que CLIP convierte tus imágenes en embeddings, el paquete Ultralytics los normaliza en L2 y los almacena en una única matriz de NumPy. Una consulta se clasifica con una multiplicación de matrices que calcula la similitud de coseno entre el embedding de la consulta y cada embedding de imagen, y luego ordena las puntuaciones. Esta búsqueda de fuerza bruta es exacta y rápida para colecciones de imágenes típicas, sin ninguna dependencia de base de datos vectorial adicional que instalar o gestionar.
Link to this sectionWhy use the Ultralytics Python package if CLIP is from OpenAI?#
Aunque CLIP ha sido desarrollado por OpenAI, el paquete de Python de Ultralytics integra la generación de embeddings, la indexación y la búsqueda por similitud de coseno en un pipeline completo de búsqueda semántica de imágenes con unas pocas líneas de código que simplemente funcionan:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
results = searcher("a dog sitting on a bench")Esta implementación de alto nivel maneja:
- Generación de embeddings de imagen y texto basados en CLIP.
- Creación y gestión de índices de embeddings.
- Búsqueda semántica eficiente con similitud de coseno.
- Carga de imágenes basada en directorios y visualización.
Link to this section¿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 API backend para tu interfaz personalizada.
Link to this section¿Es posible realizar búsquedas en videos en lugar de en imágenes estáticas?#
No directamente. Una solución simple es extraer fotogramas individuales de tus videos (por ejemplo, uno por 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 tus videos.