Kombinieren Sie AI-Modelle für die Bildsuche mit ONNX und Milvus
Open Neural Network Exchange (ONNX) ist ein offenes Format, das zur Darstellung von Modellen für maschinelles Lernen entwickelt wurde. Seit seiner Veröffentlichung im Jahr 2017 hat sich ONNX zu einem Standard für KI entwickelt und bietet Bausteine für Modelle für maschinelles Lernen und Deep Learning. ONNX definiert ein gemeinsames Dateiformat, das es KI-Entwicklern ermöglicht, Modelle mit verschiedenen Frameworks, Tools, Laufzeiten und Compilern zu verwenden, und trägt dazu bei, die Innovationsgeschwindigkeit in der Gemeinschaft der künstlichen Intelligenz zu erhöhen.
Milvus ist eine quelloffene Vektordatenbank, die äußerst flexibel, zuverlässig und rasend schnell ist. Sie unterstützt das Hinzufügen, Löschen, Aktualisieren und Suchen von Vektoren nahezu in Echtzeit. Milvus verfügt über ein umfassendes Set an intuitiven APIs und unterstützt mehrere weit verbreitete Indexbibliotheken (z.B. Faiss, NMSLIB und Annoy), was die Indexauswahl für ein bestimmtes Szenario vereinfacht. Milvus ist einfach zu bedienen und wurde bereits in Hunderten von Organisationen und Institutionen weltweit eingesetzt, u. a. für Bild-, Audio- und Videosuche, Empfehlungen, Chatbots und die Suche nach neuen Medikamenten.
In diesem Artikel erfahren Sie, wie Sie mehrere Modelle für die Bildsuche auf der Grundlage von ONNX und Milvus verwenden können. Er nimmt VGG16- und ResNet50-Modelle als Beispiele, verwendet ONNX, um verschiedene KI-Modelle auszuführen, um Merkmalsvektoren zu generieren, und führt schließlich ein Merkmalsvektor-Retrieval in Milvus durch, um ähnliche Bilder zu finden.
Modelle mit ONNX verarbeiten
Das ONNX-Format kann leicht zwischen KI-Modellen ausgetauscht werden. Zum Beispiel kann das TensorFlow-Modell in das ONNX-Format konvertiert und in der Caffe-Umgebung ausgeführt werden. In diesem Beispiel konvertieren wir das vortrainierte ResNet50-Modell unter dem Keras-Framework in das ONNX-Format und rufen dann das VGG16-Modell im ONNX-Format auf, um verschiedene Modelle zu analysieren.
from keras.applications.resnet50 import ResNet50
importiere tensorflow as tf
# keras-resnet50 Modell laden und als Floder speichern
model_resnet50 = ResNet50(include_top=False, pooling='max', weights='imagenet')
tf.saved_model.save(model_resnet50, "keras_resnet50_model")
# resnet50-Modell nach onnx konvertieren
! python -m tf2onnx.convert --saved-model "keras_resnet50_model" --output "onnx_resnet50.onnx"
Hinweis: Wenn wir die Schnittstelle keras2onnx.convert_keras(model, model.name) zur Konvertierung des Modells verwenden, wird der Fehler AttributeError:'KerasTensor' object has no attribute'graph' zurückgegeben. Dann können wir den Bash-Befehl von Python verwenden, um gemäß der Lösung auf Stack Overflow zu konvertieren.
Extrahieren von Feature-Vektoren mit Modellen
Nach der Konvertierung des ResNet50-Modells in das ONNX-Format können Sie den Merkmalsvektor des Bildes direkt durch die Inferenz extrahieren. Hinweis: Die Merkmalsvektoren müssen nach der Extraktion normalisiert werden.
# liefert die Bildvektoren mit dem onnx-Modell
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, axis=0)
x = preprocess_input(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
ONNX-formatiertes VGG16-Modell zur Verarbeitung von Bilddaten verwenden:
# Vektoren mit ResNet50 und VGG16 ONNX-Modell erzeugen
2vec_resnet = get_onnx_vectors("onnx_resnet50.onnx", "./pic/example.jpg")
3vec_vgg = get_onnx_vectors("onnx_vgg16.onnx", "./pic/example.jpg")
Vektordaten speichern
Unstrukturierte Daten wie Bilder können nicht direkt von einem Computer verarbeitet werden, aber sie können durch ein KI-Modell in Vektoren umgewandelt und dann von einem Computer analysiert werden. Die Milvus-Vektordatenbank ist für die Analyse umfangreicher unstrukturierter Daten ausgelegt. Sie kann Vektordaten speichern und Analysen nahezu in Echtzeit durchführen. Erstellen Sie zunächst eine Sammlung des entsprechenden Modells in Milvus, und fügen Sie dann die Bildvektoren ein.
von milvus importieren *
# Sammlungen in Milvus erstellen
milvus.create_collection(resnet_collection_param)
milvus.create_collection(vgg_collection_param)
# Daten in Milvus einfügen und ids zurückgeben
status, resnet_ids = milvus.insert(resnet_collection_name, resnet_vectors)
status, vgg_ids = milvus.insert(vgg_sammlungs_name, vgg_vectors)
Nachdem die Daten erfolgreich eingefügt wurden, gibt Milvus die dem Vektor entsprechende ID zurück, und wir können das Bild anhand der ID finden. Da Milvus 1.1, das in diesem Fall verwendet wird, keine skalare Filterung unterstützt (die Milvus 2.0 jetzt unterstützt), wird Redis verwendet, um die Vektor-ID und den Schlüsselwert des Bildpfads zu speichern.
importiere redis
def img_ids_to_redis(img_directory, res_ids):
for img, ids in zip(images, res_ids):
redis.set(ids, img)
Suche nach ähnlichen Bildern
Nachdem wir die Daten gespeichert haben, können wir den Vektor abrufen. Milvus unterstützt mehrere Abstandsberechnungsmethoden, darunter Euklidischer Abstand, Inneres Produkt und Hamming-Abstand. Die Bildähnlichkeitssuche in diesem Artikel verwendet die euklidische Abstandsberechnung zwischen den Vektoren in Milvus, gibt die ID des ähnlichen Vektors zurück und findet dann das der ID entsprechende Bild in Redis.
# Suche in Milvus und Rückgabe der ähnlichen Ergebnisse mit IDs
def search_in_milvus(collection_name, search_vector):
status, results = milvus.search(collection_name, TOP_K, [search_vector])
print(status)
re_ids = [x.id for x in results[0]]
re_distance = [x.distance for x in results[0]]
return re_ids, re_distance
# liefert die Bilder entsprechend den Ergebnis-IDs
def get_sim_imgs(collection_name, search_vector):
ids, distance = search_in_milvus(collection_name, search_vector)
img = [red.get(i).decode("utf-8") for i in ids]
return ids, distance, img
Am Beispiel der Modelle VGG16 und ResNet50 zeigt dieser Artikel die Verarbeitung mehrerer Modelle durch ONNX und die Kombination mehrerer Modelle mit Milvus für die Suche nach ähnlichen Vektoren, um ähnliche Bilder zu erhalten. Die beiden oben genannten Modelle basieren auf dem Keras-Framework, das schnell Merkmalsvektoren extrahieren kann. Aus dem Notebook geht hervor, dass die Ergebnisse der Milvus-Suche nach Bildern im COCO-Datensatz auf der Grundlage dieser beiden Modelle zwar ähnlich sind, ihre euklidischen Abstände aber nicht gleich sind. Sie können auch versuchen, die Suchergebnisse der beiden Modelle mit anderen Datensätzen zu vergleichen.
Milvus ist eine hochleistungsfähige, hochverfügbare Vektordatenbank, die für die Verarbeitung von Merkmalsvektoren aus umfangreichen unstrukturierten Daten verwendet werden kann. Weitere Lösungen finden Sie unter [Milvus Bootcamp] (https://github.com/milvus-io/bootcamp).
Referenzen
- https://github.com/onnx/onnx
- https://onnx.ai/
- https://milvus.io/cn/
- https://github.com/milvus-io/bootcamp
Über den Autor
Shiyu Chen, eine Dateningenieurin bei Zilliz, hat an der Xidian Universität einen Abschluss in Informatik gemacht. Seit sie bei Zilliz arbeitet, hat sie Lösungen für Milvus in verschiedenen Bereichen erforscht, wie z.B. Audio- und Videoanalyse, Abrufen von Molekülformeln usw., was die Anwendungsszenarien der Gemeinschaft sehr bereichert hat. Derzeit erforscht sie weitere interessante Lösungen. In ihrer Freizeit treibt sie gerne Sport und liest.
Weiterlesen

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

VidTok: Rethinking Video Processing with Compact Tokenization
VidTok tokenizes videos to reduce redundancy while preserving spatial and temporal details for efficient processing.

Long List of Awesome DeepSeek Integrations You Should Know
Discover how DeepSeek's affordable AI ecosystem challenges Silicon Valley giants with powerful integrations for developers and businesses—from RAG systems to productivity tools, all at 90% lower cost.
