- Komponenter kreves
- YOLO
- Installere OpenCV i Raspberry Pi
- Installere andre nødvendige pakker i Raspberry Pi
- Programforklaring
- Testing av Social Distance Detector Project
I tiden til Covid-19 er sosial distansering en effektiv måte å bremse overføringen av smittsomt virus. Folk rådes til å minimere kontakten med hverandre for å minimere risikoen for at sykdommen smitter gjennom direkte kontakt. Å opprettholde sikker avstand er en utfordring for mange steder som fabrikker, banker, busser eller jernbanestasjoner osv.
Så i forlengelse av våre tidligere Corona-sikkerhetsprosjekter som automatisk rensemaskin og kontaktløs temperaturovervåking, her skal vi bygge et Social Distancing Detector-system ved hjelp av OpenCV og Raspberry Pi. Vi bruker vektene av YOLO v3 objektgjenkjenningsalgoritmen med Deep Neural Network-modulen.
Raspberry Pi er alltid et godt valg for bildebehandlingsprosjekter, da det har mer minne og hastighet enn andre kontrollere. Vi har tidligere brukt Raspberry Pi for noen komplekse bildebehandlingsprosjekter som ansikts landemerkeoppdagelse og ansiktsgjenkjenningsprogram.
Komponenter kreves
- Bringebær Pi 4
Her trenger vi bare RPi 4 med OpenCV installert på den. OpenCV brukes her til digital bildebehandling. De vanligste bruksområdene for digital bildebehandling er gjenkjenning av objekter, ansiktsgjenkjenning og personteller.
YOLO
YOLO (You Only Look Once) er et smart Convolution nevrale nettverk (CNN) for sanntids gjenkjenning av objekter. YOLOv3, den siste varianten av objektgjenkjenningsalgoritmen, kan YOLO gjenkjenne 80 forskjellige objekter i bilder og videoer, og den er super rask og har utmerket nøyaktighet. Algoritmen bruker et enkelt nevralt nettverk på hele bildet, og skiller deretter bildet i regioner og beregner grensebokser og sannsynligheter for hvert område. Base YOLO-modellen kan behandle bilder i sanntid med 45 bilder per sekund. YOLO-modellen overgår alle andre deteksjonsmetoder som SSD og R-CNN.
YOLOV3-modellen som vi skal bruke i dette prosjektet kan lastes ned herfra.
Installere OpenCV i Raspberry Pi
Før du installerer OpenCV og andre avhengigheter, må Raspberry Pi oppdateres fullstendig. Bruk kommandoene nedenfor for å oppdatere Raspberry Pi til den siste versjonen:
sudo apt-get oppdatering
Bruk deretter følgende kommandoer for å installere de nødvendige avhengighetene for å installere OpenCV på din 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
Til slutt installerer du OpenCV på Raspberry Pi ved hjelp av kommandoene nedenfor.
pip3 installer opencv-contrib-python == 4.1.0.25
Hvis du ikke er kjent med OpenCV, kan du sjekke våre forrige OpenCV-opplæringsprogrammer med Raspberry pi:
- Installere OpenCV på Raspberry Pi ved hjelp av CMake
- Sanntids ansiktsgjenkjenning med Raspberry Pi og OpenCV
- Lisensgjenkjenning ved bruk av Raspberry Pi og OpenCV
- Estimering av mengde ved bruk av OpenCV og Raspberry Pi
Vi har også laget en serie OpenCV-opplæringsprogrammer fra begynnernivå.
Installere andre nødvendige pakker i Raspberry Pi
Før vi programmerer Raspberry Pi for sosial avstandsdetektor, la oss installere de andre nødvendige pakkene.
Installere imutils: imutils brukes til å gjøre viktige bildebehandlingsfunksjoner som oversettelse, rotasjon, endring av størrelse, skjelettdannelse og visning av Matplotlib-bilder enklere med OpenCV. Bruk kommandoen nedenfor for å installere imutils:
pip3 installere imutils
Programforklaring
Komplett kode er gitt på slutten av siden. Her forklarer vi de viktige delene av koden for en bedre forklaring.
Så ved starten av koden, importer alle nødvendige biblioteker som skal brukes i dette prosjektet.
import numpy as np import cv2 import imutils import os import time
Funksjonen Sjekk () brukes til å beregne avstanden mellom to objekter eller to punkter i en ramme av videoen. Punktene a og b betegner de to objektene i rammen. Disse to punktene brukes til å beregne den euklidiske avstanden mellom objektene.
def Sjekk (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrering = (a + b) / 2 hvis 0 <dist <0,25 * kalibrering: returner True else: return False
Oppsettfunksjonen brukes til å angi banene for YOLO-vekter, cfg-fil, COCO-navnefil. os.path- modulen brukes til vanlig manipulering av banenavn. os.path.join () -modulen er en undermodul av os.path og brukes til å koble sammen en eller flere banekomponenter på en intelligent måte. Metoden cv2.dnn.readNetFromDarknet () brukes til å laste de lagrede vektene inn i nettverket. Etter å ha lastet vektene, trekk ut listen over alle lagene som brukes i et nettverk ved hjelp av en net.getLayerNames- modell.
def Oppsett (yolo): global neural_net, ln, LABELS vekter = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath).les (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, vekter) ln = neural_net.getLayerNames () ln = - 1] for i i neural_net.getUnconnectedOutLayers ()]
Inne i bildebehandlingsfunksjonen tar vi en enkelt videoramme og behandler den for sosial distansering av oppdagelse mellom hver person i mengden. I de to første linjene i funksjonen setter vi dimensjonene til videorammen (W, H) som (Ingen, Ingen) i utgangspunktet. I neste linje brukte vi metoden cv2.dnn.blobFromImage () for å laste inn rammer i en batch og kjøre dem gjennom nettverket. BLOB-funksjonen utfører gjennomsnittlig subtraksjon, skalering og kanalbytte på en ramme.
(H, W) = (Ingen, Ingen) ramme = image.copy () hvis W er Ingen eller H er Ingen: (H, W) = ramme.form blob = cv2.dnn.blobFromImage (ramme, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Lagutgangene fra YOLO består av et sett med verdier. Disse verdiene hjelper oss med å definere hvilket objekt som tilhører hvilken klasse . Vi sløyfer over hver utgang i lagetOutputs, og når vi oppdager mennesker, setter vi klassetiketten som "person". Fra hver deteksjon får vi en avgrensningsboks som gir oss X-senter, Y-senter, Bredde og høyde på boksen for deteksjon i utgangen:
score = deteksjon maxi_class = np.argmax (score) konfidens = score hvis LABELS == "person": hvis tillit> 0,5: boks = deteksjon * np.array () (centerX, centerY, bredde, høyde) = box.astype ("int") x = int (centerX - (bredde / 2)) y = int (centerY - (høyde / 2)) disposisjon.append () confidences.append (float (tillit))
Deretter beregner du avstanden mellom midten av den aktuelle boksen med alle de andre oppdagede boksene. Hvis avgrensningsboksene er nærme, endrer du statusen til sann.
for i i rekkevidde (len (midt)): for j i rekkevidde (len (midt)): lukk = Kontroller (midt, midt) hvis nær: par. tilføy (, midt]) status = Sann status = Sann indeks = 0
I de neste linjene tegner du et rektangel rundt personen ved hjelp av boksdimensjonene vi mottok fra modellen, og sjekker deretter om boksen er sikker eller usikker. Hvis avstanden mellom boksene er nær, vil boksfargen farges rødt, ellers blir boksen farget grønn.
(x, y) = (disposisjon, disposisjon) (w, h) = (disposisjon, disposisjon) hvis status == True: cv2. rektangel (ramme, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == Usann: cv2.rektangel (ramme, (x, y), (x + w, y + h), (0, 255, 0), 2)
Nå inne i sløyfefunksjonen leser vi hver ramme i videoen og behandler deretter hver ramme for å beregne avstanden mellom personene.
ret, frame = cap.read () hvis ikke ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 eller frameno == 1): Oppsett (yolo) ImageProcess (current_img) Frame = processingImg
I de neste linjene bruker du funksjonen cv2.VideoWriter () til å lagre utdatavideoen på stedet spesifisert av opptaksnavn som vi har definert tidligere.
hvis create er Ingen: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testing av Social Distance Detector Project
Når koden din er klar, åpner du en Pi-terminal og navigerer til prosjektkatalogen. Koden, Yolo-modellen og demovideoen skal være i samme mappe som vist nedenfor.
Du kan laste ned YoloV3-katalogen herfra, videoer fra Pexels og kopiere Python-koden gitt nedenfor, og plassere dem i samme katalog som vist ovenfor.
Når du er i prosjektkatalogen, utfører du følgende kommando for å starte koden:
python3 detector.py
Jeg prøvde denne koden på et videoeksempel som ble hentet fra Pexels. For meg var FPS veldig treg, og det tok omtrent 10 til 11 minutter å behandle hele videoen.
I stedet for å bruke en video, kan du selv teste denne koden med en Raspberry Pi kamera ved å erstatte cv2.VideoCapture (input) med cv2.VideoCapture (0) i 98 th linje av koden. Lær mer om bruk av PiCamera med Raspberry Pi ved å følge lenken.
Slik kan du bruke OpenCV med Raspberry Pi for å oppdage brudd på sosial distansering. Utgangsvideoen og koden er gitt nedenfor: