Innehållsförteckning:

Rock Paper Scissor AI: 11 steg
Rock Paper Scissor AI: 11 steg

Video: Rock Paper Scissor AI: 11 steg

Video: Rock Paper Scissor AI: 11 steg
Video: ANIME ROCK, PAPER, SCISSORS 2024, November
Anonim
Rock Paper Scissor AI
Rock Paper Scissor AI

Har du någonsin känt dig uttråkad ensam? Låt oss spela rock, papper och sax mot ett interaktivt system med intelligens.

Steg 1: Saker som används i detta projekt

Hårdvarukomponenter

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

Programvaruappar

  • Raspberry Pi Raspbian
  • OpenCV
  • TensorFlow

Steg 2: Idé?

Image
Image

Efter att ha arbetat med olika projekt på olika domäner planerade jag att göra ett roligt projekt, och jag bestämde mig för att göra ett papper-saxspel:)

I detta projekt kommer vi att göra ett interaktivt spel och spela mot datorn som drivs av AI för att fatta beslut. AI använder kameran som är ansluten till Raspberry Pi för att känna igen vad rörelser användaren gjort med handen, klassificera dem i den bästa kategorin (etikett) sten, papper eller sax. När datorn väl har rört sig pekar stegmotorn som är ansluten till Raspberry Pi mot riktningen baserat på dess rörelse.

Regler som måste beaktas för detta spel:

  • Rock trubbar saxen
  • Papper täcker berget
  • Sax klippte papper

Vinnaren avgörs utifrån ovanstående tre villkor. Låt oss se en snabb demo av projektet här.

Steg 3: Komma igång?

Kom igång?
Kom igång?
Kom igång?
Kom igång?

Raspberry Pi

Jag har använt en Raspberry Pi 3 Model B+ som har stora förbättringar och är mer kraftfull än den tidigare Raspberry Pi 3 Model B.

Raspberry Pi 3 B+ är integrerad med 1,4 GHz 64-bitars fyrkärnig processor, dual-band trådlöst LAN, Bluetooth 4.2/BLE, snabbare Ethernet och Power-over-Ethernet-stöd (med separat PoE HAT).

Specifikationer: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bitars SoC @ 1,4 GHz, 1 GB LPDDR2 SDRAM, 2,4 GHz och 5 GHz IEEE 802.11.b/g/n/ac trådlöst LAN, Bluetooth 4.2, BLE, Gigabit Ethernet över USB 2.0 (maximal genomströmning på 300 Mbps), Den utökade 40-stifts GPIO-rubriken, HDMI4 USB 2.0-portar i full storlek, CSI-kameraport för anslutning av en Raspberry Pi-kamera, DSI-displayport för anslutning av en Raspberry Pi-pekskärmsdisplay 4-polig stereoutgång och komposit videoport, Micro SD-port för att ladda ditt operativsystem och lagra data 5V/2,5A DC-ingång, Power-over-Ethernet (PoE) stöd (kräver separat PoE HAT).

Servomotor

Vi använder en SG-90 servomotor, en motor med högt vridmoment som klarar belastningen upp till 2,5 kg (1 cm).

USB -kamera

En USB -kamera för att göra spelet interaktivt med bildbehandlingen

Vissa bygelkablar används för att koppla in stegmotorn och Raspberry Pi.

Steg 4: Bränna Raspbian till SD -kortet?

Bränna Raspbian till SD -kortet?
Bränna Raspbian till SD -kortet?
Bränna Raspbian till SD -kortet?
Bränna Raspbian till SD -kortet?
Bränna Raspbian till SD -kortet?
Bränna Raspbian till SD -kortet?

Raspbian är den valda Linux -distributionen som körs på Raspberry Pi. I den här guiden kommer vi att använda Lite -versionen, men skrivbordsversionen (som levereras med en grafisk miljö) kan också användas.

  • Ladda ner Etcher och installera det.
  • Anslut en SD -kortläsare med SD -kortet inuti.
  • Öppna Etcher och välj från din hårddisk den Raspberry Pi.img- eller.zip -fil du vill skriva till SD -kortet.
  • Välj det SD -kort du vill skriva din bild till.
  • Granska dina val och klicka på "Flash!" för att börja skriva data till SD -kortet.

Anslut enheten till ditt nätverk

  • Aktivera SSH -åtkomst genom att lägga till tom fil ssh, igen placerad vid roten av startvolymen på ditt SD -kort.
  • Sätt in SD -kortet i Raspberry Pi. Den startar om ungefär 20 sekunder. Du bör nu ha SSH -åtkomst till din Raspberry Pi. Som standard är dess värdnamn raspberrypi.local. Öppna ett terminalfönster på din dator och skriv följande:

ssh [email protected]

Standardlösenordet är hallon

Här har jag använt en separat bildskärm för att ansluta till Raspberry Pi.

Steg 5: Samla in datauppsättningen? ️

Samlar du in datauppsättningen? ️
Samlar du in datauppsättningen? ️
Samlar du in datauppsättningen? ️
Samlar du in datauppsättningen? ️

Det första steget i detta projekt är datainsamling. Systemet måste identifiera handgesten och känna igen handlingen och få den att röra sig i enlighet därmed.

Vi installerar flera bibliotek till Raspberry Pi med pipinstallation

kommando.

sudo apt-get update && sudo apt-get upgradesudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev pip installera opencv pip installera numpy pip installera scikit-lära pip installera scikit-image pip installera h5py pip installera Keras pip installera tensorflow pip installera 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 install sex

Om du stöter på några problem med OpenCVpackage rekommenderar jag starkt att du installerar dessa paket.

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 installerat alla nödvändiga beroenden för detta projekt. Datauppsättningen görs genom samlingar och arrangemang av bilderna under lämplig etikett.

Här skapar vi datauppsättningsbilderna för etiketten sten, papper och sax med hjälp av följande utdrag.

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

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

Bilden tas för varje etikett (sten, papper, sax och ingen).

Steg 6: Designa ett NN och utbilda modellen ⚒️⚙️

Designa ett NN och utbilda modellen ⚒️⚙️
Designa ett NN och utbilda modellen ⚒️⚙️

Kärnan i detta projekt är en bildklassificerare som klassificerar en av tre kategorier. För att göra denna klassificerare använder vi det förutbildade CNN (Convolutional Network) som heter SqueezeNet.

Här använder vi Keras och TensorFlow för att generera SqueezeNet -modellen som kan identifiera gesten. Bilderna som vi genererade i föregående steg används för att träna modellen. Modellen tränas med hjälp av datauppsättningen som genererats för inga nämnda epoker (cykler).

Modellen är konfigurerad med hyperparametrarna enligt nedan.

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

Medan modellen tränar kan du hitta modellens förlust och noggrannhet för varje epok och noggrannheten ökar vid någon tidpunkt efter några epoker.

Det tog ungefär 2 timmar att generera modellen med högsta noggrannhet efter 10 epok. Om du möter minnesallokeringsfel gör du följande steg (tack till Adrian)

För att öka ditt bytesutrymme, öppna /etc /dphys-swapfile och redigera sedan variabeln CONF_SWAPSIZE:

# CONF_SWAPSIZE = 100

CONF_SWAPSIZE = 1024

Lägg märke till att jag ökar bytet från 100MB till 1024MB. Därifrån startar du om swaptjänsten:

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

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

Notera:

Att öka bytesstorleken är ett bra sätt att bränna ut ditt minneskort, så var noga med att återställa den här ändringen och starta om växlingstjänsten när du är klar. Du kan läsa mer om stora storlekar som skadar minneskort här.

Steg 7: Testa modellen ✅

Testar modellen ✅
Testar modellen ✅
Testar modellen ✅
Testar modellen ✅
Testar modellen ✅
Testar modellen ✅

När modellen väl genereras producerar den utdatafilen "rock-paper-scissors-model.h5". Den här filen används som källa för att testa om systemet kan identifiera olika handgester och kunna differentiera åtgärderna.

Modellen laddas i python -skriptet enligt följande

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

Kameran läser testbilden och omvandlar den önskade färgmodellen och ändrar sedan storleken på bilden till 227 x 227 pixlar (samma storlek som används för modellgenerering). Bilderna som användes för att träna modellen kan användas för att testa den genererade modellen.

img = cv2.imread (filepath)

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

När modellen har laddats och bilden förvärvats av kameran, förutsäger modellen den tagna bilden med SqueezeNet -modellen laddad och gör förutsägelser för användarens rörelser.

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

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

Kör test.py -skriptet för att testa modellen med olika testbilder.

python3 test.py

Nu är modellen redo att upptäcka och förstå handgesterna.

Steg 8: Rock-Paper-Scissors Game

Rock-Paper-sax spel
Rock-Paper-sax spel

Spelet använder en slumpmässig talgenereringsfunktion för att bestämma datorns förflyttning. Den följer ovanstående regler för att avgöra vinnaren. Spelet är utformat med två lägen: Normalt läge och Intelligent läge, där intelligent läge motangriper användarens rörelse, dvs datorn vinner alla drag mot användaren.

cap = cv2. VideoCapture (0) # För att ta bild från kameran

Låt oss nu göra spelet i normalt läge där systemet/ Raspberry Pi tar bilden av handen och analyserar och identifierar handgesten. Med hjälp av en slumptalsgenerator spelas datorrörelsen. Vinnaren väljs utifrån reglerna och visas sedan på skärmen. Starta spelet med följande kommando.

python3 play.py

Steg 9: Integrering av servomotorer?

Till sist, lägg till servomotorn i detta projekt. Servomotorn är GPIO -stift 17 på Raspberry Pi, som har PWM -funktionen för att styra rotationsvinkeln.

Servomotorn som används i detta projekt är SG-90. Den kan rotera medurs och moturs upp till 180 °

Anslutningarna ges enligt följande.

Servomotor - Raspberry Pi

Vcc - +5V

GND - GND

Signal - GPIO17

Biblioteken som RPi. GPIO och tid används i detta projekt.

importera RPi. GPIO som GPIO

importtid

GPIO -stiftet konfigureras sedan till PWM med hjälp av följande rader

servoPIN = 17

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

GPIO Pin 17 är konfigurerad att användas som PWM vid frekvensen 50Hz. Servomotorns vinkel uppnås genom att ställa in arbetscykeln (Ton & Toff) för PWM

plikt = vinkel/18 + 2

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

Detta ger den önskade stegvinkeln för varje puls, vilket ger den önskade rotationsvinkeln.

Nu har jag tagit diagrammet och skurit det i tre sektioner, för sten, papper och sax. Servomotorn är fixerad i mitten av diagrammet. Pekaren/klaffen är ansluten till servomotorns axel. Denna axel pekar på datorns rörelse enligt logiken som beräknas i skriptet.

Steg 10: Arbetet med projektet?

Image
Image

Och nu är det speltid. Låt oss se hur projektet fungerar.

Om du stöter på några problem när du bygger detta projekt, fråga mig gärna. Föreslå gärna nya projekt som du vill att jag ska göra härnäst.

Ge tummen upp om det verkligen hjälpte dig och följ min kanal för intressanta projekt.:)

Dela den här videon om du vill.

Glad att du prenumererar:

Tack för att du läser!

Steg 11: Kod - Project Repo

Koden läggs till i GitHub -förvaret som finns i kodsektionen.

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

Rekommenderad: