Indholdsfortegnelse:

Rock Paper Scissor AI: 11 trin
Rock Paper Scissor AI: 11 trin

Video: Rock Paper Scissor AI: 11 trin

Video: Rock Paper Scissor AI: 11 trin
Video: AI Show Live - Episode 29 - I wanna 🤘🏽 Rock (Paper, Scissors) with Seth 2024, November
Anonim
Rock Paper Scissor AI
Rock Paper Scissor AI

Har du nogensinde kedet dig alene? Lad os spille rock, papir og saks mod et interaktivt system med intelligens.

Trin 1: Ting, der bruges i dette projekt

Hardware komponenter

  • Raspberry Pi 3 Model B+ × 1
  • Raspberry Pi kameramodul V2 × 1
  • SG90 Micro-servomotor × 1

Software apps

  • Raspberry Pi Raspbian
  • OpenCV
  • TensorFlow

Trin 2: Idé?

Image
Image

Efter at have arbejdet med forskellige projekter på forskellige domæner, planlagde jeg at lave et sjovt projekt, og jeg besluttede at lave et klippepapir-saksespil:)

I dette projekt vil vi lave et interaktivt spil og spille mod computeren, der drives af AI til at træffe beslutninger. AI bruger kameraet, der er tilsluttet Raspberry Pi, til at genkende, hvad der bevæger brugeren med hånden, klassificere dem i den bedste kategori (etiket) sten, papir eller saks. Når computeren bevæger sig, peger trinmotoren, der er forbundet til Raspberry Pi, i retning af den baseret på dens bevægelse.

Regler, der skal overvejes for dette spil:

  • Rock stumper saksen
  • Papir dækker klippen
  • Sakse klipper papir

Vinderen afgøres ud fra ovenstående tre betingelser. Lad os se en hurtig demo af projektet her.

Trin 3: Kom godt i gang?

Kom godt i gang?
Kom godt i gang?
Kom godt i gang?
Kom godt i gang?

Hindbær Pi

Jeg har brugt en Raspberry Pi 3 Model B+, som har store forbedringer og er mere kraftfuld end den tidligere Raspberry Pi 3 Model B.

Raspberry Pi 3 B+ er integreret med 1,4 GHz 64-bit quad-core processor, dual-band trådløst LAN, Bluetooth 4.2/BLE, hurtigere Ethernet og Power-over-Ethernet support (med separat PoE HAT).

Specifikationer: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit SoC @ 1.4GHz, 1GB LPDDR2 SDRAM, 2.4GHz og 5GHz IEEE 802.11.b/g/n/ac trådløst LAN, Bluetooth 4.2, BLE, Gigabit Ethernet over USB 2.0 (maksimal gennemstrømning på 300 Mbps), Den udvidede 40-pins GPIO-header, HDMI4 USB 2.0-porte i fuld størrelse, CSI-kameraport til tilslutning af et Raspberry Pi-kamera, DSI-skærmport til tilslutning af en Raspberry Pi touchscreen display 4-polet stereo output og komposit videoport, Micro SD-port til indlæsning af dit operativsystem og lagring af data5V/2,5A DC-strømindgang, Power-over-Ethernet (PoE) support (kræver separat PoE HAT).

Servomotor

Vi bruger en SG-90 servomotor, en motor med højt drejningsmoment, der kan klare belastningen op til 2,5 kg (1 cm).

USB kamera

Et USB -kamera til at gøre spillet interaktivt med billedbehandlingen

Nogle Jumper -kabler bruges til at tilslutte trinmotoren og Raspberry Pi.

Trin 4: Brænd Raspbian til SD -kortet?

Brænde Raspbian til SD -kortet?
Brænde Raspbian til SD -kortet?
Brænde Raspbian til SD -kortet?
Brænde Raspbian til SD -kortet?
Brænde Raspbian til SD -kortet?
Brænde Raspbian til SD -kortet?

Raspbian er den valgte Linux -distribution, der kører på Raspberry Pi. I denne vejledning bruger vi Lite -versionen, men desktopversionen (som leveres med et grafisk miljø) kan også bruges.

  • Download Etcher og installer det.
  • Tilslut en SD -kortlæser med SD -kortet indeni.
  • Åbn Etcher, og vælg fra din harddisk den Raspberry Pi.img- eller.zip -fil, du vil skrive til SD -kortet.
  • Vælg det SD -kort, du vil skrive dit billede til.
  • Gennemgå dine valg, og klik på 'Flash!' for at begynde at skrive data til SD -kortet.

