Talaan ng mga Nilalaman:

Rock Paper Scissor AI: 11 Mga Hakbang
Rock Paper Scissor AI: 11 Mga Hakbang

Video: Rock Paper Scissor AI: 11 Mga Hakbang

Video: Rock Paper Scissor AI: 11 Mga Hakbang
Video: Tonight Showbotics: Jimmy Meets Sophia the Human-Like Robot 2024, Nobyembre
Anonim
Rock Paper Scissor AI
Rock Paper Scissor AI

Naranasan mo na bang mainis na mag-isa? Maglaro tayo ng bato, papel, at gunting laban sa isang interactive na system na pinalakas ng intelihensiya.

Hakbang 1: Mga Bagay na Ginamit sa Project na Ito

Mga bahagi ng hardware

  • Raspberry Pi 3 Model B + × 1
  • Raspberry Pi Camera Module V2 × 1
  • SG90 Micro-servo motor × 1

Mga app ng software

  • Raspberry Pi Raspbian
  • OpenCV
  • TensorFlow

Hakbang 2: Ideya?

Image
Image

Matapos magtrabaho sa iba't ibang mga proyekto sa iba't ibang mga domain, binalak kong gumawa ng isang kasiya-siyang proyekto, at nagpasya akong gumawa ng isang rock-paper-gunting na laro:)

Sa proyektong ito, gumawa kami ng isang interactive na laro at maglaro laban sa computer na pinalakas ng AI upang magpasya. Ginagamit ng AI ang Camera na konektado sa Raspberry Pi upang makilala kung ano ang gumagalaw ng gumagamit gamit ang kamay, inuri ito sa pinakamahusay na kategorya (label) na bato, papel, o gunting. Kapag ang computer ay gumagalaw, ang stepper motor ay konektado sa mga puntos ng Raspberry Pi patungo sa direksyon batay sa paglipat nito.

Mga panuntunan na dapat isaalang-alang para sa larong ito:

  • Pinupula ng bato ang gunting
  • Sinasaklaw ng papel ang bato
  • Gumupit ng papel ang gunting

Mapagpasyahan ang nagwagi batay sa tatlong mga kundisyon sa itaas. Tingnan natin ang isang mabilis na demo ng proyekto dito.

Hakbang 3: Pagsisimula?

Nagsisimula ?
Nagsisimula ?
Nagsisimula ?
Nagsisimula ?

Raspberry Pi

Gumamit ako ng isang Raspberry Pi 3 Model B + na may mahusay na mga pagpapahusay at Mas Malakas kaysa sa naunang Raspberry Pi 3 Model B.

Ang Raspberry Pi 3 B + ay isinama sa 1.4GHz 64-bit quad-core processor, dual-band wireless LAN, Bluetooth 4.2 / BLE, mas mabilis na Ethernet, at suporta ng Power-over-Ethernet (na may hiwalay na PoE HAT).

Mga pagtutukoy: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz, 1GB LPDDR2 SDRAM, 2.4GHz at 5GHz IEEE 802.11.b / g / n / ac wireless LAN, Bluetooth 4.2, BLE, Gigabit Ethernet sa USB 2.0 (maximum throughput ng 300 Mbps), Ang pinalawig na 40-pin GPIO header, Full-size HDMI4 USB 2.0 port, CSI camera port para sa pagkonekta ng isang Raspberry Pi camera, DSI display port para sa pagkonekta ng isang Raspberry Pi touchscreen display4-post stereo output at pinaghalo video port, Micro SD port para sa paglo-load ng iyong operating system at pag-iimbak ng data5V / 2.5A DC power input, suporta ng Power-over-Ethernet (PoE) (nangangailangan ng hiwalay na PoE HAT).

Servo Motor

Gumagamit kami ng isang SG-90 servo motor, isang mataas na torque motor na maaaring hawakan ang pagkarga ng hanggang sa 2.5kg (1cm).

USB Camera

Isang USB camera upang gawing interactive ang laro sa pagproseso ng imahe

Ang ilang mga Jumper cables ay ginagamit upang i-wire ang stepper motor at Raspberry Pi.

Hakbang 4: Sunugin ang Raspbian sa SD Card?

Sunugin ang Raspbian sa SD Card?
Sunugin ang Raspbian sa SD Card?
Sunugin ang Raspbian sa SD Card?
Sunugin ang Raspbian sa SD Card?
Sunugin ang Raspbian sa SD Card?
Sunugin ang Raspbian sa SD Card?

Ang Raspbian ay ang pamamahagi ng pagpipilian ng Linux na tumatakbo sa Raspberry Pi. Sa gabay na ito, gagamitin namin ang bersyon ng Lite, ngunit ang bersyon ng Desktop (na kasama ng isang grapikong kapaligiran) ay maaari ding magamit.

  • I-download ang Etcher at i-install ito.
  • Ikonekta ang isang SD card reader sa loob ng SD card.
  • Buksan ang Etcher at pumili mula sa iyong hard drive ng Raspberry Pi.img o.zip file na nais mong isulat sa SD card.
  • Piliin ang SD card kung saan mo nais isulat ang iyong imahe.
  • Suriin ang iyong mga napili at i-click ang 'Flash!' upang simulang magsulat ng data sa SD card.

Ikonekta ang aparato sa iyong network

  • Paganahin ang pag-access ng SSH sa pamamagitan ng pagdaragdag ng walang laman na file ssh, muling inilagay sa ugat ng dami ng boot sa iyong SD card.
  • Ipasok ang SD card sa Raspberry Pi. Mag-boot ito sa halos 20 segundo. Dapat ay mayroon ka nang access sa SSH sa iyong Raspberry Pi. Bilang default, ang hostname nito ay magiging raspberrypi.local. Sa iyong computer, buksan ang isang window ng terminal at i-type ang sumusunod:

ssh [email protected]

Ang default na password ay raspberry

Dito ko ginamit ang isang hiwalay na monitor upang mag-interface sa Raspberry Pi.

Hakbang 5: Pagkolekta ng Dataset? ️

Pagkolekta ng Dataset? ️
Pagkolekta ng Dataset? ️
Pagkolekta ng Dataset? ️
Pagkolekta ng Dataset? ️

Ang unang hakbang sa proyektong ito ay ang pagkolekta ng data. Kinikilala ng System ang kilos ng kamay at kilalanin ang pagkilos at gawin itong ilipat nang naaayon.

Nag-i-install kami ng maraming mga aklatan sa Raspberry Pi gamit ang pag-install ng pip

utos

sudo apt-get update && sudo apt-get upgradesudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev pip install opencv pip install numpy pip install scikit-learn pip install scikit-image pip install h5py pip install Keras pip i-install ang tensorflow pip install Werkzeug pip install Keras-Applications pip install Keras-Preprocessing pip install keras-squzenet pip install astor pip install tensorboard pip install tensorflow-estimator pip install mock pip install grpcio pip install absl-pypip install gast pip install joblib pip install Markdown pip install protobuf pip install PyYAML pip install anim

Kung nahaharap ka sa anumang mga isyu sa OpenCVpackage, masidhing inirerekumenda kong i-install ang mga package na ito.

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

Na-install namin ang lahat ng kinakailangang mga dependency para sa proyektong ito. Ang hanay ng Data ay ginawa ng mga koleksyon at pag-aayos ng mga imahe sa ilalim ng naaangkop na label.

Dito nilikha namin ang mga itinakdang data ng mga imahe para sa label na rock, papel at gunting gamit ang sumusunod na snippet.

roi = frame [100: 500, 100: 500]

save_path = os.path.join (img_class_path, '{}.jpg'.format (count + 1)) cv2.imwrite (save_path, roi)

Ang imahe ay nakunan para sa bawat label (bato, papel, gunting at Wala).

Hakbang 6: Pagdidisenyo ng isang NN at Pagsasanay sa Modelo ⚒️⚙️

Pagdidisenyo ng isang NN at Pagsasanay sa Modelo ⚒️⚙️
Pagdidisenyo ng isang NN at Pagsasanay sa Modelo ⚒️⚙️

Ang Core ng proyektong ito ay isang klasipikasyon ng imahe na inuri ang isa sa tatlong mga kategorya. Upang magawa ang Classifier na ito, ginagamit namin ang paunang sanay na CNN (Convolutional Network) na tinatawag na SqueezeNet.

Dito ginagamit namin ang Keras at TensorFlow upang makabuo ng modelo ng SqueezeNet na maaaring makilala ang kilos. Ang mga larawang nilikha namin sa nakaraang hakbang ay ginagamit upang sanayin ang modelo. Ang modelo ay sinanay gamit ang nabuo na Dataset para sa wala sa mga Panahon (Mga Pag-ikot) na nabanggit.

Ang modelo ay naka-configure sa mga hyperparameter tulad ng ipinakita sa ibaba.

modelo = Sequential ([SqueezeNet (input_shape = (227, 227, 3), isama_top = Mali), Pag-dropout (0.5), Convolution2D (NUM_CLASSES, (1, 1), padding = 'valid'), Pag-activate ('relu'), GlobalAveragePooling2D (), Pag-activate ('softmax')])

Habang ang modelo ay pagsasanay, maaari mong makita ang pagkawala at kawastuhan ng modelo para sa bawat Epoch at ang kawastuhan ay nagdaragdag sa ilang mga oras sa oras pagkatapos ng ilang Epoch.

Halos tumagal ito ng 2 oras upang makabuo ng modelo na may pinakamataas na kawastuhan pagkatapos ng 10 kapanahunan. Kung nahaharap ka sa anumang mga error sa paglalaan ng memorya, gawin ang mga sumusunod na hakbang (Salamat kay Adrian)

Upang madagdagan ang iyong puwang ng swap, buksan ang / etc / dphys-swapfile at pagkatapos ay i-edit ang variable na CONF_SWAPSIZE:

# CONF_SWAPSIZE = 100

CONF_SWAPSIZE = 1024

Pansinin na pinapataas ko ang swap mula sa 100MB hanggang 1024MB. Mula doon, i-restart ang swap service:

Huminto sa $ sudo /etc/init.d/dphys-swapfile

Magsimula ang $ sudo /etc/init.d/dphys-swapfile

Tandaan:

Ang pagdaragdag ng laki ng pagpapalit ay isang mahusay na paraan upang masunog ang iyong memory card, kaya tiyaking ibalik ang pagbabagong ito at muling simulan ang serbisyo ng swap kapag tapos ka na. Maaari kang magbasa nang higit pa tungkol sa malalaking sukat na sumisira sa mga memory card dito.

Hakbang 7: Pagsubok sa Modelo ✅

Pagsubok sa Modelo ✅
Pagsubok sa Modelo ✅
Pagsubok sa Modelo ✅
Pagsubok sa Modelo ✅
Pagsubok sa Modelo ✅
Pagsubok sa Modelo ✅

Kapag nabuo ang modelo, gumagawa ito ng output file na "rock-paper-gunting-model.h5". Ginamit ang file na ito bilang mapagkukunan upang masubukan kung makikilala ng system ang iba't ibang mga kilos ng kamay at makakaiba ang mga pagkilos.

Ang modelo ay na-load sa python script tulad ng sumusunod

modelo = load_model ("rock-paper-gunting-model.h5")

Binabasa ng camera ang imahe ng pagsubok at binago ang kinakailangang modelo ng kulay, at pagkatapos ay baguhin ang laki ng imahe sa 227 x 227 pixel (Parehong laki na ginamit para sa pagbuo ng modelo). Ang mga imaheng ginamit para sa pagsasanay ng modelo ay maaaring magamit upang subukan ang nabuong modelo.

img = cv2.imread (filepath)

img = cv2.cvtColor (img, cv2. COLOR_BGR2RGB) img = cv2.resize (img, (227, 227))

Kapag na-load ang modelo at ang imahe ay nakuha ng camera, hinuhulaan ng modelo ang nakunan ng imahe gamit ang modelong SqueezeNet na na-load, at hinuhulaan ang paggalaw ng gumagamit.

pred = model.predict (np.array ())

move_code = np.argmax (pred [0]) move_name = mapper (move_code) print ("Hula: {}". format (ilipat_name))

Patakbuhin ang test.py script upang subukan ang modelo na may iba't ibang mga imahe ng pagsubok.

pagsubok sa python3.py

Ngayon ang modelo ay handa na upang makita at maunawaan ang mga kilos ng kamay.

Hakbang 8: Laro sa Rock-Paper-Gunting

Laro sa Rock-Paper-Gunting
Laro sa Rock-Paper-Gunting

Ang Laro ay gumagamit ng isang random na pagbuo ng bilang ng henerasyon upang magpasya ang paglipat ng computer. Sinusunod nito ang mga nasabing tuntunin upang matukoy ang nagwagi. Ang laro ay dinisenyo gamit ang dalawang mga mode: Normal Mode at Intelligent mode, kung saan ang matalinong mode ay nag-counterattack ng paggalaw ng gumagamit, ibig sabihin, ang Computer ay nanalo sa lahat ng mga paggalaw laban sa gumagamit.

cap = cv2. VideoCapture (0) # Upang makuha ang imahe mula sa Camera

Ngayon gawin natin ang laro sa Normal mode kung saan kinukunan ng system / Raspberry Pi ang larawan ng kamay at pinag-aaralan at kinikilala ang kilos ng kamay. Pagkatapos ay gumagamit ng isang random na generator ng numero, nilalaro ang paglipat ng computer. Ang nagwagi ay pinili batay sa mga patakaran at pagkatapos ay ipapakita sa screen. Simulan ang laro gamit ang sumusunod na utos.

play ng python3.py

Hakbang 9: Pagsasama ng Servo Motor?

Sa wakas, idagdag ang servo motor sa proyektong ito. Ang Servo motor ay ang GPIO pin 17 ng Raspberry Pi, na mayroong pagpapaandar ng PWM upang makontrol ang anggulo ng pag-ikot.

Ang Servo Motor na ginamit sa proyektong ito ay SG-90. Maaari itong gumawa ng pag-ikot ng pakaliwa at laban sa pakaliwa hanggang sa 180 °

Ang mga Koneksyon ay ibinibigay tulad ng sumusunod.

Servo Motor - Raspberry Pi

Vcc - + 5V

GND - GND

Signal - GPIO17

Ang mga aklatan tulad ng RPi. GPIO at oras ay ginagamit sa proyektong ito.

i-import ang RPi. GPIO bilang GPIO

oras ng pag-import

Pagkatapos ay naka-configure ang pin ng GPIO sa PWM gamit ang mga sumusunod na linya

servoPIN = 17

GPIO.setmode (GPIO. BCM) GPIO.setup (servoPIN, GPIO. OUT)

Ang GPIO Pin 17 ay na-configure upang magamit bilang isang PWM sa dalas ng 50Hz. Ang Angle ng servo motor ay nakakamit sa pamamagitan ng pagtatakda ng duty cycle (Ton & Toff) ng PWM

tungkulin = anggulo / 18 + 2

GPIO.output (servoPIN, True) p. ChangeDutyCycle (duty) oras. Tulog (1) GPIO.output (servoPIN, Mali) p. ChangeDutyCycle (0)

Lilikha ito ng nais na anggulo ng hakbang para sa bawat pulso, na magbibigay ng nais na anggulo ng pag-ikot.

Ngayon ay kinuha ko ang tsart at hiniwa ito sa tatlong mga seksyon, para sa bato, papel, at gunting. Ang motor na Servo ay naayos sa gitna ng tsart. Ang pointer / flap ay konektado sa baras ng servo motor. Itinuturo ng baras na ito ang paglipat ng computer ayon sa lohikal na nakalkula sa script.

Hakbang 10: Paggawa ng Proyekto?

Image
Image

At ngayon, oras na ng pag-play. Tingnan natin ang pagtatrabaho ng proyekto.

Kung nahaharap ka sa anumang mga isyu sa pagbuo ng proyektong ito, huwag mag-atubiling magtanong sa akin. Mangyaring magmungkahi ng mga bagong proyekto na nais mong susunod ko.

Magbigay ng isang thumbs up kung nakatulong talaga ito sa iyo at sundin ang aking channel para sa mga kagiliw-giliw na proyekto.:)

Ibahagi ang video na ito kung nais mo.

Maligaya na nag-subscribe ka:

Salamat sa pagbabasa!

Hakbang 11: Code - Project Repo

Ang code ay idinagdag sa GitHub Repository na maaaring matagpuan sa seksyon ng code.

Rahul24-06 / Rock-Paper-Gunting -

Inirerekumendang: