يقع اكتشاف الوجوه عند بوابة الدخول لمعظم مسارات رؤية الحاسوب (computer vision pipelines). فكل مكالمة فيديو، ومعرض صور، وبث أمني يعتمد على رصد الوجوه البشرية قبل حدوث أي شيء آخر. ومع ذلك، فإن اختيار النموذج عادة ما يفرض مفاضلة غير مرضية؛ فالشبكات الثقيلة توفر الدقة ولكنها تتطلب وحدات معالجة رسومات (GPUs) باهظة الثمن وأنظمة تبريد مثبتة في الخزائن. أما النماذج الأصغر فتعمل على أجهزة متواضعة، لكنها غالبًا ما تتعثر أمام الوجوه الصغيرة أو البث عالي الدقة. يأتي نموذج YuNet من OpenCV Zoo ليكسر هذا النمط. لقد قضيت وقتًا في قياس أدائه عبر مقاييس مختلفة لمعرفة ما إذا كان يستحق مكانًا في المشاريع الحقيقية أم أنه مجرد نموذج يبدو جيدًا على الورق فقط.
لماذا يستحق YuNet نظرة فاحصة
YuNet ليس مجرد فضول بحثي. إنه موجود داخل OpenCV Zoo، وهي مجموعة من النماذج المدربة مسبقًا والمحسنة لوحدة OpenCV DNN. يستخدم الإصدار المحدد الذي اختبرته تقنية تكميم INT8 (INT8 quantization)، مما يعني ضغط أوزانه وتنشيطاته إلى أرقام صحيحة بـ 8 بت بدلاً من أرقام الفاصلة العائمة المعتادة بـ 32 بت. وهذا ليس مجرد ملاحظة تقنية ثانوية؛ فتقنية INT8 تقلل بشكل كبير من عرض نطاق الذاكرة (memory bandwidth)، وتخفف الضغط على ذاكرة التخزين المؤقت (cache)، وتسمح لوحدات المعالجة المركزية (CPUs) الحديثة بإتمام عملية الاستدلال (inference) دون عناء. بالنسبة لأي شخص يبني تطبيقات على جهاز كمبيوتر محمول، أو جهاز طرفي (edge device)، أو خادم بدون بطاقة رسومات مخصصة، فإن هذه الكفاءة هي الفارق بين مسار عمل سلس وبين عرض شرائح متقطع.
تتميز البنية نفسها بأنها خفيفة الوزن بطبيعتها، حيث تتجنب أعباء الهياكل الأساسية (backbones) الضخمة وتركز على المهمة الوحيدة وهي تحديد مواقع الوجوه. وهذا الانضباط يؤتي ثماره عندما تحتاج إلى دمج عملية الاكتشاف في تطبيق أكبر حيث يتم تقاسم ميزانية وحدة المعالجة المركزية والبطارية مع مهام التتبع، أو التعرف، أو ترميز الفيديو.
الإعداد
أُجريت جميع الاختبارات على جهاز Mac Studio مزود بشريحة Apple M4 Max. كان ملف النموذج هو نسخة YuNet INT8 quantized ONNX من مستودع OpenCV Zoo. قمت بقياس سرعة الاستدلال على صورة بدقة 1280x720 أولاً، ثم قارنت أعداد الاكتشاف عبر أربع دقات إدخال مختلفة لفهم كيفية تأثير المقياس على النتائج.
إذا كنت ترغب في التحقق من هذه الأرقام على جهازك الخاص، فإن العملية قابلة للتكرار بالكامل. قم بتشغيل الأوامر التالية لسحب المستودع المتفرق (sparse repository) وتنفيذ اختبار القياس:
git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run
يحافظ الـ sparse checkout على صغر حجم التنزيل، ويتولى مشغل المهام mise إدارة التبعيات خلف الكواليس. لن تحتاج إلى الصراع مع بيئات Python أو التثبيت اليدوي للحزم.
سرعة تحافظ على استقرارها
في صورة بدقة 1280x720، بلغ متوسط نموذج YuNet INT8 حوالي 9.21 مللي ثانية لكل عملية استدلال. سجلت أسرع عملية 8.03 مللي ثانية، بينما وصلت أبطأ عملية إلى 10.47 مللي ثانية. هذا النطاق ضيق بشكل ملحوظ؛ حيث يفصل أقل من مللي ثانية ونصف بين أفضل وأسوأ الأوقات.
من الناحية العملية، هذا الاستقرار أهم من مجرد التباهي بالأرقام. فالتطبيقات التي تعمل في الوقت الفعلي لا تحتاج فقط إلى زمن انتقال (latency) منخفض في المتوسط، بل تحتاج إلى زمن انتقال يمكن التنبؤ به. النموذج الذي يستغرق أحيانًا 50 مللي ثانية يتسبب في تقطع مرئي في بث كاميرا الويب. أما YuNet فيبقى مستقرًا؛ يمكنك الاعتماد عليه لإنهاء إطار قبل وصول الإطار التالي، مما يجعل جدولة بقية مسار العمل الخاص بك أبسط بكثير.
تباين المقياس يكشف القصة الحقيقية
السرعة الخام لا تعني الكثير إذا كان النموذج يخطئ في اكتشاف نصف الوجوه في المشهد. لاختبار ذلك، قمت بتمرير نفس الصور المصدرية عبر YuNet بأربع دقات مختلفة. وتخبرنا الأعداد بقصة واضحة:
- 320 x 180: تم اكتشاف 6 وجوه
- 640 x 360: تم اكتشاف 26 وجهًا
- 1280 x 720: تم اكتشاف 38 وجهًا
- 2560 x 1440: تم اكتشاف 52 وجهًا
القفزة هائلة. عند دقة 320 x 180، لا يتم رصد سوى الوجوه الأكبر والأقرب. وبمجرد الرفع إلى 640 x 360، يتضاعف العدد أربع مرات. وعند دقة 1440p الكاملة، يجد YuNet وجوهًا أكثر بثماني مرات مما وجده عند أدنى دقة.
يحدث هذا لأن تقليل العينات (downsampling) يدمر التفاصيل بشكل أسرع مما قد يتخيله المرء. فالوجه الذي يغطي مساحة متواضعة في إطار بدقة 1440p يمكن أن يتقلص ليصبح مجرد بقعة من خمسة في خمسة بكسلات عند دقة 360p. وبمجرد أن تنهار ملامح الوجه لتصبح أقل من المجال الاستقبالي (receptive field) للنموذج، فإنها تتحول إلى ضجيج غير مرئي؛ تندمج العينان مع الحواجب، وتختفي الأنوف، ولا يجد YuNet شيئًا يمسك به.
النتيجة العملية تستحق التذكر: إذا كانت كاميرتك تلتقط عرضًا واسع الزاوية لفصل دراسي، أو غرفة مؤتمرات، أو زاوية شارع، فلن تظهر الوجوه البعيدة ما لم تمنح النموذج عددًا كافيًا من البكسلات. الدقة هنا ليست مجرد مسألة جودة صورة، بل هي رافعة مباشرة تؤثر على الاستدعاء (recall).
استراتيجية تغيير الحجم التي تحتاجها حقًا
YuNet سريع بما يكفي بحيث لا تحتاج إلى تقليص مدخلاتك إلى 320 × 240 بدافع العادة. على معالج M4 Max، حتى دقة 2560 × 1440 تعمل بدون وحدة معالجة رسومات (GPU) مخصصة. وهذا يغير الطريقة التي يجب أن تصمم بها مسار المعالجة (pipeline).
بدلاً من إجبار كل إطار على المرور عبر حجم ثابت وصغير، اختر دقة الإدخال بناءً على ما تحاول العثور عليه. إذا كنت تهتم فقط بالشخص الموجود مباشرة أمام الكاميرا، فإن دقة 720p أو حتى 640p ستكون كافية. أما إذا كنت بحاجة إلى فهرسة كل حاضر في قاعة كبيرة، فقم بتزويد النموذج بقصّة (crop) ذات دقة أعلى أو بالإطار الأصلي الكامل. ولأن YuNet خفيف الوزن، فلديك المساحة الكافية لاتخاذ هذا القرار؛ فأنت لست مقيداً بإعداد مسبق واحد لتجنب تأخير قدره 200 مللي ثانية.
ومع ذلك، يظل هناك تحذير واحد: لا يزال النموذج يعتمد على حجم الوجه بالنسبة للموتر (tensor) المدخل. لا يوجد هنا ثبات سحري في الحجم (scale invariance). فالوجوه الصغيرة تظل غير مرئية ما لم تشغل عدداً كافياً من البكسلات. الحل ميكانيكي: قم بتكبير الصورة المصدر قبل عملية الاستدلال (inference) عند البحث عن أهداف بعيدة، ثم قم بإسقاط صناديق الإحاطة (bounding boxes) الناتجة مرة أخرى على الإحداثيات الأصلية. يمنحك YuNet ميزانية السرعة التي تسمح لك بالقيام بهذه الخطوة.
أين يقع هذا في بنيتك التقنية (Stack)
YuNet ليس حلاً لكل مهمة تخيلية تتعلق بالوجوه. فالانسداد الشديد (occlusion)، أو زوايا الوجه الجانبية الحادة، أو استخراج الشبكة ثلاثية الأبعاد (3D mesh extraction) تقع خارج نطاق عمله. ولكن بالنسبة للمهام الأساسية المتمثلة في تحديد مواقع الوجوه في الصور وبث الفيديو، فإنه يشغل مكانة مثالية. تستفيد تطبيقات الويب كام في الوقت الفعلي، وأدوات فرز الصور الآلية، والأنظمة المدمجة المتواضعة، جميعها من كاشف يعمل بسرعة على وحدات المعالجة المركزية (CPUs) القياسية.
كما يجعل تنسيق INT8 ONNX عملية النشر غير مؤلمة. فلست بحاجة إلى تثبيت PyTorch أو TensorFlow على الجهاز المستهدف. تقوم وحدة DNN في OpenCV بتحميل النموذج مباشرة، مما يحافظ على صغر حجم ملفك الثنائي (binary) ويجعل شجرة التبعيات (dependency tree) بسيطة.
الخلاصة
يثبت YuNet أن اكتشاف الوجوه لا يتطلب أجهزة صناعية أو أطر عمل ضخمة. الأرقام تتحدث بوضوح: أقل من عشر مللي ثانية لإطار بدقة 720p، وزيادة مباشرة ومتوقعة في عدد عمليات الاكتشاف مع ارتفاع الدقة. يمكنك الاختيار بين الحصول على أقصى سرعة بدقة متوسطة أو تغطية أوسع بمقياس أعلى، ولن يعاقبك النموذج على هذا الاختيار.
إذا كنت تبني أي شيء يتعامل مع صور من العالم الحقيقي، فقم بتشغيل خطوات إعادة الإنتاج المذكورة أعلاه على أجهزتك الخاصة. اختبرها مقابل لقطاتك. ثم قم بضبط منطق تغيير الحجم ليتناسب مع الوجوه التي تحتاج فعلياً إلى العثور عليها. السرعة مفيدة فقط عندما يمكنك توجيهها. يمنحك YuNet السرعة والتحكم معاً.
