- Požadované komponenty
- YOLO
- Instalace OpenCV na Raspberry Pi
- Instalace dalších požadovaných balíčků na Raspberry Pi
- Vysvětlení programu
- Testování projektu detektoru sociální vzdálenosti
V době Covid-19 je sociální distancování účinným způsobem, jak zpomalit přenos infekčního viru. Lidem se doporučuje minimalizovat vzájemný kontakt, aby se minimalizovalo riziko přenosu nemoci přímým kontaktem. Udržování bezpečné vzdálenosti je výzvou pro mnoho míst, jako jsou továrny, banky, autobusy nebo železniční stanice atd.
Takže v pokračování našich předchozích bezpečnostních projektů Corona, jako je automatický dezinfekční stroj a bezkontaktní monitorování teploty, zde budeme stavět systém Social Distancing Detector pomocí OpenCV a Raspberry Pi. Budeme používat váhy algoritmu detekce objektů YOLO v3 s modulem Deep Neural Network.
Raspberry Pi je vždy dobrou volbou pro projekty zpracování obrazu, protože má více paměti a rychlosti než jiné řadiče. Dříve jsme Raspberry Pi používali pro některé složité projekty zpracování obrazu, jako je detekce orientačních bodů obličeje a aplikace pro rozpoznávání tváře.
Požadované komponenty
- Raspberry Pi 4
Zde potřebujeme pouze RPi 4 s nainstalovaným OpenCV. OpenCV se zde používá pro digitální zpracování obrazu. Nejběžnějšími aplikacemi digitálního zpracování obrazu jsou detekce objektů, rozpoznávání tváře a počítadlo osob.
YOLO
YOLO (You Only Look Once) je inteligentní konvoluční neurální síť (CNN) pro detekci objektů v reálném čase. YOLOv3, nejnovější varianta algoritmu detekce objektů, dokáže YOLO rozpoznat 80 různých objektů v obrázcích a videích a je super rychlý a má vynikající přesnost. Algoritmus aplikuje jednu neuronovou síť na celý obraz, poté rozdělí obraz do oblastí a vypočítá hraniční pole a pravděpodobnosti pro každou oblast. Základní model YOLO dokáže zpracovávat obrázky v reálném čase rychlostí 45 snímků za sekundu. Model YOLO překonává všechny ostatní metody detekce, jako jsou SSD a R-CNN.
Model YOLOV3, který v tomto projektu použijeme, si můžete stáhnout zde.
Instalace OpenCV na Raspberry Pi
Před instalací OpenCV a dalších závislostí je třeba Raspberry Pi plně aktualizovat. Pomocí následujících příkazů aktualizujte Raspberry Pi na nejnovější verzi:
sudo apt-get aktualizace
Potom použijte následující příkazy k instalaci požadovaných závislostí pro instalaci OpenCV na 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 nainstalovat libqt4-test –y
Nakonec nainstalujte OpenCV na Raspberry Pi pomocí níže uvedených příkazů.
pip3 nainstalujte opencv-contrib-python == 4.1.0.25
Pokud jste v OpenCV nováčkem, podívejte se na naše předchozí výukové programy OpenCV s Raspberry pi:
- Instalace OpenCV na Raspberry Pi pomocí CMake
- Rozpoznávání tváře v reálném čase s Raspberry Pi a OpenCV
- Rozpoznávání SPZ pomocí Raspberry Pi a OpenCV
- Odhad velikosti davu pomocí OpenCV a Raspberry Pi
Také jsme vytvořili řadu výukových programů OpenCV od úrovně pro začátečníky.
Instalace dalších požadovaných balíčků na Raspberry Pi
Před programováním detektoru vzdálenosti Raspberry Pi pro Social si nainstalujte další požadované balíčky.
Instalace imutils: imutils se používá k usnadnění základních funkcí zpracování obrazu, jako je překlad, rotace, změna velikosti, skeletonizace a zobrazování obrázků Matplotlib s OpenCV. Pomocí níže uvedeného příkazu nainstalujte imutils:
pip3 nainstalujte imutils
Vysvětlení programu
Celý kód je uveden na konci stránky. Zde vysvětlíme důležité části kódu pro lepší vysvětlení.
Na začátku kódu tedy importujte všechny požadované knihovny, které budou použity v tomto projektu.
import numpy jako np import cv2 import imutils import os import čas
Funkce Check () se používá k výpočtu vzdálenosti mezi dvěma objekty nebo dvěma body v rámci videa. Body a b označují dva objekty v rámu. Tyto dva body se používají k výpočtu euklidovské vzdálenosti mezi objekty.
def Check (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrace = (a + b) / 2 pokud 0 <dist <0,25 * kalibrace: návrat True jiný: návrat False
Funkce nastavení se používá k nastavení cest pro váhy YOLO, soubor cfg, soubor názvů COCO. modul os.path se používá pro běžnou manipulaci s názvem cesty. modul os.path.join () je podmodul os.path a slouží k inteligentnímu připojení jedné nebo více složek cesty. Metoda cv2.dnn.readNetFromDarknet () se používá k načtení uložených vah do sítě. Po načtení vah extrahujte seznam všech vrstev použitých v síti pomocí 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, weights) ln = neural_net.getLayerNames () ln = - 1] pro i v neural_net.getUnconnectedOutLayers ()]
Uvnitř funkce zpracování obrazu pořídíme jediný snímek videa a poté jej zpracujeme pro detekci sociálních vzdáleností mezi každou osobou v davu. V prvních dvou řádcích funkce jsme původně nastavili rozměry videozáznamu (W, H) jako (None, None). V dalším řádku jsme použili metodu cv2.dnn.blobFromImage () k načtení snímků v dávce a jejich spuštění v síti. Funkce blob provádí střední odčítání, změnu měřítka a přepínání kanálů na snímku.
(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 se skládají ze sady hodnot. Tyto hodnoty nám pomáhají definovat, který objekt patří do které třídy . Smyčkujeme každý výstup ve layerOutputs a jak detekujeme lidi, nastavíme označení třídy jako „osoba“. Z každé detekce dostaneme ohraničující rámeček, který nám na výstupu poskytne střed X, střed Y, šířku a výšku rámečku:
skóre = detekce maxi_class = np.argmax (skóre) spolehlivost = skóre, pokud LABELS == "osoba": pokud důvěra> 0,5: box = detekce * np.array () (centerX, centerY, šířka, výška) = box.astype ("int") x = int (centerX - (šířka / 2)) y = int (centerY - (výška / 2)) outline.append () confidences.append (float (spolehlivost))
Poté vypočítejte vzdálenost mezi středem aktuálního pole se všemi ostatními detekovanými poli. Pokud jsou ohraničovací rámečky blízko, změňte stav na true.
for i in range (len (center)): for j in range (len (center)): close = Check (center, center) if close: pair.append (, center]) status = True status = True index = 0
Na dalších řádcích nakreslete obdélník kolem osoby pomocí rozměrů pole, které jsme obdrželi od modelu, a pak zkontrolujte, zda je pole bezpečné nebo nebezpečné. Pokud je vzdálenost mezi rámečky malá, bude barva rámečku zbarvena červeně, jinak bude rámeček zbarven zeleně.
(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)
Nyní uvnitř funkce smyčky čteme každý snímek videa a poté zpracováváme každý snímek, abychom vypočítali vzdálenost mezi osobami.
ret, frame = cap.read () pokud ne ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 nebo frameno == 1): Nastavení (yolo) ImageProcess (current_img) Frame = zpracovánoImg
V následujících řádcích použijte funkci cv2.VideoWriter () k uložení výstupního videa na místo určené opname, které jsme definovali dříve.
pokud create je None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testování projektu detektoru sociální vzdálenosti
Jakmile je váš kód připraven, otevřete terminál Pi a přejděte do adresáře projektu. Kód, model Yolo a ukázkové video by měly být ve stejné složce, jak je uvedeno níže.
Zde si můžete stáhnout adresář YoloV3, videa z Pexels a zkopírovat níže uvedený kód Pythonu a umístit je do stejného adresáře, jak je uvedeno výše.
Jakmile jste v adresáři projektu, spusťte kód spuštěním následujícího příkazu:
python3 detector.py
Zkoušel jsem tento kód na příkladu videa, který byl získán od Pexels. Pro mě byl FPS velmi pomalý a zpracování celého videa trvalo přibližně 10 až 11 minut.
Namísto použití video, můžete si dokonce vyzkoušet tento kód s Raspberry Pi Kamera nahrazením cv2.VideoCapture (vstup) s cv2.VideoCapture (0) v 98 th řádek kódu. Další informace o používání PiCamera s Raspberry Pi získáte kliknutím na odkaz.
Takto můžete pomocí OpenCV s Raspberry Pi detekovat narušení sociální distancování. Výstupní video a kód jsou uvedeny níže: