- المكونات مطلوبة
- يولو
- تثبيت OpenCV في Raspberry Pi
- تثبيت الحزم الأخرى المطلوبة في Raspberry Pi
- شرح البرنامج
- اختبار مشروع كاشف المسافة الاجتماعية
في زمن كوفيد -19 ، كان التباعد الاجتماعي وسيلة فعالة لإبطاء انتقال الفيروس المعدي. يُنصح الأشخاص بتقليل اتصالهم ببعضهم البعض لتقليل مخاطر انتقال المرض من خلال الاتصال المباشر. يمثل الحفاظ على مسافة آمنة تحديًا للعديد من الأماكن مثل المصانع أو البنوك أو الحافلات أو محطات السكك الحديدية ، إلخ.
لذا ، استمرارًا لمشاريعنا السابقة لسلامة كورونا مثل آلة التعقيم الأوتوماتيكية ومراقبة درجة الحرارة بدون تلامس ، سنقوم هنا ببناء نظام كاشف عن بعد اجتماعي باستخدام OpenCV و Raspberry Pi. سنستخدم أوزان خوارزمية YOLO v3 للكشف عن الكائنات مع وحدة الشبكة العصبية العميقة.
يعد Raspberry Pi دائمًا خيارًا جيدًا لمشاريع معالجة الصور نظرًا لأنه يحتوي على ذاكرة وسرعة أكبر من وحدات التحكم الأخرى. استخدمنا سابقًا Raspberry Pi لبعض مشاريع معالجة الصور المعقدة مثل اكتشاف معالم الوجه وتطبيق التعرف على الوجه.
المكونات مطلوبة
- رازبيري باي 4
هنا نحتاج فقط إلى RPi 4 مع OpenCV مثبت عليه. يتم استخدام OpenCV هنا لمعالجة الصور الرقمية. أكثر تطبيقات معالجة الصور الرقمية شيوعًا هي اكتشاف الكائنات والتعرف على الوجوه وعداد الأشخاص.
يولو
YOLO (أنت تنظر مرة واحدة فقط) هي شبكة عصبية التفاف ذكية (CNN) لاكتشاف الكائنات في الوقت الفعلي. YOLOv3 ، أحدث متغير لخوارزمية اكتشاف الكائن ، يمكن لـ YOLO التعرف على 80 كائنًا مختلفًا في الصور ومقاطع الفيديو ، وهو سريع للغاية ولديه دقة ممتازة. تطبق الخوارزمية شبكة عصبية واحدة على الصورة بأكملها ، ثم تفصل الصورة إلى مناطق وتحسب مربعات الحدود والاحتمالات لكل منطقة. يمكن لنموذج YOLO الأساسي معالجة الصور في الوقت الفعلي بمعدل 45 إطارًا في الثانية. يتفوق نموذج YOLO على جميع طرق الكشف الأخرى مثل SSD و R-CNN.
يمكن تنزيل نموذج YOLOV3 الذي سنستخدمه في هذا المشروع من هنا.
تثبيت OpenCV في Raspberry Pi
قبل تثبيت OpenCV والاعتمادات الأخرى ، يجب تحديث Raspberry Pi بالكامل. استخدم الأوامر التالية لتحديث Raspberry Pi إلى أحدث إصدار:
sudo apt-get update
ثم استخدم الأوامر التالية لتثبيت التبعيات المطلوبة لتثبيت OpenCV على Raspberry Pi الخاص بك.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –y sudo apt-get install libqt4-test –y
أخيرًا ، قم بتثبيت OpenCV على Raspberry Pi باستخدام الأوامر أدناه.
تثبيت pip3 opencv-Contrib-python == 4.1.0.25
إذا كنت جديدًا على OpenCV ، فتحقق من دروس OpenCV السابقة مع Raspberry Pi:
- تثبيت OpenCV على Raspberry Pi باستخدام CMake
- التعرف على الوجوه في الوقت الحقيقي باستخدام Raspberry Pi و OpenCV
- التعرف على لوحة الترخيص باستخدام Raspberry Pi و OpenCV
- تقدير حجم الحشد باستخدام OpenCV و Raspberry Pi
لقد أنشأنا أيضًا سلسلة من دروس OpenCV التعليمية بدءًا من مستوى المبتدئين.
تثبيت الحزم الأخرى المطلوبة في Raspberry Pi
قبل برمجة Raspberry Pi for Social Distance detector ، دعنا نثبت الحزم الأخرى المطلوبة.
تثبيت imutils: يتم استخدام imutils لجعل وظائف معالجة الصور الأساسية مثل الترجمة ، والتدوير ، وتغيير الحجم ، والهيكل العظمي ، وعرض صور Matplotlib أسهل باستخدام OpenCV. استخدم الأمر أدناه لتثبيت imutils:
pip3 تثبيت imutils
شرح البرنامج
يتم إعطاء رمز كامل في نهاية الصفحة. نحن هنا نوضح الأقسام المهمة من الكود للحصول على شرح أفضل.
لذلك في بداية الكود ، قم باستيراد جميع المكتبات المطلوبة التي سيتم استخدامها في هذا المشروع.
استيراد numpy كـ np import cv2 import imutils استيراد نظام التشغيل وقت الاستيراد
و تحقق () يتم استخدام الدالة لحساب المسافة بين كائنين أو نقطتين في إطار من الفيديو. تشير النقطتان أ و ب إلى كائنين في الإطار. يتم استخدام هاتين النقطتين لحساب المسافة الإقليدية بين الكائنات.
تحقق def (أ ، ب): dist = ((أ - ب) ** 2 + 550 / ((أ + ب) / 2) * (أ - ب) ** 2) ** 0.5 معايرة = (أ + ب) / 2 إذا كانت 0 <dist <0.25 * معايرة: إرجاع صحيح آخر: إرجاع خطأ
تُستخدم وظيفة الإعداد لتعيين مسارات أوزان YOLO ، ملف cfg ، ملف أسماء COCO. تُستخدم وحدة os.path لمعالجة اسم المسار المشترك. وحدة () os.path.join هي وحدة نمطية فرعية من os.path وتستخدم لربط واحد أو أكثر من مكونات المسار بذكاء. cv2.dnn.readNetFromDarknet () تستخدم طريقة لتحميل الأوزان المحفوظة في الشبكة. بعد تحميل الأوزان ، استخرج قائمة كل الطبقات المستخدمة في الشبكة باستخدام نموذج net.getLayerNames .
def Setup (yolo): global neural_net، ln، LABELS weights = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath)).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config، weights) ln = neural_net.getLayerNames () ln = - 1] for i in neural_net.getUnconnectedOutLayers ()]
داخل وظيفة معالجة الصور ، نأخذ إطارًا واحدًا للفيديو ثم نعالجها لاكتشاف المسافات الاجتماعية بين كل شخص وسط الحشد. في أول سطرين من الوظيفة ، قمنا بتعيين أبعاد إطار الفيديو (W ، H) على أنها (بلا ، بلا) في البداية. في السطر التالي ، استخدمنا طريقة cv2.dnn.blobFromImage () لتحميل الإطارات دفعة واحدة وتشغيلها عبر الشبكة. ينفذ وظيفة سائل الطرح المتوسط الحسابي و تحجيم، و قناة مبادلة على الإطار.
(H، W) = (None، None) frame = image.copy () إذا كان W بلا أو H لا شيء: (H، W) = frame.shape blob = cv2.dnn.blobFromImage (frame، 1 / 255.0، (416 ، 416) ، swapRB = صحيح ، اقتصاص = خطأ) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
تتكون مخرجات الطبقة من YOLO من مجموعة من القيم. تساعدنا هذه القيم في تحديد أي كائن ينتمي إلى أي فئة . نقوم بعمل حلقة فوق كل ناتج في layerOutputs وعندما نكتشف الأشخاص ، قمنا بتعيين تسمية الفئة على أنها "شخص". من كل اكتشاف ، نحصل على مربع محيط يعطينا مركز X ، ومركز Y ، وعرض ، وارتفاع الصندوق للكشف في الإخراج:
الدرجات = الكشف maxi_class = np.argmax (النتائج) الثقة = الدرجات إذا كانت LABELS == "الشخص": إذا كانت الثقة> 0.5: المربع = الاكتشاف * np.array () (centerX ، centerY ، العرض ، الارتفاع) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (height / 2)) outline.append () confidences.append (float (trust))
بعد ذلك ، احسب المسافة بين مركز المربع الحالي مع جميع المربعات الأخرى المكتشفة. إذا كانت المربعات المحيطة قريبة ، فقم بتغيير الحالة إلى صحيح.
بالنسبة لـ i في النطاق (len (center)): لـ j في النطاق (len (مركز)): إغلاق = تحقق (مركز ، مركز) إذا كان قريبًا: pairs.append (، مركز]) الحالة = الحالة الحقيقية = مؤشر حقيقي = 0
في السطور التالية ، ارسم مستطيلاً حول الشخص باستخدام أبعاد الصندوق التي تلقيناها من النموذج ، ثم تحقق مما إذا كان الصندوق آمنًا أم غير آمن. إذا كانت المسافة بين المربعات قريبة ، فسيتم تلوين المربع باللون الأحمر ، وإلا فسيتم تلوين المربع باللون الأخضر.
(x ، y) = (مخطط تفصيلي ، مخطط تفصيلي) (w ، h) = (مخطط تفصيلي ، مخطط تفصيلي) إذا كانت الحالة == صحيح: cv2.rectangle (إطار ، (x ، y) ، (x + w ، y + h) ، (0، 0، 150)، 2) حالة elif == خطأ: cv2.rectangle (frame، (x، y)، (x + w، y + h)، (0، 255، 0)، 2)
الآن داخل وظيفة الحلقة ، نقرأ كل إطار في الفيديو ثم نعالج كل إطار لحساب المسافة بين الأشخاص.
ret، frame = cap.read () إن لم يكن مُعادًا: break current_img = frame.copy () current_img = imutils.resize (current_img، width = 480) video = current_img.shape Frameno + = 1 if (frameno٪ 2 == 0 أو Frameno == 1): الإعداد (yolo) ImageProcess (current_img) Frame = ProcessingImg
في السطور التالية ، استخدم وظيفة cv2.VideoWriter () لتخزين إخراج الفيديو في الموقع المحدد بواسطة اسم التشغيل الذي حددناه سابقًا.
إذا كان الإنشاء بلا: fourcc = cv2.VideoWriter_fourcc (* 'XVID') قم بإنشاء = cv2.VideoWriter (اسم التشغيل ، fourcc ، 30 ، (Frame.shape ، Frame.shape) ، صحيح) create.write (الإطار)
اختبار مشروع كاشف المسافة الاجتماعية
بمجرد أن يصبح الرمز جاهزًا ، افتح Pi Terminal وانتقل إلى دليل المشروع. يجب أن يكون الكود ونموذج Yolo والفيديو التوضيحي في نفس المجلد كما هو موضح أدناه.
يمكنك تنزيل دليل YoloV3 من هنا ، ومقاطع فيديو من Pexels ونسخ كود Python الوارد أدناه ، ووضعها في نفس الدليل كما هو موضح أعلاه.
بمجرد دخولك إلى دليل المشروع ، قم بتنفيذ الأمر التالي لبدء الكود:
كاشف python3
لقد جربت هذا الكود على مثال فيديو تم الحصول عليه من Pexels. بالنسبة لي ، كانت FPS بطيئة للغاية واستغرقت حوالي 10 إلى 11 دقيقة لمعالجة الفيديو بأكمله.
بدلا من استخدام الفيديو، يمكنك حتى اختبار هذا الرمز مع كاميرا التوت بي عن طريق استبدال cv2.VideoCapture (المدخلات) مع cv2.VideoCapture (0) في 98 تشرين خط رمز. تعرف على المزيد حول استخدام PiCamera مع Raspberry Pi باتباع الرابط.
هذه هي الطريقة التي يمكنك بها استخدام OpenCV مع Raspberry Pi لاكتشاف انتهاكات التباعد الاجتماعي. يتم إعطاء الفيديو الناتج والكود أدناه: