يركز هذا المشروع على إنشاء خدمة تعرض صورًا ترتيبية مماثلة.
UI الخاصة بها متوفرة على https://ordsimilarity.com/. API (التفاصيل أدناه) متوفرة على https://api.ordsimilarity.com.
يتم تصنيف الصور باستخدام خوارزمية average hash ، والتي تحولها إلى تسلسل صغير من 0S و 1S. ثم تتم مقارنتها باستخدام Hamming distance ، والتي تقيس عدد البتات الشائعة بين صورتين. يمكن العثور على وصف مفصل في هذا الرابط.
يتم تخزين متوسط التجزئة لجميع المراسيم في ملف JSON . يمكن رؤية بيانات مثال في average_hash_example.json .
ملاحظة: نستخدم ملف JSON بدلاً من "DB العادي" لأننا نحتاج دائمًا إلى حلقة جميع البيانات في الداخل ، وتبين أن الأمر أسرع بكثير لتحميل جميع البيانات من ملف JSON مقارنةً ببعض DB مثل SQLite3.
وظيفة المعالجة الرئيسية هي get_matches_from_data في get_matches.py . تتكرر هذه الوظيفة من خلال جميع التجزئة المتوسطة المحددة وتقارن تشابهها مع متوسط التجزئة المحسوبة من البيانات المقدمة - إما معرف ترتيب أو محتوى الصورة المخصص. إنه يعيد قائمة بأكثر الأوامر المماثلة ، مرتبة حسب تشابهها.
get_matches.py يوفر أيضًا الوصول إلى CLI إلى الوظيفة. انظر python get_matches.py --help لمزيد من التفاصيل.
يتم تنفيذ API في python باستخدام FastAPI Framework. عند بدء التشغيل ، يقوم بتحميل التجزئة المتوسطة من ملف JSON إلى الذاكرة. بعد ذلك ، لكل طلب ، يوفر هذه البيانات إلى وظيفة get_matches_from_data المذكورة أعلاه ويجمع النتيجة. قبل إرجاع نتيجة JSON إلى العميل ، فإنه يثري بيانات الأوامر المماثلة مع خصائص أو روابط مفيدة إضافية.
ملاحظة: تدعو واجهة برمجة تطبيقات API في الواقع API Rust ، والتي توفر أداء أفضل بكثير. راجع قسم Rust server لمزيد من التفاصيل.
يتضمن واجهة برمجة التطبيقات نقاط نهاية متعددة للبحث عن التشابه ، والتي يتم تعريفها في api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n هي 20 ، وهي اختيارية. إذا لم يتم تحديدها ، فإنه يتخلف عن 20.POST /file?top_n=Ncurl -X POST -H "Content-Type: multipart/form-data" -F "file=@images/1.jpg" http://localhost:8001/file?top_n=10top_n غير محدود في هذه الحالة ، وهو اختياري. إذا لم يتم تحديدها ، فإنه يتخلف عن 20. لتحسين الأداء ، تم تنفيذ وظيفة get_matches أيضًا في Rust ، لتسريع بحث التشابه.
similar_pictures تحتوي على Rust ثنائي ومكتبة لهذا الغرض.
تم إنشاء اتصال Rust من python في get_matches_rust.py ، والذي يعرض نفس واجهة CLI مثل get_matches.py . أصبح هذا الاتصال ممكنًا من خلال مكتبة مشتركة Rust ، والتي تقيم ضمن similar_pictures/target/release/libsimilar_pictures.so .
بالإضافة إلى ذلك ، يتم إنشاء Rust ثنائي مستقل كـ CLI ، ضمن similar_pictures/target/release/similar_pictures . يمكن رؤية مساعدة CLI من خلال ./similar_pictures/target/release/similar_pictures --help . استخدامه يشبه نسخة python .
تستخدم كل من مكتبة Rust و Binary وظيفة get_matches الشائعة من similar_pictures/src/get_matches.rs ، التي تؤدي نفس المهمة مثل إصدار python . لبناء صدأ ثنائي ومكتبة لنظام التشغيل الخاص بك ، قم cargo build --release .
كما تم نسخ النهج مع تحميل التجزئة المتوسطة في الذاكرة على بدء التشغيل لخدمة الطلبات بشكل أسرع بكثير في Rust - في rust_http_server .
أنه يحتوي على خادم (غير عام) بنقاط نهاية مماثلة مثل API python - والفرق الوحيد هو أنه لا يقبل كائن الملف ، ويجب إعطاؤه ملف file_hash مباشرة.
لا ينبغي استخدامه مباشرة ، ولكن كدخل خلفي python تطبيقات. يتم إنشاء الاتصال في rust_server.py .