- Szükséges alkatrészek
- YOLO
- Az OpenCV telepítése a Raspberry Pi programba
- Más szükséges csomagok telepítése a Raspberry Pi programba
- A program magyarázata
- A szociális távolságdetektor projekt tesztelése
A Covid-19 idején a társadalmi távolságtartás hatékony módszer a fertőző vírusok terjedésének lassítására. Az embereknek javasoljuk, hogy minimalizálják az egymással való kapcsolatukat, hogy minimalizálják a betegség közvetlen érintkezés útján történő továbbadásának kockázatát. A biztonságos távolság fenntartása sok helyütt kihívást jelent, például gyárak, bankok, buszok vagy vasútállomások stb.
Tehát korábbi Corona biztonsági projektjeink folytatásaként, mint például az automatikus fertőtlenítő gép és az érintés nélküli hőmérséklet-figyelés, itt egy Social Distancing Detector rendszert fogunk építeni OpenCV és Raspberry Pi felhasználásával. A YOLO v3 Object Detection Algorithm súlyát a Deep Neural Network modullal fogjuk használni.
A Raspberry Pi mindig jó választás a képfeldolgozó projektek számára, mivel több memóriával és sebességgel rendelkezik, mint más vezérlők. Korábban a Raspberry Pi-t használtuk olyan összetett képfeldolgozási projektekhez, mint az arc mérföldköveinek észlelése és az arcfelismerő alkalmazások.
Szükséges alkatrészek
- Málna Pi 4
Itt csak az RPC 4-re van szükségünk, amelyre telepítve van az OpenCV. Az OpenCV-t itt használják digitális képfeldolgozásra. A digitális képfeldolgozás leggyakoribb alkalmazásai az objektumfelismerés, az arcfelismerés és az emberek számlálója.
YOLO
A YOLO (You Only Look Once) egy intelligens Convolution neurális hálózat (CNN) a valós idejű objektumdetektáláshoz. A YOLOv3, az objektum-felismerési algoritmus legújabb változata, a YOLO 80 különböző objektumot képes felismerni képeken és videókon, szupergyors és kiváló pontosságú. Az algoritmus egyetlen neurális hálózatot alkalmaz az egész képre, majd szétválasztja a képet régiókra, és kiszámítja az egyes területekhez tartozó határmezõket és valószínûségeket. Az alap YOLO modell képes valós időben, 45 képkocka / másodperces sebességgel feldolgozni a képeket. A YOLO modell felülmúlja az összes többi detektálási módszert, például az SSD-t és az R-CNN-t.
A YOLOV3 modell, amelyet ebben a projektben használni fogunk, innen tölthető le.
Az OpenCV telepítése a Raspberry Pi programba
Az OpenCV és más függőségek telepítése előtt a Raspberry Pi-t teljesen frissíteni kell. Az alábbi parancsokkal frissítheti a Raspberry Pi legújabb verzióját:
sudo apt-get frissítés
Ezután a következő parancsokkal telepítse az OpenCV telepítéséhez szükséges függőségeket a Raspberry Pi-re.
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-teszt -y
Végül telepítse az OpenCV-t a Raspberry Pi-re az alábbi parancsok segítségével.
pip3 install opencv-contrib-python == 4.1.0.25
Ha még nem ismeri az OpenCV alkalmazást, akkor nézze meg korábbi OpenCV oktatóanyagainkat a Raspberry pi programmal:
- Az OpenCV telepítése a Raspberry Pi-re a CMake segítségével
- Valós idejű arcfelismerés Raspberry Pi-vel és OpenCV-vel
- Rendszámfelismerés Raspberry Pi és OpenCV használatával
- A tömeg méretének becslése OpenCV és Raspberry Pi használatával
Létrehoztunk egy sor OpenCV oktatóanyagot a kezdő szinttől kezdve.
Más szükséges csomagok telepítése a Raspberry Pi programba
Mielőtt programozná a Raspberry Pi for Social distance detector programot, telepítse a többi szükséges csomagot.
Az imutilok telepítése: Az imutilokat alapvető képfeldolgozási funkciók, például fordítás, forgatás, átméretezés, csontvázosítás és a Matplotlib képek egyszerűbb elkészítésére használják az OpenCV segítségével. Az imutils telepítéséhez használja az alábbi parancsot:
pip3 telepítse az imutilokat
A program magyarázata
A teljes kódot az oldal végén adjuk meg. Itt magyarázzuk el a kód fontos szakaszait a jobb magyarázat érdekében.
Tehát a kód indításakor importálja az összes szükséges könyvtárat, amelyet használni fog a projektben.
import numpy as np import cv2 import imutils import os import time
A Check () függvény két objektum vagy két képkocka közötti távolság kiszámítására szolgál. Az a és b pontok a keret két objektumát jelölik. Ezt a két pontot használják az objektumok közötti euklideszi távolság kiszámításához.
def Ellenőrizze (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrálás = (a + b) / 2, ha 0 <dist <0,25 * kalibrálás: return True else: return False
A beállítási funkcióval a YOLO súlyok, a cfg fájl, a COCO nevek fájl elérési útjai kerülnek beállításra. Az os.path modult a közös elérési út manipulálására használják. Az os.path.join () modul az os.path egyik almodulja , amelyet egy vagy több útkomponens intelligens összekapcsolására használnak. A cv2.dnn.readNetFromDarknet () metódust használják a mentett súlyok hálózatba töltésére . A súlyok betöltése után a net.getLayerNames modell segítségével vonja ki a hálózatban használt összes réteg listáját.
def Setup (yolo): globális neural_net, ln, LABELS súlyok = 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 (konfiguráció, súlyok) ln = neural_net.getLayerNames () ln = - 1] i-re a neural_net.getUnconnectedOutLayers ()]
A képfeldolgozó funkción belül egyetlen képkockát készítünk a videóról, majd feldolgozzuk a társadalmi távolságtartás detektálására minden tömegben lévő ember között. A függvény első két sorában a videokeret (W, H) méreteit kezdetben (None, None) értékként állítottuk be. A következő sorban a cv2.dnn.blobFromImage () metódust használtuk a keretek kötegelt betöltésére és a hálózaton keresztül történő futtatására. A blob funkció végrehajtja az átlagos kivonást, méretezést és csatornacserét egy kereten.
(H, W) = (Nincs, Nincs) keret = image.copy (), ha W nincs, vagy H nincs: (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)
A YOLO réteg kimenetei értékekből állnak. Ezek az értékek segítenek meghatározni, hogy melyik objektum melyik osztályba tartozik. Áthurcoljuk a layerOutputs minden kimenetét, és miközben észleljük az embereket, az osztály címkét "személyként" állítjuk be. Minden érzékelésből kapunk egy határoló dobozt, amely megadja a doboz X középpontját, Y középpontját, szélességét és magasságát a kimenet észleléséhez:
pontszámok = detektálás maxi_osztály = np.argmax (pontszámok) magabiztosság = pontszám, ha CÍMKÉK == "személy": ha bizalom> 0,5: négyzet = észlelés * np.array () (centerX, centerY, szélesség, magasság) = box.astype ("int") x = int (centerX - (szélesség / 2)) y = int (centerY - (magasság / 2)) outline.append () bizalom.append (float (megbízhatóság))
Ezt követően számítsa ki az aktuális doboz közepe és az összes többi észlelt mező közötti távolságot. Ha a határoló dobozok közel vannak, akkor változtassa meg az állapotot igazra.
i tartományban (len (közép)): j esetén tartomány (len (közép)): bezár = Ellenőrizze (középen, középen), ha közel van: párok. append (, center]) állapot = Igaz állapot = Igaz index = 0
A következő sorokban rajzoljon egy téglalapot az ember köré a modelltől kapott dobozméretek használatával, majd ellenőrizze, hogy a doboz biztonságos vagy nem biztonságos-e. Ha a dobozok közötti távolság közel van, akkor a doboz színe vörös színű lesz, különben a doboz zöld lesz.
(x, y) = (körvonal, vázlat) (w, h) = (körvonal, vázlat), ha állapot == Igaz: cv2.téglalap (keret, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == Hamis: cv2.téglalap (keret, (x, y), (x + w, y + h), (0, 255, 0), 2)
A hurokfunkción belül a videó minden képkockáját elolvassuk, majd az egyes képkockákat feldolgozzuk a személyek közötti távolság kiszámításához.
ret, frame = cap.read () ha nem ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 vagy frameno == 1): Beállítás (yolo) ImageProcess (current_img) Keret = feldolgozottImg
A következő sorokban használja a cv2.VideoWriter () függvényt a kimeneti videó tárolására az opname által korábban megadott helyen.
ha a létrehozása nincs: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
A szociális távolságdetektor projekt tesztelése
Miután elkészült a kód, nyisson meg egy Pi terminált, és lépjen a projekt könyvtárába. A kódnak, a Yolo modellnek és a bemutató videónak ugyanabban a mappában kell lennie, mint az alábbiakban látható.
Innen letöltheti a YoloV3 könyvtárat, a Pexels videókat és átmásolhatja az alább megadott Python kódot, és elhelyezheti őket a fent látható könyvtárban.
Miután belépett a projektkönyvtárba, hajtsa végre a következő parancsot a kód indításához:
python3 detector.py
Kipróbáltam ezt a kódot egy videopéldán, amelyet a Pexels-től szereztünk be. Számomra az FPS nagyon lassú volt, és körülbelül 10–11 percet vett igénybe a teljes videó feldolgozása.
Ahelyett, hogy egy videót, akkor is kipróbálni ezt a kódot a Raspberry Pi kamera helyett a cv2.VideoCapture (input) és cv2.VideoCapture (0) 98 -én sor a kódot. Tudjon meg többet a PiCamera és a Raspberry Pi használatáról a link követésével.
Így használhatja az OpenCV-t a Raspberry Pi-vel a társadalmi távolságtartási jogsértések észleléséhez. A kimeneti videó és kód az alábbiakban található: