تعلم الآلةرؤية الحاسب

خوارزمية إكتشاف الكائنات في الوقت الفعلي – YOLO

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

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

في البداية دعونا نفهم ماهي الشبكات العصبية الاصطناعية (Artificial Neural Networks) ومما تتكون؟

هي تقنيات حسابية مصممة لمحاكاة الطريقة التي يؤدي بها الدماغ البشري مهمة معينة، وذلك عن طريق معالجة ضخمة موزعة على التوازي، ومكونة من وحدات معالجة بسيطة، هذه الوحدات ما هي إلا عناصر حسابية تسمى عصبونات أو عقد Nodes, Neurons والتي لها خاصية عصبية من حيث أنها تقوم بتخزين المعرفة العملية والمعلومات التجريبية لتجعلها متاحة للمستخدم وذلك عن طريق ضبط الأوزان.

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

نلاحظ من الشكل أعلاه أن العصبون يتألف من:

  1. إشارات الدخل (Input (X1,X2,Xn وتمثل إشارة المدخلات للخلية العصبية
  2. قوى الأوزان (Weights (W1, W2, Wn حيث يعبر الوزن عن شدة الترابط بين عنصر قبله وعنصر بعده
  3. وحدة المعالجة (Processing Element) وهذا العنصر يقسم إلى قسمين:
  •   الجامع (Summer) لجمع الإشارات في الدخل الموزون
  •   دالة التفعيل (Activation Function):
    وهذه الدالة تحد من خرج العصبون لذا يسمى بتابع التخميد Squashing حيث يجعل الخرج ضمن المجال [0,1] أو ضمن المجال [-1,1]
  1. الخرج (Output (y وهي القيمة النهائية لنواتج العمليات داخل الخلية العصبية

توجد أنواع متعددة من الشبكات العصبية الإصطناعية، دعونا نأخذ النوع الأول وهو ما سوف نستخدمه اليوم في خوارزميتنا.

الشبكات العصبية الترشيحية (Convolutional Neural Networks)

يشير اسم “الشبكات العصبية الترشيحية” إلى أن الشبكة تستخدم عملية رياضية تسمى الترشيح (convolution). الترشيح هو نوع من العمليات الخطية المتخصصة. الشبكات الترشيحية هي ببساطة شبكات عصبية تستخدم الترشيح بدلاً من ضرب المصفوفة العامة في واحدة على الأقل من طبقاتها.

بنية الشبكة العصبونية الترشيحية

المُكوّنات الأساسية للشبكات العصبية الترشيحية هي: طبقة الترشيح (Convolutional Layer)، ودالّة التفعيل (Activation function)، وطبقة التجميع (Pooling Layer)، وطبقة تامة الاتصال (Fully-connected Layer) سنوضّح كل منها على حدة.

الطبقات الترشيحية (Convolutional Layers)

تأتي تسمية هذا النوع من الطبقات من عملية الترشيح (convolution) الرياضية وهي عملية تطبق على تابعين f,  g و تنتج التابع o وهو نسخة معدلة عن التابعين و ناتج المنطقة المتداخلة بينهما، لهذه العملية أثر كبير في معالجة الصور.تنتج إذاً هذه الطبقات عن تطبيق عملية الترشيح الرياضية على عناصر الدخل (عصبونات الطبقة السابقة أو بيكسلات الصورة المدخلة) مع عدد من المرشحات (filters) أو نواة الترشيح (kernels) وتكرر عملية الترشيح السابقة على كل مجموعة عناصر من الدخل بحجم المرشح الواحد، لتنتج لدينا قيم واحدة من خرائط الخصائص (feature map)، ثم نكرر كامل العمليات السابقة لكل مرشح فينتج خريطة خصائص أخرى، وهكذا…

تعبر قيم هذه المرشحات عن أوزان الشبكة (weights).

طبقات انتقائية (Sub-sampling Layers) 

تعد هذه الطبقات خيارية في تصميم الشبكة، أي لا يشترط وجودها، وإن وجدت فستأتي بعد كل طبقة من الطبقات الترشيحية، وتهدف إلى تخفيض عدد العينات أو العصبونات، حيث ستقوم باختصار كل مجموعة من عصبونات الدخل بحجم معين إلى عصبون واحد، ويحدد هذا الحجم ضمن تصميم الشبكة وتكون قيمته المثلى 2×2 لأن تكبيرها قد يؤدي إلى ضياع في المعلومات ويتم التخفيض بعدة طرق منها:

  • التجميع بالقيمة العليا (max pooling): تأخذ القيمة الأعلى بينها
  • التجميع بالمعدل (average pooling) : تأخذ معدل جميع القيم

طبقات تامة الاتصال (Fully Connected)

بعد عدة طبقات من النوعين السابقين تأتي هذه الطبقات لتربط كل عصبونات الطبقة السابقة (مهما كان نوعها) وتجعلها دخل لكل عصبون فيها كما في الشبكات العصبونية العادية، لا يشترط كونها بعدد معين ولكن غالباً يوجد منها طبقتان متتاليتان كطبقات أخيرة في الشبكة إذ لا يمكن أن تأتي قبل طبقة من النوع الترشيحي:

  • تُطبق فيها عملية البسط (flattening operation)

بَسط الدخل إلى متجه خصائص ومن ثَم تمريره إلى شبكة من العصبونات للتنبؤ باحتمالات الخرج.

  • طبقة المدخلات:

هو مصفوفة تتضمن معلومات عن مواقع تضع أشكال (أنماط) مُعقدة مُعينة في الصورة، ونُطلق على هذه الأنماط المُعقدة اسم (مُصنِّفات قابلة للتدريب- trainable classifiers)؛ هي المُرشِّحات ذاتها (kernals) أو مصفوفة الأوزان.

  • طبقة المخرجات:

هو متجه قيمِ يمثِّل كل منها احتمال صنف من التصنيفات التي تُدرَّب الشبكة عليها (أي الأوزان)؛ فمثلاً: نفرض لدينا كل من التصنيفين قطة وسيارة، سيكون خرج الطبقة [0.91 , 0.01] هذا يعني احتمال أن تكون الصورة لِقِطة هو 0.91 أما احتمال كونها لِسيارة هو 0.01 وباختيار الاحتمال الأكبر تكون الصورة من صنف قطة.

  • دالة التفعيل (Activating Function)

هي دالة لا خطيّة ولها عدّة أنواع تجدها في الصورة أدناه.

أنت تنظر مرة واحدة فقط  (YOLO)

يولو (YOLO) هو بمثابة القفزة في مجال الرؤية الحاسوبية، وبالتحديد معالجة الصورة في الوقت الفعلي. لتتعرف على Joseph Redmon عالم الحاسب وصاحب خوارزمية يولو هنا حديثه في TED.

قبل البدء بالشرح شاهد عمل الخوارزمية في الوقت الحقيقي.

لنفترض أننا قسمنا الصورة إلى شبكة بحجم 3 × 3 وهناك إجمالي 3 فئات نريد تصنيف الكائنات لها. الفئات هي المشاة والسيارات والدراجات النارية على التوالي، لذلك بالنسبة لكل خلية شبكة سيكون المدخل متجه ذو ثمانية أبعاد:

لنأخذ السيارة الأولى كمثال:

(pc) يحدد ما إذا كان هناك كائن موجود في الشبكة أم لا.

(bx, by, bh, bw) هذة القيم تحدد أبعاد المربع المحيط. إذا كان هناك كائن سيتم حسابها بالنسبة لخلية الشبكة التي نتعامل معها.

(bx , by) تشير إلى الإحداثيات x , y، في هذه الحالة سيكون bx = 0.4 and by = 0.3.

(bh) هي نسبة ارتفاع المربع المحيط (المربع الأحمر في المثال أعلاه) إلى ارتفاع خلية الشبكة، والتي في مثالنا هي حوالي 0.9.

(bw) هي نسبة عرض المربع المحيط إلى عرض خلية الشبكة وتساوي هنا 0.5.

تمثيل الفئات من نوع مشاة، سيارة، دراجة نارية إذا كان الكائن سيارة سيكون C2=1.

ستصبح النتائج:

باستخدام المثال أعلاه (صورة الإدخال – 100 × 100 × 3 ، الإخراج – 3 × 3 × 8)

سيتم تدريب نموذجنا على النحو التالي:

الآن لدينا صورة سيارة المربع الاحمر يشير إلى منطقة الكائن الفعلي واللون البنفسجي يشير إلى التنبؤ. متى يمكننا القول أن الخوارزمية تتنبأ بشكل صحيح؟

نلاحظ الآن أنه توجد منطقة تقاطع بين المربعين وهذا ما سوف يدلنا إلى جواب سؤالنا بالأعلى

المنطقة التي باللون الأصفر تحدد هذا التقاطع. لقد وضعنا حد (threshold) إذا كانت المنطقة أعلى من 0.5 نقول عنها تنبؤ صحيح، وإذا كانت أقل نقول التنبؤ خاطئ.

قيمة الحد تعود لك، يمكنك زيادتها أو نقصها حسب الحالة، لكن تذكر كلما زدنا الحد زادت نسبة الدقة.

واحدة من أكثر المشاكل شيوعًا في خوارزميات الكشف عن الأشياء (detection) هي أنه بدلاً من اكتشاف الكائن مرة واحدة فقط  قد تكتشفه عدة مرات، هنا لدينا مثال تم التعرف على السيارات أكثر من مرة:

تقوم تقنية( Non-Max Suppression ) بتنظيف هذا الأمر حتى نحصل على اكتشاف واحد فقط لكل كائن.

يبحث أولاً في الاحتمالات المرتبطة بكل كشف ويأخذ أكبر احتمال في الصورة أعلاة 0.9، هو أعلى احتمال، لذلك سيتم تحديد المربع ذو 0.9 بأنه أول احتمال.

ثانياً، يبحث في نفس المنطقة عن الاحتمالات الاقل ويتم قمعها. في المثال في الاعلى هما الاحتمالان 0.7 و 0.6.

ثالثاً، يختار المربع التالي من جميع المربعات ذات الاحتمال الأكبر وهو في مثالنا 0.8 و يتم قمع الاحتمالات الأقل، وهكذا.

دعنا نلخص بسرعة النقاط حول خوارزمية (Non-Max Suppression):

1- تجاهل جميع المربعات التي لها احتمالات أقل من أو تساوي الحد الذي حددناه مسبقًا

2- بالنسبة للمربعات المتبقية:

  • اختر المربع ذو الاحتمال الأعلى واعتبر ذلك بمثابة تنبؤ بالمخرجات
  • تجاهل أي مربع آخر لديه احتمال أكبر من الحد في الخطوة أعلاه

كرر الخطوة 2 حتى يتم اعتبار كل المربعات بمثابة تنبؤ بالمخرجات أو تجاهلها.

هناك طريقة أخرى يمكننا استخدامها لتحسين أداء خوارزمية YOLO.

لقد رأينا أن كل شبكة يمكنها تحديد كائن واحد فقط. ولكن ماذا لو كان هناك كائنات متعددة في شبكة واحدة؟ يمكن أن يكون هذا هو الحال في الواقع، هذا يقودنا إلى مفهوم مربعات الربط (anchor boxes) انظر في الصورة التالية المقسمة إلى شبكة 3 * 3:

تذكر كيف قمنا بتعيين كائن إلى شبكة؟ أخذنا نقطة الوسط للكائن، وبناءً على موقعه قمنا بتعيين الكائن إلى الشبكة. ماذا لو كانت تقع نقطة المنتصف لكلا الكائنين في نفس الشبكة؟ كيف ستكون مربعات الربط الفعلية للكائنات؟

سنحصل على كائن واحد فقط، إما السيارة أو الشخص. ولكن إذا استخدمنا مربعات الربط سوف نتمكن من إخراج المربعين، كيف نفعل ذلك؟ اولاً نقوم مسبقاً بتعريف شكلين مختلفين تسمى مربعات الربط، الآن لكل شبكة بدلاً من وجود مخرج واحد سيكون لدينا مخرجين اثنين (يمكننا زيادة عدد مربعات المخرجات).

في المثال هذا ستكون المدخلات مع مربعات الربط:

تنتمي أول 8 صفوف لمربع الربط 1، والصفوف المتبقية للمربع 2.

يتم تعيين الكائنات إلى مربعات الربط استنادًا إلى تشابه المربعات المحيطة وشكل مربع الربط.

الإخراج في هذه الحالة، بدلاً من 3 × 3 × 8 (باستخدام شبكة 3 × 3 و3 فئات)، ستكون 3 × 3 × 16 (نظرًا لأننا نستخدم مربعي ربط).

دعونا نجمع كل الأفكار التي قمنا بتغطيتها حتى الآن ودمجها في إطار YOLO

سنرى أولاً كيفية تدريب نموذج، ومن ثم كيف يمكن إجراء التنبؤات لصورة جديدة لم تكن مرئية سابقًا.

  • التدريب

مدخلات التدريب الخاصة بنا ستكون صورًا وقيم مقابلة لها.

ضع في اعتبارك السيناريو الذي نستخدم فيه الشبكة 3 × 3 مع مربعات ربط لكل شبكة، وهناك 3 فئات كائن مختلفة. وبالتالي، سيكون شكل مدخلات y المقابلة 3 × 3 × 16. الآن، لنفترض إذا استخدمنا 5 مربعات ربط لكل شبكة وزاد عدد الفئات إلى 5. وبالتالي سيكون الهدف هو 5x10x3x3 = 50 x 3 x 3 هذه هي الطريقة التي تتم بها عملية التدريب.

  • الاختبار

سيتم تقسيم الصورة الجديدة إلى نفس عدد الشبكات التي اخترناها خلال فترة التدريب. بالنسبة لكل شبكة، سيتوقع النموذج إخراج الشكل 3 × 3 × 16 (على افتراض أن هذا هو شكل الهدف خلال وقت التدريب). القيم 16 في هذا التوقع ستكون بنفس تنسيق إدخال التدريب. ستتوافق القيم الثمانية الأولى مع مربع الربط 1، حيث ستكون القيمة الأولى هي احتمال وجود كائن في تلك الشبكة. ستكون القيم 2-5 هي إحداثيات المربع المحيط لهذا الكائن، وسوف تخبرنا القيم الثلاث الأخيرة عن الفئة التي ينتمي إليها الكائن. ستكون القيم الثمانية التالية خاصة بمربع الربط 2 وبنفس التنسيق، أي الاحتمال أولاً، ثم إحداثيات المربع المحيط، وأخيراً الفئات.

أخيرًا ، سيتم تطبيق تقنية (Non-Max Suppression) على المربعات المتوقعة للحصول على تنبؤ واحد لكل كائن.

فيما يلي الأبعاد والخطوات الدقيقة التي تتبعها خوارزمية YOLO:

يأخذ صورة إدخال الشكل (608 ، 608 ،3)، ينقل هذه الصورة إلى شبكة عصبية ترشيحية (CNN)، والتي تُرجع ناتجًا الأبعاد (19 , 19 , 5 , 85).

يتم ضرب البعدين الأخيرين من الناتج أعلاه للحصول على حجم الإخراج (19 , 19 ,425)

هنا، تقوم كل خلية في شبكة 19 × 19 بإرجاع 425 رقمًا 425 = 5 * 85 ، حيث 5 هو عدد مربعات الربط لكل شبكة، 85 = 5 + 80 ، هنا تشير 5 إلى (pc ، bx ،by ، bh ،bw) و 80 هي عدد الفئات التي نريد اكتشافها.

إلى هنا نصل إلى نهاية الجانب النظري لفهم كيفية عمل خوارزمية YOLO.

للتطبيق العملي هنا رابط Github.

 

المصدر
https://arxiv.org/pdf/1804.02767.pdfhttps://pjreddie.com/media/files/papers/yolo_1.pdfhttps://arxiv.org/pdf/1612.08242.pdfhttps://medium.com/@jonathan_hui/real-time-object-detection-with-yolo-yolov2-28b1b93e2088
اظهر المزيد

Asrar

مبرمجة مهتمة بالذكاء الإصطناعي و الرؤية الحاسوبية.

‫2 تعليقات

  1. https://en.wikipedia.org/wiki/Capsule_neural_network
    https://arxiv.org/pdf/1710.09829.pdf
    أظاهر الخوارزمية تتعامل مع تراكيب البيانات اللي في المقالات أعلاه.
    كانت عندي فكرة لو تطبق نفس تركيبة البيانات مع خوارزميات التعرف على الصوت و تحويله الى أوامر
    Natural Language Processing
    بعدها نستخدم برامج التحكم بالأجهزة عن بعد مثل
    Remote Desktop و VNC في لنكس
    بهذه الطريقة جعلنا أنظمة ال Accessibility وهي الخاصة بجعل الكمبيوتر سهل التعامل معه أكثر تطور بحيث الأشخاص الذين يحتاجون مثل هذه الأنظمة للعمل على أجهزتهم الشخصية بأمكانهم التعامل مع شبكات و أجهزه عبر الشبكة فتسمح لذوي الأحتياجات الخاصة بالعمل كمسئولي أنظمة في شركات كبرى وحل مشاكل المستخدمين من المكتب عبر تطبيقات التحكم بالأجهزة عن بعد.

    1. مرحبا مقال مفيد جدا أنا في الحقيقة مهتم بنظم المعلومات الجغرافية لدي تجربة محترمة في هذا المجال توصلت إلى هذا المقال عبر بحث لي يخص نظم المعلومات الجغرافية، أعتقد أنه يمكنني عمل ذلك في مجالي لكن بالنسبة للبرمجة لا أستطيع فعل ذلك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى