Turinys:
- 1 žingsnis: šiame projekte naudojami dalykai
- 2 žingsnis: idėja?
- 3 žingsnis: Kaip pradėti?
- 4 veiksmas: įrašykite „Raspbian“į SD kortelę?
- 5 veiksmas: rinkti duomenų rinkinį? ️
- 6 žingsnis: NN kūrimas ir modelio mokymas ⚒️⚙️
- 7 žingsnis: modelio testavimas ✅
- 8 žingsnis: Uolienos, popieriaus ir žirklių žaidimas
- 9 žingsnis: Servo variklio integracija?
- 10 žingsnis: projekto įgyvendinimas?
- 11 veiksmas: kodas - projekto repo
Video: Roko popieriaus žirklės AI: 11 žingsnių
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:45
Ar kada jautėtės nuobodus vienas? Pažaiskime akmenį, popierių ir žirkles prieš interaktyvią sistemą, aprūpintą intelektu.
1 žingsnis: šiame projekte naudojami dalykai
Techninės įrangos komponentai
- „Raspberry Pi 3“modelis B+ × 1
- „Raspberry Pi“fotoaparato modulis V2 × 1
- SG90 mikro servo variklis × 1
Programinės įrangos programos
- Raspberry Pi Raspbian
- „OpenCV“
- „TensorFlow“
2 žingsnis: idėja?
Po to, kai dirbau su įvairiais projektais skirtingose srityse, planavau sukurti įdomų projektą ir nusprendžiau sukurti akmens-popieriaus-žirklių žaidimą:)
Šiame projekte mes sukursime interaktyvų žaidimą ir žaisime prieš kompiuterį, kurį valdo AI, kad būtų galima priimti sprendimus. AI naudoja fotoaparatą, prijungtą prie „Raspberry Pi“, kad atpažintų, kas juda ranka, ir priskiria juos prie geriausių kategorijų (etikečių) uolienų, popieriaus ar žirklių. Kai kompiuteris juda, žingsninis variklis, prijungtas prie „Raspberry Pi“, rodo kryptį, pagrįstą jo judesiu.
Taisyklės, į kurias reikia atsižvelgti žaidžiant:
- Rokas išblukina žirkles
- Popierius uždengia uolą
- Žirklės pjauna popierių
Laimėtojas bus sprendžiamas remiantis pirmiau nurodytomis trimis sąlygomis. Pažiūrėkime greitą projekto demonstraciją čia.
3 žingsnis: Kaip pradėti?
Raspberry Pi
Aš naudoju „Raspberry Pi 3“modelį B+, kuris turi puikių patobulinimų ir yra galingesnis nei ankstesnis „Raspberry Pi 3“modelis B.
„Raspberry Pi 3 B+“yra integruotas su 1,4 GHz 64 bitų keturių branduolių procesoriumi, dviejų juostų belaidžiu LAN, „Bluetooth 4.2/BLE“, greitesniu „Ethernet“ir „Power-over-Ethernet“palaikymu (su atskiru „PoE HAT“).
Specifikacijos: „Broadcom BCM2837B0“, „Cortex-A53“(ARMv8) 64 bitų SoC @ 1,4 GHz, 1 GB LPDDR2 SDRAM, 2,4 GHz ir 5 GHz IEEE 802.11.b/g/n/ac belaidis LAN, „Bluetooth 4.2“, BLE, „Gigabit Ethernet“per USB 2.0 (maksimalus pralaidumas 300 Mbps), prailginta 40 kontaktų GPIO antraštė, pilno dydžio HDMI4 USB 2.0 prievadai, CSI kameros prievadas Raspberry Pi fotoaparatui prijungti, DSI ekrano prievadas, skirtas prijungti Raspberry Pi jutiklinį ekraną 4 polių stereo išvestis ir kompozitas vaizdo prievadas, „Micro SD“prievadas operacinei sistemai įkelti ir duomenims saugoti 5V/2,5A nuolatinės srovės maitinimas, „Power-over-Ethernet“(PoE) palaikymas (reikalingas atskiras „PoE HAT“).
Servo variklis
Mes naudojame SG-90 servo variklį, didelio sukimo momento variklį, kuris gali atlaikyti iki 2,5 kg (1 cm) apkrovą.
USB kamera
USB kamera, kad žaidimas būtų interaktyvus naudojant vaizdo apdorojimą
Kai kurie „Jumper“kabeliai naudojami žingsninio variklio ir „Raspberry Pi“prijungimui.
4 veiksmas: įrašykite „Raspbian“į SD kortelę?
„Raspbian“yra pasirinktas „Linux“platinimas, veikiantis „Raspberry Pi“. Šiame vadove naudosime „Lite“versiją, tačiau taip pat galima naudoti darbalaukio versiją (su grafine aplinka).
- Atsisiųskite „Etcher“ir įdiekite.
- Prijunkite SD kortelių skaitytuvą su SD kortele viduje.
- Atidarykite „Etcher“ir iš standžiojo disko pasirinkite Raspberry Pi.img arba.zip failą, kurį norite įrašyti į SD kortelę.
- Pasirinkite SD kortelę, į kurią norite įrašyti vaizdą.
- Peržiūrėkite savo pasirinkimus ir spustelėkite „Flash“! pradėti rašyti duomenis į SD kortelę.
Prijunkite įrenginį prie tinklo
- Įgalinkite SSH prieigą pridėdami tuščią failą ssh, vėl įdėtą į SD kortelės įkrovos apimties šaknį.
- Įdėkite SD kortelę į „Raspberry Pi“. Jis bus paleistas maždaug per 20 sekundžių. Dabar turėtumėte turėti SSH prieigą prie „Raspberry Pi“. Pagal numatytuosius nustatymus jo prieglobos serverio pavadinimas bus raspberrypi.local. Kompiuteryje atidarykite terminalo langą ir įveskite:
Numatytasis slaptažodis yra avietė
Čia aš naudoju atskirą monitorių sąsajai su „Raspberry Pi“.
5 veiksmas: rinkti duomenų rinkinį? ️
Pirmasis šio projekto žingsnis yra duomenų rinkimas. Sistema turi atpažinti rankos gestą, atpažinti veiksmą ir atitinkamai priversti jį judėti.
Į „Raspberry Pi“įdiegiame kelias bibliotekas naudodami „pip install“
komandą.
sudo apt-get update && sudo apt-get upgrades sud apt įdiegti „tensorflow pip install“„Werkzeug pip“įdiegti „Keras-Applications“pip įdiegti „Keras-Preprocessing pip install“įdiegti „keras-squeezenet pip“įdiegti astor pip įdiegti „tensorboard pip“įdiegti „tensorflow“įvertinimo priemonę „pip install“imituoti pip įdiegti „grpcio pip“įdiegti „absl-pypip“įdiegti gast pip įdiegti „joblib pip install“pip install protobuf pip install PyYAML pip install six
Jei susiduriate su „OpenCVpackage“problemomis, primygtinai rekomenduoju įdiegti šiuos paketus.
sudo apt-get install libhdf5-dev
sudo apt-get install libhdf5-serial-dev sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install libqt4-test
Mes įdiegėme visas reikalingas projekto priklausomybes. Duomenų rinkinys sudaromas pagal atitinkamos etiketės vaizdų kolekcijas ir išdėstymus.
Čia mes sukuriame etiketės uolienų, popieriaus ir žirklių duomenų rinkinio vaizdus naudodami šį fragmentą.
roi = kadras [100: 500, 100: 500]
save_path = os.path.join (img_class_path, '{}.jpg'.format (count + 1)) cv2.imwrite (save_path, roi)
Vaizdas fiksuojamas kiekvienoje etiketėje (uoliena, popierius, žirklės ir nėra).
6 žingsnis: NN kūrimas ir modelio mokymas ⚒️⚙️
Šio projekto esmė yra vaizdų klasifikatorius, klasifikuojantis vieną iš trijų kategorijų. Norėdami sukurti šį klasifikatorių, naudojame iš anksto apmokytą CNN („Convolutional Network“), vadinamą „SqueezeNet“.
Čia mes naudojame „Keras“ir „TensorFlow“, kad sukurtume „SqueezeNet“modelį, kuris gali atpažinti gestą. Vaizdai, kuriuos sukūrėme ankstesniame žingsnyje, naudojami modeliui mokyti. Modelis apmokytas naudojant duomenų rinkinį, sukurtą nė vienai iš paminėtų epochų (ciklų).
Modelis sukonfigūruotas naudojant hiperparametrus, kaip parodyta žemiau.
modelis = nuoseklus ([SqueezeNet (input_shape = (227, 227, 3), include_top = False), Atmetimas (0,5), Convolution2D (NUM_CLASSES, (1, 1), padding = 'valid'), Aktyvinimas („relu“), GlobalAveragePooling2D (), Aktyvinimas („softmax“)])
Kol modelis mokosi, galite rasti kiekvienos epochos modelio praradimą ir tikslumą, o tikslumas tam tikru momentu padidėja po kelių epochų.
Apytiksliai užtruko 2 valandas, kol po 10 epochų buvo sukurtas didžiausias tikslumas. Jei susiduriate su atminties paskirstymo klaidomis, atlikite šiuos veiksmus (ačiū Adrianui)
Norėdami padidinti apsikeitimo vietą, atidarykite /etc /dphys-swapfile ir redaguokite kintamąjį CONF_SWAPSIZE:
# CONF_SWAPSIZE = 100
CONF_SWAPSIZE = 1024
Atkreipkite dėmesį, kad padidinu apsikeitimo sandorį nuo 100 MB iki 1024 MB. Iš ten iš naujo paleiskite apsikeitimo paslaugą:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
Pastaba:
Padidėjęs apsikeitimo dydis yra puikus būdas sudeginti atminties kortelę, todėl būtinai atšaukite šį pakeitimą ir iš naujo paleiskite apsikeitimo paslaugą. Daugiau apie tai, kaip sugadinti atminties korteles, galite perskaityti čia.
7 žingsnis: modelio testavimas ✅
Sukūręs modelį, jis sukuria išvesties failą „rock-paper-scissors-model.h5“. Šis failas naudojamas kaip šaltinis, siekiant patikrinti, ar sistema gali atpažinti skirtingus rankų gestus ir ar gali atskirti veiksmus.
Modelis įkeliamas į python scenarijų taip
modelis = apkrovos_modelis ("rock-paper-scissors-model.h5")
Fotoaparatas nuskaito bandomąjį vaizdą ir pakeičia reikiamą spalvų modelį, tada pakeičia vaizdo dydį iki 227 x 227 pikselių (tokio paties dydžio, naudojamo modeliams kurti). Vaizdai, kurie buvo naudojami modeliui mokyti, gali būti naudojami generuojamam modeliui išbandyti.
img = cv2.imread (failo kelias)
img = cv2.cvtColor (img, cv2. COLOR_BGR2RGB) img = cv2.resize (img, (227, 227))
Kai modelis įkeliamas ir fotoaparatas įgyja vaizdą, modelis nuspėja užfiksuotą vaizdą naudodamas įkeltą „SqueezeNet“modelį ir numato vartotojo judesius.
pred = model.predict (np.array ())
move_code = np.argmax (pred [0]) move_name = mapper (move_code) print ("Numatoma: {}". formatas (move_name))
Paleiskite scenarijų test.py, kad išbandytumėte modelį su įvairiais bandomaisiais vaizdais.
python3 test.py
Dabar modelis yra pasirengęs aptikti ir suprasti rankų gestus.
8 žingsnis: Uolienos, popieriaus ir žirklių žaidimas
Žaidimas naudoja atsitiktinių skaičių generavimo funkciją, kad nuspręstų kompiuterio žingsnį. Laimėtojas nustatomas laikantis aukščiau nurodytų taisyklių. Žaidimas sukurtas dviem režimais: normalus režimas ir intelektualusis režimas, kai išmanusis režimas kontrpuolia vartotojo judesius, ty kompiuteris laimi visus judesius prieš vartotoją.
cap = cv2. VideoCapture (0) # Norėdami užfiksuoti vaizdą iš fotoaparato
Dabar padarykime žaidimą įprastu režimu, kai sistema/ „Raspberry Pi“fotografuoja ranką ir analizuoja bei nustato rankos gestą. Tada, naudojant atsitiktinių skaičių generatorių, žaidžiamas kompiuteris. Laimėtojas išrenkamas pagal taisykles ir tada rodomas ekrane. Pradėkite žaidimą naudodami šią komandą.
python3 play.py
9 žingsnis: Servo variklio integracija?
Pagaliau pridėkite servo variklį prie šio projekto. Servo variklis yra „Raspberry Pi“GPIO kaištis 17, turintis PWM funkciją sukimosi kampui valdyti.
Šiame projekte naudojamas servo variklis yra SG-90. Jis gali pasukti pagal laikrodžio rodyklę ir prieš laikrodžio rodyklę iki 180 °
Ryšiai pateikiami taip.
Servo variklis - Raspberry Pi
Vcc - +5V
GND - GND
Signalas - GPIO17
Šiame projekte naudojamos tokios bibliotekos kaip RPi. GPIO ir laikas.
importuoti RPi. GPIO kaip GPIO
importo laikas
Tada GPIO kaištis sukonfigūruotas PWM naudojant šias eilutes
servoPIN = 17
GPIO.setmode (GPIO. BCM) GPIO.setup (servoPIN, GPIO. OUT)
„GPIO Pin 17“sukonfigūruotas naudoti kaip PWM 50 Hz dažniu. Servo variklio kampas pasiekiamas nustatant PWM darbo ciklą (Ton & Toff)
pareiga = kampas/18 + 2
GPIO. output (servoPIN, True) p. ChangeDutyCycle (duty) time.sleep (1) GPIO.output (servoPIN, False) p. ChangeDutyCycle (0)
Taip kiekvienam impulsui bus sukurtas norimas žingsnio kampas, kuris suteiktų norimą sukimosi kampą.
Dabar aš paėmiau diagramą ir supjaustiau ją į tris dalis, skirtas akmeniui, popieriui ir žirklėms. Servo variklis pritvirtintas diagramos centre. Rodyklė/atvartas prijungtas prie servo variklio veleno. Šis velenas nurodo kompiuterio judėjimą pagal scenarijuje apskaičiuotą logiką.
10 žingsnis: projekto įgyvendinimas?
O dabar - žaidimo laikas. Pažiūrėkime, kaip veikia projektas.
Jei kurdami šį projektą susidūrėte su problemomis, nedvejodami paklauskite manęs. Prašau pasiūlyti naujų projektų, kuriuos norite, kad daryčiau toliau.
Nukelkite nykštį, jei tai jums tikrai padėjo, ir sekite mano kanalą įdomiems projektams.:)
Jei norite, pasidalinkite šiuo vaizdo įrašu.
Džiaugiamės, kad užsiprenumeravote:
Ačiū, kad skaitote!
11 veiksmas: kodas - projekto repo
Kodas pridedamas prie „GitHub“saugyklos, kurią rasite kodų skiltyje.
Rahul24-06/Roko popieriaus žirklės-https://github.com/Rahul24-06/Rock-Paper-Scissors
Rekomenduojamas:
Sukurkite savo roko grupės „Ekit“adapterį (be senojo adapterio), nesugriaunamai!: 10 žingsnių
Sukurkite savo roko grupės „Ekit“adapterį (be seno adapterio), nesugriaunamai!: Išgirdęs populiarų podcast'o vedėją, kuris paminėjo savo susirūpinimą dėl to, kad mirė jo laidinis USB senasis adapteris, aš ieškojau „pasidaryk pats“sprendimo, kaip prijungti geresnį/pritaikytą „eKit“prie RB . Dėkojame ponui DONINATORUI „Youtube“, kuris sukūrė vaizdo įrašą, kuriame išsamiai aprašomas jo panašus
R/C tualetinio popieriaus ritinys: 10 žingsnių
R/C tualetinio popieriaus ritinys: 2019 m. Prieš tualetinio popieriaus paniką susidomėjau „Battlebots“ir savo roboto kūrimu. Tai yra to rezultatas! Atkreipkite dėmesį: tai nėra elektronikos pamoka/kūrimas ir aš Išsiaiškinti, kaip tai veikia, buvo iššūkis, bet ten
Akmens popieriaus žirklės: 10 žingsnių
Uolienos popieriaus žirklės: Tikslas: Baigę tai, jūs išmoksite nuo „nulio“padaryti paprastą „Rock, Paper Scissors“žaidimą naudodami „Code.org“. Reikalingos medžiagos / reikalavimai: Pagrindinis „Javascript“sintaksės supratimas, kompiuteris, „Code.org“paskyra
Į objektą orientuotas programavimas: objektų kūrimas Mokymosi/mokymo metodas/technika naudojant žirkles: 5 žingsniai
Į objektą orientuotas programavimas: objektų kūrimas Mokymasis/mokymo metodas/technika naudojant žirkles: mokymosi/mokymo metodas studentams, pradedantiems į objektinį programavimą. Tai yra būdas leisti jiems vizualizuoti ir pamatyti objektų kūrimo iš klasių procesą.Dalys: 1. Žirklės (tiks bet kokia). 2. Popieriaus ar kartono gabalas. 3. Žymeklis
„OpenChord.org V0“- sukurkite tikrą gitaros gitaros/roko grupės valdiklį: 10 žingsnių
„OpenChord.org V0“- sukurkite tikrą gitaros gitaros/roko grupės valdiklį: mes visi mėgstame „Guitar Hero“ir „Rock Band“. Mes taip pat žinome, kad niekada neišmoksime groti gitara žaisdami šiuos žaidimus. O kas, jei galėtume bent jau sukurti „Guitar Hero“valdiklį, kuris leistų mums naudoti tikrą gitarą? Štai ką mes čia, „OpenChord“