Memproses Model dengan ONNX
Open Neural Network Exchange (ONNX) adalah format terbuka yang dibuat untuk merepresentasikan model pembelajaran mesin. Sejak menjadi sumber terbuka pada tahun 2017, ONNX telah berkembang menjadi standar untuk AI, menyediakan blok bangunan untuk pembelajaran mesin dan model pembelajaran mendalam. ONNX mendefinisikan format file yang umum untuk memungkinkan pengembang AI menggunakan model dengan berbagai kerangka kerja, alat, runtime, dan kompiler, dan membantu meningkatkan kecepatan inovasi dalam komunitas kecerdasan buatan.
Milvus adalah basis data vektor sumber terbuka yang sangat fleksibel, andal, dan sangat cepat. Milvus mendukung penambahan, penghapusan, pembaruan, dan pencarian vektor yang hampir seketika. Milvus memiliki seperangkat API intuitif yang komprehensif, dan dukungan untuk beberapa pustaka indeks yang diadopsi secara luas (misalnya Faiss, NMSLIB, dan Annoy), yang menyederhanakan pemilihan indeks untuk skenario tertentu. Milvus mudah digunakan, dan telah digunakan di ratusan organisasi dan institusi di seluruh dunia, termasuk pencarian gambar, audio dan video, rekomendasi, chatbot, pencarian obat baru, dll.
Artikel ini akan memperkenalkan Anda cara menggunakan beberapa model untuk pencarian gambar berdasarkan ONNX dan Milvus. Artikel ini menggunakan model VGG16 dan ResNet50 sebagai contoh, menggunakan ONNX untuk menjalankan model AI yang berbeda untuk menghasilkan vektor fitur, dan akhirnya melakukan pengambilan vektor fitur di Milvus untuk mengembalikan gambar yang serupa.
Memproses Model dengan ONNX
Format ONNX dapat dengan mudah dipertukarkan di antara model-model AI. Sebagai contoh, model TensorFlow dapat dikonversi ke format ONNX dan dijalankan di lingkungan Caffe. Dalam contoh ini, kami mengonversi model ResNet50 yang telah dilatih sebelumnya di bawah kerangka kerja Keras ke format ONNX, dan kemudian memanggil model VGG16 dalam format ONNX untuk menganalisis model yang berbeda.
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"
Catatan: Ketika kami menggunakan antarmuka keras2onnx.convert_keras(model, model.name)
untuk mengonversi model, itu akan mengembalikan kesalahan AttributeError:'KerasTensor' object has no attribute'graph'
. Kemudian kita dapat menggunakan perintah Bash Python untuk mengonversi sesuai dengan solusi di Stack Overflow.
Mengekstrak Vektor Fitur menggunakan Model
Setelah mengonversi model ResNet50 ke dalam format ONNX, Anda dapat mengekstrak vektor fitur gambar secara langsung melalui inferensi. Catatan: Vektor fitur perlu dinormalisasi setelah ekstraksi.
# 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
Gunakan model VGG16 berformat ONNX untuk memproses data gambar:
# 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")
Menyimpan Data Vektor
Data yang tidak terstruktur seperti gambar tidak dapat diproses secara langsung oleh komputer, tetapi dapat dikonversi menjadi vektor melalui model AI dan kemudian dianalisis oleh komputer. Basis data vektor Milvus dirancang untuk analisis data tidak terstruktur yang sangat besar. Database ini dapat menyimpan data vektor dan melakukan analisis hampir seketika. Pertama, buatlah koleksi model yang sesuai di Milvus, lalu masukkan vektor gambar.
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)
Setelah berhasil memasukkan data, Milvus akan mengembalikan ID yang sesuai dengan vektor, dan kemudian kita dapat menemukan gambar berdasarkan ID. Karena Milvus 1.1 yang digunakan dalam kasus ini tidak mendukung pemfilteran skalar (yang sekarang didukung oleh Milvus 2.0), Redis digunakan untuk menyimpan ID vektor dan nilai-kunci dari jalur gambar.
import redis
def img_ids_to_redis(img_directory, res_ids):
for img, ids in zip(images, res_ids):
redis.set(ids, img)
Mencari Gambar yang Mirip
Setelah menyimpan data, kita dapat mengambil vektornya. Milvus mendukung beberapa metode penghitungan jarak, termasuk Euclidean, inner product, dan jarak Hamming. Pencarian kemiripan gambar dalam artikel ini mengadopsi perhitungan jarak Euclidean antara vektor di Milvus, mengembalikan ID vektor yang mirip, dan kemudian menemukan gambar yang sesuai dengan ID tersebut di Redis.
# 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
Mengambil model VGG16 dan ResNet50 sebagai contoh, artikel ini menunjukkan pemrosesan beberapa model melalui ONNX dan menggabungkan beberapa model dengan Milvus untuk pencarian vektor yang mirip untuk mendapatkan gambar yang mirip. Kedua model di atas didasarkan pada kerangka kerja Keras, yang dapat mengekstrak vektor fitur dengan cepat. Dapat dilihat dari Notebook bahwa meskipun hasil pencarian Milvus untuk gambar pada dataset COCO berdasarkan dua model ini serupa, jarak Euclidean mereka tidak sama. Anda juga dapat mencoba membandingkan hasil pencarian kedua model ini dengan menggunakan dataset lain.
Milvus adalah database vektor berkinerja tinggi dan sangat tersedia yang dapat digunakan untuk memproses vektor fitur yang dihasilkan dari data besar yang tidak terstruktur. Untuk solusi lebih lanjut, Anda dapat merujuk ke bootcamp Milvus.
Referensi
- https://github.com/onnx/onnx
- https://onnx.ai/
- https://milvus.io/cn/
- https://github.com/milvus-io/bootcamp
Tentang penulis
Shiyu Chen, seorang insinyur data di Zilliz, lulus dari Universitas Xidian dengan gelar di bidang Ilmu Komputer. Sejak bergabung dengan Zilliz, ia telah mengeksplorasi solusi untuk Milvus di berbagai bidang, seperti analisis audio dan video, pencarian rumus molekul, dll., yang telah sangat memperkaya skenario aplikasi komunitas. Saat ini ia sedang mengeksplorasi solusi yang lebih menarik. Di waktu luangnya, ia menyukai olahraga dan membaca.
- Mengekstrak Vektor Fitur menggunakan Model
- Menyimpan Data Vektor
- Mencari Gambar yang Mirip
- Referensi
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word