- Súčasti sú povinné
- YOLO
- Inštalácia OpenCV na Raspberry Pi
- Inštalácia ďalších požadovaných balíkov na Raspberry Pi
- Vysvetlenie programu
- Testovanie projektu detektora sociálnej vzdialenosti
V čase Covid-19 je sociálne dištancovanie efektívnym spôsobom spomalenia prenosu infekčného vírusu. Ľuďom sa odporúča, aby minimalizovali vzájomný kontakt, aby sa minimalizovalo riziko prenosu choroby priamym kontaktom. Udržiavanie bezpečnej vzdialenosti je výzvou pre mnoho miest, ako sú továrne, banky, autobusy alebo železničné stanice atď.
Takže v nadväznosti na naše predchádzajúce bezpečnostné projekty Corona, ako je automatický dezinfekčný prístroj a bezkontaktné sledovanie teploty, tu budeme budovať systém Social Distancing Detector pomocou OpenCV a Raspberry Pi. Budeme používať váhy algoritmu detekcie objektov YOLO v3 s modulom Deep Neural Network.
Raspberry Pi je vždy dobrou voľbou pre projekty spracovania obrázkov, pretože má viac pamäte a rýchlosť ako iné radiče. Predtým sme Raspberry Pi používali pre niektoré zložité projekty spracovania obrázkov, ako je detekcia medzníkov tváre a aplikácia rozpoznávania tváre.
Súčasti sú povinné
- Raspberry Pi 4
Tu nám stačí RPi 4 s nainštalovaným OpenCV. OpenCV sa tu používa na digitálne spracovanie obrazu. Najbežnejšie aplikácie digitálneho spracovania obrazu sú detekcia objektov, rozpoznávanie tváre a počítanie osôb.
YOLO
YOLO (Pozeráte sa iba raz) je inteligentná neurónová sieť s konverziou (CNN) na detekciu objektov v reálnom čase. YOLOv3, najnovšia varianta algoritmu detekcie objektov, dokáže YOLO rozpoznať 80 rôznych objektov na obrázkoch a videách, je super rýchly a má vynikajúcu presnosť. Algoritmus aplikuje na celý obrázok jednu neurónovú sieť, potom obrázok rozdelí na oblasti a pre každú oblasť vypočíta hraničné rámce a pravdepodobnosti. Základný model YOLO dokáže spracovávať obrázky v reálnom čase rýchlosťou 45 snímok za sekundu. Model YOLO prekonáva všetky ostatné metódy detekcie, ako sú SSD a R-CNN.
Model YOLOV3, ktorý v tomto projekte použijeme, si môžete stiahnuť odtiaľto.
Inštalácia OpenCV na Raspberry Pi
Pred inštaláciou OpenCV a ďalších závislostí je potrebné Raspberry Pi úplne aktualizovať. Pomocou nasledujúcich príkazov aktualizujte Raspberry Pi na najnovšiu verziu:
sudo apt-get aktualizácia
Potom pomocou nasledujúcich príkazov nainštalujte požadované závislosti potrebné na inštaláciu OpenCV na vašom 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 nainštalovať libqt4-test –y
Nakoniec nainštalujte OpenCV na Raspberry Pi pomocou nižšie uvedených príkazov.
pip3 nainštaluj opencv-contrib-python == 4.1.0.25
Ak ste v OpenCV nováčikom, pozrite si naše predchádzajúce návody k OpenCV s Raspberry pi:
- Inštalácia OpenCV na Raspberry Pi pomocou CMake
- Rozpoznávanie tváre v reálnom čase s Raspberry Pi a OpenCV
- Rozpoznávanie ŠPZ pomocou Raspberry Pi a OpenCV
- Odhad veľkosti davu pomocou OpenCV a Raspberry Pi
Tiež sme vytvorili sériu tutoriálov OpenCV začínajúcich od úrovne začiatočníkov.
Inštalácia ďalších požadovaných balíkov na Raspberry Pi
Pred programovaním detektora vzdialenosti Raspberry Pi for Social si nainštalujeme ďalšie požadované balíčky.
Inštalácia imutils: imutils sa používa na uľahčenie základných funkcií spracovania obrazu, ako je preklad, rotácia, zmena veľkosti, skeletonizácia a zobrazovanie obrázkov Matplotlib pomocou OpenCV. Pomocou nižšie uvedeného príkazu nainštalujte imutils:
pip3 nainštalovať imutils
Vysvetlenie programu
Celý kód je uvedený na konci stránky. Tu vysvetľujeme dôležité časti kódu pre lepšie vysvetlenie.
Na začiatku kódu teda importujte všetky požadované knižnice, ktoré sa majú v tomto projekte použiť.
import numpy ako np import cv2 import imutils import os import času
Funkcia Check () sa používa na výpočet vzdialenosti medzi dvoma objektmi alebo dvoma bodmi v snímke videa. Body a a b označujú dva objekty v ráme. Tieto dva body sa používajú na výpočet euklidovskej vzdialenosti medzi objektmi.
def Kontrola (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrácia = (a + b) / 2 ak 0 <dist <0,25 * kalibrácia: návrat True iný: návrat False
Funkcia nastavenia sa používa na nastavenie ciest pre váhy YOLO, súbor cfg, súbor mien COCO. modul os.path sa používa na bežnú manipuláciu s názvom cesty. modul os.path.join () je podmodul os.path a slúži na inteligentné spojenie jednej alebo viacerých zložiek cesty. Na načítanie uložených váh do siete sa používa metóda cv2.dnn.readNetFromDarknet () . Po načítaní váh extrahujte zoznam všetkých vrstiev použitých v sieti pomocou modelu 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, váhy) ln = neural_net.getLayerNames () ln = - 1] pre i v neural_net.getUnconnectedOutLayers ()]
Vo vnútri funkcie spracovania obrazu zoberieme jednu snímku videa a potom ju spracujeme na detekciu sociálnej vzdialenosti medzi každou osobou v dave. V prvých dvoch riadkoch funkcie sme pôvodne nastavili rozmery videozáznamu (W, H) ako (None, None). V ďalšom riadku sme použili metódu cv2.dnn.blobFromImage () na načítanie rámcov v dávke a ich spustenie cez sieť. Funkcia blob vykonáva na snímke stredné odčítanie, zmenu mierky a výmenu kanálov.
(H, W) = (None, None) frame = image.copy () if W is None or 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)
Výstupy vrstvy z YOLO pozostávajú zo sady hodnôt. Tieto hodnoty nám pomáhajú definovať, ktorý objekt patrí do ktorej triedy . Opakujeme každý výstup vo layerOutputs a keď zisťujeme ľudí, nastavili sme označenie triedy ako „osoba“. Z každej detekcie dostaneme ohraničujúci rámček, ktorý nám na výstup poskytne stred X, stred Y, šírku a výšku poľa:
skóre = detekcia maxi_class = np.argmax (skóre) spoľahlivosť = skóre ak LABELS == "osoba": ak dôvera> 0,5: box = detekcia * np.array () (centerX, centerY, šírka, výška) = box.astype ("int") x = int (centerX - (šírka / 2)) y = int (centerY - (výška / 2)) outline.append () confidences.append (float (spoľahlivosť))
Potom vypočítajte vzdialenosť medzi stredom aktuálneho poľa so všetkými ostatnými zistenými políčkami. Ak sú ohraničovacie polia blízko, zmeňte stav na hodnotu true.
pre i v rozsahu (len (stred)): pre j v rozsahu (len (stred)): close = Skontrolujte (stred, stred), ak je blízko: pair.append (, center]) status = Skutočný stav = Pravý index = 0
Na ďalších riadkoch nakreslite obdĺžnik okolo osoby pomocou rozmerov schránky, ktoré sme dostali od modelu, a potom skontrolujte, či je schránka bezpečná alebo nebezpečná. Ak je vzdialenosť medzi políčkami malá, potom bude farba škatule zafarbená načerveno, inak bude škatuľa zafarbená zelenou farbou.
(x, y) = (outline, outline) (w, h) = (outline, outline) if status == True: cv2.rectangle (frame, (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)
Teraz vo vnútri funkcie slučky čítame každú snímku videa a potom každú snímku spracovávame, aby sme vypočítali vzdialenosť medzi osobami.
ret, frame = cap.read () ak nie ret: break current_img = frame.copy () current_img = imutils.resize (current_img, šírka = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 alebo frameno == 1): Nastavenie (yolo) ImageProcess (current_img) Rám = spracovanéImg
V nasledujúcich riadkoch použite funkciu cv2.VideoWriter () na uloženie výstupného videa na miesto určené operačným menom, ktoré sme už skôr definovali.
ak create je None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (rám)
Testovanie projektu detektora sociálnej vzdialenosti
Keď je váš kód pripravený, otvorte terminál Pi a prejdite do adresára projektu. Kód, model Yolo a ukážkové video by mali byť v rovnakom priečinku, ako je uvedené nižšie.
Tu si môžete stiahnuť adresár YoloV3, videá zo služby Pexels, skopírovať nižšie uvedený kód Pythonu a vložiť ich do rovnakého adresára, ako je uvedené vyššie.
Keď sa nachádzate v adresári projektu, spustením kódu spustite nasledujúci príkaz:
python3 detector.py
Tento kód som vyskúšal na príklade videa, ktoré bolo získané od spoločnosti Pexels. FPS bol pre mňa veľmi pomalý a spracovanie celého videa trvalo približne 10 až 11 minút.
Namiesto použitia video, môžete si dokonca vyskúšať tento kód s Raspberry Pi Kamera nahradením cv2.VideoCapture (vstup) s cv2.VideoCapture (0) v 98 th riadok kódu. Viac informácií o používaní PiCamera s Raspberry Pi získate kliknutím na nasledujúci odkaz.
Takto môžete použiť OpenCV s Raspberry Pi na detekciu sociálnych vzdialených porušení. Výstupné video a kód sú uvedené nižšie: