كيفية بناء بحث دلالي عن الصور باستخدام OpenAI CLIP#
يرشدك هذا الدليل خلال بناء محرك بحث دلالي عن الصور باستخدام OpenAI CLIP و Flask. من خلال الجمع بين التضمينات المرئية اللغوية لـ CLIP والبحث السريع عن تشابه جيب التمام المدعوم بواسطة NumPy، يمكنك بناء واجهة ويب تسترجع الصور ذات الصلة من استعلامات اللغة الطبيعية، دون الحاجة إلى فئات أو تصنيفات.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

تغلف حزمة Python الخاصة بـ Ultralytics خط الأنابيب هذا بالكامل وراء فئتين، بحيث يمكنك إطلاق تطبيق بحث عامل أو تشغيل الاستعلامات برمجياً في بضعة أسطر. يغطي هذا الدليل سبب فائدة البحث الدلالي، وكيفية عمله، وتشغيل تطبيق الويب، والبحث برمجياً، وتكوين المعلمات.
لماذا نستخدم البحث الدلالي عن الصور؟#
يوفر بناء نظام البحث الدلالي الخاص بك عن الصور باستخدام CLIP العديد من المزايا المقنعة:
- قدرات الصفر-لقطة: لست بحاجة إلى التدريب على مجموعة البيانات الخاصة بك. يتيح لك التعلم ذو الصفر-لقطة الخاص بـ CLIP الاستعلام عن أي مجموعة صور بلغة طبيعية حرة الشكل، مما يوفر الوقت والموارد.
- فهم يشبه الإنسان: على عكس البحث بالكلمات المفتاحية، يفهم CLIP السياق الدلالي ويسترجع الصور من استعلامات مجردة أو عاطفية أو متعلقة، مثل "طفل سعيد في الطبيعة" أو "أفق مدينة مستقبلية في الليل".
- لا توجد تسميات أو بيانات وصفية: يحتاج هذا النهج فقط إلى صور أولية. ينشئ CLIP متجهات (embeddings) دون أي تعليق توضيحي يدوي.
- بحث خفيف ودقيق: عملية ضرب مصفوفة واحدة مُطبعة في NumPy ترتب كل صورة حسب تشابه جيب التمام، مما يعطي نتائج دقيقة باستجابة فورية عبر آلاف التضمينات دون الحاجة إلى تثبيت أو إدارة تبعية بحث إضافية.
- تطبيقات عبر مجالات متعددة: سواء كنت تبني أرشيف صور شخصياً، أو أداة إلهام إبداعي، أو محرك بحث عن منتجات، أو نظام توصية فني، فإن نفس المجموعة التقنية تتكيف مع الحد الأدنى من التعديلات.
كيف يعمل البحث الدلالي عن الصور#
يجمع هذا المسار بين ثلاثة مكونات، كل منها يتعامل مع مرحلة واحدة من تحويل الصور والنصوص إلى نتائج مرتبة:
- يستخدم CLIP مشفر رؤية (على سبيل المثال، ResNet أو ViT) للصور ومشفر نص (يعتمد على Transformer) للغة لإسقاط كلاهما في نفس مساحة التضمين متعددة الوسائط. هذا يسمح بالمقارنة المباشرة بين النص والصور باستخدام تشابه جيب التمام.
- يقوم NumPy بتخزين تضمينات الصور كمصفوفة واحدة ويرتبها مقابل تضمين الاستعلام بعملية ضرب مصفوفة واحدة، مما يعيد أقرب المتجهات حسب تشابه جيب التمام دون أي تبعية فهرسة إضافية.
- توفر Flask واجهة ويب بسيطة لتقديم استعلامات اللغة الطبيعية وعرض الصور المتطابقة دلالياً من الفهرس.

بما أن كلاً من الصور والنص ينتهي بهما المطاف في نفس مساحة المتجهات، فإن الاسترجاع يتم بدون أمثلة (zero-shot): لست بحاجة إلى تسميات أو فئات، فقط بيانات الصور ومطالبة جيدة.
تشغيل تطبيق الويب للبحث الدلالي#
تقوم فئة SearchApp بإطلاق واجهة Flask الكاملة. عند التشغيل لأول مرة، تقوم بتنزيل مجموعة صور عينة، وبناء فهرس التضمين، وتقديم صفحة حيث يمكنك كتابة استعلام وعرض النتائج المرتبة.
تحذير مسار الصورة
إذا كنت تستخدم صورك الخاصة، فتأكد من توفير مسار مطلق لدليل الصور. وإلا، فقد لا تظهر الصور على صفحة الويب بسبب قيود خدمة الملفات في Flask.
from ultralytics import solutions
app = solutions.SearchApp(
data="images", # replace with a path to build the search engine with your own images
device="cpu", # configure the device for processing, e.g., "cpu" or "cuda"
)
app.run(debug=False) # You can also use `debug=True` argument for testingالبحث عن الصور برمجياً#
تقوم فئة VisualAISearch بجميع عمليات الخلفية بدون طبقة الويب:
- تحميل أو بناء فهرس تضمين من الصور المحلية.
- تستخرج تضمينات الصور والنصوص باستخدام CLIP.
- إجراء بحث عن التشابه باستخدام تشابه جيب التمام.
استدعِ أداة البحث باستعلام لغة طبيعية للحصول على قائمة بأسماء ملفات الصور المطابقة مرتبة حسب التشابه:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # replace with a path to build the search engine with your own images
device="cpu", # configure the device for processing, e.g., "cpu" or "cuda"
)
results = searcher("a dog sitting on a bench")
# Ranked Results:
# - 000000546829.jpg | Similarity: 0.3269
# - 000000549220.jpg | Similarity: 0.2899
# - 000000517069.jpg | Similarity: 0.2761
# - 000000029393.jpg | Similarity: 0.2742
# - 000000534270.jpg | Similarity: 0.2680تهيئة معلمات VisualAISearch#
يوضح الجدول أدناه المعلمات المتاحة لـ VisualAISearch:
| الوسيط | النوع | الافتراضي | الوصف |
|---|---|---|---|
data | str | 'images' | المسار إلى دليل الصور المستخدم للبحث عن التشابه. |
| الوسيط | النوع | الافتراضي | الوصف |
|---|---|---|---|
device | str | None | يحدد الجهاز للاستدلال (مثل cpu أو cuda:0 أو 0). يسمح للمستخدمين بالاختيار بين وحدة المعالجة المركزية (CPU)، أو وحدة معالجة رسومية (GPU) محددة، أو أجهزة الحوسبة الأخرى لتنفيذ النموذج. |
للبحث في مجموعات الصور بمقياس إنتاجي دون إدارة الملفات المحلية، يمكنك تنظيم صورك وإصدارها في منصة Ultralytics قبل فهرستها باستخدام CLIP.
الخلاصة#
باستخدام CLIP وحزمة Python الخاصة بـ Ultralytics، يمكنك إنشاء محرك بحث دلالي للصور بصفر لقطة في بضعة أسطر فقط، إما كـتطبيق ويب Flask أو كخلفية بحث برمجية. من هنا، قم بتوجيه data إلى دليل الصور الخاص بك لفهرسته، ثم استكشف حلول Ultralytics الأخرى للبناء على سير عمل الرؤية الحاسوبية الخاص بك.
الأسئلة الشائعة#
CLIP (التدريب المسبق المتباين للغة والصورة) هو نموذج تم تطويره بواسطة OpenAI يتعلم ربط المعلومات المرئية واللغوية. يتم تدريبه على مجموعة بيانات ضخمة من الصور المقترنة بتعليقات اللغة الطبيعية. يسمح هذا التدريب له برسم خريطة لكل من الصور والنصوص في مساحة تضمين مشتركة، بحيث يمكنك مقارنتها مباشرة باستخدام تشابه المتجهات.
ما يجعل CLIP متميزاً هو قدرته على التعميم. فبدلاً من تدريبه فقط على تسميات أو مهام محددة، فإنه يتعلم من اللغة الطبيعية نفسها. يتيح له ذلك التعامل مع استعلامات مرنة مثل "رجل يركب دراجة مائية" أو "مشهد أحلام سريالي"، مما يجعله مفيداً لكل شيء من التصنيف إلى البحث الدلالي الإبداعي، دون إعادة التدريب.
بمجرد أن يقوم CLIP بتحويل صورك إلى تضمينات، تقوم حزمة Ultralytics بتطبيعها بطريقة L2 وتخزينها في مصفوفة NumPy واحدة. يتم ترتيب الاستعلام بعملية ضرب مصفوفة واحدة تحسب تشابه جيب التمام بين تضمين الاستعلام وكل تضمين صورة، ثم تقوم فرز النتائج. هذا البحث بالقوة الغاشمة دقيق وسريع لمجموعات الصور النموذجية، مع عدم وجود تبعية قاعدة بيانات متجهة إضافية لتثبيتها أو إدارتها.
بينما يتم تطوير CLIP بواسطة OpenAI، فإن حزمة Python الخاصة بـ Ultralytics تغلف توليد التضمين، والفهرسة، وبحث تشابه جيب التمام في خط أتابيب بحث دلالي كامل للصور وراء بضعة أسطر من التعليمات البرمجية التي تعمل فقط:
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # replace with a path to build the search engine with your own images device="cpu", # configure the device for processing, e.g., "cpu" or "cuda" ) results = searcher("a dog sitting on a bench")يتعامل هذا التنفيذ عالي المستوى مع:
- إنشاء متجهات الصور والنصوص المستندة إلى CLIP.
- إنشاء وإدارة فهرس التضمين.
- البحث الدلالي الفعال باستخدام تشابه جيب التمام.
- تحميل الصور القائم على الدليل والتصور.
نعم. يستخدم الإعداد الحالي Flask مع واجهة HTML أساسية، ولكن يمكنك استبدالها بـ HTML الخاص بك أو بناء واجهة مستخدم أكثر ديناميكية باستخدام React أو Vue أو أي إطار عمل آخر للواجهة الأمامية. يمكن لـ Flask العمل كـ REST API للخلفية لواجهتك المخصصة.
ليس بشكل مباشر. الحل البديل البسيط هو استخراج إطارات فردية من مقاطع الفيديو الخاصة بك (على سبيل المثال، إطار واحد كل ثانية)، ومعاملتها كصور مستقلة، وتغذيتها في النظام. بهذه الطريقة، يمكن لمحرك البحث فهرسة اللحظات المرئية من مقاطع الفيديو الخاصة بك دلالياً.