🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
  • Home
  • Blog
  • معالجة النماذج باستخدام ONNX

معالجة النماذج باستخدام ONNX

  • Engineering
September 26, 2021

تبادل الشبكة العصبية المفتوحة (ONNX) هو تنسيق مفتوح مصمم لتمثيل نماذج التعلم الآلي. منذ أن تم فتح مصادره في عام 2017، تطورت ONNX لتصبح معيارًا للذكاء الاصطناعي، حيث توفر لبنات بناء لنماذج التعلم الآلي والتعلم العميق. يُحدد ONNX تنسيق ملف مشترك لتمكين مطوري الذكاء الاصطناعي من استخدام النماذج مع مختلف أطر العمل والأدوات وأوقات التشغيل والمُجمِّعات، ويساعد على زيادة سرعة الابتكار في مجتمع الذكاء الاصطناعي.

Milvus هي قاعدة بيانات متجهة مفتوحة المصدر تتسم بالمرونة العالية والموثوقية والسرعة الفائقة. وهي تدعم إضافة المتجهات وحذفها وتحديثها والبحث عنها في الوقت الفعلي تقريباً. يحتوي Milvus على مجموعة شاملة من واجهات برمجة التطبيقات البديهية، ودعم للعديد من مكتبات الفهرس المعتمدة على نطاق واسع (مثل Faiss وNMSLIB وAnnoy)، مما يبسط عملية اختيار الفهرس لسيناريو معين. يتميز برنامج Milvus بسهولة استخدامه، وقد تم استخدامه في مئات المنظمات والمؤسسات في جميع أنحاء العالم، بما في ذلك البحث عن الصور والصوت والفيديو، والتوصيات، وروبوت الدردشة، والبحث عن الأدوية الجديدة، وما إلى ذلك.

ستقدم لك هذه المقالة كيفية استخدام نماذج متعددة للبحث عن الصور استنادًا إلى ONNX و Milvus. يأخذ نموذجي VGG16 وResNet50 كأمثلة، ويستخدم ONNX لتشغيل نماذج ذكاء اصطناعي مختلفة لتوليد متجهات الميزات، وأخيرًا يقوم باسترجاع متجهات الميزات في Milvus لإرجاع صور متشابهة.

معالجة النماذج باستخدام ONNX

يمكن تبادل تنسيق ONNX بسهولة بين نماذج الذكاء الاصطناعي. على سبيل المثال، يمكن تحويل نموذج TensorFlow إلى تنسيق ONNX وتشغيله في بيئة Caffe. في هذا المثال، نقوم في هذا المثال بتحويل نموذج ResNet50 المدرّب مسبقًا ضمن إطار عمل Keras إلى تنسيق ONNX، ثم نستدعي نموذج VGG16 بتنسيق ONNX لتحليل النماذج المختلفة.

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"

ملاحظة: عند استخدامنا للواجهة keras2onnx.convert_keras(model, model.name) لتحويل النموذج، سيعيد الخطأ AttributeError:'KerasTensor' object has no attribute'graph'. ثم يمكننا استخدام أمر Python's Bash للتحويل وفقًا للحل على Stack Overflow.

استخراج متجهات الميزات باستخدام النماذج

بعد تحويل نموذج ResNet50 إلى تنسيق ONNX، يمكنك استخراج متجه الميزة للصورة مباشرةً من خلال الاستدلال. ملاحظة: يجب تطبيع متجهات السمات بعد الاستخراج.

# 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

استخدم نموذج VGG16 بتنسيق ONNX لمعالجة بيانات الصورة:

# 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")

تخزين البيانات المتجهة

لا يمكن معالجة البيانات غير المهيكلة مثل الصور مباشرةً بواسطة الكمبيوتر، ولكن يمكن تحويلها إلى متجهات من خلال نموذج الذكاء الاصطناعي ثم تحليلها بواسطة الكمبيوتر. تم تصميم قاعدة البيانات المتجهة Milvus لتشغيل تحليل البيانات غير المهيكلة الضخمة. يمكنها تخزين البيانات المتجهة وإجراء تحليل شبه فوري. أولاً، قم بإنشاء مجموعة من النموذج المطابق في Milvus، ثم أدخل متجهات الصورة.

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)

بعد إدراج البيانات بنجاح، سيعيد Milvus المعرف المطابق للمتجه، ومن ثم يمكننا العثور على الصورة حسب المعرف. نظرًا لأن Milvus 1.1 المستخدم في هذه الحالة لا يدعم التصفية العددية (التي يدعمها Milvus 2.0 الآن)، يتم استخدام Redis لتخزين معرف المتجه والقيمة الرئيسية لمسار الصورة.

import redis
def img_ids_to_redis(img_directory, res_ids):
  for img, ids in zip(images, res_ids):
    redis.set(ids, img)

البحث عن الصور المتشابهة

بعد تخزين البيانات، يمكننا استرجاع المتجه. يدعم ميلفوس طرقًا متعددة لحساب المسافة، بما في ذلك المسافة الإقليدية والضرب الداخلي ومسافة هامينج. يعتمد البحث عن تشابه الصور في هذه المقالة على حساب المسافة الإقليدية بين المتجهات في Milvus، ويعيد معرّف المتجه المتشابه ثم يعثر على الصورة المطابقة للمعرّف في 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

بأخذ نموذجي VGG16 وResNet50 كأمثلة، تعرض هذه المقالة معالجة نماذج متعددة من خلال ONNX ودمج نماذج متعددة مع Milvus لاسترجاع المتجهات المتشابهة للحصول على صور متشابهة. يعتمد النموذجان المذكوران أعلاه على إطار عمل Keras، والذي يمكنه استخراج متجهات السمات بسرعة. يمكن أن نرى من دفتر الملاحظات أنه على الرغم من أن نتائج بحث ميلفوس عن الصور على مجموعة بيانات COCO استنادًا إلى هذين النموذجين متشابهة، إلا أن المسافات الإقليدية بينهما ليست متشابهة. يمكنك أيضًا محاولة مقارنة نتائج البحث للنموذجين باستخدام مجموعات بيانات أخرى.

Milvus عبارة عن قاعدة بيانات متجهات عالية الأداء ومتوفرة بشكل كبير يمكن استخدامها لمعالجة متجهات السمات التي تم إنشاؤها من بيانات ضخمة غير منظمة. لمزيد من الحلول، يمكنك الرجوع إلى معسكر تدريب Milvus.

المراجع

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

نبذة عن المؤلف

شيو تشين، مهندسة بيانات في شركة Zilliz، تخرجت من جامعة زيليز وحصلت على شهادة في علوم الحاسب الآلي. منذ انضمامها إلى Zilliz، كانت تستكشف حلولاً لـ Milvus في مجالات مختلفة، مثل تحليل الصوت والفيديو، واسترجاع الصيغ الجزيئية، وما إلى ذلك، مما أثرى سيناريوهات التطبيق في المجتمع بشكل كبير. وهي تستكشف حاليًا المزيد من الحلول المثيرة للاهتمام. في أوقات فراغها، تحب الرياضة والقراءة.

Like the article? Spread the word

استمر في القراءة