- Απαιτούμενα στοιχεία
- ΖΕΙΣ ΜΟΝΟ ΜΙΑ ΦΟΡΑ
- Εγκατάσταση του OpenCV στο Raspberry Pi
- Εγκατάσταση άλλων απαιτούμενων πακέτων στο Raspberry Pi
- Επεξήγηση προγράμματος
- Δοκιμή του προγράμματος ανίχνευσης κοινωνικής απόστασης
Στην εποχή του Covid-19, η κοινωνική αποστασιοποίηση είναι ένας αποτελεσματικός τρόπος για να επιβραδύνεται η μετάδοση μολυσματικών ιών. Συνιστάται στους ανθρώπους να ελαχιστοποιούν την επαφή τους μεταξύ τους για να ελαχιστοποιούν τον κίνδυνο μετάδοσης της νόσου μέσω άμεσης επαφής. Η διατήρηση μιας ασφαλούς απόστασης είναι μια πρόκληση για πολλά μέρη όπως εργοστάσια, τράπεζες, λεωφορεία ή σιδηροδρομικοί σταθμοί κ.λπ.
Συνεχίζοντας λοιπόν τα προηγούμενα έργα ασφαλείας της Corona, όπως αυτόματο μηχάνημα απολύμανσης και παρακολούθηση θερμοκρασίας χωρίς επαφή, εδώ πρόκειται να δημιουργήσουμε ένα σύστημα ανίχνευσης κοινωνικής απόστασης χρησιμοποιώντας OpenCV και Raspberry Pi. Θα χρησιμοποιήσουμε τα βάρη του αλγόριθμου ανίχνευσης αντικειμένων YOLO v3 με τη μονάδα Deep Neural Network.
Το Raspberry Pi είναι πάντα μια καλή επιλογή για έργα επεξεργασίας εικόνας καθώς έχει περισσότερη μνήμη και ταχύτητα από άλλους ελεγκτές. Χρησιμοποιήσαμε προηγουμένως το Raspberry Pi για ορισμένα σύνθετα έργα επεξεργασίας εικόνας, όπως η ανίχνευση ορόσημων προσώπου και η εφαρμογή αναγνώρισης προσώπου.
Απαιτούμενα στοιχεία
- Raspberry Pi 4
Εδώ χρειαζόμαστε μόνο RPi 4 με εγκατεστημένο το OpenCV. Το OpenCV χρησιμοποιείται εδώ για ψηφιακή επεξεργασία εικόνας. Οι πιο συνηθισμένες εφαρμογές της Ψηφιακής Επεξεργασίας Εικόνας είναι η ανίχνευση αντικειμένων, η Αναγνώριση προσώπου και ο μετρητής.
ΖΕΙΣ ΜΟΝΟ ΜΙΑ ΦΟΡΑ
Το YOLO (You Only Look Once) είναι ένα έξυπνο νευρωνικό δίκτυο 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. Χρησιμοποιήστε την παρακάτω εντολή για να εγκαταστήσετε τα imutils:
pip3 εγκαταστήστε imutils
Επεξήγηση προγράμματος
Ο πλήρης κωδικός δίνεται στο τέλος της σελίδας. Εδώ εξηγούμε τις σημαντικές ενότητες του κώδικα για καλύτερη εξήγηση.
Έτσι, στην αρχή του κώδικα, εισαγάγετε όλες τις απαιτούμενες βιβλιοθήκες που πρόκειται να χρησιμοποιηθούν σε αυτό το έργο.
import numpy as np import cv2 import imutils εισαγωγή os χρόνος εισαγωγής
Η συνάρτηση Check () χρησιμοποιείται για τον υπολογισμό της απόστασης μεταξύ δύο αντικειμένων ή δύο σημείων σε ένα πλαίσιο βίντεο. Τα σημεία 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 *: return True other: return False
Η συνάρτηση ρύθμισης χρησιμοποιείται για τον καθορισμό των διαδρομών για τα βάρη YOLO, αρχείο cfg, αρχείο ονομάτων COCO. Η ενότητα os.path χρησιμοποιείται για συνηθισμένο χειρισμό ονομάτων διαδρομών. Η ενότητα os.path.join () είναι μια υπομονάδα του os.path και χρησιμοποιείται για την έξυπνη σύνδεση ενός ή περισσότερων στοιχείων διαδρομής. Η μέθοδος cv2.dnn.readNetFromDarknet () χρησιμοποιείται για τη φόρτωση των αποθηκευμένων βαρών στο δίκτυο. Αφού φορτώσετε τα βάρη, εξαγάγετε τη λίστα όλων των επιπέδων που χρησιμοποιούνται σε ένα δίκτυο χρησιμοποιώντας ένα μοντέλο net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS βάρη = 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] για i στο neural_net.getUnconnectedOutLayers ()]
Μέσα στη λειτουργία επεξεργασίας εικόνων, παίρνουμε ένα μόνο καρέ βίντεο και στη συνέχεια το επεξεργαζόμαστε για ανίχνευση κοινωνικής απόστασης μεταξύ κάθε ατόμου στο πλήθος. Στις δύο πρώτες γραμμές της συνάρτησης, ορίζουμε τις διαστάσεις του καρέ βίντεο (W, H) ως (None, None) αρχικά. Στην επόμενη γραμμή, χρησιμοποιήσαμε τη μέθοδο cv2.dnn.blobFromImage () για να φορτώσουμε πλαίσια σε παρτίδα και να τα τρέξουμε μέσω του δικτύου. Η συνάρτηση blob εκτελεί μέση αφαίρεση, κλιμάκωση και εναλλαγή καναλιών σε ένα πλαίσιο.
(H, W) = (Κανένα, Κανένα) frame = image.copy () αν το W είναι Κανένα ή το H δεν είναι: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (πλαίσιο, 1 / 255.0 (416, 416), swapRB = True, crop = False) 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 - (πλάτος / 2)) y = int (centerY - (ύψος / 2)) outline.append () confidences.append (float (εμπιστοσύνη))
Μετά από αυτό, υπολογίστε την απόσταση μεταξύ του κέντρου του τρέχοντος πλαισίου με όλα τα άλλα κουτιά που εντοπίστηκαν. Εάν τα πλαίσια οριοθέτησης είναι κοντά, αλλάξτε την κατάσταση σε true.
για i in range (len (κέντρο)): για j in range (len (κέντρο)): κλείσιμο = Έλεγχος (κέντρο, κέντρο) εάν κλείσει: pair.append (, center]) status = True status = True index = 0
Στις επόμενες γραμμές, σχεδιάστε ένα ορθογώνιο γύρω από το άτομο χρησιμοποιώντας τις διαστάσεις κουτιού που λάβαμε από το μοντέλο και, στη συνέχεια, ελέγξτε αν το πλαίσιο είναι ασφαλές ή μη ασφαλές. Εάν η απόσταση μεταξύ των κουτιών είναι κοντά, τότε το χρώμα του κουτιού θα είναι κόκκινο, αλλιώς το πλαίσιο θα είναι πράσινο.
(x, y) = (περίγραμμα, περίγραμμα) (w, h) = (περίγραμμα, περίγραμμα) εάν κατάσταση == True: cv2. ορθογώνιο (πλαίσιο, (x, y), (x + w, y + h), (0, 0, 150), 2) κατάσταση elif == False: cv2. ορθογώνιο (πλαίσιο, (x, y), (x + w, y + h), (0, 255, 0), 2)
Τώρα μέσα στη λειτουργία βρόχου , διαβάζουμε κάθε καρέ του βίντεο και μετά επεξεργαζόμαστε κάθε καρέ για να υπολογίσουμε την απόσταση μεταξύ των ατόμων.
ret, frame = cap.read () if not 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 = processingImg
Στις επόμενες γραμμές, χρησιμοποιήστε τη συνάρτηση cv2.VideoWriter () για να αποθηκεύσετε το βίντεο εξόδου στη θέση που καθορίζεται από το όνομα opname που έχουμε ορίσει νωρίτερα.
εάν η δημιουργία είναι Κανένα: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Δοκιμή του προγράμματος ανίχνευσης κοινωνικής απόστασης
Μόλις ο κωδικός σας είναι έτοιμος, ανοίξτε ένα τερματικό Pi και μεταβείτε στον κατάλογο του έργου. Ο κωδικός, το μοντέλο Yolo και το βίντεο επίδειξης πρέπει να βρίσκονται στον ίδιο φάκελο με τον παρακάτω πίνακα.
Μπορείτε να κατεβάσετε τον κατάλογο YoloV3 από εδώ, βίντεο από Pexels και να αντιγράψετε τον κώδικα Python που δίνεται παρακάτω και να τα βάλετε στον ίδιο κατάλογο με τον παραπάνω.
Μόλις βρεθείτε στον κατάλογο έργου, εκτελέστε την ακόλουθη εντολή για να ξεκινήσετε τον κωδικό:
python3 detector.py
Δοκίμασα αυτόν τον κώδικα σε ένα παράδειγμα βίντεο που αποκτήθηκε από την Pexels. Για μένα, το FPS ήταν πολύ αργό και χρειάστηκε περίπου 10 έως 11 λεπτά για την επεξεργασία ολόκληρου του βίντεο.
Αντί να χρησιμοποιεί ένα βίντεο, μπορείτε να δοκιμάσετε ακόμη και αυτόν τον κώδικα με Raspberry Pi φωτογραφική μηχανή με την αντικατάσταση του cv2.VideoCapture (είσοδος) με cv2.VideoCapture (0) σε 98 ου γραμμή του κώδικα. Μάθετε περισσότερα σχετικά με τη χρήση του PiCamera με το Raspberry Pi ακολουθώντας τον σύνδεσμο.
Έτσι μπορείτε να χρησιμοποιήσετε το OpenCV με το Raspberry Pi για να εντοπίσετε τις παραβιάσεις κοινωνικής απόστασης. Το βίντεο εξόδου και ο κωδικός δίδονται παρακάτω: