Բովանդակություն:

Rock Paper Scissor AI: 11 Քայլ
Rock Paper Scissor AI: 11 Քայլ

Video: Rock Paper Scissor AI: 11 Քայլ

Video: Rock Paper Scissor AI: 11 Քայլ
Video: Animators React 11: Mulan, Aladdin, Anime Rock Paper Scissors 2024, Նոյեմբեր
Anonim
Rock Paper Մկրատ AI
Rock Paper Մկրատ AI

Երբևէ մենակ ձանձրացե՞լ եք: Եկեք ռոք, թուղթ և մկրատ խաղանք ինտելեկտուալ համակարգի դեմ, որը սնվում է խելքով:

Քայլ 1: Այս նախագծում օգտագործվող բաները

Սարքավորման բաղադրիչներ

  • Ազնվամորի Pi 3 մոդել B+ × 1
  • Raspberry Pi Camera Module V2 × 1
  • SG90 Միկրո servo շարժիչ × 1

Softwareրագրային ծրագրեր

  • Raspberry Pi Raspbian
  • OpenCV
  • TensorFlow

Քայլ 2: Գաղափար:

Image
Image

Տարբեր տիրույթների վրա տարբեր նախագծերի վրա աշխատելուց հետո ես պլանավորեցի պատրաստել զվարճալի նախագիծ, և որոշեցի պատրաստել ժայռ-թուղթ-մկրատ խաղ:)

Այս նախագծում մենք կկատարենք ինտերակտիվ խաղ և կխաղանք համակարգչի դեմ, որը որոշումներ կայացնելու համար սնուցվում է AI- ով: AI- ն օգտագործում է Raspberry Pi- ի հետ կապված տեսախցիկը `ճանաչելու, թե ինչ շարժումներ է կատարում օգտվողը ձեռքով, դասակարգելու դրանք լավագույն կատեգորիայի (պիտակ) ժայռի, թղթի կամ մկրատի մեջ: Երբ համակարգիչն իր շարժումն է կատարում, Raspberry Pi- ին միացած սլաքային շարժիչը ցույց է տալիս դեպի իր շարժման հիման վրա ուղղված ուղղությունը:

Կանոններ, որոնք պետք է հաշվի առնել այս խաղի համար.

  • Ռոքը բթացնում է մկրատը
  • Թուղթը ծածկում է ժայռը
  • Մկրատը կտրեց թուղթ

Հաղթողը կորոշվի վերը նշված երեք պայմանների հիման վրա: Եկեք տեսնենք նախագծի արագ ցուցադրումը այստեղ:

Քայլ 3: Սկսե՞լ:

Սկսել ?
Սկսել ?
Սկսել ?
Սկսել ?

Ազնվամորի Պի

Ես օգտագործել եմ Raspberry Pi 3 Model B+ - ը, որն ունի մեծ բարելավումներ և ավելի հզոր է, քան ավելի վաղ Raspberry Pi 3 Model B- ն:

Raspberry Pi 3 B+-ը ինտեգրված է 1.4 ԳՀց 64-բիթանոց չորս միջուկային պրոցեսորին, երկկողմանի անլար LAN- ին, Bluetooth 4.2/BLE- ին, ավելի արագ Ethernet- ին և Power-over-Ethernet աջակցությանը (առանձին PoE HAT- ով):

Տեխնիկական պայմաններ. Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-բիթանոց SoC @ 1.4GHz, 1GB LPDDR2 SDRAM, 2.4GHz և 5GHz IEEE 802.11.b/g/n/ac անլար LAN, Bluetooth 4.2, BLE, Gigabit Ethernet USB 2.0-ի միջոցով (առավելագույն թողունակությունը ՝ 300 Մբիթ / վրկ), Ընդլայնված 40-պինանոց GPIO վերնագիր, Լայն չափի HDMI4 USB 2.0 պորտեր, CSI տեսախցիկի պորտ ՝ Raspberry Pi տեսախցիկին միացնելու համար, DSI ցուցադրման նավահանգիստ ՝ Raspberry Pi սենսորային էկրանին միացնելու համար 4 բևեռ ստերեո ելք և կոմպոզիտային վիդեո պորտ, Micro SD պորտ ՝ ձեր օպերացիոն համակարգը բեռնելու և տվյալների պահպանման համար 5V/2.5A DC հոսանքի մուտք, Power-over-Ethernet (PoE) աջակցություն (պահանջում է առանձին PoE HAT):

Servo Motor

Մենք օգտագործում ենք SG-90 servo շարժիչ, բարձր ոլորող շարժիչով շարժիչ, որը կարող է դիմակայել բեռը մինչև 2,5 կգ (1 սմ):

USB տեսախցիկ

USB տեսախցիկ ՝ խաղը պատկերների մշակման հետ ինտերակտիվ դարձնելու համար

Որոշ Jumper մալուխներ օգտագործվում են stepper շարժիչը և Raspberry Pi- ն լարելու համար:

Քայլ 4. Այրել Raspbian- ը SD քարտի վրա:

Այրել Ռասպբիանը SD քարտի՞ն
Այրել Ռասպբիանը SD քարտի՞ն
Այրել Ռասպբիանը SD քարտի՞ն
Այրել Ռասպբիանը SD քարտի՞ն
Այրել Ռասպբիանը SD քարտի՞ն
Այրել Ռասպբիանը SD քարտի՞ն

Raspbian- ը Raspberry Pi- ով աշխատող ընտրովի Linux բաշխումն է: Այս ուղեցույցում մենք կօգտագործենք Lite տարբերակը, բայց Desktop տարբերակը (որը գալիս է գրաֆիկական միջավայրով) նույնպես կարող է օգտագործվել:

  • Ներբեռնեք Etcher- ը և տեղադրեք այն:
  • Միացրեք SD քարտի ընթերցողին SD քարտի ներսում:
  • Բացեք Etcher- ը և ձեր կոշտ սկավառակից ընտրեք Raspberry Pi.img կամ.zip ֆայլը, որը ցանկանում եք գրել SD քարտին:
  • Ընտրեք SD քարտը, որին ցանկանում եք գրել ձեր պատկերը:
  • Վերանայեք ձեր ընտրած տարբերակները և կտտացրեք «Flash»: սկսել SD քարտին տվյալների գրել:

Միացրեք սարքը ձեր ցանցին

  • Միացրեք SSH մուտքը ՝ ավելացնելով դատարկ ֆայլի ssh, որը կրկին տեղադրված է ձեր SD քարտի բեռնախցիկի ծավալի արմատում:
  • Տեղադրեք SD քարտը Raspberry Pi- ի մեջ: Այն կբեռնվի մոտ 20 վայրկյանում: Այժմ դուք պետք է SSH մուտք ունենաք ձեր Raspberry Pi- ին: Լռելյայն, դրա հյուրընկալողի անունը կլինի raspberrypi.local: Ձեր համակարգչում բացեք տերմինալի պատուհան և մուտքագրեք հետևյալը.

ssh [email protected]

Լռելյայն գաղտնաբառը ազնվամորին է

Այստեղ ես օգտագործել եմ առանձին մոնիտոր ՝ Raspberry Pi- ի հետ ինտերֆեյսի համար:

Քայլ 5. Տվյալների հավաքագրո՞ւմ: ️

Հավաքագրու՞մ եք տվյալների հավաքածուն: ️
Հավաքագրու՞մ եք տվյալների հավաքածուն: ️
Հավաքո՞ւմ եք տվյալների հավաքածուն: ️
Հավաքո՞ւմ եք տվյալների հավաքածուն: ️

Այս նախագծի առաջին քայլը տվյալների հավաքագրումն է: Համակարգը պետք է նույնացնի ձեռքի ժեստը և ճանաչի գործողությունը և համապատասխանաբար ստիպի շարժվել:

Մենք մի քանի գրադարան ենք տեղադրում Raspberry Pi- ի վրա ՝ օգտագործելով pip install

հրաման.

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 տեղադրել tensorflow pip install Werkzeug pip install Keras-Applications pip install Keras-Preprocessing pip install keras-squeezenet pip install astor pip install tensorboard pip install tensorflow-estator 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 six

Եթե խնդիրներ ունեք OpenCVpackage- ի հետ, ես խստորեն խորհուրդ եմ տալիս տեղադրել այս փաթեթները:

sudo apt-get տեղադրել 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

Մենք տեղադրել ենք այս նախագծի համար անհրաժեշտ բոլոր կախվածությունները: Տվյալների հավաքածուն կազմված է համապատասխան պիտակի տակ պատկերների հավաքածուներից և դասավորությունից:

Այստեղ մենք ստեղծում ենք պիտակի ժայռի, թղթի և մկրատի տվյալների հավաքածուի պատկերներ ՝ օգտագործելով հետևյալ հատվածը:

roi = շրջանակ [100: 500, 100: 500]

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

Պատկերը վերցված է յուրաքանչյուր պիտակի համար (ժայռ, թուղթ, մկրատ և ոչ մեկը):

Քայլ 6. NN- ի ձևավորում և մոդելի ուսուցում ⚒️⚙️

NN- ի նախագծում և մոդելի ուսուցում ⚒️⚙️
NN- ի նախագծում և մոդելի ուսուցում ⚒️⚙️

Այս նախագծի առանցքը պատկերի դասակարգիչ է, որը դասակարգում է երեք կատեգորիաներից մեկը: Այս դասակարգիչը պատրաստելու համար մենք օգտագործում ենք նախապես պատրաստված CNN- ը (Կոնվոլյուցիոն ցանց), որը կոչվում է SqueezeNet:

Այստեղ մենք օգտագործում ենք Keras և TensorFlow ՝ SqueezeNet մոդելը գեներացնելու համար, որը կարող է նույնականացնել ժեստը: Մոդելը վարժեցնելու համար օգտագործվում են այն պատկերները, որոնք մենք ստեղծել ենք նախորդ քայլում: Մոդելը վերապատրաստվում է ՝ օգտագործելով նշված դարաշրջանների (ցիկլերի) համար ստեղծված Տվյալների հավաքածուն:

Մոդելը կազմաձևված է հիպեր պարամետրերով, ինչպես ցույց է տրված ստորև:

մոդել = հաջորդական ([SqueezeNet (input_shape = (227, 227, 3), include_top = False), Բաց թողնում (0.5), Convolution2D (NUM_CLASSES, (1, 1), padding = 'valid'), Ակտիվացում ('relu'), GlobalAveragePooling2D (), Ակտիվացում («softmax»)])

Մինչ մոդելը մարզվում է, դուք կարող եք գտնել մոդելի կորուստն ու ճշգրտությունը յուրաքանչյուր դարաշրջանի համար, և ճշգրտությունը մեծանում է ինչ -որ ժամանակաշրջանից հետո ինչ -որ պահի:

Մոտավորապես 2 ժամ տևեց մոդելը 10 դարաշրջանից հետո ամենաբարձր ճշգրտությամբ: Եթե հիշողության բաշխման որևէ սխալ եք բախվում, կատարեք հետևյալ քայլերը (Ադրիանի շնորհիվ)

Փոխանակման տարածքը մեծացնելու համար բացեք /etc /dphys-swapfile ֆայլը, այնուհետև խմբագրեք CONF_SWAPSIZE փոփոխականը ՝

# CONF_SWAPSIZE = 100

CONF_SWAPSIZE = 1024

Ուշադրություն դարձրեք, որ ես փոխանակումը մեծացնում եմ 100 ՄԲ -ից մինչև 1024 ՄԲ: Այնտեղից վերագործարկեք փոխանակման ծառայությունը.

$ sudo /etc/init.d/dphys-swapfile կանգառ

$ sudo /etc/init.d/dphys-swapfile սկիզբը

Նշում:

Փոխանակման չափը մեծացնելը հիշողության քարտը այրելու հիանալի միջոց է, այնպես որ, ավարտելուց հետո, համոզվեք, որ հետ կվերցնեք այս փոփոխությունը և կվերագործարկեք փոխանակման ծառայությունը: Մեծ չափերի վնասող հիշողության քարտերի մասին ավելին կարող եք կարդալ այստեղ:

Քայլ 7: Մոդելի փորձարկում

Մոդելի փորձարկում
Մոդելի փորձարկում
Մոդելի փորձարկում
Մոդելի փորձարկում
Մոդելի փորձարկում
Մոդելի փորձարկում

Մոդելը գեներացվելուց հետո այն թողարկում է «rock-paper-scissors-model.h5» ելքային ֆայլը: Այս ֆայլը օգտագործվում է որպես աղբյուր ՝ ստուգելու համար, թե արդյոք համակարգը կարող է նույնականացնել ձեռքի տարբեր ժեստեր և կարող է տարբերակել գործողությունները:

Մոդելը բեռնված է պիթոնի սցենարում հետևյալ կերպ

model = load_model ("rock-paper-scissors-model.h5")

Տեսախցիկը կարդում է փորձարկվող պատկերը և փոխակերպում է պահանջվող գույնի մոդելը, այնուհետև պատկերը չափում է 227 x 227 պիքսել (նույն չափը օգտագործվում է մոդելի ստեղծման համար): Պատկերները, որոնք օգտագործվել են մոդելի ուսուցման համար, կարող են օգտագործվել գեներացված մոդելը փորձարկելու համար:

img = cv2.imread (ֆայլի ուղի)

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

Երբ մոդելը բեռնվում է, և պատկերը ձեռք է բերվում տեսախցիկի կողմից, մոդելը կանխատեսում է գրավված պատկերը ՝ բեռնված SqueezeNet մոդելի միջոցով և կանխատեսում է օգտվողի շարժումների համար:

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

move_code = np.argmax (pred [0]) move_name = mapper (move_code) տպագիր («Կանխատեսված է ՝ {}». ձևաչափ (move_name))

Գործարկեք test.py սցենարը ՝ մոդելը փորձարկելու համար տարբեր տեստերի պատկերներով:

python3 test.py

Այժմ մոդելը պատրաստ է հայտնաբերել և հասկանալ ձեռքի շարժումները:

Քայլ 8. Rock-Paper-Scissors Game

Ռոք-թուղթ-մկրատ խաղ
Ռոք-թուղթ-մկրատ խաղ

Խաղը օգտագործում է պատահական թվերի ստեղծման գործառույթ ՝ համակարգչի քայլը որոշելու համար: Այն հետևում է վերը նշված կանոններին `հաղթողին որոշելու համար: Խաղը նախատեսված է երկու ռեժիմով ՝ Նորմալ ռեժիմ և Խելացի ռեժիմ, որտեղ խելացի ռեժիմը հակահարված է տալիս օգտագործողի շարժմանը, այսինքն ՝ Համակարգիչը շահում է օգտագործողի դեմ ուղղված բոլոր քայլերը:

cap = cv2. VideoCapture (0) # Տեսախցիկից լուսանկարելու համար

Այժմ եկեք խաղը դարձնենք նորմալ ռեժիմով, որտեղ համակարգը/ Raspberry Pi- ն վերցնում է ձեռքի նկարը և վերլուծում և նույնականացնում ձեռքի ժեստը: Այնուհետև օգտագործելով պատահական թվերի գեներատոր, խաղում է համակարգչի քայլը: Հաղթողը ընտրվում է կանոնների հիման վրա, այնուհետև ցուցադրվում է էկրանին: Սկսեք խաղը ՝ օգտագործելով հետևյալ հրամանը.

python3 play.py

Քայլ 9. Servo Motor Integration?

Վերջապես, այս նախագծին ավելացրեք servo շարժիչը: Servo շարժիչը Raspberry Pi- ի GPIO փին 17 -ն է, որն ունի PWM գործառույթ ՝ ռոտացիայի անկյունը վերահսկելու համար:

Այս նախագծում օգտագործվող Servo Motor- ը SG-90 է: Այն կարող է պտտել ժամացույցի սլաքի ուղղությամբ և հակառակ ՝ մինչև 180 °

Կապերը տրվում են հետևյալ կերպ.

Servo Motor - Ազնվամորի Պի

