Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) 1/2 del: 16 korakov (s slikami)
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) 1/2 del: 16 korakov (s slikami)
Anonim
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2
Je to roka? (Kamera Raspberry Pi + nevronsko omrežje) Del 1/2

Pred nekaj dnevi sem si v telovadnici poškodoval zapestje desne roke. Nato je vsakič, ko sem uporabljal računalniško miško, povzročil veliko bolečin zaradi strmega kota zapestja.

Takrat me je zadelo "ali ne bi bilo super, če bi lahko katero koli površino pretvorili v sledilno ploščico" in ne vem zakaj, ampak iz nekega razloga sem pomislil nanjo, na film HER, vam bom pustil, da ugotovite ven. To je bila vznemirljiva misel, vendar nisem vedel, ali bi to zmogel, zato sem se odločil, da poskusim.

Ta članek zajema, kaj je iz tega nastalo.

Preden začnemo, imam izjavo o omejitvi odgovornosti-

Na koncu tega članka nisem mogel pretvoriti nobene površine v sledilno ploščico, vendar se nisem veliko naučil in v svoj arzenal dodal velika orodja. Upam, da se bo to zgodilo tudi vam '

Začnimo.

Korak: Video

Image
Image

Tukaj je majhen 5 -minutni video, ki zajema vse korake. Poglej.

2. korak: Strojna oprema

Strojna oprema
Strojna oprema

Malinovo pi skupaj z malinovo kamero sem nastavil na višino približno 45 cm. Tako dobimo območje za spremljanje približno 25x25 cm pod kamero.

Malina pi in kamera maline pi sta zlahka na voljo, samo poiščite na Googlu in morali bi poiskati lokalno trgovino.

Oglejte si to povezavo ali enega od mojih seznamov predvajanja Raspberry pi, da se vaš pi brez glave zažene.

Po tej nastavitvi potrebujemo del kode, ki odloča, ali je na območju, ki ga nadzoruje kamera, roka in če je tako, kje je.

3. korak: Del kode

Del kode
Del kode
Del kode
Del kode

Kos kode, ki nam omogoča, da se odločimo, ali obstaja roka na področju interesa, uporablja nekaj, kar se imenuje nevronsko omrežje. Spadajo v kategorijo programiranja, kjer ne določimo pravil za odločanje, vendar pokažemo nevronskemu omrežju dovolj podatkov, da pravila sama določi.

V našem primeru namesto kodiranja, kako izgleda roka, prikažemo slike nevronskega omrežja, posnete iz maline pi, ki vsebujejo roko in ne vsebujejo roke. Ta faza se imenuje usposabljanje nevronske mreže, uporabljene slike pa se imenujejo nabor podatkov za usposabljanje.

4. korak: Pridobite slike

Pridobivanje slik
Pridobivanje slik

Oddaljeno sem se prijavil v svoj malin pi in z naslednjim ukazom posnel kup slik.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o okvir%04d.jpg

Z roko sem posnel 80 slik in 80 slik, ki ne vsebujejo roke. 160 slik ni dovolj za ustrezno usposabljanje nevronske mreže, vendar bi moralo biti dovolj za dokaz koncepta.

Poleg 160 slik sem posnel še 20 slik, da preizkusim naše omrežje, ko bo usposobljeno.

Ko je bil nabor podatkov pripravljen, sem začel pisati kodo za nevronsko omrežje.

5. korak: Uporabljena orodja in jezik

Uporabljena orodja in jezik
Uporabljena orodja in jezik
Uporabljena orodja in jezik
Uporabljena orodja in jezik

Svoje nevronsko omrežje sem napisal v knjižnico za poglobljeno učenje Python, imenovano Keras, koda pa je napisana na prenosnem računalniku jupyter iz navigatorja anaconda.

6. korak: Priprava nabora podatkov za usposabljanje

Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje
Priprava nabora podatkov za usposabljanje

Najprej (slika št. 1) sem vključil vse knjižnice, potrebne za ta projekt, ki vključuje PIL, matplotlib, numpy, os in Keras. V drugi celici prenosnega računalnika python (slika št. 2) definiram poti do nabora podatkov in natisnem število vzorcev. Zdaj moramo vse slike naložiti v matriko z numpy, zato sem v tretji celici (slika št. 2) ustvaril matrično polje z množico 82 (število vzorcev roke) +75 (število vzorcev, ki niso ročni), to je 157x100x100x3. 157 je skupno število slik, ki jih imam, 100x100 je naša dimenzija slike in 3 je za rdeče, zelene in modre barvne plasti na sliki.

V četrti in peti celici naložimo slike, ki vsebujejo roko, čemur sledijo slike, ki ne vsebujejo roke v matriki numpy. V šesti celici vsako vrednost razdelimo na 255, zato omejujemo obseg vrednosti od 0 do 1. (Slika #3)

Žal mi je, če priložene slike niso dovolj dobre. Tukaj je povezava do skladišča GITHUB, kjer si lahko ogledate kodo. Ne pozabite zamenjati imen poti imenika s svojo potjo:).

Premikanje skupaj.

Nato moramo označiti vsako sliko, zato ustvarimo enodimenzionalno matrično polje z dolžino 157. Prvih 82 vnosov je nastavljenih na 1, preostalih 75 vnosov pa na 0, ki prenašajo nevronsko omrežje, tako da je prvih 82 slik iz enega razreda, preostale pa iz drugega. (Slika #4)

Zdaj pa ustvarimo nevronsko mrežo.

7. korak: Nevronsko omrežje

Zivcno omrezje
Zivcno omrezje
Zivcno omrezje
Zivcno omrezje

V deveti celici definiramo svojo nevronsko mrežo. Vsebuje tri ponovitve sloja zvijanja, ki mu sledijo sloji maxpool z 8, 12 oziroma 16 zvitkovnimi filtri. Nato imamo dve gosti nevronski mreži. Za ta korak priložite dve sliki. Prvi je posnetek kode, ki ustvarja nevronsko mrežo, drugi pa slikovni prikaz nevronskega omrežja z izhodno dimenzijo in označenimi operacijami.

8. korak: Usposabljanje nevronske mreže

Nevronska mreža za usposabljanje
Nevronska mreža za usposabljanje

V deseti celici optimizacijo nevronskega omrežja konfiguriramo na 'adam', funkcijo izgube pa na 'binary_crossentropy'. Imajo pomembno vlogo pri posodabljanju uteži omrežja. Ko tečemo enajsto celico, se nevronska mreža začne trenirati. Med usposabljanjem omrežja poglejte funkcijo izgube in se prepričajte, da se zmanjšuje.

9. korak: Testiranje nevronske mreže

Testiranje nevronske mreže
Testiranje nevronske mreže

Ko je nevronsko omrežje usposobljeno, moramo pripraviti nabor testnih podatkov. Ponovimo postopek, pripravljen za pripravo vadbenega niza v 3., 4., 5. in 6. celici na testnih podatkih za izdelavo testnega niza. Za testni niz pripravimo tudi etiketo, vendar tokrat na teh podatkih zaženemo model, da dobimo napovedi in ne za trening.

10. korak: Rezultat in naslednji del…

Rezultat in naslednji del…
Rezultat in naslednji del…

Dobil sem 88 -odstotno natančnost preskusa, vendar vzemite to s ščepcem soli, saj je nabor podatkov, ki se uporablja za usposabljanje in preizkušanje tega modela, zelo zelo zelo majhen in ne zadostuje za ustrezno usposabljanje tega modela.

Kakorkoli, upam, da vam je bil ta članek všeč. Moj namen te vaje še ni dokončan in pazite na drugi del. Naložil jo bom čim prej.

V naslednjem delu bomo trenirali drugo nevronsko mrežo, ki nam bo povedala lokacijo roke na ročno zaznani sliki.

Vsa vprašanja so dobrodošla.

Če koga zanima uporaba mojega majhnega nabora podatkov, mi to sporočite v komentarjih. Dala ga bom na voljo.

Hvala za branje. Kmalu se vidimo z drugim delom do takrat. Zakaj ne ustvarite in usposobite nevronske mreže.

Edit:- Naslednji koraki so za drugi del.

11. korak: Zaznavanje predmetov

Odkrivanje objektov
Odkrivanje objektov

V prejšnjih korakih smo ustvarili NN, ki nam pove, ali preskusna slika vsebuje roko ali ne. No kaj potem? Če NN razvrsti sliko kot roko, bi radi vedeli njeno lokacijo. To se v literaturi o računalniškem vidu imenuje detekcija predmetov. Torej vadimo NN, ki dela popolnoma enako.

12. korak: Video

Image
Image

3 -minutni video, ki pojasnjuje vse preostale korake. Poglej.

13. korak: Označevanje

Označevanje
Označevanje
Označevanje
Označevanje
Označevanje
Označevanje

Če želite, da nevronsko omrežje oddaja lokacijo roke, ga moramo usposobiti, na primer za razliko od prejšnjega nevronskega omrežja, kjer je bila vsaka slika označena bodisi z roko ali brez roke. Tokrat bodo vse slike z roko imele štiri nalepke, ki ustrezajo diagonalnim koordinatam omejevalnega polja okoli roke na tej sliki.

Priložena slika datoteke csv vsebuje oznako za vsako sliko. Upoštevajte, da so koordinate normalizirane z dimenzijo slike, tj. Če je zgornja koordinata X na 320. slikovni piki na sliki s širino 640 slikovnih pik, jo bomo označili kot 0.5.

14. korak: Označevanje grafičnega vmesnika

Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika
Označevanje grafičnega vmesnika

Morda se sprašujete, kako mi je uspelo označiti vseh 82 slik, no, napisal sem grafični vmesnik v pythonu, ki mi je pomagal pri tej nalogi. Ko je slika naložena v grafičnem vmesniku. Z levo tipko miške kliknite na zgornjo koordinato in desni klik na spodnjo koordinato verjetnega omejevalnega polja okoli roke. Te koordinate se nato zapišejo v datoteko, po kateri kliknem gumb Naprej, da naložim naslednjo sliko. Ta postopek sem ponovil za vseh 82 posnetkov vlaka in 4 preskusne slike. Ko so bile nalepke pripravljene, je bil čas za usposabljanje.

Korak 15: Potrebne knjižnice

Potrebne knjižnice
Potrebne knjižnice
Potrebne knjižnice
Potrebne knjižnice
Potrebne knjižnice
Potrebne knjižnice

Najprej moramo naložiti vse potrebne knjižnice. Kar vsebuje

  • PIL za manipulacijo slik,
  • matplotlib za risanje,
  • numpy za matrično delovanje,
  • os za funkcionalnost, ki je odvisna od operacijskega sistema, in
  • keras za nevronsko mrežo.

Korak 16: Preostale celice

Preostale celice
Preostale celice
Preostale celice
Preostale celice
Preostale celice
Preostale celice
Preostale celice
Preostale celice

V 2., 3., 4. in 5. celici naložimo slike v matriko numpy in ustvarimo štiridimenzionalno matriko iz datoteke csv, ki bo delovala kot oznake. V celici 6 ustvarimo svojo nevronsko mrežo. Njegova arhitektura je enaka nevronskemu omrežju, ki se uporablja za razvrščanje, razen dimenzije izhodne plasti, ki je 4 in ne 1. Druga razlika izhaja iz uporabljene funkcije izgube, ki je povprečna napaka na kvadrat. V celici številka 8 začnemo z usposabljanjem našega nevronskega omrežja, potem ko sem jo usposobil, sem ta model preizkusil na testnem nizu, da sem dobil napovedi za omejevalno polje na prekrivajočih se koordinatah omejevalne škatle, ki so bile videti precej natančne.

Hvala za branje.