Tilslut enheden til dit netværk

  • Aktiver SSH -adgang ved at tilføje tom fil ssh, igen placeret ved roden af bootvolumen på dit SD -kort.
  • Indsæt SD -kortet i Raspberry Pi. Det vil starte om cirka 20 sekunder. Du skal nu have SSH -adgang til din Raspberry Pi. Som standard vil dets værtsnavn være raspberrypi.local. Åbn et terminalvindue på din computer, og skriv følgende:

ssh [email protected]

Standardadgangskoden er hindbær

Her har jeg brugt en separat skærm til at interface med Raspberry Pi.

Trin 5: Indsamling af datasættet? ️

Indsamler datasættet? ️
Indsamler datasættet? ️
Indsamler datasættet? ️
Indsamler datasættet? ️

Det første trin i dette projekt er dataindsamling. Systemet skal identificere håndbevægelsen og genkende handlingen og få den til at bevæge sig i overensstemmelse hermed.

Vi installerer flere biblioteker til Raspberry Pi ved hjælp af pip -installation

kommando.

sudo apt-get update && sudo apt-get upgradesudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev pip installer opencv pip installer numpy pip install scikit-lær pip install scikit-image pip installer h5py pip install Keras pip installer tensorflow pip installer Werkzeug pip install Keras-Applications pip install Keras-Preprocessing pip install keras-squeezenet 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 installer seks

Hvis du støder på problemer med OpenCVpackage, anbefaler jeg stærkt at installere disse pakker.

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

Vi har installeret alle de nødvendige afhængigheder til dette projekt. Datasættet foretages ved at indsamle og arrangere billederne under den relevante etiket.

Her opretter vi datasættets billeder til etiketten sten, papir og saks ved hjælp af følgende uddrag.

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

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

Billedet er taget for hver etiket (sten, papir, saks og Ingen).

Trin 6: Design af et NN og oplæring af modellen ⚒️⚙️

Design af et NN & oplæring af modellen ⚒️⚙️
Design af et NN & oplæring af modellen ⚒️⚙️

Kernen i dette projekt er en billedklassificering, der klassificerer en af tre kategorier. For at lave denne klassifikator bruger vi det foruddannede CNN (Convolutional Network) kaldet SqueezeNet.

Her bruger vi Keras og TensorFlow til at generere SqueezeNet -modellen, som kan identificere gestus. De billeder, som vi genererede i det foregående trin, bruges til at træne modellen. Modellen er uddannet ved hjælp af datasættet genereret for ingen af de nævnte epoker (cykler).

Modellen er konfigureret med hyperparametrene som vist nedenfor.

model = Sekventiel ([SqueezeNet (input_shape = (227, 227, 3), include_top = False), Frafald (0,5), Convolution2D (NUM_CLASSES, (1, 1), padding = 'valid'), Aktivering ('relu'), GlobalAveragePooling2D (), Aktivering ('softmax')])

Mens modellen træner, kan du finde tabet og nøjagtigheden af modellen for hver epoke, og nøjagtigheden stiger på et tidspunkt efter et par epoker.

Det tog nogenlunde 2 timer at generere modellen med den højeste nøjagtighed efter 10 epoker. Hvis du står over for fejl ved hukommelsestildeling, skal du gøre følgende trin (tak til Adrian)

For at øge dit bytteplads skal du åbne /etc /dphys-swapfile og derefter redigere variablen CONF_SWAPSIZE:

# CONF_SWAPSIZE = 100

CONF_SWAPSIZE = 1024

Bemærk, at jeg øger swap'en fra 100MB til 1024MB. Derfra genstart swap -tjenesten:

$ sudo /etc/init.d/dphys-swapfile stop

$ sudo /etc/init.d/dphys-swapfile start

Bemærk:

Forøgelse af swap -størrelse er en fantastisk måde at brænde dit hukommelseskort på, så sørg for at tilbageføre denne ændring og genstarte swap -tjenesten, når du er færdig. Du kan læse mere om store størrelser, der ødelægger hukommelseskort her.

Trin 7: Test af modellen ✅

Test af modellen ✅
Test af modellen ✅
Test af modellen ✅
Test af modellen ✅
Test af modellen ✅
Test af modellen ✅

Når modellen er genereret, producerer den outputfilen "rock-paper-scissors-model.h5". Denne fil bruges som kilde til at teste, om systemet kan identificere forskellige håndbevægelser og kunne differentiere handlingerne.

Modellen indlæses i python -scriptet som følger

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

Kameraet læser testbilledet og transformerer den påkrævede farvemodel og ændrer derefter størrelsen på billedet til 227 x 227 pixel (Samme størrelse bruges til modelgenerering). De billeder, der blev brugt til at oplære modellen, kan bruges til at teste den genererede model.

img = cv2.imread (filepath)

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

Når modellen er indlæst, og billedet er erhvervet af kameraet, forudsiger modellen det taget billede ved hjælp af SqueezeNet -modellen, der er indlæst, og foretager forudsigelsen for brugerens bevægelser.

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

move_code = np.argmax (forud [0]) move_name = mapper (move_code) print ("Forudsagt: {}". format (move_name))

Kør test.py -scriptet for at teste modellen med forskellige testbilleder.

python3 test.py

Nu er modellen klar til at registrere og forstå håndbevægelserne.

Trin 8: Rock-Paper-Scissors Game

Rock-Paper-sakse spil
Rock-Paper-sakse spil

Spillet bruger en tilfældig talgenereringsfunktion til at bestemme computerens flytning. Det følger ovennævnte regler for at bestemme vinderen. Spillet er designet med to tilstande: Normal tilstand og Intelligent tilstand, hvor intelligent tilstand modangriber brugerens bevægelse, dvs. Computer vinder alle træk mod brugeren.

cap = cv2. VideoCapture (0) # For at tage billede fra kameraet

Lad os nu lave spillet i normal tilstand, hvor systemet/ Raspberry Pi tager billedet af hånden og analyserer og identificerer håndbevægelsen. Derefter afspilles computerens bevægelse ved hjælp af en tilfældig talgenerator. Vinderen vælges ud fra reglerne og vises derefter på skærmen. Start spillet ved hjælp af følgende kommando.

python3 play.py

Trin 9: Servomotorintegration?

Tilføj endelig servomotoren til dette projekt. Servomotor er GPIO pin 17 på Raspberry Pi, som har PWM -funktionen til at styre rotationsvinklen.

Servomotoren, der bruges i dette projekt, er SG-90. Det kan dreje med uret og mod uret op til 180 °

Forbindelserne er givet som følger.

Servomotor - Raspberry Pi

Vcc - +5V

GND - GND

Signal - GPIO17

Bibliotekerne såsom RPi. GPIO og tid bruges i dette projekt.

importer RPi. GPIO som GPIO

importtid

GPIO -stiften konfigureres derefter til PWM ved hjælp af følgende linjer

servoPIN = 17

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

GPIO Pin 17 er konfigureret til brug som PWM ved frekvensen 50Hz. Servomotorens vinkel opnås ved at indstille driftscyklussen (Ton & Toff) for PWM

pligt = vinkel/18 + 2

GPIO.output (servoPIN, True) p. ChangeDutyCycle (duty) time.sleep (1) GPIO.output (servoPIN, False) p. ChangeDutyCycle (0)

Dette vil producere den ønskede trinvinkel for hver puls, hvilket ville give den ønskede rotationsvinkel.

Nu har jeg taget diagrammet og skåret det i tre sektioner, til sten, papir og saks. Servomotoren er fastgjort til midten af diagrammet. Markøren/flappen er forbundet til servomotorens aksel. Dette skaft peger på computerens bevægelse i henhold til logikken beregnet i scriptet.

Trin 10: Arbejde med projektet?

Image
Image

Og nu er det spilletid. Lad os se, hvordan projektet fungerer.

Spørg mig, hvis du har haft problemer med at bygge dette projekt. Foreslå venligst nye projekter, som du vil have mig til at lave næste gang.

Giv tommelfinger op, hvis det virkelig hjalp dig, og følg min kanal for interessante projekter.:)

Del denne video, hvis du vil.

Glad for at have dig tilmeldt:

Tak fordi du læste!

Trin 11: Kode - Project Repo

Koden tilføjes til GitHub -depotet, som findes i kodesektionen.

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

Anbefalede: