- Tarvittavat komponentit
- ELÄT VAIN KERRAN
- OpenCV: n asentaminen Raspberry Pi: hen
- Muiden vaadittujen pakettien asentaminen Raspberry Pi -ohjelmaan
- Ohjelman selitys
- Sosiaalisen etäisyysmittarin projektin testaaminen
Covid-19: n aikana sosiaalinen etäisyys on tehokas tapa hidastaa tarttuvien virusten leviämistä. Ihmisiä kehotetaan minimoimaan kontaktinsa toisiinsa, jotta minimoidaan riski taudin leviämisestä suorassa kontaktissa. Turvallisen etäisyyden ylläpitäminen on haaste monille paikoille, kuten tehtaille, pankeille, linja-autoille tai rautatieasemille jne.
Joten jatkamme aiempia Corona-turvallisuusprojekteja, kuten automaattista puhdistuslaitetta ja kontaktittomia lämpötilavalvontatoimia, aiomme rakentaa sosiaalisen etäisyysilmaisimen, joka käyttää OpenCV: tä ja Raspberry Pi: tä. Käytämme YOLO v3 Object Detection Algorithmin painoja Deep Neural Network -moduulin kanssa.
Vadelma Pi on aina hyvä valinta kuvankäsittelyprojekteille, koska sillä on enemmän muistia ja nopeutta kuin muilla ohjaimilla. Aiemmin käytimme Raspberry Pi: tä joihinkin monimutkaisiin kuvankäsittelyprojekteihin, kuten kasvojen maamerkkien havaitsemiseen ja kasvojentunnistussovellukseen.
Tarvittavat komponentit
- Vadelma Pi 4
Täällä tarvitsemme vain RPi 4: n, johon on asennettu OpenCV. OpenCV: tä käytetään tässä digitaaliseen kuvankäsittelyyn. Digitaalisen kuvankäsittelyn yleisimmät sovellukset ovat kohteiden tunnistus, kasvojentunnistus ja ihmiset laskevat.
ELÄT VAIN KERRAN
YOLO (You Only Look Once) on älykäs Convolution-hermoverkko (CNN) reaaliaikaiseen objektin havaitsemiseen. YOLOv3, objektihavaitsemisalgoritmin uusin muunnos, YOLO tunnistaa 80 erilaista kohdetta kuvissa ja videoissa, ja se on erittäin nopea ja erittäin tarkka. Algoritmi soveltaa yhtä hermoverkkoa koko kuvaan, erottaa sitten kuvan alueiksi ja laskee raja-alueet ja todennäköisyydet kullekin alueelle. Perus YOLO-malli pystyy käsittelemään kuvia reaaliajassa nopeudella 45 kuvaa sekunnissa. YOLO-malli ylittää kaikki muut havaintomenetelmät, kuten SSD ja R-CNN.
Tässä projektissa käytettävän YOLOV3-mallin voi ladata täältä.
OpenCV: n asentaminen Raspberry Pi: hen
Ennen OpenCV: n ja muiden riippuvuuksien asentamista Raspberry Pi on päivitettävä kokonaan. Päivitä Raspberry Pi uusimpaan versioon alla olevien komentojen avulla:
sudo apt-get -päivitys
Käytä sitten seuraavia komentoja asentaaksesi tarvittavat riippuvuudet OpenCV: n asentamiseksi Raspberry Pi -laitteeseesi.
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
Asenna lopuksi OpenCV Raspberry Pi -laitteeseen alla olevien komentojen avulla.
pip3 install opencv-contrib-python == 4.1.0.25
Jos olet uusi OpenCV: n käyttäjä, tarkista aiemmat OpenCV-oppaamme Raspberry pi: llä:
- OpenCV: n asentaminen Raspberry Pi: lle CMaken avulla
- Reaaliaikainen kasvojentunnistus Raspberry Pi: n ja OpenCV: n avulla
- Rekisterikilven tunnistus Raspberry Pi: n ja OpenCV: n avulla
- Joukon koon arviointi käyttämällä OpenCV: tä ja Vadelma Pi: tä
Olemme myös luoneet sarjan OpenCV-oppaita alkaen aloittelijan tasosta.
Muiden vaadittujen pakettien asentaminen Raspberry Pi -ohjelmaan
Asennetaan muut tarvittavat paketit ennen Raspberry Pi for Social -etunnistimen ohjelmointia.
Imutiilien asentaminen: imutiileja käytetään helpottamaan olennaisia kuvankäsittelytoimintoja, kuten käännös, kääntö, koon muuttaminen, luuranko ja Matplotlib-kuvien näyttäminen helpommin OpenCV: llä. Asenna imutiilit alla olevan komennon avulla:
pip3 asenna imutils
Ohjelman selitys
Täydellinen koodi annetaan sivun lopussa. Tässä selitämme koodin tärkeät osat paremman selityksen saamiseksi.
Tuo koodin alussa kaikki tarvittavat kirjastot, joita aiotaan käyttää tässä projektissa.
tuonti numpy as np tuonti cv2 tuonti imutils tuonti os tuonti aika
Check () funktiota käytetään laskea etäisyys kahden esineitä tai kaksi pistettä kehyksen video. Pisteet a ja b tarkoittavat kehyksen kahta kohdetta. Näitä kahta pistettä käytetään laskemaan kohteiden välinen Euklidinen etäisyys.
def Tarkista (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 kalibrointi = (a + b) / 2 jos 0 <etäisyys <0,25 * kalibrointi: paluu Tosi muu: palauta epätosi
Asennustoimintoa käytetään määrittämään polut YOLO-painoille, cfg-tiedostolle, COCO-nimitiedostolle. os.path- moduulia käytetään yleiseen polunimen manipulointiin. os.path.join () -moduuli on os.path -alamoduuli, jota käytetään yhdistämään yksi tai useampi polkukomponentti älykkäästi. cv2.dnn.readNetFromDarknet () -menetelmää käytetään tallennettujen painojen lataamiseen verkkoon. Kun olet ladannut painot, pura luettelo kaikista verkossa käytetyistä tasoista net.getLayerNames- mallilla.
def Asetus (yolo): globaali hermoverkko, ln, LABELS-painot = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = avoin (labelsPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, painot) ln = neural_net.getLayerNames () ln = - 1] i: lle kohteessa neural_net.getUnconnectedOutLayers ()]
Kuvankäsittelytoiminnon sisällä otamme yhden videokehyksen ja käsittelemme sen sosiaalisen etäisyyden havaitsemiseen väkijoukossa olevien ihmisten välillä. Toiminnon kahdessa ensimmäisessä rivissä asetetaan videokehyksen mitat (W, H) aluksi arvoksi (Ei mitään, Ei mitään). Seuraavalla rivillä käytimme cv2.dnn.blobFromImage () -menetelmää kehysten lataamiseen erässä ja niiden ajamiseksi verkon kautta. Möykky-toiminto suorittaa keskimääräisen vähennyslaskun, skaalauksen ja kanavanvaihdon kehyksessä.
(H, W) = (Ei mitään, Ei mitään) kehys = image.copy (), jos W ei ole mitään tai H on Ei mitään: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = tosi, rajaus = epätosi
YOLOn tasotulokset koostuvat joukosta arvoja. Nämä arvot auttavat meitä määrittelemään mikä objekti kuuluu mihin luokkaan . Silmukkaamme jokaisen kerroksen Output ulostulon ja havaitessamme ihmisiä asetamme luokan tunnisteeksi "henkilö". Jokaisesta havainnosta saamme rajoituslaatikon, joka antaa meille X-keskuksen, Y-keskuksen, leveyden ja korkeuden laatikon havaitsemiseksi lähdössä:
pisteet = havaintomaksuluokka = np.argmax (pisteet) luottamus = pisteet, jos TARRAT == "henkilö": jos luottamus> 0,5: ruutu = tunnistus * np.array () (centerX, centerY, leveys, korkeus) = box.astype ("int") x = int (centerX - (leveys / 2)) y = int (centerY - (korkeus / 2)) outline.append () confidences.append (float (luottamus))
Laske sen jälkeen nykyisen laatikon keskipisteen ja kaikkien muiden havaittujen ruutujen välinen etäisyys. Jos rajoittavat ruudut ovat lähellä, vaihda tilaksi tosi.
i: lle alueella (len (keskellä)): j: n alueella (len (keskellä)): sulje = tarkista (keskellä, keskellä), jos lähellä: paria. liitä (, keskellä]) tila = tosi tila = tosi indeksi = 0
Piirrä seuraavilla riveillä suorakulmio henkilön ympärille käyttämällä mallilta saamiamme laatikkomittoja ja tarkista sitten, onko ruutu turvallinen vai vaarallinen. Jos laatikkojen välinen etäisyys on pieni, laatikon väri on punainen, muuten laatikko on vihreä.
(x, y) = (ääriviivat, ääriviivat) (w, h) = (ääriviivat, ääriviivat), jos tila == Tosi: cv2.suorakaide (kehys, (x, y), (x + w, y + h), (0, 0, 150), 2) elif-tila == Väärä: cv2. suorakulmio (kehys, (x, y), (x + w, y + h), (0, 255, 0), 2)
Nyt silmukatoiminnon sisällä luemme videon jokaisen kehyksen ja käsittelemme sitten kutakin kehystä henkilöiden välisen etäisyyden laskemiseksi.
ret, frame = cap.read () jos ei ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 tai frameno == 1): Asetus (yolo) ImageProcess (current_img) Kehys = processImg
Käytä seuraavilla riveillä cv2.VideoWriter () -toimintoa tallentaaksesi lähtövideo aiemmin määritetyn opname -nimisen sijaintiin.
jos luominen ei ole mitään: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Sosiaalisen etäisyysmittarin projektin testaaminen
Kun koodi on valmis, avaa Pi-pääte ja siirry projektihakemistoon. Koodin, Yolo-mallin ja esittelyvideon tulisi olla samassa kansiossa kuin alla.
Voit ladata YoloV3-hakemiston täältä, videoita Pexelsistä ja kopioida alla olevan Python-koodin ja laittaa ne samaan hakemistoon kuin yllä.
Kun olet projektihakemistossa, aloita koodi suorittamalla seuraava komento:
python3 detector.py
Kokeilen tätä koodia videoesimerkillä, joka saatiin Pexelsiltä. Minulle FPS oli erittäin hidas, ja koko videon käsitteleminen kesti noin 10-11 minuuttia.
Sen sijaan käyttää videon, voit jopa testata tätä koodia Raspberry Pi Kamera korvaamalla cv2.VideoCapture (input) , jossa cv2.VideoCapture (0) 98 : nnen rivin koodia. Lisätietoja PiCameran käytöstä Raspberry Pi: n kanssa seuraamalla linkkiä.
Näin voit käyttää OpenCV: tä Raspberry Pi: n kanssa sosiaalisten etäisyyden rikkomusten havaitsemiseksi. Lähtövideo ja koodi on annettu alla: