Turinys:

Roko popieriaus žirklės AI: 11 žingsnių
Roko popieriaus žirklės AI: 11 žingsnių

Video: Roko popieriaus žirklės AI: 11 žingsnių

Video: Roko popieriaus žirklės AI: 11 žingsnių
Video: Основные ошибки при возведении перегородок из газобетона #5 2024, Lapkritis
Anonim
Roko popieriaus žirklės AI
Roko popieriaus žirklės AI

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?

Image
Image

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?

Darbo pradžia?
Darbo pradžia?
Darbo pradžia?
Darbo pradžia?

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ę?

Įrašyti Raspbian į SD kortelę?
Įrašyti Raspbian į SD kortelę?
Įrašyti Raspbian į SD kortelę?
Įrašyti Raspbian į SD kortelę?
Įrašyti Raspbian į SD kortelę?
Įrašyti 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:

ssh [email protected]

Numatytasis slaptažodis yra avietė

Čia aš naudoju atskirą monitorių sąsajai su „Raspberry Pi“.

5 veiksmas: rinkti duomenų rinkinį? ️

Renkate duomenų rinkinį? ️
Renkate duomenų rinkinį? ️
Renkate duomenų rinkinį? ️
Renkate 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 ⚒️⚙️

NN projektavimas ir modelio mokymas ⚒️⚙️
NN projektavimas 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 ✅

Modelio testavimas ✅
Modelio testavimas ✅
Modelio testavimas ✅
Modelio testavimas ✅
Modelio testavimas ✅
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 „Rokas-popierius-žirklės“
Žaidimas „Rokas-popierius-žirklės“

Ž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?

Image
Image

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: