- Componente necesare
- YOLO
- Instalarea OpenCV în Raspberry Pi
- Instalarea altor pachete necesare în Raspberry Pi
- Explicația programului
- Testarea proiectului Detector social distanță
În timpul Covid-19, distanțarea socială este o modalitate eficientă de a încetini transmiterea virusului infecțios. Oamenii sunt sfătuiți să își minimizeze contactul între ei pentru a minimiza riscul transmiterii bolii prin contact direct. Menținerea unei distanțe de siguranță este o provocare pentru multe locuri precum fabrici, bănci, autobuze sau gări etc.
Deci, în continuarea proiectelor noastre anterioare de siguranță Corona, cum ar fi mașina de dezinfectare automată și monitorizarea temperaturii fără contact, aici vom construi un sistem de detectare a distanțării sociale folosind OpenCV și Raspberry Pi. Vom folosi greutățile algoritmului de detectare a obiectelor YOLO v3 cu modulul Deep Neural Network.
Raspberry Pi este întotdeauna o alegere bună pentru proiectele de procesare a imaginii, deoarece are mai multă memorie și viteză decât alte controlere. Am folosit anterior Raspberry Pi pentru unele proiecte complexe de procesare a imaginilor, cum ar fi detectarea reperelor faciale și aplicația de recunoaștere a feței.
Componente necesare
- Raspberry Pi 4
Aici avem nevoie doar de RPi 4 cu OpenCV instalat pe el. OpenCV este utilizat aici pentru procesarea digitală a imaginilor. Cele mai frecvente aplicații de procesare digitală a imaginilor sunt detectarea obiectelor, recunoașterea feței și contorul de persoane.
YOLO
YOLO (You Only Look Once) este o rețea neuronală inteligentă de convoluție (CNN) pentru detectarea obiectelor în timp real. YOLOv3, cea mai recentă variantă a algoritmului de detectare a obiectelor, YOLO poate recunoaște 80 de obiecte diferite în imagini și videoclipuri și este foarte rapid și are o precizie excelentă. Algoritmul aplică o rețea neuronală unică întregii imagini, apoi separă imaginea în regiuni și calculează casetele limită și probabilitățile pentru fiecare zonă. Modelul de bază YOLO poate procesa imagini în timp real la 45 de cadre pe secundă. Modelul YOLO depășește toate celelalte metode de detectare, cum ar fi SSD și R-CNN.
Modelul YOLOV3 pe care îl vom folosi în acest proiect poate fi descărcat de aici.
Instalarea OpenCV în Raspberry Pi
Înainte de a instala OpenCV și alte dependențe, Raspberry Pi trebuie să fie complet actualizat. Utilizați comenzile de mai jos pentru a actualiza Raspberry Pi la cea mai recentă versiune:
sudo apt-get update
Apoi utilizați următoarele comenzi pentru a instala dependențele necesare pentru instalarea OpenCV pe 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
În cele din urmă, instalați OpenCV pe Raspberry Pi folosind comenzile de mai jos.
pip3 instalează opencv-contrib-python == 4.1.0.25
Dacă sunteți nou în OpenCV, consultați tutorialele noastre anterioare OpenCV cu Raspberry pi:
- Instalarea OpenCV pe Raspberry Pi folosind CMake
- Recunoaștere a feței în timp real cu Raspberry Pi și OpenCV
- Recunoașterea plăcuței de înmatriculare utilizând Raspberry Pi și OpenCV
- Estimarea dimensiunii mulțimii folosind OpenCV și Raspberry Pi
De asemenea, am creat o serie de tutoriale OpenCV începând de la nivelul pentru începători.
Instalarea altor pachete necesare în Raspberry Pi
Înainte de a programa Raspberry Pi pentru detectorul de distanță Social, să instalăm celelalte pachete necesare.
Instalarea imutils: imutils este folosit pentru a face funcții esențiale de procesare a imaginilor, cum ar fi traducerea, rotația, redimensionarea, scheletizarea și afișarea imaginilor Matplotlib mai ușor cu OpenCV. Utilizați comanda de mai jos pentru a instala imutils:
pip3 instalează imutils
Explicația programului
Codul complet este dat la sfârșitul paginii. Aici explicăm secțiunile importante ale codului pentru o explicație mai bună.
Deci, la începutul codului, importați toate bibliotecile necesare care vor fi utilizate în acest proiect.
import numpy ca np import cv2 import imutils import os time import
Funcția Check () este utilizată pentru a calcula distanța dintre două obiecte sau două puncte dintr-un cadru video. Punctele a și b denotă cele două obiecte din cadru. Aceste două puncte sunt utilizate pentru a calcula distanța euclidiană dintre obiecte.
Def Verificați (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 calibrare = (a + b) / 2 dacă 0 <dist <0,25 * calibrare: returnează True else: returnează False
Funcția de configurare este utilizată pentru a seta căile pentru greutățile YOLO, fișier cfg, fișier nume COCO. modulul os.path este utilizat pentru manipularea obișnuită a căii. modulul os.path.join () este un sub-modul al os.path și utilizat pentru a uni una sau mai multe componente de cale în mod inteligent. Metoda cv2.dnn.readNetFromDarknet () este utilizată pentru a încărca greutățile salvate în rețea. După încărcarea greutăților, extrageți lista tuturor straturilor utilizate într-o rețea utilizând un model net.getLayerNames .
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, greutăți) ln = neural_net.getLayerNames () ln = - 1] pentru i în neural_net.getUnconnectedOutLayers ()]
În interiorul funcției de procesare a imaginii, luăm un singur cadru de video și apoi îl procesăm pentru detectarea distanțării sociale între fiecare persoană din mulțime. În primele două linii ale funcției, setăm inițial dimensiunile cadrului video (W, H) ca (None, None). În următoarea linie, am folosit metoda cv2.dnn.blobFromImage () pentru a încărca cadre într-un lot și a le rula prin rețea. Funcția blob efectuează scăderea medie, scalarea și schimbarea canalului pe un cadru.
(H, W) = (None, None) frame = image.copy () dacă W este None sau H is None: (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)
Ieșirile de strat de la YOLO constau dintr-un set de valori. Aceste valori ne ajută să definim ce obiect aparține clasei . Trecem peste fiecare ieșire din layerOutputs și, pe măsură ce detectăm oameni, setăm eticheta clasei ca „persoană”. Din fiecare detecție, obținem o casetă de delimitare care ne oferă centrul X, centrul Y, lățimea și înălțimea casetei pentru detectarea în ieșire:
scoruri = detectare maxi_class = np.argmax (scoruri) încredere = scoruri dacă LABELS == "persoană": dacă încredere> 0,5: casetă = detectare * np.array () (centruX, centruY, lățime, înălțime) = casetă.astype ("int") x = int (centruX - (lățime / 2)) y = int (centruY - (înălțime / 2)) outline.append () confidențiale.append (float (încredere))
După aceea, calculați distanța dintre centrul casetei curente cu toate celelalte casete detectate. Dacă casetele de delimitare sunt aproape, atunci schimbați starea în adevărat.
pentru i în interval (len (centru)): pentru j în interval (len (centru)): închidere = Verificați (centru, centru) dacă este aproape: perechi.aplicați (, centru)) stare = Stare adevărată = Indice adevărat = 0
În rândurile următoare, desenați un dreptunghi în jurul persoanei folosind dimensiunile cutiei pe care le-am primit de la model, apoi verificați dacă cutia este sigură sau nesigură. Dacă distanța dintre cutii este aproape, atunci culoarea cutiei va fi colorată în roșu, altfel caseta va fi colorată în verde.
(x, y) = (contur, contur) (w, h) = (contur, contur) dacă starea == Adevărat: cv2.rectangle (cadru, (x, y), (x + w, y + h), (0, 0, 150), 2) status elif == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Acum, în interiorul funcției buclă , citim fiecare cadru al videoclipului și apoi procesăm fiecare cadru pentru a calcula distanța dintre persoane.
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 sau frameno == 1): Setup (yolo) ImageProcess (current_img) Frame = processImg
În rândurile următoare, utilizați funcția cv2.VideoWriter () pentru a stoca videoclipul de ieșire la locația specificată de opname pe care am definit-o mai devreme.
dacă creați este None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testarea proiectului Detector social distanță
Odată ce codul dvs. este gata, deschideți un terminal Pi și navigați la directorul proiectului. Codul, modelul Yolo și videoclipul demonstrativ ar trebui să fie în același folder așa cum se arată mai jos.
Puteți descărca directorul YoloV3 de aici, videoclipuri din Pexels și copiați codul Python dat mai jos și le puteți pune în același director așa cum se arată mai sus.
Odată ce vă aflați în directorul proiectului, executați următoarea comandă pentru a porni codul:
python3 detector.py
Am încercat acest cod pe un exemplu video care a fost obținut de la Pexels. Pentru mine, FPS a fost foarte lent și a durat aproximativ 10 până la 11 minute pentru a procesa întregul videoclip.
În loc să utilizați un videoclip, puteți testa chiar acest cod cu o cameră Raspberry Pi înlocuind cv2.VideoCapture (intrare) cu cv2.VideoCapture (0) în linia 98 a codului. Aflați mai multe despre utilizarea PiCamera cu Raspberry Pi urmând linkul.
Acesta este modul în care puteți utiliza OpenCV cu Raspberry Pi pentru a detecta încălcările de distanțare socială. Video și codul de ieșire sunt date mai jos: