🚀 Testen Sie Zilliz Cloud, die vollständig verwaltete Milvus, kostenlos – erleben Sie 10x schnellere Leistung! Jetzt testen>>

milvus-logo
LFAI

Modelle mit ONNX verarbeiten

  • Engineering
September 26, 2021

Open Neural Network Exchange (ONNX) ist ein offenes Format, das zur Darstellung von Modellen für maschinelles Lernen entwickelt wurde. Seit seiner Freigabe 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, z. B. bei der Bild-, Audio- und Videosuche, bei Empfehlungen, Chatbots, der Suche nach neuen Medikamenten usw.

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 laufen zu lassen, um Merkmalsvektoren zu generieren, und führt schließlich ein Merkmalsvektor-Retrieval in Milvus durch, um ähnliche Bilder zurückzugeben.

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
import tensorflow as tf

# load keras-resnet50 model and save as a floder
model_resnet50 = ResNet50(include_top=False, pooling='max', weights='imagenet')
tf.saved_model.save(model_resnet50, "keras_resnet50_model")

# convert resnet50 model to onnx
! python -m tf2onnx.convert --saved-model "keras_resnet50_model" --output "onnx_resnet50.onnx"

Hinweis: Wenn wir die Schnittstelle keras2onnx.convert_keras(model, model.name) verwenden, um das Modell zu konvertieren, gibt sie den Fehler AttributeError:'KerasTensor' object has no attribute'graph' zurück. Dann können wir den Bash-Befehl von Python zur Konvertierung gemäß der Lösung auf Stack Overflow verwenden.

Extrahieren von Merkmalsvektoren 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 Feature-Vektoren müssen nach der Extraktion normalisiert werden.

# get the image vectors with onnx model
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

Verwenden Sie ein VGG16-Modell im ONNX-Format, um Bilddaten zu verarbeiten:

# generate vectors with ResNet50 and VGG16 ONNX model
2vec_resnet = get_onnx_vectors("onnx_resnet50.onnx", "./pic/example.jpg")
3vec_vgg = get_onnx_vectors("onnx_vgg16.onnx", "./pic/example.jpg")

Speichern von Vektordaten

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.

from milvus import *

# create collections in Milvus
milvus.create_collection(resnet_collection_param)
milvus.create_collection(vgg_collection_param)

# insert data to Milvus and return ids
status, resnet_ids = milvus.insert(resnet_collection_name, resnet_vectors)
status, vgg_ids = milvus.insert(vgg_collection_name, vgg_vectors)

Nachdem die Daten erfolgreich eingefügt wurden, gibt Milvus die ID zurück, die dem Vektor entspricht, und dann können wir 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.

import 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

Nach dem Speichern der Daten können wir den Vektor abrufen. Milvus unterstützt mehrere Methoden zur Abstandsberechnung, 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 ähnliche Vektor-ID zurück und findet dann das Bild, das der ID in Redis entspricht.

# search in Milvus and return the similarly results with 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
    
# get the images according the result 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

Anhand 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 Feature-Vektoren 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 im Milvus Bootcamp.

Referenzen

  1. https://github.com/onnx/onnx
  2. https://onnx.ai/
  3. https://milvus.io/cn/
  4. https://github.com/milvus-io/bootcamp

Über den Autor

Shiyu Chen, Dateningenieurin bei Zilliz, hat einen Abschluss in Informatik von der Xidian Universität. 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.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Weiterlesen