- Componenten vereist
- YOLO
- OpenCV installeren in Raspberry Pi
- Andere vereiste pakketten installeren in Raspberry Pi
- Programma-uitleg
- Testen van het Social Distance Detector Project
In de tijd van Covid-19 is sociale afstand nemen een effectieve manier om de overdracht van infectieus virus te vertragen. Mensen wordt geadviseerd om hun contact met elkaar te minimaliseren om het risico van overdracht van de ziekte door direct contact te minimaliseren. Het aanhouden van een veilige afstand is een uitdaging voor veel plaatsen zoals fabrieken, banken, bussen of treinstations, enz.
Dus in het verlengde van onze eerdere Corona-veiligheidsprojecten, zoals een automatische ontsmettingsmachine en contactloze temperatuurbewaking, gaan we hier een detectiesysteem voor sociale afstanden bouwen met OpenCV en Raspberry Pi. We zullen de gewichten van het YOLO v3 Object Detection Algorithm gebruiken met de Deep Neural Network-module.
Raspberry Pi is altijd een goede keuze voor beeldverwerkingsprojecten, omdat het meer geheugen en snelheid heeft dan andere controllers. We gebruikten Raspberry Pi eerder voor een aantal complexe beeldverwerkingsprojecten, zoals detectie van gezichtsoriëntatiepunten en gezichtsherkenningstoepassingen.
Componenten vereist
- Raspberry Pi 4
Hier hebben we alleen RPi 4 nodig met OpenCV erop geïnstalleerd. OpenCV wordt hier gebruikt voor digitale beeldverwerking. De meest voorkomende toepassingen van digitale beeldverwerking zijn objectdetectie, gezichtsherkenning en mensenteller.
YOLO
YOLO (You Only Look Once) is een slim Convolution neuraal netwerk (CNN) voor realtime objectdetectie. YOLOv3, de nieuwste variant van het objectdetectie-algoritme, YOLO kan 80 verschillende objecten in afbeeldingen en video's herkennen, en het is supersnel en heeft een uitstekende nauwkeurigheid. Het algoritme past een enkel neuraal netwerk toe op het hele beeld, verdeelt het beeld vervolgens in regio's en berekent de grenzen en kansen voor elk gebied. Base YOLO-model kan afbeeldingen in realtime verwerken met 45 frames per seconde. Het YOLO-model presteert beter dan alle andere detectiemethoden zoals SSD en R-CNN.
Het YOLOV3-model dat we in dit project gaan gebruiken, kan hier worden gedownload.
OpenCV installeren in Raspberry Pi
Voordat de OpenCV en andere afhankelijkheden worden geïnstalleerd, moet de Raspberry Pi volledig worden bijgewerkt. Gebruik de onderstaande opdrachten om de Raspberry Pi bij te werken naar de nieuwste versie:
sudo apt-get update
Gebruik vervolgens de volgende opdrachten om de vereiste afhankelijkheden te installeren voor het installeren van OpenCV op uw 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
Installeer ten slotte de OpenCV op Raspberry Pi met behulp van de onderstaande opdrachten.
pip3 installeer opencv-contrib-python == 4.1.0.25
Als je nieuw bent bij OpenCV, bekijk dan onze vorige OpenCV-tutorials met Raspberry pi:
- OpenCV installeren op Raspberry Pi met CMake
- Realtime gezichtsherkenning met Raspberry Pi en OpenCV
- Kentekenherkenning met Raspberry Pi en OpenCV
- Menigte schatten met OpenCV en Raspberry Pi
We hebben ook een reeks OpenCV-tutorials gemaakt, beginnend vanaf het beginnersniveau.
Andere vereiste pakketten installeren in Raspberry Pi
Voordat we de Raspberry Pi voor sociale afstandsdetector gaan programmeren, moeten we de andere vereiste pakketten installeren.
Imutils installeren: imutils wordt gebruikt om essentiële beeldverwerkingsfuncties zoals vertaling, rotatie, formaat wijzigen, skeletvorming en het weergeven van Matplotlib-afbeeldingen gemakkelijker te maken met OpenCV. Gebruik de onderstaande opdracht om de imutils te installeren:
pip3 installeer imutils
Programma-uitleg
De volledige code staat aan het einde van de pagina. Hier leggen we de belangrijke delen van de code uit voor een betere uitleg.
Importeer dus aan het begin van de code alle vereiste bibliotheken die in dit project zullen worden gebruikt.
import numpy als np import cv2 import imutils import os import tijd
De functie Check () wordt gebruikt om de afstand tussen twee objecten of twee punten in een videoframe te berekenen. De punten a en b geven de twee objecten in het frame aan. Deze twee punten worden gebruikt om de Euclidische afstand tussen de objecten te berekenen.
def Controleer (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibratie = (a + b) / 2 if 0 <dist <0.25 * calibratie: retourneer Waar, anders: retourneer False
De setup-functie wordt gebruikt om de paden in te stellen voor de YOLO-gewichten, cfg-bestand, COCO-namenbestand. os.path module wordt gebruikt voor het manipuleren van algemene padnamen. os.path.join () module is een submodule van os.path en wordt gebruikt om een of meer padcomponenten intelligent samen te voegen. De methode cv2.dnn.readNetFromDarknet () wordt gebruikt om de opgeslagen gewichten in het netwerk te laden. Na het laden van de gewichten, extraheert u de lijst van alle lagen die in een netwerk worden gebruikt met behulp van een net.getLayerNames- model.
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, gewichten) ln = neural_net.getLayerNames () ln = - 1] voor i in neural_net.getUnconnectedOutLayers ()]
Binnen de beeldverwerkingsfunctie nemen we een enkel videoframe en verwerken het vervolgens voor detectie van sociale afstand tussen elke persoon in de menigte. In de eerste twee regels van de functie stellen we de afmetingen van het videoframe (W, H) aanvankelijk in op (Geen, Geen). In de volgende regel hebben we de methode cv2.dnn.blobFromImage () gebruikt om frames in een batch te laden en ze door het netwerk te laten lopen. De blob-functie voert gemiddelde aftrekking, schaalvergroting en kanaalwisseling op een frame uit.
(H, W) = (Geen, Geen) frame = image.copy () als W Geen of H is Geen: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttijd = time.time () layerOutputs = neural_net.forward (ln)
De laaguitvoer van YOLO bestaat uit een reeks waarden. Deze waarden helpen ons te bepalen welk object tot welke klasse behoort. We herhalen elke output in de layerOutputs en aangezien we mensen detecteren, stellen we het class label in als "person". Van elke detectie krijgen we een selectiekader dat ons X-midden, Y-midden, Breedte en Hoogte van de doos geeft voor detectie in de uitvoer:
scores = detectie maxi_class = np.argmax (scores) vertrouwen = scores als LABELS == "persoon": als vertrouwen> 0,5: box = detectie * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (hoogte / 2)) outline.append () confidences.append (float (vertrouwen))
Bereken daarna de afstand tussen het midden van de huidige box en alle andere gedetecteerde boxen. Als de selectiekaders dichtbij zijn, wijzigt u de status in true.
voor i binnen bereik (len (midden)): voor j binnen bereik (len (midden)): close = Controleer (midden, midden) indien dichtbij: pairs.append (, midden]) status = Ware status = Ware index = 0
Teken in de volgende regels een rechthoek rond de persoon met behulp van de afmetingen van de doos die we van het model hebben ontvangen, en controleer vervolgens of de doos veilig of onveilig is. Als de afstand tussen de dozen klein is, wordt de kleur van de doos rood gekleurd, anders wordt de doos groen.
(x, y) = (omtrek, omtrek) (w, h) = (omtrek, omtrek) if status == Waar: cv2.rechthoek (kader, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Nu, binnen de lusfunctie , lezen we elk frame van de video en verwerken we elk frame om de afstand tussen de personen te berekenen.
ret, frame = cap.read () indien niet ret: break current_img = frame.copy () current_img = imutils.resize (current_img, breedte = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 of frameno == 1): Setup (yolo) ImageProcess (current_img) Frame = verwerktImg
Gebruik in de volgende regels de functie cv2.VideoWriter () om de outputvideo op te slaan op de door opname aangegeven locatie die we eerder hebben gedefinieerd.
als create Geen is: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testen van het Social Distance Detector Project
Zodra uw code klaar is, opent u een Pi-terminal en navigeert u naar de projectdirectory. De code, het Yolo-model en de demovideo moeten in dezelfde map staan als hieronder wordt weergegeven.
Je kunt de YoloV3-directory vanaf hier downloaden, video's van Pexels en de onderstaande Python-code kopiëren en ze in dezelfde directory plaatsen als hierboven weergegeven.
Als u zich eenmaal in de projectdirectory bevindt, voert u de volgende opdracht uit om de code te starten:
python3 detector.py
Ik heb deze code geprobeerd op een videovoorbeeld dat was verkregen van Pexels. Voor mij was de FPS erg traag en het duurde ongeveer 10 tot 11 minuten om de hele video te verwerken.
In plaats van een video, kunt u zelfs deze code met een Raspberry Pi Camera testen door het vervangen van cv2.VideoCapture (input) met cv2.VideoCapture (0) in 98 ste regel van de code. Lees meer over het gebruik van PiCamera met Raspberry Pi door de link te volgen.
Dit is hoe u OpenCV met Raspberry Pi kunt gebruiken om schendingen van sociale afstanden te detecteren. De outputvideo en code worden hieronder gegeven: