خوارزمية الكشف عن الأغراض والتعرف على الكائنات YOLO v3 الإصدار الثالث

مقدمة :

تعد خوارزمية YOLO  من أهم الخوارزميات المستخدمة في مجال الرؤية الحاسوبية Computer vision  , فهي قادرة على تصنيف الكائنات الموجودة داخل صورة معينة (انسان – فاكهة -سيارة .. ) بالإضافة الى تحديد مكان وجود هذه الكائنات داخل الصورة (Object detection) ,خوارزمية YOLO هي اختصار لـ “You Only Look Once” أي بمعنى أنها تتطلب مروراً واحداً فقط (انتشار امامي) عبر الشبكة العصبونية التفافية لاكتشاف كائنات متعددة داخل صورة, بحيث يتم تقسيم الصورة إلى مناطق ويتم التنبؤ بمربع الاحاطة Bounding box والاحتمالات لكل منطقة.

الفرق بين عملية Object Detection  و Image Classification :

معظم الأشخاص قد يقعوا في عملية التباس ظناً أن عملية اكتشاف الأشياء وتصنيف الصور هي مهمة واحدة ,ولكن في الحقيقة هما مهمتين مختلفتين ويكمن الاختلاف الأساسي بين هاتين المهمتين أن عملية Image Classification تقوم بتصنيف الكائن الموجود في الصورة فقط ( انسان – سيارة … ) ولا يمكنها أن تشير إلى مكان وجود هذا الكائن داخل الصورة أبداً بالإضافة إلى ذلك لا يمكنها أن تقوم بعملية التصنيف بشكل صحيح في حال وجود أكثر من كائن واحد في الصورة. أما بالنسبة لعملية Object Detection  فهي تحدد موقع أكثرمن كائن داخل صورة بالتنبؤ بمربع الاحاطة Bounding box  حول كل كائن موجود بالصورة وأيضا القيام بعملية التصنيف لهذا الكائنات  ( انسان – سيارة … ).

يوجد ثلاثة إصدارات لخوارزمية YOLO سنتحدث في هذا المقال عن الإصدار الثالث منها YOLO v3.

قبل الحديث عن خوارزمية YOLO v3 سنقوم بتوضيح بعض المفاهيم الخاصة بخوارزمية YOLO .

المفهوم الاول : خلايا الشبكة – Grid cells

يشير هذا المفهوم الى تقسيم الصورة الى شبكة من الخلايا والتنبؤ بمربع الاحاطة Bounding box في كل من هذه الخلايا (كل خلية من هذه الخلايا تقوم بالتنبؤ بوجود كائن أم لا سنقوم بتوضيح هذا الامر لاحقا).

في الصورة أعلاه لدينا سيارتين ( كائنين) وتم وضع مربع احاطة bounding box  باللون الأحمر لكل منهما.

كل خلية في هذه الشبكة يكون لها خرج التالي :

حيث :

Pc : هي احتمالية وجود كائن أم لا .

bx , by : هما احداثيات مركز مربع الإحاطة  Bounding box , مجال هاتين القيمتين يجب أن يكون دائماً بين 0 و 1 لأنه في حال كانت أحد القيمتين خارج هذا المجال بالتالي سيكون مركز مربع الاحاطة Bounding box خارج حدود الخلية ,لذلك نطبق على الخرج تابع sigmoid لحصر الخرج ضمن هذا المجال [0,1].

bh  ,bw : ارتفاع وعرض مربع الإحاطة  Bounding box , من الممكن أن تكون هاتين القيمتين اكبر من 1 لان الكائن قد يكون قسم منه في خلية والقسم الاخر في خلية أخرى .

المعادلات التالية تصف كيفية تحويل خرج الشبكة العصبونية للحصول على أبعاد المربع المتوقع :

tx ,ty , tw , th : خرج الشبكة العصبونية .

cx , cy : احداثيات الزاوية العلوية اليسرى بالنسبة للخلية.

pw , ph : أبعاد الـ anchor بالنسبة للمربع (تحدثنا عن هذا مفهوم anchor box  في الاسفل)

مثال لتوضيح :

إذا كان توقع المركز (0.5 ,0.3 ) واحداثيات الزاوية اليسرى العليا هي (1,1) فأن المركز على feature map يقع في (1.5 , 1.3) , وفي حال كان توقع المركز اكبر من الواحد  أي على سبيل المثال (0.5 , 1.2) بالتالي يقع المركز في (2.2,1.5)  لاحظ أن المركز موجود في الصف الثالث والعمود الثاني أي خارج حدود الخلية وهذا ما لا يجوز أن يحدث.

بالعودة الى دلالات الخرج y  :

c1 ,c2 ,c3 : لتصنيف الكائن المكتشف , في مثالنا هذا لسهولة التوضيح سنفرض لدينا ثلاث أنواع من الكائنات فقط نريد اكتشافها وهي المشاة و السيارة والدراجة النارية .

في حال الكائن المكتشف هو سيارة تكون c2  قيمتها 1 ( أي c2=1) والقيم الباقية هي أصفار(c1=0 , c3=0)

بُعد الخرج الناتج هو  3×3 مع العمق 8 أي يصبح البعد هو 8×3×3 (كما قلنا أن كل خلية تقوم بالتنبؤ باحتمالية وجود كائن أم لا ,بالتالي كل خلية سيكون لديها شعاع خرج y ومن هنا أتى العمق 8).

ملاحظة : في أغلب الحالات يكون لدينا 80 نوعاً مختلفاً من الكائنات المطلوب اكتشافها وتصنيفها وبالتالي سيكون خرج كل خلية y  هو 80+5 =85 , أي ( pc, bx , by , bh , bw , c1 , c2 , c3 ……… c80)

السيارة أقصى اليمين تنتمي إلى الخلية التي تقع في اقصى اليمين بالوسط لأن مربع الاحاطة موجود داخل هذه خلية (أي بمعنى أوضح هذه الخلية هي التي تنبأت بالسيارة ) .

بالنسبة للسيارة الموجودة في منتصف الصورة ، يتقاطع مربع الإحاطة لها مع عدة خلايا شبكية , تأخذ خوارزمية YOLO  مركز مربع الاحاطة وتربطه بخلية الشبكة التي يقع فيها هذا المركز (أي هذه الخلية هي المسؤولة عن اكتشاف هذا السيارة).

سنوضح معنى خرج كل خلية :

بالنسبة للخلايا  Cells التي لا يوجد فيها أي كائن (الخلايا الثلاثة التي تقع في الأعلى) تكون  Pc=0 , وعلامة الاستفهام تدل على اننا لا نهتم بهذه القيم (لأنه لا يوجد كائن).

لكن لدينا مشكلة :  في حال كان يوجد أكثر من كائن في نفس الخلية على سبيل المثال شخص يقف أمام السيارة ومركز مربع الإحاطة  Bounding box  لكل من السيارة والشخص قريبين جداً من بعضهما , وشبكة الخلايا السابقة قادرة على اكتشاف كائن واحد في الخلية فمن سوف تكتشف السيارة أم الشخص؟؟

لحل هذه المشكلة نلجأ الى مفهوم anchor box.

المفهوم الثاني :  Anchor box

يستخدم هذا المفهوم مع خوارزمية YOLO  لتمكينها من اكتشاف كائنات متعددة داخل الخلية الواحدة في حال كانت الخلية تحتوي على اكثر من كائن.

لاحظ أنه في الصورة أعلاه يتمركز كل من الشخص والسيارة في الخلية الوسطى من الشبكة .

الفكرة في مفهوم anchor box  تكمن في اضافة أبعاد للخرج لاكتشاف اكثر من كائن في خلية الشبكة الواحدة.

لغرض التوضيح سنختار مربعين anchor boxes من شكلين :

تحوي كل خلية شبكة الآن على مربعين anchor boxes , وهذا يعني أن كل خلية يمكنها التنبؤ بوجود كائنين لكن لماذا نختار مربعين anchor boxes  ببعدين مختلفين ؟؟ السبب حتى تتناسب هذه المربعات مع ابعاد الكائنات التي نريد اكتشافها في الصورة (سيارة , انسان . . . ),بالنسبة للمثال أعلاه سيتم ربط الشخص بالمربع الطويل لأن شكله أكثر تشابهاً والسيارة بالمربع العريض.

سيتم توسيع خرج كل خلية شبكة لتحوي معلومات عن مربعين الاحاطة .

تذكرة : كان بُعد شعاع الخرج y سابقاً 8 وكان قادر على اكتشاف كائن واحد ,أما الان بالنسبة لكائنين يصبح 16=2×8

وبالتالي يصبح بُعد الخرج النهائي للشبكة 16×3×3 .

نحن نختار أبعاد متنوعة من anchor box للسماح للنموذج بالتخصص بشكل أفضل , حيث سيتم تدريب بعض المخرجات على اكتشاف كائنات عريضة مثل سيارة ومخرجات أخرى على اكتشاف كائنات طويلة ونحيفة مثل المشاة وهكذا .

المفهوم الثالث : Intersection over Union

يستخدم هذا المفهوم لقياس دقة تحديد موقع الكائن ,وهو مقياس يسمح لنا بتقييم مدى تشابه مربع الإحاطة Bounding box  المتنبئ به مع مربع الاحاطة Bounding box  الحقيقي ,والفكرة هي أننا نريد حساب نسبة المساحة التي يتداخل فيها المربعان مع المساحة الاجمالية للمربعين معا.

معادلة حساب IoU هي كالتالي :

أي تقاطع المربعين على اجتماعهما.

سنأخذ مثال بسيط لتوضيح الفكرة :

المربع الأخضر يمثل مربع الإحاطة  Bounding box الحقيقي , أما المربع الأحمر يمثل مربع الاحاطة Bounding box المتوقع .

نلاحظ أن قيمة التقاطع على الاتحاد هي 0.733 وهي قيمة جيدة لكن ليست ممتازة (أي النموذج في هذه الحالة لم يقم بعمل اكتشاف لإشارة التوقف بشكل ممتاز ,يجب الحصول على دقة أفضل )

قيمة IoU تتراوح بين الصفر والواحد حيث :

  1. القيمة واحد تعني أن مربع الاحاطة Bounding box  المتوقع يتطابق تماماً مع مربع الإحاطة Bounding box الحقيقي.
  2. القيمة صفر تعني أن المربعين لا يتداخلان على الاطلاق. 

سنتحدث عن كيفية حساب منطقة التقاطع والاتحاد :

في البداية بدلاً من تحديد الـ Bounding box من خلال نقطة المركز والعرض والطول ,سنحدده باستخدام الزاوية العليا اليساري(x1 ,y1) والزاوية السفلى اليميني (x2 ,y2 ) , حيث هذه التحديد يساعد في حساب التقاطع والاجتماع للمربعين.

حساب تقاطع المربعين بالشكل التالي :

الصورة أعلاه توضح بشكل جيد آلية حساب احداثيات مربع التقاطع للمربعين(الزاوية العليا اليساري والزاوية السفلى اليميني) لا داعي لشرحها.

ثم لحساب مساحة التقاطع نضرب ارتفاع مربع التقاطع بعرضه .

حيث عرض مربع التقاطع نحصل عليه بالشكل x2 – x1   أما بالنسبة لطول y2-y1

بهذا الشكل نحصل على مساحة تقاطع المربعين , أما بالنسبة لمساحة اجتماع مربعين (Union) نستخدم المعادلة التالية :

مساحة المربع الأول زائد مساحة المربع الثاني ناقص مساحة التقاطع ,هكذا نحصل على اجتماع مربعين.

لا يقتصر مفهوم  IoU فقط على تقييم دقة نموذج تم تدريبه , وانما أيضاً هو مفهوم مهم أثناء التنبؤ لذلك دعنا نوضح مفهوم جديد مستخدم لفلترة مربعات الإحاطة  Bounding boxes المتعددة لنفس الكائن وهو Non-max Suppression.

المفهوم الثالث :  Non-max Suppression

في المثال التوضيحي السابق استخدمنا مربعات 3×3 , لكن في الواقع يتم استخدام مربعات 19×19 لتحقيق دقة تنبؤ أعلى , نتيجة لذلك من المتوقع أن يكون هناك عدة مربعات متوقعة لنفس الكائن وذلك بسب زيادة عدد التنبؤات فكما قلنا أن كل خلية تقوم بالتنبؤ .

في الصورة أدناه يخرج النموذج بثلاث تنبؤات لسيارة التي في المنتصف أي هناك ثلاث مربعات احاطة  Bounding box  لكائن واحد ونحن بحاجة إلى واحد فقط .

لاحظ خط مربع الاحاطة Bounding box  الأكثر سماكة هو الأكثر دقة فهو الذي يحوي على اعلى قيمة pc

(ملاحظة : تم وضع خط سميك بغرض التوضيح فقط للإشارة الى انه المربع الأكثر دقة)

هدفنا هو المحافظة على مربع الإحاطة  Bounding box  الأكثر دقة وأزاله المربعات البقية .

وهذا ما يفعله مفهوم non-max suppression  في ثلاث خطوات :

  1. تجاهل جميع المربعات التي تحوي قيمة pc أقل أو تساوي 0.6.
  2. نختار المربع الذي يحوي على أكبر قيمة لـ pc  كتنبؤ.
  3. تخلص من أي مربع متبقٍ مع IoU أكبر من أو يساوي 0.5.

وتكون النتيجة بالنهاية :

نستنتج أن non-max suppression  تضمن لنا الكشف عن كل كائن مرة واحدة فقط.

الان أصبح نموذج YOLO  موضحاً بالنسبة لك تستطيع تدريبه على الكثير من الصور مثل مجموعة البيانات COCO يبلغ حجمها 42 جيجابايت والتي أصدرتها Microsoft للكشف عن الكائنات وتقسيمها وتوصيف الصور أيضا , لكنك لن تقوم بذلك لان هذا يستغرق منك وقتا طويلاً ربما يصل الى أسابيع , بالمقابل يوجد نماذج مدربة مسبقاً وجاهزة تستطيع استخدامها والاستفادة منها.

بعد أن تعرفنا على المفاهيم السابقة أصبح من السهل علينا فهم الإصدار الثالث من خوارزمية YOLO.


YOLO v3

يستخدم الإصدار الثالث YOLO v3 بنية Darknet-53  المكونة من 53 طبقة مدربة على بيانات ImageNet وتم تكديس 53 طبقة أخرى عليها أيضا, مما يمنحها بنية 106 طبقة اللتفافية بالكامل.

الميزة الأكثر بروزاً في الإصدار الثالث أنه يقوم بالكشف في ثلاث مقاييس مختلفة أي يتم التنبؤ ثلاث مرات من أجل دخل واحد بمعنى لديه ثلاث طبقات خرج , للحصول على الخرج النهائي نطبيق نواة كشف 1×1 على feature map .

 بُعد نواة الكشف هو

1x1x(Bx(5+C)

هنا الـ B  هو عدد مربعات الإحاطة Bounding box التي تتوقعها كل خلية .

العدد 5 أربع قيم منه مستخدمة لتحديد أبعاد مربع الاحاطة Bounding box ( مركز المربع وطوله وعرضه ) أما القيمة الخامسة هي pc  .

c هو عدد الأصناف

في YOLO v3 تكون B=3  و C=80 لذا فأن حجم نواة الكشف 255×1×1 .

ملاحظة هامة : YOLO v3 يتعامل مع صور بأبعاد 416×416.

يقوم YOLO v3  كما قلنا سابقاً بالتنبؤ بثلاث مقاييس مختلفة يتم تحديد هذه المقاييس من خلال تقليل أبعاد الصورة المدخلة بخطوات stride  هي 32 و 16 و 8 على التوالي.

ملاحظة : عزيزي القارئ أثناء قرائتك للسطور التالية التي تتحدث عن آلية الكشف بالمقاييس الثلاثة يجب أن تنظر الى بنية شبكة YOLO v3  باستمرار حتى تتضح الأمور بالنسبة لك.

الكشف الأول (المقياس الأول) : يتم الكشف الأول بوسطة الطبقة 82 حيث يتم تقليل أبعاد الصورة down sampling بواسطة الشبكة  العصبونية , بحيث يكون للطبقة 82 خطوة stride  هي 32 وستكون feature map الناتجة بحجم 13×13.

ويتم الكشف هنا باستخدام نواة كشف 1×1 مما يعطينا detection feature map  بحجم 255×13×13 بالشكل التالي :

الكشف الثاني (المقياس الثاني) : يطبق على feature map  الناتج من الطبقة 79 عدد من الطبقات الالتفافية  ثم بعد ذلك يتم دمج feature map الناتج مع feature map  من الطبقة 61 , وبعدها يطبق على feature map  المجمع بعض الطبقات الالتفافية 1×1 لدمج الميزات feature السابقة (من الطبقة 61 ) ليتم بذلك الكشف الثاني عن طريق الطبقة 94 , بحيث يكون لهذه الطبقة خطوة stride  هي 16  فينتج لدينا detection feature map بحجم 255×26×26. بالشكل التالي :

الكشف الثالث (المقياس الثالث ) : يتم اتباع اجراء مماثل مرة أخرى حيث يطبق على feature map من الطبقة 91 بعض الطبقات الالتفافية  قبل أن يتم دمجها مع feature map من الطبقة 36 ثم بعد ذلك كما قبل يتم تطبيق أيضا بعض الطبقات التلافيفة1×1 لدمج الميزات feature السابقة من الطبقة 36 ثم نحصل على الكشف الثالث detection feature map عن طريق الطبقة 106 بحيث يكون لهذه الطبقة خطوة stride هي 8  وبالتالي حجم feature map  الناتج 255×52×52.

تساعد عملية الكشف بالمقاييس الثلاثة  على حل مشكلة اكتشاف الكائنات الصغيرة التي كانت تعاني منها خوارزمية YOLO  الإصدار الثاني ,حيث طبقات upsampling المدمجة مع طبقات السابقة تحافظ على الميزات feature المستخلصة و التي تساعد في اكتشاف الاجسام الصغيرة.

ملاحظة : ربما نتحدث عن مفهومي upsampling و downsampling في مقال أخر.

الطبقة 13×13 مسؤولة عن الكشف عن الاجسام الكبيرة , بينما الطبقة 26×26 مسؤولة عن الاجسام المتوسطة أما الطبقة 52×52 مسؤولة عن الكشف عن الاجسام الصغيرى.

يستخدم YOLO v3 في المجمل 9 مربعات anchor boxes , ثلاث مربعات من أجل كل مقياس(طبقة)

أي كل خلية في كل مقياس (طبقة) تقوم بالتنبؤ بثلاث صناديق بمقاييس مختلفة

في الطبقة الأولى الـ feature map  الناتج بعده هو 13×13 وكما قلنا أن كل خلية تتنبأ بثلاث صناديق بالتالي عدد الصناديق المتوقعة في هذه الطبقة هو 13×13×3 وبالتالي يساوي507 صندوق متوقع.

بالنسبة للطبقة الثانية الـ feature map الناتج بُعده هو 26×26 وكل خلية تتنبأ بثلاث صناديق بالتالي عدد الصناديق المتوقعة في هذه الطبقة هو 26×26×3 وبالتالي يساوي2,028  صندوق متوقع.

أما الطبقة الثالثة الـ feature map  الناتج بعده هو 52×52 وكل خلية تتنبأ بثلاث صناديق بالتالي عدد الصناديق المتوقعة في هذه الطبقة هو 52×52×3 بالتالي يساوي8,112  صندوق متوقع.

ومنه بالنسبة لصورة يبلغ حجمها 416×416 عدد الصناديق المتوقعة 10,647

 (بالشكل 507 + 2,028 + 8,112 = 10647)

تقديم كلاً من :

محمد كردي

محمد ذويب

المصادر :

https://heartbeat.fritz.ai/gentle-guide-on-how-yolo-object-localization-works-with-keras-part-2-65fe59ac12d

http://ronny.rest/tutorials/module/localization_001/iou/

https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b

https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/