- Komponente potrebne
- YOLO
- Instaliranje OpenCV-a u Raspberry Pi
- Instaliranje ostalih potrebnih paketa u Raspberry Pi
- Objašnjenje programa
- Testiranje projekta socijalne detekcije udaljenosti
U vrijeme Covid-19, socijalno udaljavanje učinkovit je način usporavanja prijenosa zaraznog virusa. Ljudima se savjetuje da minimaliziraju međusobni kontakt kako bi umanjili rizik od prenošenja bolesti izravnim kontaktom. Održavanje sigurne udaljenosti izazov je za mnoga mjesta kao što su tvornice, banke, autobusi ili željezničke stanice itd.
Dakle, u nastavku naših prethodnih Corona sigurnosnih projekata poput automatskog uređaja za dezinfekciju i beskontaktnog nadzora temperature, ovdje ćemo izgraditi sustav socijalnog udaljavanja pomoću OpenCV i Raspberry Pi. Koristit ćemo težine algoritma za otkrivanje objekata YOLO v3 s modulom Deep Neural Network.
Raspberry Pi uvijek je dobar izbor za projekte obrade slika jer ima više memorije i brzine od ostalih kontrolera. Prije smo koristili Raspberry Pi za neke složene projekte obrade slika poput otkrivanja orijentira lica i aplikacije za prepoznavanje lica.
Komponente potrebne
- Raspberry Pi 4
Ovdje nam treba samo RPi 4 s instaliranim OpenCV-om. OpenCV se ovdje koristi za digitalnu obradu slike. Najčešća primjena digitalne obrade slike su otkrivanje predmeta, prepoznavanje lica i brojač ljudi.
YOLO
YOLO (Gledaš samo jednom) pametna je neuronska mreža Convolution (CNN) za otkrivanje objekata u stvarnom vremenu. YOLOv3, najnovija varijanta algoritma za otkrivanje objekata, YOLO može prepoznati 80 različitih objekata na slikama i videozapisima, vrlo je brz i ima izvrsnu točnost. Algoritam primjenjuje jednu neuronsku mrežu na cijelu sliku, a zatim razdvaja sliku na regije i izračunava granične okvire i vjerojatnosti za svako područje. Osnovni model YOLO može obrađivati slike u stvarnom vremenu brzinom od 45 sličica u sekundi. YOLO model nadmašuje sve ostale metode otkrivanja poput SSD-a i R-CNN-a.
Model YOLOV3 koji ćemo koristiti u ovom projektu možete preuzeti ovdje.
Instaliranje OpenCV-a u Raspberry Pi
Prije instaliranja OpenCV-a i ostalih ovisnosti, Raspberry Pi mora se u potpunosti ažurirati. Upotrijebite naredbe u nastavku da biste ažurirali Raspberry Pi na najnoviju verziju:
sudo apt-get ažuriranje
Zatim upotrijebite sljedeće naredbe za instaliranje potrebnih ovisnosti za instaliranje OpenCV-a na vaš 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
Na kraju, instalirajte OpenCV na Raspberry Pi pomoću naredbi u nastavku.
pip3 instalirati opencv-contrib-python == 4.1.0.25
Ako ste novi u OpenCV-u, provjerite naše prethodne vodiče za OpenCV s Raspberry pi:
- Instaliranje OpenCV-a na Raspberry Pi pomoću CMake-a
- Prepoznavanje lica u stvarnom vremenu s Raspberry Pi i OpenCV
- Prepoznavanje registarske pločice pomoću Raspberry Pi i OpenCV
- Procjena veličine gužve pomoću OpenCV-a i Raspberry Pi-a
Također smo stvorili niz vodiča za OpenCV počevši od početničke razine.
Instaliranje ostalih potrebnih paketa u Raspberry Pi
Prije programiranja Raspberry Pi za Social detektor udaljenosti, instalirajmo ostale potrebne pakete.
Instaliranje imutilsa: imutils se koristi za olakšavanje osnovnih funkcija obrade slika, kao što su prijevod, rotacija, promjena veličine, skeletiranje i prikazivanje Matplotlib slika s OpenCV-om. Upotrijebite naredbu ispod kako biste instalirali imutils:
pip3 instalirati imutils -
Objašnjenje programa
Kompletni kod dan je na kraju stranice. Ovdje objašnjavamo važne odjeljke koda radi boljeg objašnjenja.
Dakle, na početku koda uvezite sve potrebne knjižnice koje će se koristiti u ovom projektu.
uvoz numpy kao np uvoz cv2 uvoz imutils uvoz os vrijeme uvoza
Funkcija Check () koristi se za izračunavanje udaljenosti između dva objekta ili dvije točke u kadru videozapisa. Točke a i b označavaju dva objekta u okviru. Te dvije točke koriste se za izračunavanje euklidske udaljenosti između objekata.
def Provjera (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibracija = (a + b) / 2 ako je 0 <dist <0,25 * kalibracija: return True else: return False
Funkcija postavljanja koristi se za postavljanje staza za YOLO utege, cfg datoteku, datoteku imena COCO. modul os.path koristi se za uobičajenu manipulaciju nazivom puta . os.path.join () modul je podmodul os.path-a i koristi se za inteligentno spajanje jedne ili više komponenata puta. Za učitavanje spremljenih pondera u mrežu koristi se metoda cv2.dnn.readNetFromDarknet () . Nakon učitavanja utega, izvucite popis svih slojeva koji se koriste u mreži pomoću modela net.getLayerNames .
def Postavljanje (yolo): globalni neural_net, ln, LABELS težine = 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, weights) ln = neural_net.getLayerNames () ln = - 1] for i in neural_net.getUnconnectedOutLayers ()]
Unutar funkcije obrade slike, snimamo jedan kadar videozapisa, a zatim ga obrađujemo za otkrivanje društvenog distanciranja između svake osobe u mnoštvu. U prva dva retka funkcije u početku smo postavili dimenzije video okvira (W, H) kao (None, None). U sljedećem smo retku koristili cv2.dnn.blobFromImage () metodu za učitavanje okvira u paketu i njihovo pokretanje kroz mrežu. Blob funkcija izvodi srednje oduzimanje, skaliranje i zamjenu kanala na okviru.
(H, W) = (None, None) frame = image.copy () ako je W None ili H nije 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)
Izlazi sloja iz YOLO sastoje se od skupa vrijednosti. Te nam vrijednosti pomažu definirati koji objekt pripada kojoj klasi . Premotavamo svaki izlaz u LayOutputs i dok otkrivamo ljude, oznaku klase postavljamo kao "osoba". Iz svakog otkrivanja dobivamo granični okvir koji nam daje X centar, Y centar, širinu i visinu okvira za otkrivanje u izlazu:
ocjene = otkrivanje maxi_class = np.argmax (ocjene) pouzdanost = ocjene ako su LABELS == "osoba": ako je pouzdanost> 0,5: box = otkrivanje * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (height / 2)) outline.append () confidences.append (float (pouzdanost))
Nakon toga izračunajte udaljenost između središta trenutnog okvira sa svim ostalim otkrivenim okvirima. Ako su okvirni okviri blizu, promijenite status u true.
za i u dometu (len (sredina)): za j u opsegu (len (sredina)): close = Provjeri (središte, središte) ako je blizu: parovi.dodaj (, središte]) status = True status = True index = 0
U sljedećim redovima nacrtajte pravokutnik oko osobe pomoću dimenzija kutije koje smo dobili od modela, a zatim provjerite je li kutija sigurna ili nesigurna. Ako je udaljenost između kutija bliska, tada će boja kutije biti obojena crvenom bojom, inače će kutija biti obojena zeleno.
(x, y) = (obris, obris) (w, h) = (obris, obris) ako je status == True: cv2.rectangle (okvir, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == False: cv2.rectangle (okvir, (x, y), (x + w, y + h), (0, 255, 0), 2)
Sada unutar funkcije petlje čitamo svaki kadar videozapisa, a zatim obrađujemo svaki kadar kako bismo izračunali udaljenost između osoba.
ret, frame = cap.read () ako nije ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 ili frameno == 1): Postavljanje (yolo) ImageProcess (current_img) Okvir = obradioImg
U sljedećim redovima koristite funkciju cv2.VideoWriter () za pohranu izlaznog videozapisa na mjesto određeno opnameom koje smo prethodno definirali.
ako je stvaranje Nijedno: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testiranje projekta socijalne detekcije udaljenosti
Nakon što vaš kôd bude spreman, otvorite Pi terminal i idite do direktorija projekta. Kôd, model Yolo i demonstracijski videozapis trebaju biti u istoj mapi kao što je prikazano u nastavku.

Ovdje možete preuzeti YoloV3 direktorij, video zapise s Pexela i kopirati dolje navedeni Python kod i staviti ih u isti direktorij kao što je gore prikazano.
Jednom kad ste u direktoriju projekta, izvršite sljedeću naredbu za pokretanje koda:
python3 detektor.py
Isprobao sam ovaj kôd na primjeru videozapisa koji je dobiven od Pexela. Za mene je FPS bio vrlo spor i obrađivanju cijelog videozapisa trebalo je otprilike 10 do 11 minuta.

Umjesto da koristite video, čak možete testirati ovaj kod sa malina Pi kamere zamjenom cv2.VideoCapture (ulaz) sa cv2.VideoCapture (0) 98 th liniju koda. Saznajte više o korištenju PiCamere s Raspberry Pi slijedeći vezu.
Na ovaj način možete koristiti OpenCV s Raspberry Pi za otkrivanje kršenja socijalnih distanciranja. Izlazni video i kod dati su u nastavku:
