Spisu treści:

Rock Paper Scissor AI: 11 kroków
Rock Paper Scissor AI: 11 kroków

Wideo: Rock Paper Scissor AI: 11 kroków

Wideo: Rock Paper Scissor AI: 11 kroków
Wideo: VFX Reveal Before & After - Anime Rock, Paper, Scissors 2024, Listopad
Anonim
Nożyce do papieru skalnego AI
Nożyce do papieru skalnego AI

Czy kiedykolwiek czułeś się znudzony w samotności? Zagrajmy w kamień, papier i nożyce przeciwko interaktywnemu systemowi opartemu na inteligencji.

Krok 1: Rzeczy użyte w tym projekcie

Komponenty sprzętowe

  • Raspberry Pi 3 Model B+ × 1
  • Moduł kamery Raspberry Pi V2 × 1
  • Silnik mikro-serwo SG90 × 1

Aplikacje programowe

  • Raspberry Pi Raspbian
  • Otwórz CV
  • Przepływ Tensora

Krok 2: Pomysł ?

Image
Image

Po pracy nad różnymi projektami na różnych domenach planowałem zrobić fajny projekt i postanowiłem zrobić grę kamień-papier-nożyce:)

W tym projekcie stworzymy interaktywną grę i zagramy przeciwko komputerowi, który jest zasilany przez sztuczną inteligencję, aby podejmować decyzje. AI wykorzystuje kamerę podłączoną do Raspberry Pi, aby rozpoznać ruchy użytkownika wykonane ręką, klasyfikować je do najlepszej kategorii (etykiety) kamienia, papieru lub nożyczek. Gdy komputer wykona ruch, silnik krokowy podłączony do Raspberry Pi wskazuje kierunek w oparciu o jego ruch.

Zasady, które należy wziąć pod uwagę w tej grze:

  • Rock tępi nożyce
  • Papier pokrywa skałę
  • Nożyczki tną papier

Zwycięzca zostanie wyłoniony na podstawie powyższych trzech warunków. Zobaczmy tutaj szybkie demo projektu.

Krok 3: Pierwsze kroki ?

Zaczynasz ?
Zaczynasz ?
Zaczynasz ?
Zaczynasz ?

Malina Pi

Użyłem Raspberry Pi 3 Model B+, który ma świetne ulepszenia i jest bardziej wydajny niż wcześniejszy Raspberry Pi 3 Model B.

Raspberry Pi 3 B+ jest zintegrowany z 64-bitowym czterordzeniowym procesorem 1,4 GHz, dwuzakresową bezprzewodową siecią LAN, Bluetooth 4.2/BLE, szybszym Ethernetem i obsługą Power-over-Ethernet (z oddzielnym PoE HAT).

Specyfikacje: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bitowy SoC @ 1,4 GHz, 1 GB LPDDR2 SDRAM, 2,4 GHz i 5 GHz IEEE 802.11.b/g/n/ac bezprzewodowa sieć LAN, Bluetooth 4.2, BLE, Gigabit Ethernet przez USB 2.0 (maksymalna przepustowość 300 Mb/s), Rozszerzony 40-pinowy nagłówek GPIO, Pełnowymiarowe porty HDMI4 USB 2.0, port kamery CSI do podłączenia kamery Raspberry Pi, port wyświetlacza DSI do podłączenia wyświetlacza dotykowego Raspberry Pi 4-biegunowe wyjście stereo i kompozyt port wideo, port Micro SD do ładowania systemu operacyjnego i przechowywania danych wejście zasilania 5 V/2,5 A DC, obsługa Power-over-Ethernet (PoE) (wymaga oddzielnego HAT PoE).

Siłownik

Używamy serwo silnika SG-90, silnika o wysokim momencie obrotowym, który może wytrzymać obciążenie do 2,5 kg (1 cm).

Kamera USB

Kamera USB, aby gra była interaktywna z przetwarzaniem obrazu

Niektóre kable Jumper służą do podłączenia silnika krokowego i Raspberry Pi.

Krok 4: Nagraj Raspbian na kartę SD?

Nagraj Raspbian na kartę SD?
Nagraj Raspbian na kartę SD?
Nagraj Raspbian na kartę SD?
Nagraj Raspbian na kartę SD?
Nagraj Raspbian na kartę SD?
Nagraj Raspbian na kartę SD?

Raspbian to ulubiona dystrybucja Linuksa działająca na Raspberry Pi. W tym przewodniku będziemy używać wersji Lite, ale można również użyć wersji Desktop (która zawiera środowisko graficzne).

  • Pobierz Etcher i zainstaluj go.
  • Podłącz czytnik kart SD z kartą SD w środku.
  • Otwórz Etcher i wybierz z dysku twardego plik.img lub.zip Raspberry Pi, który chcesz zapisać na karcie SD.
  • Wybierz kartę SD, na której chcesz zapisać swój obraz.
  • Przejrzyj swoje wybory i kliknij „Flash!” rozpocząć zapisywanie danych na karcie SD.

Podłącz urządzenie do swojej sieci

  • Włącz dostęp SSH, dodając pusty plik ssh, ponownie umieszczony w katalogu głównym woluminu rozruchowego na karcie SD.
  • Włóż kartę SD do Raspberry Pi. Uruchomi się za około 20 sekund. Powinieneś teraz mieć dostęp SSH do swojego Raspberry Pi. Domyślnie jego nazwą hosta będzie raspberrypi.local. Na komputerze otwórz okno terminala i wpisz:

ssh [email protected]

Domyślne hasło to malina

Tutaj użyłem osobnego monitora do połączenia z Raspberry Pi.

Krok 5: Zbieranie zbioru danych ?️

Zbieranie zbioru danych ?️
Zbieranie zbioru danych ?️
Zbieranie zbioru danych ?️
Zbieranie zbioru danych ?️

Pierwszym krokiem w tym projekcie jest zbieranie danych. System musi rozpoznać gest ręki i rozpoznać akcję i odpowiednio nią wykonać ruch.

Instalujemy kilka bibliotek na Raspberry Pi za pomocą pip install

Komenda.

sudo apt-get aktualizacja && sudo apt-get upgradesudo apt-get zainstaluj libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev instalacja pip opencv instalacja pip numpy pip instalacja scikit-learn pip instalacja scikit-image pip instalacja h5py pip instalacja Keras pip zainstaluj tensorflow pip zainstaluj Werkzeug pip zainstaluj Keras-Aplikacje pip zainstaluj Keras-Przetwarzanie wstępne pip zainstaluj keras-squeezenet pip zainstaluj astor pip zainstaluj tensorboard pip zainstaluj tensorflow-estimator pip zainstaluj mock pip zainstaluj grpcio pip zainstaluj absl-pypip zainstaluj pip zainstaluj pip zainstaluj zadanie pip zainstaluj protobuf pip zainstaluj PyYAML pip zainstaluj sześć

Jeśli napotkasz jakiekolwiek problemy z pakietem OpenCV, zdecydowanie zalecam zainstalowanie tych pakietów.

sudo apt-get zainstaluj libhdf5-dev

sudo apt-get zainstaluj libhdf5-serial-dev sudo apt-get zainstaluj libatlas-base-dev sudo apt-get zainstaluj libjasper-dev sudo apt-get zainstaluj libqtgui4 sudo apt-get zainstaluj libqt4-test

Zainstalowaliśmy wszystkie wymagane zależności dla tego projektu. Zbiór danych jest tworzony przez kolekcje i aranżacje obrazów pod odpowiednią etykietą.

Tutaj tworzymy obrazy zestawu danych dla etykiety kamień, papier i nożyce za pomocą poniższego fragmentu kodu.

ROi = rama[100:500, 100:500]

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

Obraz jest rejestrowany dla każdej etykiety (kamień, papier, nożyce i Brak).

Krok 6: Projektowanie sieci NN i trenowanie modelu ⚒️⚙️

Projektowanie sieci NN i trenowanie modelu ⚒️⚙️
Projektowanie sieci NN i trenowanie modelu ⚒️⚙️

Rdzeniem tego projektu jest klasyfikator obrazów, który klasyfikuje jedną z trzech kategorii. Do stworzenia tego klasyfikatora używamy przeszkolonej sieci CNN (Convolutional Network) o nazwie SqueezeNet.

Tutaj używamy Keras i TensorFlow do wygenerowania modelu SqueezeNet, który może zidentyfikować gest. Obrazy, które wygenerowaliśmy w poprzednim kroku, służą do trenowania modelu. Model jest szkolony przy użyciu zestawu danych wygenerowanego dla żadnej z wymienionych epok (cykli).

Model jest skonfigurowany z hiperparametrami, jak pokazano poniżej.

model = sekwencyjny([SqueezeNet(input_shape=(227, 227, 3), include_top=False), Odpad (0,5), Convolution2D(NUM_CLASSES, (1, 1), dopełnienie='prawidłowy'), Aktywacja('relu'), Globalna średnia Pooling2D(), Aktywacja('softmax')])

Podczas uczenia modelu można znaleźć utratę i dokładność modelu dla każdej epoki, a dokładność wzrasta w pewnym momencie po kilku epokach.

Wygenerowanie modelu z najwyższą dokładnością po 10 epoce zajęło około 2 godzin. Jeśli napotkasz jakiekolwiek błędy alokacji pamięci, wykonaj następujące czynności (podziękowania dla Adriana)

Aby zwiększyć przestrzeń wymiany, otwórz /etc/dphys-swapfile, a następnie edytuj zmienną CONF_SWAPSIZE:

# CONF_SWAPSIZE=100

CONF_SWAPSIZE=1024

Zauważ, że zwiększam wymianę ze 100 MB do 1024 MB. Stamtąd uruchom ponownie usługę wymiany:

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

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

Notatka:

Zwiększenie rozmiaru wymiany to świetny sposób na wypalenie karty pamięci, więc pamiętaj, aby cofnąć tę zmianę i ponownie uruchomić usługę wymiany, gdy skończysz. Możesz przeczytać więcej o dużych rozmiarach uszkadzających karty pamięci tutaj.

Krok 7: Testowanie modelu ✅

Testowanie modelu ✅
Testowanie modelu ✅
Testowanie modelu ✅
Testowanie modelu ✅
Testowanie modelu ✅
Testowanie modelu ✅

Po wygenerowaniu modelu tworzy plik wyjściowy „rock-paper-scissors-model.h5”. Ten plik jest używany jako źródło do sprawdzenia, czy system może zidentyfikować różne gesty rąk i rozróżnić działania.

Model jest ładowany do skryptu Pythona w następujący sposób

model = load_model("kamień-papier-nożyczki-model.h5")

Kamera odczytuje obraz testowy i przekształca wymagany model kolorów, a następnie zmienia rozmiar obrazu do 227 x 227 pikseli (ten sam rozmiar używany do generowania modelu). Obrazy, które zostały użyte do uczenia modelu, można wykorzystać do przetestowania wygenerowanego modelu.

img = cv2.imread(ścieżka pliku)

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

Po załadowaniu modelu i pobraniu obrazu przez kamerę model przewiduje przechwycony obraz za pomocą załadowanego modelu SqueezeNet i przewiduje ruchy użytkownika.

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

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

Uruchom skrypt test.py, aby przetestować model za pomocą różnych obrazów testowych.

python3 test.py

Teraz model jest gotowy do wykrywania i rozumienia gestów rąk.

Krok 8: Gra kamień-papier-nożyczki

Gra kamień-papier-nożyczki
Gra kamień-papier-nożyczki

Gra wykorzystuje funkcję generowania liczb losowych, aby zdecydować o ruchu komputera. Wyłonienie zwycięzcy następuje zgodnie z powyższymi zasadami. Gra została zaprojektowana z dwoma trybami: Normal Mode i Intelligent, gdzie inteligentny tryb kontratakuje na ruch użytkownika, tzn. Komputer wygrywa wszystkie ruchy przeciwko użytkownikowi.

cap = cv2. VideoCapture(0) # Aby przechwycić obraz z kamery

Teraz stwórzmy grę w trybie Normal, w którym system/ Raspberry Pi robi zdjęcie dłoni i analizuje oraz identyfikuje gesty dłoni. Następnie za pomocą generatora liczb losowych odtwarzany jest ruch komputera. Zwycięzca jest wybierany na podstawie zasad, a następnie wyświetlany na ekranie. Uruchom grę za pomocą następującego polecenia.

python3 play.py

Krok 9: Integracja z serwosilnikiem?

Na koniec dodaj serwomotor do tego projektu. Silnik serwo to pin 17 GPIO Raspberry Pi, który posiada funkcję PWM do kontroli kąta obrotu.

Servo Motor użyty w tym projekcie to SG-90. Może wykonywać obroty zgodnie z ruchem wskazówek zegara i przeciwnie do ruchu wskazówek zegara do 180 °;

Połączenia są podane w następujący sposób.

Silnik serwo - Raspberry Pi

Vcc - +5V

GND - GND

Sygnał - GPIO17

W tym projekcie wykorzystywane są biblioteki takie jak RPi. GPIO i czas.

importuj RPi. GPIO jako GPIO

czas importu

Pin GPIO jest następnie konfigurowany do PWM za pomocą następujących linii

serwoPIN = 17

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

GPIO Pin 17 jest skonfigurowany do używania jako PWM przy częstotliwości 50Hz. Kąt silnika serwo osiąga się poprzez ustawienie cyklu pracy (Ton i Toff) PWM

cło = kąt/18 + 2

GPIO.output(servoPIN, True) p. ChangeDutyCycle(obowiązek) time.sleep(1) GPIO.output(servoPIN, False) p. ChangeDutyCycle(0)

Spowoduje to uzyskanie pożądanego kąta kroku dla każdego impulsu, co da pożądany kąt obrotu.

Teraz wziąłem wykres i podzieliłem go na trzy sekcje: kamień, papier i nożyce. Silnik Servo jest przymocowany do środka wykresu. Wskaźnik/klapa jest połączona z wałem serwomotoru. Ten wał wskazuje na ruch komputera zgodnie z logiką obliczoną w skrypcie.

Krok 10: Praca nad projektem ?

Image
Image

A teraz czas na zabawę. Zobaczmy, jak działa projekt.

Jeśli napotkałeś jakiekolwiek problemy podczas budowy tego projektu, nie wahaj się mnie zapytać. Proszę sugerować nowe projekty, które chcesz, abym wykonał w następnej kolejności.

Daj kciuki, jeśli to naprawdę ci pomogło i śledź mój kanał, aby znaleźć ciekawe projekty.:)

Udostępnij ten film, jeśli chcesz.

Cieszę się, że subskrybujesz:

Dziękuje za przeczytanie!

Krok 11: Kod - Repozytorium projektu

Kod jest dodawany do repozytorium GitHub, które można znaleźć w sekcji kodu.

Rahul24-06 / Papier-kamień-nożyczki -

Zalecana: