Turinys:
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Ši pamoka paremta mano universiteto projektu. Tikslas buvo sukurti sistemą, kurioje neuroninis tinklas analizuoja vaizdą ir, remdamasis atpažinimu, lieps arduino robotui judėti per Ros.
Pavyzdžiui, jei atpažįstamas posūkio į dešinę ženklas, tada robotas pasuks į dešinę, jei bus atpažintas posūkio į kairę ženklas, tada robotas pasuks į kairę, jei neatpažįstamas nė vienas, tada robotas važiuos į priekį. Duomenų rinkinys, kuris bus naudojamas, yra oficialus kelio ženklų atpažinimas iš INI (2019) (Institut Fur Neuroinformatik), šis duomenų rinkinys turi 43 klases, tačiau reikia tik dviejų; 00033 ir 00034 aplankai duomenų rinkinyje yra posūkio į kairę ir į dešinę ženklai.
1 žingsnis: Reikalavimai
Šio projekto reikalavimai yra šie:
Arduino robotas. (iš esmės arduino uno, variklio vairuotojas ir varikliai) (nereikalingas, jei nenaudojate roboto)
Aviečių pi 4.
Pi kamera.
Reikalinga programinė įranga:
Python 3.
„OpenCV 4“.
Tensorflow.
arduino IDE (nereikia, jei nenaudojate roboto)
Ros (nereikalingas, jei nenaudojate roboto)
Kad ir kokia būtų jūsų mėgstamiausia python ide („Aviečių pi“, aš naudoju „Thonny“).
Norėdami nustatyti „OpenCV“ir „Tensorflow“, vykdykite Adriano nurodymus. Nuoroda:
Rekomenduoju pažiūrėti kuo daugiau jo vadovėlių, jie tikrai įdomūs ir naudingi tiek pradedantiesiems, tiek tarpiniams.
2 žingsnis: Duomenų mokymas
Traukinio scenarijus skirtas prieigai prie duomenų rinkinio, kuriame yra apie 50 000 vaizdų iš 43 klasių. Scenarijus parašytas „python“, naudojant įvairias bibliotekas: os - tai skirta „python“scenarijui susieti su teisingu katalogu, kuriame yra duomenų rinkinys. „Matplotlib“- skirtas mokymo modelio duomenims rodyti. Tensorflow ir keras - tai bibliotekos, naudojamos dirbtinio nervinio tinklo modeliui sukurti, jos naudojamos modeliui kurti. Numpy - ši biblioteka skirta paversti vaizdus masyvu, kurį vėliau galima perkelti į modelį ir gauti prognozę.
Pridedamas scenarijus yra python kodas, skirtas modeliui sukurti iš duomenų rinkinio. Tai susideda iš konvoliucinio 2D su (5, 5) įėjimu ir suaktyvinus relu, tada sujungus, kai tai bus padaryta, įvestis pereina kitą konvoliuciją su (3, 3) įvestimi su tuo pačiu aktyvavimu ir kaupimu. Tai atsitinka paskutinį kartą prieš išlyginant, o tada tankis taikomas klasių kiekiui, šiuo atveju 43.
Kitas žingsnis buvo modelio sudarymas. Tai yra dalis, kuri nustato optimizatorių, sgd buvo tinkamiausias, nes jis buvo panašus į 1 užduotyje naudojamą optimizatorių. Sgd reiškia stochastinį gradiento nusileidimą. Taip pat kompiliatoriuje reikia nustatyti nuostolį, geriausiai pasirinkti nuostolį „sparse_categorical_crossentropy“, nes kategorijos yra sveikieji skaičiai, o modelis kiekvienai klasei pateikia prognozę kaip plūdę nuo 0 iki 1. 1 yra 100% tikslumas.
Kai kompiliatorius bus baigtas, reikia pritaikyti generatorių, kad modelis pradėtų apdoroti vaizdo įvestis. Generatorių sudaro kelios dalys: training_set - tai nuoroda į mokymui naudojamą duomenų rinkinį, steps_per_epoch - tai yra būtinų žingsnių skaičius kiekvienoje epochoje, epochos - tai yra, kiek kartų programa kartosis per visą duomenų rinkinį, validation_data - tai nuoroda į duomenų rinkinį, naudojamą patvirtinimui, validation_steps - patvirtinimui naudojamų žingsnių skaičius, patvirtinimas įvyksta kiekvienos epochos pabaigoje.
Paprastai reikia visiškai ištrinti visą duomenų rinkinį kiekvienoje epochoje. Taigi, pavyzdžiui, 1024 vaizdų duomenų rinkiniui reikės: Partijos dydis = 32, Žingsniai per epochą = 32, epochos = 1. Kiekvienas žingsnis apima visą partijos dydį, taigi, kai partijos dydis yra 32, veiksmai bus 32. ranka, geriausia, kad partijos dydis būtų didesnis nei klasių skaičius, taip yra todėl, kad jei partijos dydis yra mažesnis, į kiekvieną veiksmą negalima įtraukti kiekvienos klasės vaizdo.
Kai modelis baigs mokymą, programa, naudodama matplotlib, sudarys rezultatų grafiką, kuriame bus parodyta mokymo istorija nuo pradžios iki pabaigos. Grafikas susideda iš tikslumo, patvirtinimo tikslumo, praradimo ir patvirtinimo praradimo, jis yra padalintas į kiekvieną epochą, kad būtų parodyta, kaip vyko mokymas. Paskutinis etapas yra išsaugoti modelį kaip.h5 failą, kurį vėliau galima pasiekti numatant. Modelio išsaugojimas reiškia, kad kiekvieną kartą, kai vykdoma prognozavimo programa, mokymo programos nereikia vykdyti iš naujo. Treniruočių programa gali trukti iki 10 minučių per epochą aviečių pi.
Pridedamas mokymo scenarijus:
3 žingsnis: „Pi“fotoaparato prognozių įgyvendinimas
Kita programa yra numatymas ir leidėjo scenarijus.
Pirmasis etapas yra modelio įkėlimas naudojant model.load (). Antrasis etapas yra kartoti rėmus iš pi fotoaparato naudojant „opencv“ir tada pakeisti kadro dydį iki tokio pat dydžio kaip įvesties dydžiai, naudojami mokymo etape, 32 x 32 pikselių. Kai tai bus padaryta, naujas rėmo dydis pakeistas per modelį naudojant model.predict (), kuris išleidžia matricą, kiekvienas matricos elementas yra plūdė nuo 0 iki 1, elemento indeksas yra toks pat, kaip ir klasė, kurią ji atstovauja pirmasis elementas yra pirmoji klasė, o skaičius yra tos klasės vaizdinio tikrumo prognozė. Pvz.
PASTABA: jei nenaudojate roboto pusės. Tiesiog pašalinkite eilutes:
"importuoti rospy"
def talker (kryptis):
pranešimas = eilutė ()
pub = rospy. Publisher ('robotas', eilutė, eilės dydis = 10)
rospy.init_node ('kalbėtojas', anonimas = tiesa)
pranešimas = kryptis
rospy.loginfo (žinutė)
pub.publish (žinutė)"
„pašnekovas (kryptis)“
Pridedamas „Pi“kameros scenarijus.
4 žingsnis: „Arduino“robotas
Paskutinis žingsnis yra roboto programos scenarijus.
Tai parašyta C ++ ir yra.ino failas, skirtas „arduino uno“. Programai reikalinga „ros“biblioteka, kurią galima rasti bibliotekų tvarkytuvėje ide. Kai tai bus importuota, yra pavyzdinių failų, aš nusprendžiau išplėsti „LED“mirksėjimo failą, nes tai būtų panašus į tai, ko man reikėjo. Programa tęsia ciklą, kol atjungiamas maitinimas, pirmiausia ji klauso temos roboto, kai sugauna komandą iš tos temos, ji turės if, kad pamatytų, ką komanda sako. Jei komanda paliekama, scenarijus vykdo posūkio į kairę metodą, jei komanda yra teisinga, tada jis paleidžia metodą „pasukti į dešinę“, o priešingu atveju - paleisti metodą „Pirmyn“. Šie trys metodai yra labai panašūs vienas į kitą, jie nurodo, kad skaitmeniniai kaiščiai yra žemi (įžeminti) arba 100 (PWM). Taip yra todėl, kad robotas nebūtų per greitas, nurodydamas variklio vairuotojui leisti išeina įtampa. Šių išėjimų tvarka verčia robotą pasukti į kairę ir į dešinę arba eiti į priekį, taip yra dėl variklių einančios įtampos orientacijos.
Pridedamas „arduino“.ino scenarijus.
5 žingsnis: bandymas
Nuotraukos pridedamos, todėl projektas nuo pradžios iki pabaigos. Pirmajame paveikslėlyje parodyta, kaip vyksta mokymas. Kai tai bus baigta, bus parodytas pagaminto modelio atspaudas. Trečiame paveikslėlyje parodyta prognozė iš mokymo scenarijaus. tai paskutinis mokymo scenarijaus etapas. Jei pažvelgsite į aplanką, kuriame yra mokymo scenarijus, sudarytas grafikas ir modelis. Grafikas čia turėtų atrodyti kaip 4 paveikslėlis, tai rodo treniruočių istoriją nuo pradžios iki pabaigos.
Galutinis vaizdas rodomas vykdant „pi“kameros scenarijų, tai tiesioginis srautas iš „pi“kameros. kiekviename kadre atliekama prognozė, o terminale atspausdinama. Rėmelis rodo, ką mato fotoaparatas.
Pridedama mano universiteto ataskaita apie šį projektą. Prašome perskaityti daugiau apie projektą.
6 veiksmas: visi papildomi failai
Kai kurie iš jų buvo bandomi failai, kuriuos sukūriau pakeliui.