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

milvus-logo
LFAI

نظرة عامة

  • Scenarios
August 04, 2020
Rife Wang

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

خضعت خدمة البحث عن طريق الصورة لتطورين:

  1. بدء التحقيق التقني الأول في أوائل عام 2019 وإطلاق الجيل الأول من النظام في مارس وأبريل 2019;
  2. بدأ التحقيق في خطة الترقية في أوائل عام 2020 وبدأت الترقية الشاملة لنظام الجيل الثاني في أبريل 2020.

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

نظرة عامة

ما هي الصورة؟

يجب أن نعرف ما هي الصورة قبل التعامل مع الصور.

الإجابة هي أن الصورة هي مجموعة من وحدات البكسل.

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

1-what-is-an-image.png 1-ما هو-ما هو-صورة.png

لنفترض أن الجزء الموجود في المربع الأحمر عبارة عن صورة، فإن كل مربع صغير مستقل في الصورة هو بكسل، وهو وحدة المعلومات الأساسية. بعد ذلك، يكون حجم الصورة 11 × 11 بكسل.

2-what-is-an-image.png 2-ما-ما-هو-صورة.png

التمثيل الرياضي للصور

يمكن تمثيل كل صورة بمصفوفة. يتوافق كل بكسل في الصورة مع عنصر في المصفوفة.

الصور الثنائية

تكون وحدات البكسل في صورة ثنائية إما سوداء أو بيضاء، لذا يمكن تمثيل كل بكسل بـ 0 أو 1. على سبيل المثال، تمثيل المصفوفة لصورة ثنائية 4*4 هو

0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0

صور RGB

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

([0 .. 255], [0 .. 255], [0 .. 255])

إذا أخذنا صورة 4*4 RGB كمثال:

3-4-x-4-rgb-image.png 3-4-x-4-rgb-image.png

يتمثل جوهر معالجة الصور في معالجة مصفوفات البكسل هذه.

المشكلة التقنية للبحث بالصورة

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

بالنسبة لنظام البحث حسب الصورة، نريد البحث عن الصور ذات المحتوى المتشابه. إذن، نحتاج إلى حل مشكلتين أساسيتين:

  • تمثيل أو تجريد الصورة كصيغة بيانات يمكن معالجتها بواسطة الكمبيوتر.
  • يجب أن تكون البيانات قابلة للمقارنة لحسابها.

وبشكل أكثر تحديدًا، نحتاج إلى الميزات التالية:

  • استخراج سمات الصورة.
  • حساب الميزات (حساب التشابه).

الجيل الأول من نظام البحث حسب الصورة

استخراج الميزات - تجريد الصورة

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

4-first-generation-image-search.png 4-الجيل الأول-الجيل الأول-البحث عن الصور. png

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

حساب الميزات - حساب التشابه

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

ما هي مسافة هامينج؟ هي عدد البتات المختلفة.

على سبيل المثال,

Value 1: 0 1 0 1 0
Value 2: 0 0 0 1 1

هناك بتتان مختلفتان في القيمتين السابقتين، لذا فإن مسافة هامينج بينهما هي 2.

الآن نحن نعرف مبدأ حساب التشابه. والسؤال التالي هو، كيف نحسب مسافات هامينج لبيانات بمقياس 100 مليون من 100 مليون صورة؟ باختصار، كيف نبحث عن الصور المتشابهة؟

في المرحلة المبكرة من المشروع، لم أجد أداة مرضية (أو محرك حوسبة) يمكنه حساب مسافة هامينج بسرعة. لذلك غيرت خطتي.

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

على سبيل المثال

Value 1: 8 a 0 3 0 3 f 6
Value 2: 8 a 0 3 0 3 d 8

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

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

وبالتالي من السهل جدًا حل مطابقة التكافؤ. يمكننا استخدام التصفية الكلاسيكية لنظام قاعدة البيانات التقليدية.

وبالطبع، أستخدم المطابقة متعددة الفصول وأحدد درجة المطابقة باستخدام الحد الأدنى_should_match في ElasticSearch (لا تقدم هذه المقالة مبدأ ES، يمكنك تعلمه بنفسك).

لماذا نختار ElasticSearch؟ أولاً، لأنه يوفر وظيفة البحث المذكورة أعلاه. ثانيًا، يستخدم مشروع مدير الصور في حد ذاته ES لتوفير وظيفة البحث عن النص الكامل وهو اقتصادي للغاية لاستخدام الموارد الموجودة.

ملخص نظام الجيل الأول

يختار الجيل الأول من نظام البحث بالصور من الجيل الأول حل pHash + ElasticSearch، والذي يتميز بالميزات التالية:

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

لاختراق هذه القيود، ظهر نظام البحث عن الصور من الجيل الثاني بتقنية أساسية مختلفة تمامًا.

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

Like the article? Spread the word

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