Combinar modelos de IA para la búsqueda de imágenes mediante ONNX y Milvus
Open Neural Network Exchange (ONNX) es un formato abierto creado para representar modelos de aprendizaje automático. Desde su lanzamiento en 2017, ONNX se ha convertido en un estándar para la IA, proporcionando bloques de construcción para modelos de aprendizaje automático y aprendizaje profundo. ONNX define un formato de archivo común para permitir a los desarrolladores de IA utilizar modelos con diversos marcos, herramientas, tiempos de ejecución y compiladores, y ayuda a aumentar la velocidad de la innovación en la comunidad de inteligencia artificial.
Milvus es una base de datos vectorial de código abierto muy flexible, fiable y rapidísima. Permite añadir, eliminar, actualizar y buscar vectores casi en tiempo real. Milvus cuenta con un amplio conjunto de API intuitivas y es compatible con múltiples bibliotecas de índices ampliamente adoptadas (por ejemplo, Faiss, NMSLIB y Annoy), lo que simplifica la selección de índices para un escenario determinado. Milvus es fácil de usar, y se ha utilizado en cientos de organizaciones e instituciones de todo el mundo, incluyendo búsqueda de imágenes, audio y vídeo, recomendación, chatbot, búsqueda de nuevos medicamentos, etc.
Este artículo le mostrará cómo utilizar múltiples modelos para la búsqueda de imágenes basándose en ONNX y Milvus. Toma los modelos VGG16 y ResNet50 como ejemplos, utiliza ONNX para ejecutar diferentes modelos de IA para generar vectores de características y, finalmente, realiza la recuperación de vectores de características en Milvus para devolver imágenes similares.
Procesar modelos con ONNX
El formato ONNX puede intercambiarse fácilmente entre modelos de IA. Por ejemplo, el modelo TensorFlow puede convertirse al formato ONNX y ejecutarse en el entorno Caffe. En este ejemplo, convertimos el modelo pre-entrenado ResNet50 bajo el framework Keras al formato ONNX, y luego llamamos al modelo VGG16 en formato ONNX para analizar diferentes modelos.
from keras.applications.resnet50 import ResNet50
import tensorflow as tf
# carga el modelo keras-resnet50 y guárdalo como floder
model_resnet50 = ResNet50(include_top=False, pooling='max', weights='imagenet')
tf.saved_model.save(model_resnet50, "keras_resnet50_model")
# convertir el modelo resnet50 a onnx
python -m tf2onnx.convert --saved-model "keras_resnet50_model" --output "onnx_resnet50.onnx"
Nota: Cuando utilizamos la interfaz keras2onnx.convert_keras(model, model.name) para convertir el modelo, nos devolverá el error AttributeError:'KerasTensor' object has no attribute'graph'. Entonces podemos usar el comando Bash de Python para convertir según la solución en Stack Overflow.
Extraer vectores de características usando modelos
Después de convertir el modelo ResNet50 en formato ONNX, puede extraer el vector de características de la imagen directamente a través de la inferencia. Nota: Los vectores de características necesitan ser normalizados después de la extracción.
# obtener los vectores de la imagen con el modelo onnx
def get_onnx_vectors(onnx_model, img_path):
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, eje=0)
x = preprocesar_entrada(x)
sess = onnxruntime.InferenceSession(onnx_model)
x = x if isinstance(x, list) else [x]
feed = dict([(input.name, x[n]) for n, input in enumerate(sess.get_inputs())])
feat = sess.run(None, feed)[0]
norm_feat = feat[0] / LA.norm(feat[0])
norm_feat = [i.item() for i in norm_feat]
return norm_feat
Utiliza el modelo VGG16 con formato ONNX para procesar los datos de imagen:
# generar vectores con ResNet50 y el modelo ONNX VGG16
2vec_resnet = get_onnx_vectors("onnx_resnet50.onnx", "./pic/ejemplo.jpg")
3vec_vgg = get_onnx_vectors("onnx_vgg16.onnx", "./pic/ejample.jpg")
Almacenar datos vectoriales
Los datos no estructurados, como las imágenes, no pueden ser procesados directamente por un ordenador, pero pueden ser convertidos en vectores a través de un modelo de IA y luego analizados por un ordenador. La base de datos vectorial Milvus está diseñada para el análisis masivo de datos no estructurados. Puede almacenar datos vectoriales y realizar análisis casi en tiempo real. En primer lugar, cree una colección del modelo correspondiente en Milvus y, a continuación, inserte los vectores de imagen.
from milvus import *
# crear colecciones en Milvus
milvus.create_collection(resnet_coleccion_param)
milvus.create_collection(vgg_collection_param)
# insertar datos en Milvus y devolver ids
status, resnet_ids = milvus.insert(resnet_collection_name, resnet_vectors)
status, vgg_ids = milvus.insert(vgg_collection_name, vgg_vectors)
Después de insertar los datos con éxito, Milvus devolverá el ID correspondiente al vector, y entonces podremos encontrar la imagen por ID. Dado que Milvus 1.1 usado en este caso no soporta filtrado escalar (que Milvus 2.0 soporta ahora), se usa Redis para almacenar el ID del vector y el key-value de la ruta de la imagen.
import redis
def img_ids_to_redis(directorio_img, res_ids):
for img, ids in zip(images, res_ids):
redis.set(ids, img)
Búsqueda de imágenes similares
Después de almacenar los datos, podemos recuperar el vector. Milvus soporta múltiples métodos de cálculo de distancias, incluyendo la distancia euclídea, el producto interior y la distancia de Hamming. La búsqueda de imágenes similares en este artículo adopta el cálculo de la distancia euclidiana entre los vectores en Milvus, devuelve el ID del vector similar y, a continuación, encuentra la imagen correspondiente al ID en Redis.
# buscar en Milvus y devolver los resultados con ids similares
def buscar_en_milvus(nombre_coleccion, vector_buscado):
status, results = milvus.search(nombre_coleccion, TOP_K, [vector_busqueda])
print(estado)
re_ids = [x.id para x en resultados[0]]
re_distancia = [x.distancia para x en resultados[0]]
return re_ids, re_distance
# obtener las imágenes según los ids de los resultados
def get_sim_imgs(nombre_coleccion, vector_busqueda):
ids, distancia = search_in_milvus(nombre_coleccion, vector_busqueda)
img = [red.get(i).decode("utf-8") for i in ids]
return ids, distancia, img
Tomando como ejemplo los modelos VGG16 y ResNet50, este artículo muestra el procesamiento de múltiples modelos a través de ONNX y la combinación de múltiples modelos con Milvus para la recuperación de vectores similares para obtener imágenes similares. Los dos modelos anteriores se basan en el framework Keras, que puede extraer rápidamente vectores de características. Puede verse en el Cuaderno que, aunque los resultados de la búsqueda de Milvus de imágenes en el conjunto de datos COCO basados en estos dos modelos son similares, sus distancias euclidianas no son las mismas. También puede intentar comparar los resultados de búsqueda de los dos modelos utilizando otros conjuntos de datos.
Milvus es una base de datos vectorial de alto rendimiento y alta disponibilidad que puede utilizarse para procesar vectores de características generados a partir de datos masivos no estructurados. Para obtener más soluciones, puede consultar Milvus bootcamp.
Referencias
- https://github.com/onnx/onnx
- https://onnx.ai/
- https://milvus.io/cn/
- https://github.com/milvus-io/bootcamp
Sobre el autor
Shiyu Chen, ingeniero de datos en Zilliz, es licenciado en Informática por la Universidad de Xidian. Desde que se unió a Zilliz, ha estado explorando soluciones para Milvus en varios campos, como el análisis de audio y vídeo, la recuperación de fórmulas de moléculas, etc., lo que ha enriquecido enormemente los escenarios de aplicación de la comunidad. Actualmente está explorando más soluciones interesantes. En su tiempo libre, le encantan los deportes y la lectura.
Sigue leyendo

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Zero-Downtime Migration Now Available in Zilliz Cloud Private Preview
Zero-Downtime Migration enables seamless cluster-to-cluster migrations within Zilliz Cloud while maintaining full service availability.

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.
