- Komponenter, der kræves
- YOLO
- Installation af OpenCV i Raspberry Pi
- Installation af andre nødvendige pakker i Raspberry Pi
- Programforklaring
- Test af projektet for social afstandsdetektor
På tidspunktet for Covid-19 er social distancering en effektiv måde at bremse overførslen af infektiøs virus på. Folk rådes til at minimere deres kontakt med hinanden for at minimere risikoen for, at sygdommen overføres ved direkte kontakt. At opretholde en sikker afstand er en udfordring for mange steder som fabrikker, banker, busser eller jernbanestationer osv.
Så i forlængelse af vores tidligere Corona-sikkerhedsprojekter som automatisk desinfektionsmaskine og kontaktløs temperaturovervågning, her skal vi opbygge et Social Distancing Detector-system ved hjælp af OpenCV og Raspberry Pi. Vi bruger vægten af YOLO v3 objektdetekteringsalgoritmen med modulet Deep Neural Network.
Raspberry Pi er altid et godt valg til billedbehandlingsprojekter, da det har mere hukommelse og hastighed end andre controllere. Vi har tidligere brugt Raspberry Pi til nogle komplekse billedbehandlingsprojekter som ansigtsmærkning og ansigtsgenkendelsesapplikation.
Komponenter, der kræves
- Hindbær Pi 4
Her behøver vi kun RPi 4 med OpenCV installeret på den. OpenCV bruges her til digital billedbehandling. De mest almindelige anvendelser af digital billedbehandling er genstandsdetektering, ansigtsgenkendelse og persontæller.
YOLO
YOLO (You Only Look Once) er et smart Convolution neuralt netværk (CNN) til realtidsobjekteregistrering. YOLOv3, den nyeste variant af objektdetekteringsalgoritmen, kan YOLO genkende 80 forskellige objekter i billeder og videoer, og den er super hurtig og har fremragende nøjagtighed. Algoritmen anvender et enkelt neuralt netværk på hele billedet og adskiller derefter billedet i regioner og beregner afgrænsningsfelter og sandsynligheder for hvert område. Base YOLO-modellen kan behandle billeder i realtid med 45 billeder pr. Sekund. YOLO-modellen overgår alle andre detektionsmetoder som SSD og R-CNN.
YOLOV3-modellen, som vi skal bruge i dette projekt, kan downloades herfra.
Installation af OpenCV i Raspberry Pi
Før du installerer OpenCV og andre afhængigheder, skal Raspberry Pi opdateres fuldt ud. Brug nedenstående kommandoer til at opdatere Raspberry Pi til den nyeste version:
sudo apt-get opdatering
Brug derefter følgende kommandoer til at installere de nødvendige afhængigheder til installation af 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
Endelig skal du installere OpenCV på Raspberry Pi ved hjælp af nedenstående kommandoer.
pip3 installer opencv-contrib-python == 4.1.0.25
Hvis du er ny i OpenCV, skal du tjekke vores tidligere OpenCV-tutorials med Raspberry pi:
- Installation af OpenCV på Raspberry Pi ved hjælp af CMake
- Realtids ansigtsgenkendelse med Raspberry Pi og OpenCV
- Registrering af nummerplade ved hjælp af Raspberry Pi og OpenCV
- Estimering af mængde ved hjælp af OpenCV og Raspberry Pi
Vi har også oprettet en række OpenCV-tutorials startende fra begynderniveauet.
Installation af andre nødvendige pakker i Raspberry Pi
Før vi programmerer Raspberry Pi til social afstandsdetektor, lad os installere de andre nødvendige pakker.
Installation af imutils: imutils bruges til at gøre vigtige billedbehandlingsfunktioner såsom oversættelse, rotation, ændring af størrelse, skeletisering og visning af Matplotlib-billeder lettere med OpenCV. Brug nedenstående kommando til at installere imutils:
pip3 installere imutils
Programforklaring
Komplet kode gives i slutningen af siden. Her forklarer vi de vigtige dele af koden for en bedre forklaring.
Så i starten af koden skal du importere alle de nødvendige biblioteker, der skal bruges i dette projekt.
import numpy som np import cv2 import imutils import os importtid
Funktionen Check () bruges til at beregne afstanden mellem to objekter eller to punkter i en videoramme. Punktene a og b betegner de to objekter i rammen. Disse to punkter bruges til at beregne den euklidiske afstand mellem objekterne.
def Kontroller (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 Sandt andet: returner Falsk
Opsætningsfunktionen bruges til at indstille stierne til YOLO-vægte, cfg-fil, COCO-navnefil. os.path- modulet bruges til almindelig manipulation af stienavne . os.path.join () -modulet er et undermodul af os.path og bruges til at forbinde en eller flere stykomponenter intelligent. Metoden cv2.dnn.readNetFromDarknet () bruges til at indlæse de gemte vægte i netværket. Efter indlæsning af vægte skal du udtrække listen over alle lag, der er brugt i et netværk ved hjælp af en net.getLayerNames- model.
def Opsætning (yolo): global neural_net, ln, LABELS vægte = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = åben (labelsPath split. ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, vægte) ln = neural_net.getLayerNames () ln = - 1] til i i neural_net.getUnconnectedOutLayers ()]
Inde i billedbehandlingsfunktionen tager vi et enkelt videobillede og behandler det derefter til social afstandsdetektion mellem hver person i mængden. I de første to linjer i funktionen indstiller vi dimensionerne på videorammen (W, H) som (Ingen, Ingen) i starten. I den næste linje brugte vi metoden cv2.dnn.blobFromImage () til at indlæse rammer i en batch og køre dem gennem netværket. Blob-funktionen udfører gennemsnitlig subtraktion, skalering og kanalbytning på en ramme.
(H, W) = (Ingen, Ingen) frame = image.copy () hvis W er None eller H er None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttid = time.time () layerOutputs = neural_net.forward (ln)
Lagudgangene fra YOLO består af et sæt værdier. Disse værdier hjælper os med at definere, hvilket objekt der hører til hvilken klasse . Vi sløjfer over hver output i layerOutputs, og når vi opdager mennesker, indstiller vi klassemærket som "person". Fra hver detektion får vi en afgrænsningsboks, der giver os X-center, Y-center, Bredde og højde på boksen til detektion i output:
scores = afsløring maxi_class = np.argmax (scores) tillid = scores hvis LABELS == "person": hvis tillid> 0,5: box = detektion * np.array () (centerX, centerY, bredde, højde) = box.astype ("int") x = int (centerX - (bredde / 2)) y = int (centerY - (højde / 2)) disposition.append () confidences.append (float (tillid))
Derefter skal du beregne afstanden mellem midten af den aktuelle boks med alle de andre registrerede felter. Hvis afgrænsningsfelterne er tætte, skal du ændre status til sand.
for i inden for rækkevidde (len (center)): for j inden for rækkevidde (len (center)): close = Kontroller (center, center) hvis tæt: pair.append (, center]) status = Sand status = Sandt indeks = 0
I de næste linjer tegner du et rektangel omkring personen ved hjælp af de boksdimensioner, vi modtog fra modellen, og kontrollerer derefter, om feltet er sikkert eller usikkert. Hvis afstanden mellem kasserne er tæt, farves boksfarven rød, ellers farves boksen grønt.
(x, y) = (disposition, outline) (w, h) = (outline, outline) if status == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == Falsk: cv2.rektangel (ramme, (x, y), (x + w, y + h), (0, 255, 0), 2)
Nu inde i sløjfefunktionen læser vi alle rammer i videoen og behandler derefter hver ramme for at beregne afstanden mellem personerne.
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): Opsætning (yolo) ImageProcess (current_img) Frame = processingImg
I de næste linjer skal du bruge funktionen cv2.VideoWriter () til at gemme outputvideoen på det sted, der er angivet af opname, som vi har defineret tidligere.
hvis create er Ingen: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Test af projektet for social afstandsdetektor
Når din kode er klar, skal du åbne en Pi-terminal og navigere til projektmappen. Koden, Yolo-modellen og demo-videoen skal være i samme mappe som vist nedenfor.
Du kan downloade YoloV3-kataloget herfra, videoer fra Pexels og kopiere Python-koden angivet nedenfor og placere dem i samme bibliotek som vist ovenfor.
Når du er i projektmappen, skal du udføre følgende kommando for at starte koden:
python3 detector.py
Jeg prøvede denne kode på et videoeksempel, der blev hentet fra Pexels. For mig var FPS meget langsom, og det tog ca. 10 til 11 minutter at behandle hele videoen.
I stedet for at bruge en video, kan du selv teste denne kode med en Raspberry Pi Camera ved at erstatte cv2.VideoCapture (indgang) med cv2.VideoCapture (0) i 98 th linje i koden. Lær mere om brug af PiCamera med Raspberry Pi ved at følge linket.
Sådan kan du bruge OpenCV med Raspberry Pi til at opdage de sociale distanceringsovertrædelser. Outputvideoen og koden er angivet nedenfor: