Innholdsfortegnelse:

Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi: 12 trinn (med bilder)
Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi: 12 trinn (med bilder)

Video: Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi: 12 trinn (med bilder)

Video: Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi: 12 trinn (med bilder)
Video: AMAZFIT BIP S LITE Smart Watch ATM5: Things To Know | Accuracy & Real Life Review 2024, Juli
Anonim
Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi
Pool Pi Guy - AI -drevet alarmsystem og bassengovervåking ved hjelp av Raspberry Pi

Å ha et basseng hjemme er morsomt, men kommer med stort ansvar. Min største bekymring er å overvåke om noen er i nærheten av bassenget uten tilsyn (spesielt yngre barn). Min største irritasjon er å sørge for at bassengvannsledningen aldri går under pumpeinngangen, noe som ville kjøre pumpen tørr og ødelegge den som koster $ $ $ i reparasjoner.

Jeg har nylig funnet ut hvordan jeg bruker en Raspberry Pi med OpenCV og TensorFlow, sammen med en vannstandssensor og en magnetventil for å løse begge problemene - og ha det gøy!

Det viser seg også å være et flott alarmsystem - bevegelsesaktivert, AI -kontrollert, uendelig tilpassbar.

La oss dykke inn.

Trinn 1: Grand Plan

I denne instruksen vil vi vise hvordan du:

  1. Sett opp en Raspberry Pi med OpenCV og TensorFlow
  2. Koble til et webkamera via en lang USB -kabel
  3. Skriv en OpenCV -algoritme for å oppdage bevegelse
  4. Bruk TensorFlow for gjenkjenning av objekter
  5. Sett opp en webserver på Raspberry Pi for å vise de interessante bildene
  6. Integrer med IFTTT for å utløse mobilvarsler i tilfelle en person blir oppdaget
  7. Fest en reléhatt til Raspberry Pi og koble den til en magnetventil som vil tilføre vann til bassenget
  8. Fest en vannstandssensor til Raspberry Pi og grensesnitt med den ved hjelp av Pi's GPIO
  9. Skriv en kode for å lime det hele sammen

Trinn 2: Handleliste

Handleliste
Handleliste

Alle komponentene er lett tilgjengelige fra Amazon. Eksperimenter og bytt komponenter - det er halve moroa!

  1. Bringebær Pi
  2. Raspberry Pi -strømforsyning (ikke spar på her)
  3. Minnekort (større er bedre)
  4. Case (denne er stor nok til å huse både Pi og HAT)
  5. USB -webkamera (et hvilket som helst webkamera vil gjøre, men du vil ha et som får gode bilder og balanserer belysningen godt)
  6. USB -forlengelseskabel (om nødvendig - mål avstanden mellom Pi og hvor du vil plassere kameraet)
  7. Relébrett HAT (denne har 3 releer, og vi trenger bare en, men du vil finne en bruk for de andre snart nok!)
  8. Solenoid
  9. Solenoid montering 1 og montering 2 (det avhenger virkelig av hva du passer solenoiden til, men disse fungerte for meg)
  10. Magnetisk strømforsyning (enhver 24V AC ville gjøre)
  11. Kabel (igjen, nesten hvilken som helst 2 -strengs kabel ville gjøre - strømmen er minimal)
  12. Vannstandsbryter (dette er bare et eksempel, sjekk hva som lett kan kobles til bassenget ditt)
  13. Noen hoppekabler og ledningskontakter

Trinn 3: Sett opp din Raspberry Pi

Sett opp din Raspberry Pi
Sett opp din Raspberry Pi

Raspberry Pi er en flott liten datamaskin. Det koster bare $ 35, kjører konsekvent og har mye kompatibel programvare og maskinvare. Det er ganske enkelt å sette opp det:

  1. Formater SD -kortet. Dette trenger spesiell forsiktighet - Raspberry Pi kan bare starte fra et FAT -formatert SD -kort. Følg disse instruksjonene.
  2. Koble Raspberry Pi til et USB -tastatur og mus, pluss en HDMI -skjerm, og følg instruksjonene i Raspberry Pi NOOBS -opplæringen. Sørg for å konfigurere WiFi og aktivere SSH -tilgang. Ikke glem å sette opp et passord for standard pi -kontoen.
  3. I ditt hjemmenettverk konfigureres en statisk IP for Raspberry Pi - det ville gjøre det mye lettere å SSH.
  4. Sørg for at du har en ssh -klient installert på skrivebordet/den bærbare datamaskinen. For en PC vil jeg anbefale Putty, som du kan installere herfra.
  5. Koble av USB og HDMI fra Raspberry Pi, start den på nytt og ssh inn i den - hvis alt fungerte, skulle du se noe slikt:

Linux raspberrypi 4.14.98-v7+ #1200 SMP ti feb 12 20:27:48 GMT 2019 armv7l

