- Potrebne komponente
- YOLO
- Namestitev OpenCV v Raspberry Pi
- Namestitev drugih potrebnih paketov v Raspberry Pi
- Pojasnilo programa
- Testiranje projekta Social Social Detector
V času Covid-19 je socialno oddaljevanje učinkovit način za upočasnitev prenosa nalezljivega virusa. Ljudem svetujemo, naj čim bolj zmanjšajo stike med seboj, da zmanjšajo tveganje za prenos bolezni z neposrednim stikom. Ohranjanje varne razdalje je izziv za mnoge kraje, kot so tovarne, banke, avtobusi ali železniške postaje itd.
V nadaljevanju naših prejšnjih varnostnih projektov Corona, kot sta avtomatski razkuževalni stroj in brezkontaktno spremljanje temperature, bomo tukaj zgradili sistem Social Distancing Detector z uporabo OpenCV in Raspberry Pi. Z modulom Deep Neural Network bomo uporabili uteži algoritma za zaznavanje objektov YOLO v3.
Raspberry Pi je vedno dobra izbira za projekte obdelave slik, saj ima več pomnilnika in hitrosti kot drugi krmilniki. Pred tem smo Raspberry Pi uporabljali za nekatere zapletene projekte obdelave slik, kot sta zaznavanje mejnikov obraza in aplikacija za prepoznavanje obrazov.
Potrebne komponente
- Raspberry Pi 4
Tu potrebujemo samo RPi 4 z nameščenim OpenCV. OpenCV se tu uporablja za digitalno obdelavo slik. Najpogostejši programi digitalne obdelave slik so zaznavanje predmetov, prepoznavanje obrazov in števec ljudi.
YOLO
YOLO (pogledaš samo enkrat) je pametno nevronsko omrežje Convolution (CNN) za zaznavanje predmetov v realnem času. YOLOv3, najnovejša različica algoritma za zaznavanje predmetov, YOLO lahko prepozna 80 različnih predmetov na slikah in videoposnetkih, je zelo hiter in ima odlično natančnost. Algoritem uporabi eno nevronsko mrežo za celotno sliko, nato sliko loči na regije in izračuna mejna polja in verjetnosti za vsako območje. Osnovni model YOLO lahko slike obdela v realnem času s hitrostjo 45 sličic na sekundo. Model YOLO presega vse druge metode zaznavanja, kot sta SSD in R-CNN.
Model YOLOV3, ki ga bomo uporabili v tem projektu, lahko prenesete od tukaj.
Namestitev OpenCV v Raspberry Pi
Pred namestitvijo OpenCV in drugih odvisnosti je treba Raspberry Pi v celoti posodobiti. Za posodobitev Raspberry Pi na najnovejšo različico uporabite spodnje ukaze:
posodobitev sudo apt-get
Nato z naslednjimi ukazi namestite potrebne odvisnosti za namestitev OpenCV 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 koncu namestite OpenCV na Raspberry Pi z uporabo spodnjih ukazov.
pip3 namestite opencv-contrib-python == 4.1.0.25
Če ste novi v OpenCV, si oglejte prejšnje vadnice OpenCV z Raspberry pi:
- Namestitev OpenCV na Raspberry Pi s pomočjo CMake
- Spoznavanje obrazov v realnem času z Raspberry Pi in OpenCV
- Prepoznavanje registrske tablice z uporabo Raspberry Pi in OpenCV
- Ocena množice z uporabo OpenCV in Raspberry Pi
Ustvarili smo tudi vrsto vadnic OpenCV, ki se začnejo od začetnika.
Namestitev drugih potrebnih paketov v Raspberry Pi
Pred programiranjem detektorja razdalje Raspberry Pi for Social namestimo še druge potrebne pakete.
Namestitev imutils: imutils se uporablja za poenostavitev bistvenih funkcij obdelave slik, kot so prevajanje, vrtenje, spreminjanje velikosti, skeletiranje in prikazovanje slik Matplotlib z OpenCV. Za namestitev imutilov uporabite spodnji ukaz:
pip3 namestite imutils
Pojasnilo programa
Popolna koda je podana na koncu strani. Tu razlagamo pomembne razdelke kode za boljšo razlago.
Torej na začetku kode uvozite vse zahtevane knjižnice, ki bodo uporabljene v tem projektu.
uvoz numpy kot np uvoz cv2 uvoz imutils uvoz os čas uvoza
Funkcija Check () se uporablja za izračun razdalje med dvema predmetoma ali dvema točkama v video posnetku. Točki a in b označujeta dva predmeta v okvirju. Ti dve točki se uporabljata za izračun evklidske razdalje med predmeti.
def Preveri (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibracija = (a + b) / 2, če je 0 <dist <0,25 * umerjanje: vrnitev True drugače: vrnitev False
Funkcija namestitve se uporablja za nastavitev poti za uteži YOLO, datoteko cfg in datoteko imen COCO. Modul os.path se uporablja za skupno manipulacijo z imeni poti. modul os.path.join () je podmodul os.path in se uporablja za inteligentno povezovanje ene ali več komponent poti. Za nalaganje shranjenih uteži v omrežje se uporablja metoda cv2.dnn.readNetFromDarknet () . Po nalaganju uteži izvlecite seznam vseh slojev, uporabljenih v omrežju, z uporabo modela net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS uteži = 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, uteži) ln = neural_net.getLayerNames () ln = - 1] for i in neural_net.getUnconnectedOutLayers ()]
Znotraj funkcije obdelave slik posnamemo en sam videoposnetek in ga nato obdelamo za zaznavanje družbene oddaljenosti med vsako osebo v množici. V prvih dveh vrsticah funkcije smo sprva nastavili dimenzije video okvirja (W, H) kot (None, None). V naslednji vrstici smo uporabili metodo cv2.dnn.blobFromImage () za nalaganje okvirjev v paketu in njihovo zagon skozi omrežje. Funkcija blob izvaja odštevanje povprečja, skaliranje in zamenjavo kanalov na okvirju.
(H, W) = (None, None) frame = image.copy (), če W ni None ali H ni None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, obrezovanje = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Izhodi sloja iz YOLO so sestavljeni iz nabora vrednosti. Te vrednosti nam pomagajo določiti, kateri objekt spada v kateri razred . Preko vsakega izhoda v LayOutputs preidemo in ko zaznavamo ljudi, nastavimo oznako razreda kot "oseba". Od vsakega zaznavanja dobimo omejevalno polje, ki nam daje X center, Y center, Width in Height polja za zaznavanje v izhodu:
scores = zaznavanje maxi_class = np.argmax (scores) zaupanje = ocene, če LABELS == "oseba": če je zaupanje> 0,5: box = zaznavanje * np.array () (centerX, centerY, širina, višina) = box.astype ("int") x = int (centerX - (širina / 2)) y = int (centerY - (višina / 2)) outline.append () confidences.append (float (zaupanje))
Po tem izračunajte razdaljo med središčem trenutnega polja z vsemi ostalimi zaznanimi polji. Če so omejevalna polja blizu, spremenite stanje na true.
za i in range (len (center)): za j in range (len (center)): close = Preveri (center, center), če je blizu: pair.append (, center]) status = True status = True index = 0
V naslednjih vrsticah narišite pravokotnik okoli osebe z uporabo dimenzij škatle, ki smo jih prejeli od modela, nato preverite, ali je škatla varna ali nevarna. Če je razdalja med škatlama blizu, bo barva škatle obarvana rdeče, sicer bo škatla obarvana zeleno.
(x, y) = (oris, oris) (w, h) = (oris, oris), če 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)
Zdaj znotraj funkcije zanke beremo vsak okvir videoposnetka in nato obdelamo vsak okvir, da izračunamo razdaljo med osebami.
ret, frame = cap.read (), če ni ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 ali frameno == 1): Nastavitev (yolo) ImageProcess (current_img) Frame = obdelanoImg
V naslednjih vrsticah s funkcijo cv2.VideoWriter () shranite izhodni video na mesto, določeno z opname, ki smo ga določili prej.
če je ustvariti nič: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Testiranje projekta Social Social Detector
Ko je vaša koda pripravljena, odprite terminal Pi in se pomaknite do imenika projekta. Koda, model Yolo in predstavitveni video naj bodo v isti mapi, kot je prikazano spodaj.
Tu lahko prenesete imenik YoloV3, videoposnetke iz Pexela in kopirate spodnjo kodo Pythona ter jih shranite v isti imenik, kot je prikazano zgoraj.
Ko ste v imeniku projekta, zaženite naslednji ukaz za zagon kode:
python3 detector.py
To kodo sem preizkusil na video primeru, ki smo ga dobili pri podjetju Pexels. Zame je bil FPS zelo počasen in je trajalo približno 10 do 11 minut, da sem obdelal celoten video.
Namesto z uporabo videa, lahko celo preizkusiti to kodo z Raspberry Pi fotoaparat z zamenjavo cv2.VideoCapture (vhod) z cv2.VideoCapture (0) v 98 th vrstico kode. Preberite več o uporabi PiCamere z Raspberry Pi na povezavi.
Tako lahko OpenCV z Raspberry Pi uporabite za odkrivanje kršitev socialne oddaljenosti. Izhodni video in koda sta podana spodaj: