- רכיבים נדרשים
- אתה חי רק פעם אחת
- התקנת OpenCV ב- Raspberry Pi
- התקנת חבילות נדרשות אחרות ב- Raspberry Pi
- הסבר לתוכנית
- בדיקת פרויקט גלאי המרחק החברתי
בתקופת קוביד 19, הרחקה חברתית היא דרך יעילה להאט את העברת הנגיף המדבק. מומלץ לאנשים למזער את הקשר שלהם זה עם זה כדי למזער את הסיכון להעברת המחלה במגע ישיר. שמירה על מרחק בטוח היא אתגר עבור מקומות רבים כמו מפעלים, בנקים, אוטובוסים או תחנות רכבת וכו '.
אז בהמשך לפרויקטים הבטיחותיים הקודמים של קורונה כמו מכונת חיטוי אוטומטית וניטור טמפרטורות ללא מגע, כאן אנו הולכים לבנות מערכת גלאי הרחקה חברתית באמצעות OpenCV ו- Raspberry Pi. נשתמש במשקולות של אלגוריתם איתור האובייקטים YOLO v3 עם מודול הרשת העצבית העמוקה.
פטל פי הוא תמיד בחירה טובה עבור פרויקטים של עיבוד תמונה מכיוון שיש לו יותר זיכרון ומהירות מאשר בקרים אחרים. בעבר השתמשנו ב- Raspberry Pi עבור כמה פרויקטים מורכבים לעיבוד תמונות כמו זיהוי ציוני פנים ויישום זיהוי פנים.
רכיבים נדרשים
- פטל פי 4
כאן אנו זקוקים רק ל- RPi 4 עם OpenCV המותקן עליו. OpenCV משמש כאן לעיבוד תמונה דיגיטלית. היישומים הנפוצים ביותר של עיבוד תמונה דיגיטלית הם זיהוי אובייקטים, זיהוי פנים ומניעת אנשים.
אתה חי רק פעם אחת
YOLO (אתה מסתכל רק פעם אחת) היא רשת עצבית מסוג Convolution (CNN) חכמה לזיהוי אובייקטים בזמן אמת. YOLOv3, הגרסה האחרונה של אלגוריתם זיהוי האובייקטים, YOLO יכול לזהות 80 אובייקטים שונים בתמונות ובסרטונים, והוא מהיר במיוחד ובעל דיוק מעולה. האלגוריתם מחיל רשת עצבית אחת על כל התמונה, ואז מפריד את התמונה לאזורים ומחשב תיבות גבול והסתברויות לכל אזור. מודל YOLO בסיסי יכול לעבד תמונות בזמן אמת ב 45 פריימים לשנייה. דגם YOLO עולה על כל שיטות הזיהוי האחרות כמו SSD ו- R-CNN.
ניתן להוריד מכאן את מודל YOLOV3 בו אנו נשתמש בפרויקט זה.
התקנת OpenCV ב- Raspberry Pi
לפני התקנת ה- OpenCV ותלות אחרות, יש לעדכן את Raspberry Pi לחלוטין. השתמש בפקודות שלמטה כדי לעדכן את ה- Raspberry Pi לגרסתו האחרונה:
עדכון sudo apt-get
לאחר מכן השתמש בפקודות הבאות כדי להתקין את התלות הנדרשת להתקנת 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 לגלאי מרחקים חברתיים, נתקין את החבילות הנדרשות האחרות.
התקנת imutils: imutils משמש כדי להקל על פונקציות עיבוד תמונה חיוניות כגון תרגום, סיבוב, שינוי גודל, השלד והצגת תמונות Matplotlib קלות יותר באמצעות OpenCV. השתמש בפקודה שלהלן כדי להתקין את הדמויות:
pip3 להתקין imutils
הסבר לתוכנית
הקוד השלם ניתן בסוף העמוד. כאן אנו מסבירים את החלקים החשובים בקוד להסבר טוב יותר.
אז בתחילת הקוד, ייבא את כל הספריות הנדרשות שישמשו אותך לפרויקט זה.
ייבוא קהה כ- np ייבוא cv2 ייבוא imutils ייבוא זמן יבוא
בדוק () הפונקציה משמשת כדי לחשב את המרחק בין שני אובייקטים או שתי נקודה בתוך מסגרת של וידאו. הנקודות a ו- b מציינות את שני האובייקטים במסגרת. שתי נקודות אלה משמשות לחישוב המרחק האוקלידי בין האובייקטים.
def בדוק (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0.5 כיול = (a + b) / 2 אם 0 <dist <0.25 * כיול: להחזיר אמת אחרת: להחזיר שקר
פונקציית ההתקנה משמשת לקביעת הנתיבים עבור משקולות YOLO, קובץ cfg, קובץ שמות COCO. מודול os.path משמש למניפולציה נפוצה של שם דרך. מודול os.path.join () הוא מודול משנה של os.path ומשמש לחיבור אחד או יותר ממרכיבי נתיב בצורה חכמה. שיטת cv2.dnn.readNetFromDarknet () משמשת לטעינת המשקולות שנשמרו ברשת. לאחר טעינת המשקולות, הוצא את רשימת כל השכבות המשמשות ברשת באמצעות מודל net.getLayerNames .
הגדרת def (yolo): neural_net גלובלי, ln, LABELS weights = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath קרא (). רצועה (). פיצול ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weights) ln = neural_net.getLayerNames () ln = - 1] עבור i ב- neural_net.getUnconnectedOutLayers ()]
בתוך פונקציית עיבוד התמונה, אנו לוקחים פריים יחיד של וידיאו ואז מעבדים אותה לגילוי הרחקה חברתית בין כל אדם בקהל. בשתי השורות הראשונות של הפונקציה, הגדרנו את הממדים של מסגרת הווידאו (W, H) כ (None, None) בהתחלה. בשורה הבאה השתמשנו בשיטת cv2.dnn.blobFromImage () כדי לטעון מסגרות באצווה ולהריץ אותן דרך הרשת. מבצעת פונקצית בועת חיסור ממוצע, Scaling, ואת הערוץ להחליף על מסגרת.
(H, W) = (ללא, ללא) מסגרת = image.copy () אם W אינה או H אינה: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
תפוקות השכבה מ- YOLO מורכבות ממערכת ערכים. ערכים אלה עוזרים לנו להגדיר איזה אובייקט שייך לאיזה מחלקה . אנו עוקבים אחר כל פלט בשכבות OutOts וכאשר אנו מזהים אנשים, אנו מגדירים את תווית הכיתה כ"אדם ". מכל זיהוי, אנו מקבלים תיבת תוחם שנותנת לנו מרכז X, Y מרכז, רוחב וגובה התיבה לזיהוי בפלט:
ציונים = זיהוי maxi_class = np.argmax (ציונים) ביטחון = ציונים אם LABELS == "אדם": אם ביטחון> 0.5: box = זיהוי * np.array () (centerX, centerY, רוחב, גובה) = box.astype ("int") x = int (centerX - (רוחב / 2)) y = int (centerY - (גובה / 2)) outline.append () confidences.append (float (ביטחון))
לאחר מכן, חישב את המרחק בין מרכז התיבה הנוכחית עם כל שאר התיבות שזוהו. אם תיבות התוחם קרובות, שנה את הסטטוס לאמיתי.
עבור i בטווח (len (מרכז)): עבור j בטווח (len (מרכז)): סגור = בדוק (מרכז, מרכז) אם קרוב: זוגות. הוסף (, מרכז]) סטטוס = מצב אמיתי = אינדקס אמיתי = 0
בשורות הבאות, צייר מלבן סביב האדם באמצעות מידות התיבה שקיבלנו מהדגם, ואז בדוק אם התיבה בטוחה או לא בטוחה. אם המרחק בין הקופסאות קרוב, צבע התיבה יהיה בצבע אדום אחרת התיבה תהיה בצבע ירוק.
(x, y) = (מתאר, מתאר) (w, h) = (מתאר, מתאר) אם סטטוס == נכון: cv2. מלבן (מסגרת, (x, y), (x + w, y + h), (0, 0, 150), 2) מצב elif == שקר: cv2. מלבן (מסגרת, (x, y), (x + w, y + h), (0, 255, 0), 2)
כעת בתוך פונקציית הלולאה אנו קוראים כל פריים בסרטון ואז מעבדים כל פריים כדי לחשב את המרחק בין האנשים.
ret, frame = cap.read () אם לא ret: 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 = processImg
בשורות הבאות, השתמש בפונקציה cv2.VideoWriter () לאחסון וידאו הפלט במיקום שצוין על ידי opname שהגדרנו קודם.
אם create אינו: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
בדיקת פרויקט גלאי המרחק החברתי
לאחר שהקוד שלך מוכן, פתח מסוף Pi ונווט לספריית הפרויקט. הקוד, דגם Yolo וסרטון ההדגמה צריכים להיות באותה תיקייה כפי שמוצג להלן.
אתה יכול להוריד את מדריך YoloV3 מכאן, קטעי וידאו מ- Pexels ולהעתיק את קוד הפייתון המופיע למטה ולהכניס אותם לאותה מדריך כפי שמוצג לעיל.
ברגע שאתה בספריית הפרויקט, הפעל את הפקודה הבאה כדי להפעיל את הקוד:
python3 detector.py
ניסיתי את הקוד הזה בדוגמת וידאו שהושגה מפקסלס. מבחינתי ה- FPS היה איטי מאוד ולקח 10 עד 11 דקות לעבד את הסרטון כולו.
במקום להשתמש וידאו, אתה יכול אפילו לבדוק את הקוד הזה עם מצלמה Pi פטל ידי החלפת cv2.VideoCapture (קלט) עם cv2.VideoCapture (0) ב 98 th השורה בקוד. למידע נוסף על שימוש ב- PiCamera עם Raspberry Pi על ידי קישור.
כך תוכלו להשתמש ב- OpenCV עם Raspberry Pi כדי לזהות הפרות הרחקה חברתית. סרטון הפלט והקוד מופיע להלן: