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

milvus-logo
LFAI
  • Home
  • Blog
  • الجيل الثاني من نظام البحث عن طريق الصور

الجيل الثاني من نظام البحث عن طريق الصور

  • Scenarios
August 11, 2020
Rife Wang

هذه المقالة هي الجزء الثاني من رحلة تحسين البحث عن الصور على نطاق المليار من UPYUN. إذا فاتك الجزء الأول، انقر هنا.

الجيل الثاني من نظام البحث عن طريق الصور

يختار الجيل الثاني من نظام البحث عن طريق الصور من الناحية التقنية حل CNN + Milvus. يعتمد النظام على متجهات الميزات ويوفر دعمًا تقنيًا أفضل.

استخراج الميزات

في مجال الرؤية الحاسوبية، أصبح استخدام الذكاء الاصطناعي هو السائد في مجال الرؤية الحاسوبية. وبالمثل، يستخدم استخراج الميزات في الجيل الثاني من نظام البحث عن طريق الصورة من الجيل الثاني الشبكة العصبية التلافيفية (CNN) كتقنية أساسية

يصعب فهم مصطلح CNN. نركز هنا على الإجابة عن سؤالين:

  • ما الذي يمكن أن تفعله شبكة CNN؟
  • لماذا يمكنني استخدام شبكة CNN للبحث عن الصور؟

1-meme.jpg 1-ميم.jpg

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

ما الذي يمكن أن تفعله CNN؟ يمكنها استخراج الميزات والتعرف على الأشياء. فهو يستخرج الميزات من أبعاد متعددة ويقيس مدى قرب ميزات الصورة من ميزات القطط أو الكلاب. ويمكننا اختيار الأقرب منها كنتيجة للتعرف على الأشياء، وهو ما يشير إلى ما إذا كان محتوى صورة معينة يتعلق بقط أو كلب أو أي شيء آخر.

ما هي العلاقة بين وظيفة تحديد الكائنات في شبكة CNN والبحث عن طريق الصورة؟ ما نريده ليس نتيجة التحديد النهائية، بل متجه السمات المستخرجة من أبعاد متعددة. يجب أن تكون متجهات السمات لصورتين متشابهتين في المحتوى متقاربة.

ما هو نموذج CNN الذي يجب أن أستخدمه؟

الإجابة هي VGG16. لماذا تختاره؟ أولاً، يتمتع VGG16 بقدرة جيدة على التعميم، أي أنه متعدد الاستخدامات. ثانيًا، تحتوي متجهات السمات المستخرجة بواسطة VGG16 على 512 بُعدًا. إذا كان هناك عدد قليل جدًا من الأبعاد، فقد تتأثر الدقة. إذا كان هناك الكثير من الأبعاد، فإن تكلفة تخزين وحساب متجهات السمات هذه مرتفعة نسبيًا.

يعد استخدام شبكة CNN لاستخراج ميزات الصورة حلاً سائدًا. يمكننا استخدام VGG16 كنموذج و Keras + TensorFlow للتنفيذ التقني. هذا هو المثال الرسمي لـ Keras:

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
model = VGG16(weights=’imagenet’, include_top=False)
img_path = ‘elephant.jpg’
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)
features = model.predict(x)

الميزات المستخرجة هنا هي متجهات الميزات.

1. التطبيع

لتسهيل العمليات اللاحقة، غالبًا ما نقوم بتطبيع الميزة:

ما يتم استخدامه لاحقًا هو أيضًا تطبيع norm_feat.

2. وصف الصورة

يتم تحميل الصورة باستخدام طريقة image.load_img من keras.preprocessing:

from keras.preprocessing import image
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))

في الواقع، إنها في الواقع طريقة TensorFlow التي تستدعيها Keras. لمزيد من التفاصيل، راجع وثائق TensorFlow. كائن الصورة النهائي هو في الواقع مثيل صورة PIL (PIL المستخدمة من قبل TensorFlow).

3. تحويل البايتات

من الناحية العملية، غالبًا ما يتم نقل محتوى الصورة عبر الشبكة. لذلك، بدلًا من تحميل الصور من المسار، نفضل تحويل بيانات البايت مباشرةً إلى كائنات صورة، أي صور PIL:

import io
from PIL import Image

# img_bytes: 图片内容 bytes
img = Image.open(io.BytesIO(img_bytes))
img = img.convert('RGB')

img = img.resize((224, 224), Image.NEAREST)

صورة img أعلاه هي نفس النتيجة التي تم الحصول عليها بواسطة طريقة image.load_img. هناك أمران يجب الانتباه إليهما:

  • يجب أن تقوم بتحويل RGB.
  • يجب تغيير الحجم (تغيير الحجم هو المعلمة الثانية من load_img method).

4. معالجة الحدود السوداء

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

الحد الأسود هو في الأساس صف أو عمود من وحدات البكسل حيث تكون جميع وحدات البكسل (0، 0، 0) (صورة RGB). لإزالة الحد الأسود هو العثور على هذه الصفوف أو الأعمدة وحذفها. هذه في الواقع عملية ضرب مصفوفة ثلاثية الأبعاد في NumPy.

مثال على إزالة الحدود السوداء الأفقية:

# -*- coding: utf-8 -*-
import numpy as np
from keras.preprocessing import image
def RemoveBlackEdge(img):
Args:
       img: PIL image instance
Returns:
       PIL image instance
"""
   width = img.width
   img = image.img_to_array(img)
   img_without_black = img[~np.all(img == np.zeros((1, width, 3), np.uint8), axis=(1, 2))]
   img = image.array_to_img(img_without_black)
return img

هذا إلى حد كبير ما أريد أن أتحدث عنه باستخدام شبكة CNN لاستخراج ميزات الصورة وتنفيذ معالجة أخرى للصور. الآن دعونا نلقي نظرة على محركات البحث المتجهة.

محرك البحث المتجه

تم حل مشكلة استخراج متجهات السمات من الصور. ثم المشاكل المتبقية هي:

  • كيفية تخزين متجهات السمات؟
  • كيفية حساب تشابه متجهات السمات، أي كيفية البحث؟ يمكن لمحرك البحث المتجه مفتوح المصدر Milvus حل هاتين المشكلتين. حتى الآن، يعمل بشكل جيد في بيئة الإنتاج لدينا.

3-milvus-logo.png 3-ميلفوس-شعار.png

ميلفوس، محرك البحث المتجه

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

ستصف بقية هذه المقالة الممارسات والنقاط المحددة التي يجب ملاحظتها.

1. متطلبات وحدة المعالجة المركزية

لاستخدام Milvus، يجب أن تدعم وحدة المعالجة المركزية الخاصة بك مجموعة تعليمات avx2. بالنسبة لأنظمة لينكس، استخدم الأمر التالي للتحقق من مجموعات التعليمات التي تدعمها وحدة المعالجة المركزية لديك:

cat /proc/cpuinfo | grep flags

ثم تحصل على شيء مثل:

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb         rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2     ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti intel_ppin tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm ida arat pln pts

ما يلي الأعلام هي مجموعات التعليمات التي تدعمها وحدة المعالجة المركزية لديك. بالطبع، هذه أكثر بكثير مما أحتاج إليه. أريد فقط معرفة ما إذا كانت مجموعة تعليمات معينة، مثل avx2، مدعومة. ما عليك سوى إضافة grep لتصفية ذلك:

cat /proc/cpuinfo | grep flags | grep avx2

إذا لم يتم إرجاع أي نتيجة، فهذا يعني أن مجموعة التعليمات المحددة هذه غير مدعومة. تحتاج إلى تغيير جهازك إذن.

2. تخطيط السعة

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

لنقم ببعض العمليات الحسابية السريعة. كل بعد من أبعاد المتجه هو float32. ويشغل النوع float32 4 بايت. إذاً متجه من 512 بُعداً يتطلب 2 كيلوبايت من التخزين. وعلى نفس المنوال

  • ألف متجه من 512 بُعداً يتطلب 2 ميغابايت من التخزين.
  • مليون متجه من 512 بُعدًا يتطلب 2 جيجابايت من التخزين.
  • 10 ملايين متجه من 512 بُعدًا تتطلب 20 جيجابايت من التخزين.
  • 100 مليون متجه 512 بُعداً تتطلب 200 جيجابايت من التخزين.
  • يتطلب مليار متجه من 512 متجه 512 بُعدًا 2 تيرابايت من التخزين.

إذا أردنا تخزين جميع البيانات في الذاكرة، فإن النظام يحتاج إلى سعة الذاكرة المقابلة على الأقل.

يوصى باستخدام أداة حساب الحجم الرسمية: أداة تحجيم ميلفوس.

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

3. تكوين النظام

لمزيد من المعلومات حول تكوين النظام، راجع وثائق ملفوس:

  • تكوين خادم ميلفوس: https://milvus.io/docs/v0.10.1/milvus_config.md

4. تصميم قاعدة البيانات

التجميع والتقسيم

  • يُعرف التجميع أيضًا باسم الجدول.
  • يشير التقسيم إلى الأقسام الموجودة داخل مجموعة.

إن التنفيذ الأساسي للتقسيم هو في الواقع نفس تنفيذ المجموعة، باستثناء أن التقسيم يكون تحت مجموعة. ولكن مع الأقسام، يصبح تنظيم البيانات أكثر مرونة. يمكننا أيضًا الاستعلام عن قسم معين في مجموعة لتحقيق نتائج استعلام أفضل.

كم عدد المجموعات والأقسام التي يمكننا الحصول عليها؟ المعلومات الأساسية عن المجموعة والقسم موجودة في البيانات الوصفية. يستخدم Milvus إما SQLite (التكامل الداخلي لـ Milvus) أو MySQL (يتطلب اتصالاً خارجيًا) لإدارة البيانات الوصفية الداخلية. إذا كنت تستخدم SQLite بشكل افتراضي لإدارة البيانات الوصفية (Metadata)، فسوف تعاني من فقدان شديد في الأداء عندما تكون أعداد المجموعات والأقسام كبيرة جداً. ولذلك، يجب ألا يتجاوز العدد الإجمالي للمجموعات والأقسام 50,000 (سيحدد Milvus 0.8.0 هذا العدد بـ 4,096). إذا كنت بحاجة إلى تعيين رقم أكبر، فمن المستحسن استخدام MySQL عبر اتصال خارجي.

بنية البيانات التي تدعمها مجموعة وقسم ميلفوس بسيطة للغاية، أي ID + vector. بمعنى آخر، لا يوجد سوى عمودين في الجدول: المعرف وبيانات المتجه.

ملاحظة:

  • يجب أن يكون المعرف أعدادًا صحيحة.
  • نحتاج إلى التأكد من أن المعرف فريد داخل مجموعة وليس داخل قسم.

التصفية الشرطية

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

البيانات المهيكلة وتعيين المتجهات

يدعم Milvus فقط بنية بيانات المعرف + المتجه. ولكن في سيناريوهات العمل، ما نحتاجه هو بيانات منظمة تحمل معنى العمل. بمعنى آخر، نحتاج إلى العثور على بيانات منظمة من خلال المتجهات. وفقًا لذلك، نحتاج إلى الحفاظ على علاقات التعيين بين البيانات المنظمة والمتجهات من خلال المعرف.

structured data ID <--> mapping table <--> Milvus ID

تحديد الفهرس

يمكنك الرجوع إلى المقالات التالية:

  • أنواع الفهرس: https://www.milvus.io/docs/v0.10.1/index.md
  • كيفية تحديد الفهرس: https://medium.com/@milvusio/كيفية اختيار فهرس في ميلفوس-4f3d1525259212

5. معالجة نتائج البحث

نتائج البحث في ميلفوس هي مجموعة من المعرف + المسافة:

  • المعرف: المعرف في المجموعة.
  • المسافة: تشير قيمة المسافة من 0 ~ 1 إلى مستوى التشابه؛ كلما كانت القيمة أصغر، كلما كان المتجهان أكثر تشابهًا.

تصفية البيانات التي يكون معرّفها -1

عندما يكون عدد المجموعات صغيرًا جدًا، قد تحتوي نتائج البحث على بيانات معرفها -1. نحتاج إلى تصفيتها بأنفسنا.

ترقيم الصفحات

البحث عن المتجهات مختلف تمامًا. يتم فرز نتائج الاستعلام بترتيب تنازلي من حيث التشابه، ويتم تحديد أكثر النتائج تشابهًا (topK) من النتائج (يتم تحديد topK من قبل المستخدم في وقت الاستعلام).

لا يدعم ميلفوس ترقيم الصفحات. نحتاج إلى تنفيذ وظيفة ترقيم الصفحات بأنفسنا إذا احتجنا إليها في العمل. على سبيل المثال، إذا كان لدينا عشر نتائج في كل صفحة ونريد عرض الصفحة الثالثة فقط، نحتاج إلى تحديد أن topK = 30 وإرجاع آخر عشر نتائج فقط.

عتبة التشابه للأعمال

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

تمت كتابة هذه المقالة من قبل rifewang، مستخدم Milvus ومهندس برمجيات في UPYUN. إذا أعجبك هذا المقال، فمرحبًا بك لتلقي التحية على https://github.com/rifewang.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

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