Programmene som følger med Debian GNU/Linux -systemet er gratis programvare; de eksakte distribusjonsvilkårene for hvert program er beskrevet i de enkelte filene i/usr/share/doc/*/copyright. Debian GNU/Linux leveres ABSOLUTT INGEN GARANTI, i den utstrekning det er tillatt av gjeldende lov. Siste pålogging: Man 13. mai 10:41:40 2019 fra 104.36.248.13 pi@raspberrypi: ~ $

Trinn 4: Konfigurer OpenCV

Oppsett OpenCV
Oppsett OpenCV

OpenCV er en fantastisk samling av bildemanipuleringsfunksjoner for datasyn. Det lar oss lese bilder fra webkameraet, manipulere dem for å finne bevegelsesområder, lagre dem og mer. Oppsett på Raspberry Pi er ikke vanskelig, men krever litt forsiktighet.

Start med å installere virtaulenvwrapper: vi vil bruke python til å gjøre all vår programmering, og virtualenv vil hjelpe oss med å holde avhengigheter atskilt for OpenCV og TensorFlow vs. Kolbe eller GPIO:

pi@raspberrypi: ~ $ sudo pip install virtualenvwrapper

Nå kan du kjøre "mkvirtualenv" for å lage et nytt miljø, "workon" for å jobbe med det og mer.

Så la oss lage et miljø for bildemanipulering, med python 3 som standardtolker (det er 2019, det er ingen grunn til å holde oss til den eldre python 2):

pi@raspberrypi: ~ $ mkvirtualenv cv -p python3

… (cv) pi@raspberrypi: ~

Vi er nå klare til å installere OpenCV. Vi vil stort sett følge den utmerkede opplæringen i Lær OpenCV. Følg spesifikt trinn 1 og 2:

sudo apt -y updatesudo apt -y upgrade ## Installer avhengigheter sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm sudo apt-get -y install git gfortran sudo apt-get -y install libjpeg8-dev libjasper- dev libpng12-dev sudo apt-get -y install libtiff5-dev sudo apt-get -y install libtiff-dev sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get- y installer libxine2-dev libv4l-dev cd/usr/include/linux sudo ln -s -f../libv4l1-videodev.h videodev.h sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0. 10-dev sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default sudo apt-get -y install libatlas-base-dev sudo apt-get -y install libmp3lame-dev libtheora-dev sudo apt-get -y installer libvorbis-dev libxvidcore-dev libx264-dev sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get -y install libavresample-dev sudo apt-get -y install x264 v4l-utils sudo apt -get -y installer libprotobuf -dev protobuf-compiler sudo apt-get -y install libgoogle-glog-dev libgflags-dev sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen sudo apt-get install libqtgui4 sudo apt-get install libqt4- test

Nå kan vi bare installere OpenCV med pythonbindinger inne i cv virtualenv (du er fortsatt i det, ikke sant?) Ved å bruke

pip installer opencv-contrib-python

Og det er det! Vi har OpenCV installert på Raspberry Pi, klare til å ta bilder og videoer, manipulere dem og være kule.

Kontroller det ved å åpne en python -tolk og importere opencv, og sjekk at det ikke er noen feil:

(cv) pi@raspberrypi: ~ $ python

Python 3.5.3 (standard, 27. september 2018, 17:25:39) [GCC 6.3.0 20170516] på linux Skriv "hjelp", "copyright", "credits" eller "lisens" for mer informasjon. >>> import cv2 >>>

Trinn 5: Konfigurer TensorFlow

Sett opp TensorFlow
Sett opp TensorFlow

TensorFlow er et rammeverk for maskinlæring / AI utviklet og vedlikeholdt av Google. Den har omfattende støtte for dyplæringsmodeller for en rekke oppgaver, inkludert gjenkjenning av objekter i bilder, og er nå ganske enkel å installere på Raspberry Pi. Ytelsen til de lette modellene på den lille Pi er rundt 1 bilde per sekund, noe som er helt tilstrekkelig for et program som vårt.

Vi vil i utgangspunktet følge den utmerkede opplæringen av Edje Electronics, med modifikasjoner muliggjort av nyere TensorFlow -distribusjoner:

pi@raspberrypi: ~ $ workon cv

(cv) pi@raspberrypi: ~ $ pip install tensorflow (cv) pi@raspberrypi: ~ $ sudo apt-get install libxml2-dev libxslt-dev (cv) pi@raspberrypi: ~ $ pip install pute lxml jupyter matplotlib cython (cv) pi@raspberrypi: ~ $ sudo apt-get install python-tk

Nå må vi kompilere Googles protobuf. Bare følg instruksjonene i trinn 4 i den samme utmerkede opplæringen

Til slutt, klon og sett opp TensorFlows modelldefinisjoner - følg trinn 5 i Edje Electronics -opplæringen

Følg gjerne eksemplet deres også i trinn 6, det er en flott introduksjon til gjenkjenning av objekter på Raspberry Pi.

Trinn 6: Bevegelsesdeteksjon ved hjelp av OpenCV

La oss starte med å teste at OpenCV kan grensesnittet med vårt webkamera: ssh inn i Raspberry Pi, gå til cv virtualenv (workon cv), åpne en python -tolk (bare skriv python), og skriv inn følgende python -kommandoer:

importer cv2

cap = cv2. VideoCapture (0) cap.set (cv2. CAP_PROP_FRAME_WIDTH, 1920) cap.set (cv2. CAP_PROP_FRAME_HEIGHT, 1080) ret, frame = cap.read () print ('Read frame size: {} x {}'.format (frame.shape [1], frame.shape [0])

Med noe hell vil du se at OpenCV var i stand til å lese en HD -ramme fra kameraet.

Du kan bruke cv2.imwrite (bane, ramme) til å skrive rammen til disk og sftp den tilbake for å se et faktisk utseende.

Strategien for å oppdage bevegelse er ganske rett frem:

  1. Arbeid med rammer med lavere oppløsning - det er ikke nødvendig å operere på full HD her
  2. Gjør bildene uskarpe for å sikre så lite støy som mulig.
  3. Hold et løpende gjennomsnitt av de siste N -bildene. For denne applikasjonen, hvor bildefrekvensen er rundt 1 FPS (bare fordi TensorFlow tar litt tid per bilde), fant jeg ut at N = 60 gir gode resultater. Og siden en forsiktig implementering ikke krever mer CPU med flere rammer som er OK (det tar mer minne - men det er ubetydelig når vi jobber med bildene med lavere oppløsning)
  4. Trekk det nåværende bildet fra det løpende gjennomsnittet (bare vær forsiktig med å skrive - du må tillate positive og negative verdier [-255.. 255], så rammen må konverteres til int)
  5. Du kan utføre subtraksjonen på en gråskala-konvertering av rammen (og gjennomsnittet), eller gjøre det separat for hver av RGB-kanalene og deretter kombinere resultatene (som er strategien jeg valgte, noe som gjør den følsom for fargeendringer)
  6. Bruk en terskel på deltaet og fjern støy ved erosjon og utvidelse
  7. Til slutt ser du etter konturer av områder med et delta - disse områdene er der bevegelse har skjedd og det nåværende bildet er forskjellig fra gjennomsnittet av tidligere bilder. Vi kan videre finne avgrensningsbokser for disse konturene om nødvendig.

Jeg har innkapslet koden for å gjøre dette i DeltaFinder python -klassen som du finner i min github her

Trinn 7: Finn objekter ved hjelp av TensorFlow

Hvis du har fulgt installasjonsprosedyren for TensorFlow, har du allerede testet at du har TensorFlow installert og fungerer.

For å oppdage mennesker i en generell utendørsscene, fungerer modeller som er forhåndstrent på COCO -datasettet ganske bra - som er akkurat modellen vi har lastet ned på slutten av TensorFlow -installasjonen. Vi trenger bare å bruke det for slutning!

Igjen, jeg har innkapslet modellbelastning og slutning i TFClassify python -klassen for å gjøre ting enklere, som du finner her.

Trinn 8: Sett opp en webserver på Raspberry Pi

Sett opp en webserver på Raspberry Pi
Sett opp en webserver på Raspberry Pi

Den enkleste måten å få tilgang til objektdetekteringsresultatene er en nettleser, så la oss sette opp en webserver på Raspberry Pi. Vi kan deretter sette det opp for å vise bilder fra en gitt katalog.

Det er flere alternativer for et webserverrammeverk. Jeg valgte Flask. Det er ekstremt konfigurerbart og enkelt å utvide med Python. Siden "skalaen" vi trenger er triviell, var det mer enn nok.

Jeg foreslår at du installerer det i en ny virtualenv, så:

pi@raspberrypi: ~ $ mkvirtualenv webserv

(webserv) pi@raspberrypi: ~ $ pip install Flask

Vær oppmerksom på at med et normalt nettverksoppsett vil det bare være tilgjengelig når nettleseren din er på samme trådløse LAN som Raspberry Pi. Du kan opprette en portkartlegging / NAT -konfigurasjon på Internett -ruteren for å tillate ekstern tilgang - men jeg anbefaler det. Koden jeg skrev prøver ikke å gi den sikkerheten du trenger når du tillater generell internettilgang til din Raspberry Pi.

Test installasjonen din ved å følge hurtigstartguiden for Flask

Trinn 9: Mobilvarsler fra Raspberry Pi ved bruk av IFTTT

Mobilvarsler fra Raspberry Pi ved bruk av IFTTT
Mobilvarsler fra Raspberry Pi ved bruk av IFTTT

Jeg har veldig lyst til å få mobilvarsler når hendelser skjer. I dette tilfellet, når en person oppdages og når vannstanden går lavt. Den enkleste måten jeg fant det på, uten å måtte skrive en tilpasset mobilapp, bruker IFTTT. IFTTT står for "If This Then That" og gjør at mange typer hendelser kan utløse mange typer handlinger. I vårt tilfelle er vi interessert i IFTTT Maker Webhook -utløseren. Dette lar oss utløse en IFTTT -handling ved å sende en HTTP POST -forespørsel til IFTTT -serveren med en spesiell nøkkel tildelt kontoen vår, sammen med data som spesifiserer hva som skjedde. Handlingen vi kan gjøre kan være så enkel som å lage et varsel på mobilenheten vår ved hjelp av IFTTT -mobilappen, eller noe mer komplekst enn det.

Slik gjør du det:

  1. Opprett en IFTTT -konto på ifttt.com
  2. Mens du er logget på, går du til siden for innstillinger for Webhook -tjenester og skriver inn nettadressen i nettleseren din (noe som https://maker.ifttt.com/use/. Denne nettsiden viser deg nøkkelen og nettadressen du skal bruke for å utløse handlinger.
  3. Lag en IFTTT -applet som vil generere et mobilvarsel når Webhook utløses med detaljer om hendelsen:

    1. Klikk på "Mine appleter" og deretter "Ny applett".
    2. Klikk på "+dette" og velg "webhooks". Klikk på "Motta en nettforespørsel" for å gå til detaljene
    3. Gi arrangementet ditt et navn, f.eks. "PoolEvent" og klikk "Create trigger"
    4. Klikk på "+det" og velg "varsler". Velg deretter "Send et rikt varsel fra IFTTT -appen"
    5. For "tittel" velg noe som "PoolPi"
    6. For "melding" skriv "Pool Pi detektert:" og klikk "legg til ingrediens".. "Verdi1".
    7. Gå tilbake til URL -en du kopierte i trinn 2. Den viser URL -en som skal brukes til å påberope den nyopprettede appleten. Kopier nettadressen og erstatt plassholderen {event} med hendelsesnavnet (i eksempelet PoolEvent)
  4. Last ned, installer og logg inn på IFTTT -appen for din mobile enhet
  5. Kjør dette python -skriptet på Raspberry Pi for å se at det fungerer (merk at det kan ta noen sekunder eller minutter å utløse på din mobile enhet):

importforespørsler

requests.post ('https://maker.ifttt.com/trigger/PoolEvent/with/key/', json = {"value1": "Hei varsler"})

Trinn 10: Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil

Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil
Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil
Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil
Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil
Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil
Legg til en reléhatt til Raspberry Pi og koble den til en magnetventil

Før du fortsetter med dette trinnet SLÅ AV Raspberry Pi: ssh til den og skriv "sudo shutdown now", og koble den deretter fra strømmen

Målet vårt er å slå på og av strømforsyningen til en magnetventil - en ventil som kan åpne eller lukke vannforsyningen basert på 24V vekselstrøm den får fra en strømforsyning. Reléer er de elektriske komponentene som kan åpne eller lukke en krets basert på et digitalt signal som Raspberry Pi kan levere. Det vi gjør her er å koble et relé til disse digitale signalpinnene på Raspberry Pi, og la den stenge kretsen mellom 24V vekselstrømforsyning og magnetventilen.

Pinnene på Raspberry Pi som kan fungere som digital inngang eller utgang kalles GPIO - Input/Output for generelt formål, og de er raden med 40 pinner på siden av Pi. Med Pi slått av og sett reléhatten godt inn i den. HATEN jeg valgte har 3 reléer i den, og vi vil bruke bare ett av dem. Tenk deg alt du kan gjøre med de to andre:)

Slå på Raspberry Pi igjen. Den røde "strøm" LED på reléet HAT skal slås på, noe som indikerer at den får strøm fra Pi gjennom GPIO. La oss teste at vi kan kontrollere det: ssh inn i Pi igjen, skriv inn python og skriv:

importer gpiozero

dev = gpiozero. DigitalOutputDevice (26, initial_value = True) dev.off ()

Du bør høre et hørbart "klikk", som indikerer at reléet er aktivert, og se en LED som tennes som viser at det første reléet er i den tilkoblede posisjonen. Du kan nå skrive

dev.on ()

Som ville slå reléet til "av" posisjon (merkelig, jeg vet …) og gå ut () fra python.

Når du bruker jumperkabler og den lengre kabelen, kobler du reléet mellom 24V strømforsyning og magnetventilen. Se diagrammet. Til slutt kobler du magnetventilen til en kran ved hjelp av adapterne og gjør deg klar til å teste alt ved å gjenta kommandoene ovenfor - de skal slå vannet av og på.

Fest en slange til magnetventilen og sett den andre enden dypt i bassenget. Du har nå et datamaskinstyrt basseng-topp-off-system, og det er på tide å koble til en sensor for å fortelle den når den skal kjøres.

Trinn 11: Koble til en vannstandssensor

Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor
Koble til en vannstandssensor

En vannstandssensor er ganske enkelt en flottør som kobler en elektrisk krets når flottøren er nede, og bryter den når den flyter opp. Hvis du setter den inn i bassenget i riktig høyde, vil flottøren være oppe når vannstanden er tilstrekkelig, men falle ned når det ikke er nok vann.

For at Raspberry Pi skal vite statusen for vannstandssensoren, trenger vi Pi for å føle en åpen eller lukket krets. Heldigvis er det veldig enkelt: De samme GPIO -kontaktene som vi bruker som digital utgang for å kontrollere reléene, kan fungere som innganger (derav I i GPIO). Spesielt hvis vi kobler den ene ledningen til sensoren til +3.3V på GPIO-kontakten og den andre sensorkabelen til en pinne som vi konfigurerer som nedtrekksinngang (det vil si at den normalt vil være på GND-spenningsnivå), måler den pinnen en digital "høy" eller "på" spenning bare når vannstandssensoren lukker kretsen - når vannivået er lavt. Jeg brukte GPIO pin 16 som inngang, som jeg markerte på bildet ovenfor.

Python -koden for å konfigurere pinnen som input og teste den nåværende tilstanden er:

importer gpiozero

level_input = gpiozero. Button (16) water_low = level_input.is_pressed

En potensiell utfordring er at når sensoren bare endrer tilstand, vil den svinge raskt mellom på og av tilstander. Løsningen på det er kjent som "debouncing" og ser etter en konsekvent tilstandsendring før du tar affære. GPIOZERO -biblioteket har kode for å gjøre det, men av en eller annen grunn fungerte den koden ikke bra for meg. Jeg skrev en enkel sløyfe for å utløse IFTTT -varsler når det oppdages en konsekvent tilstandsendring, som du finner i depotet mitt her.

Trinn 12: Skriv kode for å knytte alt sammen

Skriv kode for å knytte alt sammen
Skriv kode for å knytte alt sammen

Det er det. Oppsettet vårt er fullført. Du kan skrive din egen kode for å knytte ting sammen til et komplett system, eller bruke koden jeg gir. For å gjøre det, bare opprett katalogstrukturen og klon depotet, slik:

mkdir poolpi

cd poolpi git -klon

Rediger deretter filene som heter ifttt_url.txt i katalogene motion_alert og water_level for å ha URL -adressen til din egen IFTTT -webkrok med din hemmelige nøkkel. Du kan bruke to forskjellige webkroker til forskjellige handlinger.

Til slutt vil vi at denne koden skal kjøres automatisk. Den enkleste måten å oppnå det på er gjennom Linux crontab -tjenesten. Vi kan legge til noen crontab -linjer for to hovedoppgaver:

  1. Kjør våre tre programmer: objektdetektoren, vannstandssensoren og webserveren ved hver omstart
  2. Rydd opp utgangskatalogen, slett gamle bilder og gamle videofiler (jeg valgte å slette filer eldre enn 1 dag og bilder eldre enn 7 dager - eksperimentere gjerne)

For å gjøre den typen crontab -e som åpner tekstredigeringsprogrammet for nano. Legg til følgende linjer nederst i filen:

0 1 * * * finn/home/pi/poolpi/output -type f -navn " *.avi" -mtime +1 -delete

0 2 * * * finn/home/pi/poolpi/output -type f -navn " *.jpg" -mtime +7 -delete @reboot python3 /home/pi/poolpi/motion_alert/webserv/webserv.py @reboot python3 /home/pi/poolpi/motion_alert/motion_obj_alert.py @reboot python3 /home/pi/poolpi/water_level/test_water_level.py

Til slutt, start Raspberry Pi på nytt. Det er nå klart for å holde bassenget fullt og trygt.

Tenk på oppsettet, koden, og ikke glem å stjerne github -depotet mitt og kommentere instruksjonene hvis du synes det er nyttig. Jeg er alltid ute etter å lære mer.

Glad i å lage!

IoT -utfordring
IoT -utfordring
IoT -utfordring
IoT -utfordring

Runner Up i IoT Challenge

Anbefalt: