تخطَّ إلى المحتوى
كل المشاريع
الكود متاح التوصيل والتجارةمفتوح المصدر

RIZA

تسوّق الأزياء، والبحث بالصورة

Riza | Fashion & Shopping، متجر أزياء سعودي على Google Play و App Store، ومعه البحث بالصورة: يكتشف OWLv2 كل قطعة، ويطابق FashionCLIP و FAISS أقرب المنتجات إليها.

الدولة
السعودية
النوع
الكود متاح
الفترة
2026
المنصات
Android · iOS · API · WordPress
RIZA AI Visual Search
صورة منتج مفهرسة
11,934
منتج قابل للبحث بالصورة
2,697
ذاكرة الخدمة، بلا GPU
6 GB → 2 GB

نظرة عامة

RIZA علامة أزياء ونمط حياة سعودية تعمل على WordPress و WooCommerce، ولها تطبيق المتجر Riza | Fashion & Shopping المنشور على Google Play و App Store. كثيراً ما يصل المتسوّق ومعه صورة لشيء أعجبه، لقطة من وسائل التواصل أو صورة من الشارع، دون أن يعرف اسمه في الكتالوج.

صمّم محمود وبنى الميزة التي تجيب عن طلب "أرني منتجات تشبه هذه": اكتشاف القطع في الصورة، والبحث بالتشابه داخل منطقة محددة، وقسم "منتجات مشابهة" في صفحات المنتجات، وواجهات REST يتشاركها الموقع والتطبيق.

هذا المستودع إعادة كتابة نظيفة وعامة لذلك العمل الإنتاجي: خدمة Python مبنية على FastAPI وإضافة WordPress/WooCommerce تصلح لأي متجر. يحتفظ بخوارزميات الإنتاج وضبطها، دون أي بيانات أو مفاتيح خاصة بالمتجر.

التحدي

  1. 01

    البحث النصي لا ينفع في الأزياء: لا يستطيع المتسوّق كتابة "فستان ميدي بيج ملفوف بأكمام منفوخة"، لكنه يستطيع أن يريه

  2. 02

    صورة الإطلالة الواحدة تضم عدة منتجات، فالبحث بالصورة كاملة يعيد نتائج مختلطة

  3. 03

    سيرفر بلا GPU يشاركه المتجر نفسه، فكان على كل نموذج أن يبرّر استهلاكه للذاكرة

  4. 04

    الكتالوج يتغيّر يومياً، فيجب أن يتحدّث الفهرس عند الحفظ دون تعطيل لوحة الإدارة

  5. 05

    نقطة رفع عامة ومجهولة الهوية تحتاج إلى حدود صارمة على الرفع والمعدّل والبيانات المُعادة

أبرز الميزات

البحث

  • اكتشاف القطع بنموذج OWLv2 عبر 36 وصفاً نصياً، وتظهر كل قطعة كزر قابل للنقر مع إطارها
  • البحث بالمنطقة: يُقصّ الإطار المختار بهامش 10% ويُحوَّل إلى متجه بنموذج FashionCLIP
  • نقطة بحث سريع تتخطّى الاكتشاف لتبحث بالصورة كاملة فوراً
  • قسم "منتجات مشابهة" لأي منتج، مبني على متوسط متجهات صوره

جودة الترتيب

  • بحث دقيق بتشابه جيب التمام عبر FAISS IndexFlatIP على متجهات مُطبَّعة بـ L2
  • إزالة التكرار لكل منتج: جلب top_k × 6 جاراً والإبقاء على أفضل صورة لكل منتج
  • عتبتان: واحدة متساهلة في الـ API لزيادة الاستدعاء، وأخرى أشد في المتجر لرفع الدقة
  • تعزيز الفئة يرفع المنتجات المطابقة للقطعة المكتشفة ("Dress" / "فستان") إلى القمة

التكامل

  • إضافة WordPress بصفحة إعدادات، ومُفهرس دفعي، وفهرسة تلقائية عند الحفظ والحذف، وأكواد مختصرة، وقوالب قابلة للتخصيص من الثيم
  • مسارات REST عامة (/wp-json/vsw/v1/*) يتشاركها مكوّن الموقع وتطبيق الجوال
  • أداة سطر أوامر لفهرسة الكتالوج من CSV أو JSON أو WooCommerce REST API

الأمان

  • مصادقة بمفتاح API تُقارَن في زمن ثابت
  • حدود لحجم الرفع وعدد البكسلات، وفحص فعلي لنوع الملف، ورفع خاص يُحذف بعد 30 دقيقة
  • تحديد معدّل الطلبات لكل زائر على المسارات العامة
  • جلب صور محمي من SSRF: بلا تحويلات، ومضيفات عامة أو قائمة سماح صريحة فقط

الميزة الأبرز

البحث بالصورة

  • يرفع المتسوّق صورة، فيفحص WordPress نوعها ويحدّ حجمها ويحفظها بشكل خاص لمدة 30 دقيقة.
  • يكتشف الـ API القطع القابلة للشراء ويعيد إطاراتها بتسميات عربية وإنجليزية، تظهر كأزرار فوق الصورة.
  • يختار المتسوّق قطعة، فيقصّها الـ API بهامش 10% ويحوّلها إلى متجه بنموذج FashionCLIP ويستعلم FAISS عن top_k × 6 جاراً.
  • تُصفّى النتائج إلى أفضل صورة لكل منتج، وتُطبَّق العتبات وتعزيز الفئة، ثم يعيد المتجر المنتجات المنشورة والظاهرة فقط التي تتجاوز حدّه الأدنى.

ملاحظات هندسية

  1. 01

    ثلاثة نماذج على سيرفر بلا GPU، ثم اثنان

    حمّل الإصدار الأول OWLv2 و FashionCLIP ونموذج CLIP عاماً. أظهرت القياسات أن FashionCLIP يتعامل جيداً بما يكفي مع منتجات التجميل والعطور والألعاب، فأُزيل النموذج العام ووفّر نحو 1.8 جيجابايت من الذاكرة.

  2. 02

    تحميل كسول لنموذج الاكتشاف

    OWLv2 هو النموذج الأثقل بنحو 2.5 جيجابايت في الذاكرة، ولا يحتاجه سوى /detect. يُحمَّل خلف قفل مزدوج الفحص عند أول استخدام أو يُسخَّن في خيط خلفي، فيكون /search جاهزاً فوراً.

  3. 03

    نتيجة واحدة لكل منتج

    لكل منتج عدة صور، فتهيمن بضعة منتجات على أقرب الجيران. لذلك يجلب الفهرس عدداً أكبر، ويُبقي أفضل صورة لكل منتج، ثم يطبّق top_k.

  4. 04

    إعادة ترتيب واعية بالفئة

    قد تبدو حقيبة بيج أقرب إلى فستان بيج من فستان آخر. حلّ ذلك تقسيمٌ مستقر يضع الفئة المطابقة أولاً ويرتّب بالدرجة داخل كل مجموعة، دون إعادة تدريب، ويعمل مع أسماء الفئات العربية أيضاً.

  5. 05

    إطارات دقيقة على الصور غير المربعة

    يحشو OWLv2 الصور لتصبح مربعة، فتعالج إعادة الكتابة النتائج وفق الحجم المحشو. تتطابق الإطارات مع بكسلات الصورة الأصلية، ويرسمها المتجر بالنسب المئوية فوق صورة متجاوبة.

  6. 06

    SQLite مصدراً للحقيقة

    تُحدَّث المتجهات أو تُدرج لكل صورة منتج، ويُعاد بناء فهرس FAISS في الذاكرة عند التشغيل وبعد الحذف. إعادة الفهرسة آمنة التكرار، وإعادة التشغيل لا تُفقد الفهرس أبداً.

النتائج

  • فهرسة 11,934 صورة لـ 2,697 منتجاً وإتاحتها للبحث في الإنتاج
  • خفض استهلاك الذاكرة من نحو 6 إلى نحو 2 جيجابايت بدمج نموذجَي CLIP والتحميل الكسول لنموذج الاكتشاف، على معالج فقط بلا GPU
  • خدمت واجهات REST نفسها كلاً من الموقع وتطبيق الجوال
  • 42 اختبار pytest تغطي واجهتَي FAISS و NumPy

التقنيات

  • Python
  • FastAPI
  • Pydantic v2
  • FashionCLIP
  • OWLv2
  • FAISS
  • SQLite
  • WordPress
  • WooCommerce
  • PHP
  • Vanilla JS
  • pytest
  • Docker