رصد المسافة الاجتماعية باستخدام الرؤية الحاسوبية Social Distancing Detector

Social Distance Detection

التدقيق العلمي: د. دانيا صغير، م. محمّد سرميني
التدقيق اللغوي: هبة الله فلّاحة

المقدمة Introduction

يعدّ التباعد الاجتماعيّ طريقة مهمة لإبطاء انتشار الأمراض المُعدية، حيث يُطلب من الأشخاص الحدّ من تفاعلاتهم مع بعضهم البعض، مما يقلل من فرص انتشار المرض عن طريق الاتصال الجسديّ أو القريب. في العقد الماضي، أظهر الذّكاء الاصطناعيّ / التعلّم العميق نتائج واعدة في العديد من مشاكل الحياة اليوميّة، وتمّ أتمتة مهامّ الحياة اليوميّة المختلفة بمساعدة الذّكاء الاصطناعيّ. في هذه المقالة، سنتناول بالتفصيل كيف يمكن استخدام التعلّم العميق والرؤية الحاسوبيّة لمراقبة التباعد الاجتماعيّ.

سننفذ التعلم العميق والرؤية الحاسوبية باستخدام لغة البرمجة بايثون. 

ماهي مسافة الأمان الاجتماعيّة Social Distancing؟

هي من أحد وأهمّ الإجراءات الواجب اتباعها في أوقات الأوبئة لمنع انتشار الأمراض المُعدية، تعني أنّ الناس يجب أن يبتعدوا بأجسادهم عن بعضهم البعض للحدّ من انتشار الأمراض المُعدية.

التدقيق العلمي: د. دانيا صغير، م. محمد سرميني
التدقيق اللغوي: هبة الله فلّاحة

مبدأ عمل نموذج التباعد الاجتماعيّ بشكل عامّ Social Distancing Model

اكتشاف الأشخاص في كلّ إطار من إطارات الفيديو باستخدام خوارزميّة يولو (yolo)، فهي عبارة عن شبكة طيّ عصبونيّة قادرة على اكتشاف أغراض متعدّدة في الزّمن الحقيقيّ من خلال عملية مسح واحدة فقط. في هذا النموذج سنقوم باستخدام الإصدار الثالث من هذه الخوارزميّة.
حساب المسافة بين كلّ شخص مع باقي الأشخاص الآخرين، من خلال حساب المسافة بين مركزيّ مربع الإحاطة Bounding box الخاصّة بالشخصين المطلوب دراسة المسافة الاجتماعيّة بينهما.
تصنيف المسافة المحدّدة بين كلّ شخص مع باقي الأشخاص، إذا كانت المسافة قليلة يكون هذا الشخص في مرحلة الخطر وقد يتعرّض للإصابة، بالتالي يتمّ وضع إطارٍ لونه أحمر حوله، أمّا إذا كانت المسافة كبيرة يكون هذا الشخص في مرحلة أمان وبالتالي يتمّ وضع إطارٍ لونه أخضر حوله.

مبدأ عمل نموذج التباعد الاجتماعيّ بشكل خاصّ Social Distancing Model

الشكل(1) -المبدأ الخاصّ لعمل نموذج التباعد الاجتماعيّ
  • ليكن لدينا صورة مدخلة (إمّا ثابتة أو عبارة عن إطار من إطارات الفيديو).
  • تطبيق خوارزميّة الكشف عن الأغراض object detection لاكتشاف جميع الأشياء الموجودة في الصّورة (إنسان – سيّارة – إشارة مرور)، ثمّ نأخذ فقط الأغراض التي تعبّر عن المشاة من خلال رقم الصنف class الخاصّ بالإنسان.
  • حساب المسافة بين مركزيّ مربع الإحاطة المتعلقين بكلّ شخصين في الصورة.
  • اختبار هذه المسافة بين كلّ شخصين، إذا كانت أقلّ من قيمة معيّنة “يتمّ تحديدها” بالتالي الشخصان لا يحققان القواعد الصحيّة للتباعد الاجتماعيّ، أو إذا كانت المسافة أكبر بالتالي الشخصان يحققان القواعد الصحيّة للتباعد الاجتماعيّ.
  • إظهار النتائج.

مراحل تطور الخوارزميّات المستخدمة في عمليّة الكشف عن الأغراض

النافذة المتحرّكة Sliding Window

تعتبر الطريقة الأبسط لبناء نموذج يعمل على اكتشاف الأغراض، حيث تعتمد على تقسيم الصورة لعدّة مناطق متساوية الحجم وبعد ذلك تصنيف الغرض المكتشف في كلّ منطقة (إنسان، فاكهة، سيّارة…). من الممكن أن تكون النوافذ متداخلة فيما بينها وذلك يعتمد على خطوة التّحريك stride، إذا كانت قليلة جدًّا من المؤكد سيحدث تداخل أمّا إذا كانت كبيرة بنسبة معيّنة فلا يحدث تداخل.

خطوات مبدأ عمل النافذة المتحرّكة برمجيًّا:

ليكن لدينا صورة ما، نقوم بتقسيم الصورة إلى عدّة مناطق متساوية (على سبيل المثال 10*10)، و لأجل كلّ منطقة نقوم بما يلي:

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

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

شبكة الطيّ العصبونيّة المناطقيّة ذات القناع Region-Based Convolutional Neural Network (R-CNN)

هي تحسين لخوارزميّة النافذة المتحرّكة، بحيث يتمّ تجاهل المناطق التي من الممكن ألّا تحتوي على غرض، حيث نسمي العمليّة التي يتمّ فيها اختيار المناطق التي من الممكن أن تحتوي على غرض  باقتراحات المنطقة “Region Proposals”.

تمّ اقتراح العديد من الخوارزميّات لمعرفة المناطق الهامّة في الصّورة (Region of Interest(ROI)،   ولكنّ أفضلها هي خوارزميّة البحث الانتقائيّ “(Selective Search (SS”.

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

 يمكن القول: إنّ R-CNN هي عبارة عن شبكة عصبونيّة قائمة علاس المنطقة.

الشكل(2) -الشكل العام لخوارزميّة R-CNN

خطوات عمل شبكة الطيّ العصبونيّة المناطقيّة ذات القناع R-CNN برمجيًّا:

  1. ليكن لدينا صورة ما.
  2. نوجد كلّ المناطق المهمّة في الصورة “ROI” باستخدام خوارزميّة البحث الانتقائيّ .  
  3. من أجل كلّ منطقة نقوم بما يلي:
  • نطبق على كلّ منطقة من المناطق التي تمّ استخراجها شبكة طيّ عصبونيّة  CNN.
  • نستخرج المزايا المميّزة للصّورة من شبكة الطيّ CNN.
  • يتمّ إدخال المزايا التي تمّ استخراجها  من شبكة الطيّ   على شبكة طيّ عصبونيّة كاملة الاتصال Fully connected  فنحصل منها  على خرجين، الخرج الأوّل من أجل توقع مربع التحديد الخاصّ بكلّ غرض بحيث يتمّ استخدام خوارزميّة الانحدار Regression  في الخرج، أما بالنسبة للخرج الثاني، فهو من أجل تصنيف الغرض الموجود في مربع التّحديد الذي تمّ توقّعه في الخرج الأوّل (إنسان، قطّة، سيّارة . . . ) يتمّ استخدام خوارزميّة آلة المتجّه الدّاعم  SVM  في الخرج، حيث تعتبر  من خوارزميّات تعلّم الآلة Machine Learning وتُصنّف من الخوارزميّات الخاضعة للإشراف، مهمّتها القيام بعمليّة التّصنيف الثنائيّ “binary classification”، بالإضافة لمهمة التّصنيف المتعدّد  “Multi Classification“.

شبكة الطيّ العصبونيّة المناطقيّة السريعة Fast Region-Based Convolutional Neural Network(Fast R-CNN)

الشكل(3) -الشكل العام لخوارزميّة Fast R-CNN

خطوات عمل شبكة الطيّ العصبونيّة المناطقيّة السريعة  Fast R-CNN برمجيًّا:

  • ليكن لدينا صورة ما.
  • يتمُّ إيجاد كلّ المناطق المهمّة في الصّورة “ROI” باستخدام خوارزميّة البحث الانتقائيّ .
  • يتمُّ إدخال الصّورة على شبكة طيّ CNN.
  • يتمُّ استخراج خريطة المزايا features map من كامل الصّورة من خلال شبكة عصبونية ConvNet، حيث يُعتبر خرج هذه الشبكة صورة تحتوي على الخصائص “المزايا” الخاصّة بالصّورة المدخلة، وعدد خرائط المزايا في الصّورة هو من مرتبات n².
  • يتمُّ القيام بعمليّة إسقاط لكلّ منطقة من المناطق التي تمّ إيجادها بواسطة خوارزميّة البحث الانتقائيّ  على خريطة المزايا المناظرة، (أي بمعنى أوضح معرفة موقع كلّ منطقة مهمّة على خريطة المزايا).
  • يتمُّ إدخال جميع المناطق إلى شبكة الهرم التسلسلي القابلة للتطوير  SSPNet 

(Scalable Sequential Pyramid Network) (وهي عبارة عن شبكة عصبية تلافيفية قابلة للتطوير بدرجة عالية وتتميز هذه الشبكة ببنية ذات مرونة عالية لتلبية أفضل حل وسط يتعلق بالسرعة والدقة) على شكل صور، كلّ صورة تعبر عن مناطق مهمّة في الصورة ROI بعد ذلك نقوم بعمليّة التّجميع Pooling max لكلّ منطقة لتخفيض حجمها وجعل أبعادها ثابتة. نحن نعلم أنه لا يمكن أن يكون دخل الشبكة كاملة الاتصال متغيرًا؛ لهذا السبب جعلنا أبعاد كلّ منطقة ثابتة وذلك باستخدام شبكة الهرم التسلسلي القابلة للتطويرSSPNet .

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

  • نحصل من  الشبكة كاملة الاتصال على خرجين، الخرج الأوّل من أجل توقّع مربع الإحاطة  الخصّ بكلّ غرض بحيث يتمّ استخدام خوارزميّة الانحدار الخطيّ Regression Linear في الخرج، والخرج الثاني من أجل تصنيف الغرض الموجود في مربع الإحاطة الذي تمّ توقُّعه في الخرج الأوّل، مع العلم أنه يتمّ تطبيق تابع سوفت ماكس Softmax على الخرج الثاني

شبكة الطيّ العصبونيّة المناطقيّة الأسرع  Faster Region-Based Convolutional Neural Network (Faster R-CNN)

هي عبارة عن تحسين للخوارزميّتين Fast R-CNN وR-CNN، تمّ الاستغناء عن خوارزميّة البحث الانتقائيّ المكلفة زمنيًّا والمستخدمة في عمليّة استخراج المناطق المهمّة “ROI”، (حيث تأخذ عمليّة استخراج كلّ منطقة زمنًا معيّنًا بالتالي من أجل 2000 منطقة سوف يكون زمنًا كبيرًا). وتمَّ استخدام شبكة اقتراح المناطق المهمة  RPN اختصار Region -Proposal -Network وهي عبارة عن شبكة تقوم باستخراج المناطق المهمّة بشكل سريع جدًّا تعتمد على مفهوم صناديق الارتكاز  Anchors Boxes.

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

تعدّ خوارزميّة يولو من أهمّ الخوارزميّات المستخدمة في مجال الرؤية الحاسوبيّة Computer vision، فهي قادرة على تصنيف الأغراض الموجودة داخل صورة معيّنة (إنسان، فاكهة، سيارة… ) بالإضافة إلى تحديد مكان وجود هذه الأغراض داخل الصّورة 4، خوارزميّة يولو YOLO هي اختصار لـعبارة “You Only Look Once” أي بمعنى أنها تتطلّب مرورًا واحدًا فقط (انتشار أماميّ) عبر الشبكة العصبونيّة لاكتشاف أغرضٍ متعدّدة داخل صورة، بحيث يتمّ تقسيم الصّورة إلى مناطق ويتمّ التنبّؤ بمربع الإحاطة والاحتمالات لكلّ منطقة.

تُستخدم خوارزميّة يولو في اكتشاف الأشخاص في كلّ إطار من إطارات الفيديو، يستخدم الإصدار الثّالث منها بنية دارك نت DarkNet-53 المكوّنة من 53 طبقة مدرّبة على بيانات ايمج-نت ImageNet، وتمّ تكديس 53 طبقة أخرى أيضًا مما يمنحها بنية 106 طبقة  بالكامل.

ميزتها الأساسيّة هي الكشف في ثلاثة مقاييس مختلفة، أي يتمّ التنبّؤ ثلاث مرات من أجل دخل واحد.

لمعرفة المزيد من التفاصيل عن خوارزمية الكشف والتعرف على الأغراض YOLO v3 اضغط هنا.

تطبيق عملي Implementation

من أجل الكشف عن الأشخاص، هناك بعض الخطوات التي يجب القيام بها:

اختيار النّموذج Model Selection

 تمّ تدريب النّموذج على مجموعة البيانات كوكو COCO التي تحتوي على 120.000 صورة بإجمالي 880.000 عنصر مُعنون في هذه الصور. تمّ تدريب هذه النّماذج على اكتشاف 90 نوعًا مختلفًا من الأغراض المحدّدة في مجموعة البيانات هذه.

اكتشاف الأشخاص People Detection

 بدايةً نقوم بتحميل الملفّ الذي يحتوي على النموذج وتحديد النواتج التي نريد الحصول عليها من النموذج، ومن ثمّ نقوم بتمرير كلّ إطار /صورة للحصول على المخرجات المرغوبة. وأيضًا يتمتصفية التنبؤات الضعيفة والأشياء التي لا نحتاج إلى الكشف عنها.

لتحميل الملف اضغط هنا

class Model:
def __init__(self, model_path):
           self.detection_graph = tf.Graph()
       with self.detection_graph.as_default():
            od_graph_def = tf.compat.v1.GraphDef()
            with tf.io.gfile.GFile(model_path, 'rb') as file:
                serialized_graph = file.read()
                od_graph_def.ParseFromString(serialized_graph)
                tf.import_graph_def(od_graph_def, name='')
  self.sess = tf.compat.v1.Session(graph=self.detection_graph)
    def predict(self,img):
        img_exp = np.expand_dims(img, axis=0)

كلّ إطار يتمّ تمريره من خلال النموذج يحتاج إلى معالجة، يتمّ ذلك عن طريق استدعاء دالة run (). ويجب تحديد بعض البارمترات عند القيام بذلك كنوع المدخلات التي يطلبها النموذج والمخرجات التي نريد العودة منها. في حالتنا المخرجات المطلوبة هي كما يلي:

المربعات المحيطة بكلّ كائن (إحداثيات كلّ كائن)، بالإضافة إلى رصد المسافة الاجتماعيّة بين كلّ شخصين متجاورين.

(boxes,scores,classes)=self.sess.run([self.detection_graph.get_tensor_by_name('detection_boxes:0'),self.detection_graph.get_tensor_by_name('detection_scores:0'), self.detection_graph.get_tensor_by_name('detection_classes:0')],feed_dict={self.detection_graph.get_tensor_by_name('image_tensor:0'): img_exp})
 return (boxes, scores, classes)

من أجل استبعاد كلّ من التوقعات الضعيفة (العتبة: 0.75) وجميع أصناف  الأغراض الأخرى باستثناء الأشخاص، استخدمت العبارة الشرطيّة if التي تجمع بين الشرطين لاستبعاد أيّ كائن آخر من الحساب الإضافيّ.

if int(classes[i]) == 1 and scores[i] > 0.75

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

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

width, height, _ = image.shape

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

def compute_perspective_transform(corner_points,width,height,image):
  
  corner_points_array = np.float32(corner_points)
 
  img_params = np.float32([[0,0],[width,0],[0,height],[width,height]])
 
  matrix = cv2.getPerspectiveTransform(corner_points_array,img_params) 
  img_transformed = cv2.warpPerspective(image,matrix,(width,height))
  return matrix,img_transformed

نلاحظ أنّه تمّ إرجاع المصفوفة لأنه سيتمّ استخدامها في الخطوة التالية، لحساب الإحداثيّات الجديدة لكلّ شخص يتمّ اكتشافه، والنتيجة هي إحداثيّات “GPS”  لكلّ شخص في الإطار. يعدّ استخدام هذه العناصر أكثر دقة مقارنةً باستخدام النّقاط في الإطار الأصليّ، و يمكن أن يؤدّي ذلك إلى تحسين قياس التباعد الاجتماعيّ كثيرًا.

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

def compute_point_perspective_transformation(matrix,list_downoids):

عندما تتغيّر إحداثيّات النّقاط للمربّعات المُنشأة، نقوم بإرجاع قائمة تحتوي على النّقاط المُراد تحويلها إلى إحداثيّات جديدة، حيث أنّه يتمّ الحصول على الإحداثيّات الجديدة من خلال الإحداثيّات القديمة، وإرجاع قائمة النّقاط التي طرأ عليها تغيير لأنّها مهمّة في إعادة حساب المسافة الاجتماعيّة.

   list_points_to_detect = np.float32(list_downoids).reshape(-1, 1, 2)
  transformed_points = cv2.perspectiveTransform(list_points_to_detect, matrix)
  
  transformed_points_list = list()
  for i in range(0,transformed_points.shape[0]):
    transformed_points_list.append([transformed_points[i][0][0],transformed_points[i][0][1]])
  return transformed_points_list

قياس التباعد الاجتماعيّ  Social distancing measurement

  if len(transformed_downoids) >= 2:
 
list_indexes= list(itertools.combinations(range(len(transformed_downoids)), 2))
    for i,pair in enumerate(itertools.combinations(transformed_downoids, r=2)):

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

if math.sqrt( (pair[0][0] - pair[1][0])**2 + (pair[0][1] - pair[1][1])**2 ) < int(distance_minimum):

ومن بعدها يتم القيام بتغيير ألوان النقاط القريبة جداً من بعضها إلى اللون الأحمر.

 change_color_topview(pair)
        index_pt1 = list_indexes[i][0]
        index_pt2 = list_indexes[i][1]
        change_color_originalframe(index_pt1,index_pt2)

النتائج Results

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

يمكن الوصول إلى كامل الشيفرة البرمجية عن طريق الرابط التالي github

الخاتمة

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

المراجـــــع

  1. Social-Distancing-Detector.
  2. Real-Time Social Distance Monitoring tool using Computer Vision.
  3. A social distancing detector using a Tensorflow object detection model, Python and OpenCV.
  4. Computer Vision Is Ready Now.
  5. Social Distancing Analyzer Using Computer Vision and Deep Learning.
  6. Analyze a Soccer game using Tensorflow Object Detection and OpenCV.
0 Shares:
اترك تعليقاً

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

You May Also Like