Vcc - +5V

GND - GND

Ազդանշան - GPIO17

Այս նախագծում օգտագործվում են այնպիսի գրադարաններ, ինչպիսիք են RPi. GPIO- ն և ժամանակը:

ներմուծեք RPi. GPIO- ն որպես GPIO

ներմուծման ժամանակը

GPIO- ի քորոցը այնուհետև կազմաձևված է PWM- ին ՝ օգտագործելով հետևյալ տողերը

servoPIN = 17

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

GPIO Pin 17 – ը կազմաձևված է ՝ որպես PWM օգտագործելու 50 Հց հաճախականությամբ: Servo շարժիչի անկյունը ձեռք է բերվում PWM- ի աշխատանքային ցիկլը (Ton & Toff) սահմանելով

տուրք = անկյուն/18 + 2

GPIO.putput (servoPIN, True) p. ChangeDutyCycle (տուրք) time.sleep (1) GPIO.output (servoPIN, False) p. ChangeDutyCycle (0)

Սա կստեղծի ցանկալի քայլի անկյուն յուրաքանչյուր զարկերակի համար, ինչը կտա պտույտի ցանկալի անկյունը:

Այժմ ես վերցրեցի գծապատկերը և այն կտրեցի երեք մասի ՝ ռոքի, թղթի և մկրատի համար: Servo շարժիչը ամրագրված է գծապատկերի կենտրոնում: Inուցանիշը/փեղկը միացված է servo շարժիչի լիսեռին: Այս լիսեռը մատնանշում է համակարգչի քայլը ՝ ըստ սցենարում հաշվարկված տրամաբանության:

Քայլ 10. Նախագծի մշակում:

Image
Image

Եվ հիմա, խաղալու ժամն է: Եկեք տեսնենք նախագծի աշխատանքը:

Եթե այս նախագծի կառուցման ընթացքում որևէ խնդրի եք բախվել, ազատ զգացեք ինձ հարցնել: Խնդրում եմ առաջարկեք նոր նախագծեր, որոնք ցանկանում եք, որ ես անեմ հաջորդը:

Ձեռք տվեք, եթե դա իսկապես օգնեց ձեզ և հետևեք իմ ալիքին հետաքրքիր նախագծերի համար::)

Եթե ցանկանում եք, կիսվեք այս տեսանյութով:

Երջանիկ եմ, որ բաժանորդագրվել եք ՝

Շնորհակալություն կարդալու համար:

Քայլ 11. Կոդ - Reրագրի վերանայում

Կոդն ավելացվում է GitHub շտեմարանին, որը կարելի է գտնել կոդի բաժնում:

Rahul24-06/Rock-Paper-Scissors-https://github.com/Rahul24-06/Rock-Paper-Scissors

Խորհուրդ ենք տալիս: