- Erforderliche Komponenten
- YOLO
- OpenCV in Raspberry Pi installieren
- Installieren anderer erforderlicher Pakete in Raspberry Pi
- Programmerklärung
- Testen des Social Distance Detector-Projekts
In der Zeit von Covid-19 ist soziale Distanzierung ein wirksamer Weg, um die Übertragung von infektiösem Virus zu verlangsamen. Menschen wird empfohlen, ihren Kontakt untereinander zu minimieren, um das Risiko einer Übertragung der Krankheit durch direkten Kontakt zu minimieren. Die Einhaltung eines Sicherheitsabstands ist für viele Orte wie Fabriken, Banken, Busse oder Bahnhöfe usw. eine Herausforderung.
In Fortsetzung unserer früheren Corona-Sicherheitsprojekte wie der automatischen Desinfektionsmaschine und der kontaktlosen Temperaturüberwachung werden wir hier ein Social Distancing Detector-System mit OpenCV und Raspberry Pi bauen. Wir werden die Gewichte des YOLO v3-Objekterkennungsalgorithmus mit dem Deep Neural Network-Modul verwenden.
Raspberry Pi ist immer eine gute Wahl für Bildverarbeitungsprojekte, da es mehr Speicher und Geschwindigkeit als andere Controller hat. Wir haben Raspberry Pi zuvor für einige komplexe Bildverarbeitungsprojekte wie die Erkennung von Gesichtsmarkierungen und Gesichtserkennungsanwendungen verwendet.
Erforderliche Komponenten
- Himbeer Pi 4
Hier benötigen wir nur RPi 4 mit OpenCV. OpenCV wird hier für die digitale Bildverarbeitung verwendet. Die häufigsten Anwendungen der digitalen Bildverarbeitung sind Objekterkennung, Gesichtserkennung und Personenzähler.
YOLO
YOLO (Sie sehen nur einmal) ist ein intelligentes neuronales Faltungsnetzwerk (CNN) für die Objekterkennung in Echtzeit. YOLOv3, die neueste Variante des Objekterkennungsalgorithmus, YOLO kann 80 verschiedene Objekte in Bildern und Videos erkennen, ist superschnell und hat eine hervorragende Genauigkeit. Der Algorithmus wendet ein einzelnes neuronales Netzwerk auf das gesamte Bild an, trennt das Bild dann in Regionen und berechnet Grenzfelder und Wahrscheinlichkeiten für jeden Bereich. Das Basis-YOLO-Modell kann Bilder in Echtzeit mit 45 Bildern pro Sekunde verarbeiten. Das YOLO-Modell übertrifft alle anderen Erkennungsmethoden wie SSD und R-CNN.
Das YOLOV3-Modell, das wir in diesem Projekt verwenden werden, kann hier heruntergeladen werden.
OpenCV in Raspberry Pi installieren
Vor der Installation von OpenCV und anderen Abhängigkeiten muss der Raspberry Pi vollständig aktualisiert werden. Verwenden Sie die folgenden Befehle, um den Raspberry Pi auf die neueste Version zu aktualisieren:
sudo apt-get update
Verwenden Sie dann die folgenden Befehle, um die erforderlichen Abhängigkeiten für die Installation von OpenCV auf Ihrem Raspberry Pi zu installieren.
sudo apt-get installiere libhdf5-dev -y sudo apt-get installiere libhdf5-serial-dev –y sudo apt-get installiere libatlas-base-dev –y sudo apt-get installiere libjasper-dev -y sudo apt-get installiere libqtgui4 –Y sudo apt-get install libqt4-test –y
Installieren Sie abschließend OpenCV mit den folgenden Befehlen auf Raspberry Pi.
pip3 installiere opencv-contrib-python == 4.1.0.25
Wenn Sie OpenCV noch nicht kennen, lesen Sie unsere vorherigen OpenCV-Tutorials mit Raspberry pi:
- Installieren von OpenCV auf Raspberry Pi mit CMake
- Echtzeit-Gesichtserkennung mit Raspberry Pi und OpenCV
- Kennzeichenerkennung mit Raspberry Pi und OpenCV
- Crowd Size Estimation mit OpenCV und Raspberry Pi
Wir haben auch eine Reihe von OpenCV-Tutorials für Anfänger erstellt.
Installieren anderer erforderlicher Pakete in Raspberry Pi
Bevor Sie den Raspberry Pi für Social Distance Detector programmieren, installieren Sie die anderen erforderlichen Pakete.
Imutils installieren: Mit imutils werden wichtige Bildverarbeitungsfunktionen wie Übersetzung, Drehung, Größenänderung, Skelettierung und Anzeige von Matplotlib-Bildern mit OpenCV vereinfacht. Verwenden Sie den folgenden Befehl, um die imutils zu installieren:
pip3 installiere Imutils
Programmerklärung
Der vollständige Code ist am Ende der Seite angegeben. Hier erklären wir die wichtigen Abschnitte des Codes zur besseren Erklärung.
Importieren Sie zu Beginn des Codes alle erforderlichen Bibliotheken, die in diesem Projekt verwendet werden sollen.
import numpy as np import cv2 import imutils import os import time
Mit der Funktion Check () wird der Abstand zwischen zwei Objekten oder zwei Punkten in einem Videobild berechnet. Die Punkte a und b bezeichnen die beiden Objekte im Rahmen. Diese beiden Punkte werden verwendet, um den euklidischen Abstand zwischen den Objekten zu berechnen.
def Überprüfen Sie (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 Kalibrierung = (a + b) / 2 wenn 0 <dist <0,25 * Kalibrierung: Rückgabe True sonst: Rückgabe Falsch
Die Setup-Funktion wird verwendet, um die Pfade für die YOLO-Gewichte, die CFG-Datei und die COCO-Namensdatei festzulegen. Das Modul os.path wird für die allgemeine Manipulation von Pfadnamen verwendet. Das Modul os.path.join () ist ein Untermodul von os.path und wird verwendet, um eine oder mehrere Pfadkomponenten intelligent zu verbinden. Die Methode cv2.dnn.readNetFromDarknet () wird verwendet, um die gespeicherten Gewichte in das Netzwerk zu laden. Extrahieren Sie nach dem Laden der Gewichte die Liste aller in einem Netzwerk verwendeten Ebenen mithilfe eines net.getLayerNames- Modells.
def Setup (yolo): globales neural_net, ln, LABELS weight = 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 (Konfiguration, Gewichte) ln = neural_net.getLayerNames () ln = - 1] für i in neural_net.getUnconnectedOutLayers ()]
Innerhalb der Bildverarbeitungsfunktion nehmen wir ein einzelnes Videobild auf und verarbeiten es dann zur Erkennung sozialer Distanzierungen zwischen jeder Person in der Menge. In den ersten beiden Zeilen der Funktion setzen wir die Abmessungen des Videorahmens (B, H) zunächst auf (Keine, Keine). In der nächsten Zeile haben wir die Methode cv2.dnn.blobFromImage () verwendet, um Frames in einem Stapel zu laden und über das Netzwerk auszuführen. Die Blob-Funktion führt die mittlere Subtraktion, Skalierung und den Kanaltausch für einen Frame durch.
(H, W) = (Keine, Keine) frame = image.copy () wenn W Keine oder H Keine ist: (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)
Die Layer-Ausgaben von YOLO bestehen aus einer Reihe von Werten. Diese Werte helfen uns zu definieren, welches Objekt zu welcher Klasse gehört . Wir durchlaufen jede Ausgabe in den layerOutputs und setzen beim Erkennen von Personen die Klassenbezeichnung als "Person". Von jeder Erkennung erhalten wir einen Begrenzungsrahmen, der uns die X-Mitte, die Y-Mitte, die Breite und die Höhe der Box für die Erkennung in der Ausgabe angibt:
Scores = Erkennung maxi_class = np.argmax (Scores) Vertrauen = Scores wenn LABELS == "Person": wenn Vertrauen> 0,5: box = Erkennung * np.array () (centerX, centerY, Breite, Höhe) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (height / 2)) Outline.append () confidences.append (float (Confidence))
Berechnen Sie danach den Abstand zwischen der Mitte der aktuellen Box und allen anderen erkannten Boxen. Wenn die Begrenzungsrahmen geschlossen sind, ändern Sie den Status in true.
für i im Bereich (len (Mitte)): für j im Bereich (len (Mitte)): close = Überprüfen Sie (Mitte, Mitte), ob close: pairs.append (, center]) status = True status = True index = 0
Zeichnen Sie in den nächsten Zeilen ein Rechteck um die Person unter Verwendung der vom Modell erhaltenen Kastenabmessungen und prüfen Sie dann, ob die Kiste sicher oder unsicher ist. Wenn der Abstand zwischen den Feldern eng ist, wird die Feldfarbe rot gefärbt, andernfalls wird das Feld grün gefärbt.
(x, y) = (Umriss, Umriss) (w, h) = (Umriss, Umriss) wenn status == True: cv2.rectangle (Rahmen, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == False: cv2.rectangle (Rahmen, (x, y), (x + w, y + h), (0, 255, 0), 2)
Innerhalb der Schleifenfunktion lesen wir nun jedes Bild des Videos und verarbeiten dann jedes Bild, um den Abstand zwischen den Personen zu berechnen.
ret, frame = cap.read () wenn nicht ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 oder frameno == 1): Setup (yolo) ImageProcess (current_img) Frame = ProcessedImg
Verwenden Sie in den nächsten Zeilen die Funktion cv2.VideoWriter () , um das Ausgabevideo an dem durch opname angegebenen Speicherort zu speichern, den wir zuvor definiert haben.
Wenn create None ist: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testen des Social Distance Detector-Projekts
Sobald Ihr Code fertig ist, öffnen Sie ein Pi-Terminal und navigieren Sie zum Projektverzeichnis. Der Code, das Yolo-Modell und das Demo-Video sollten sich im selben Ordner wie unten gezeigt befinden.
Sie können das YoloV3-Verzeichnis von hier herunterladen, Videos von Pexels und den unten angegebenen Python-Code kopieren und in dasselbe Verzeichnis wie oben gezeigt legen.
Wenn Sie sich im Projektverzeichnis befinden, führen Sie den folgenden Befehl aus, um den Code zu starten:
python3 detector.py
Ich habe diesen Code an einem Videobeispiel ausprobiert, das von Pexels erhalten wurde. Für mich war der FPS sehr langsam und es dauerte ungefähr 10 bis 11 Minuten, um das gesamte Video zu verarbeiten.
Stattdessen Video verwenden, können Sie auch diesen Code testen mit einer Raspberry Pi Kamera durch den Ersatz cv2.VideoCapture (Eingang) mit cv2.VideoCapture (0) in 98 - ten Zeile des Codes. Weitere Informationen zur Verwendung von PiCamera mit Raspberry Pi finden Sie unter dem folgenden Link.
Auf diese Weise können Sie OpenCV mit Raspberry Pi verwenden, um Verstöße gegen soziale Distanzierung zu erkennen. Das Ausgabevideo und der Code sind unten angegeben: