สารบัญ:

Rock Paper Scissor AI: 11 ขั้นตอน
Rock Paper Scissor AI: 11 ขั้นตอน

วีดีโอ: Rock Paper Scissor AI: 11 ขั้นตอน

วีดีโอ: Rock Paper Scissor AI: 11 ขั้นตอน
วีดีโอ: How To Code Rock Paper Scissors In JavaScript 2024, พฤศจิกายน
Anonim
กรรไกรตัดกระดาษ AI
กรรไกรตัดกระดาษ AI

เคยรู้สึกเบื่ออยู่คนเดียวไหม? มาเล่นร็อค กระดาษ และกรรไกรกับระบบโต้ตอบที่ขับเคลื่อนด้วยปัญญา

ขั้นตอนที่ 1: สิ่งที่ใช้ในโครงการนี้

ส่วนประกอบฮาร์ดแวร์

  • Raspberry Pi 3 รุ่น B+ × 1
  • โมดูลกล้อง Raspberry Pi V2 × 1
  • SG90 ไมโครเซอร์โวมอเตอร์ × 1

แอพซอฟต์แวร์

  • 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+ ถูกรวมเข้ากับโปรเซสเซอร์ Quad-core ความเร็ว 1.4GHz 64 บิต, LAN ไร้สายแบบดูอัลแบนด์, Bluetooth 4.2/BLE, อีเธอร์เน็ตที่เร็วกว่า และรองรับ Power-over-Ethernet (พร้อม PoE HAT แยกต่างหาก)

ข้อมูลจำเพาะ: Broadcom BCM2837B0, Cortex-A53 (ARMv8) 64-bit 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 Mbps), ส่วนหัว GPIO 40 พินแบบขยาย, พอร์ต HDMI4 USB 2.0 ขนาดเต็ม, พอร์ตกล้อง CSI สำหรับเชื่อมต่อกล้อง Raspberry Pi, พอร์ตแสดงผล DSI สำหรับเชื่อมต่อหน้าจอสัมผัส Raspberry Pi เอาต์พุตสเตอริโอ 4 ขั้วและคอมโพสิต พอร์ตวิดีโอ พอร์ต Micro SD สำหรับการโหลดระบบปฏิบัติการของคุณและจัดเก็บข้อมูลอินพุตไฟ DC 5V/2.5A รองรับ Power-over-Ethernet (PoE) (ต้องใช้ PoE HAT แยกต่างหาก)

เซอร์โวมอเตอร์

เราใช้เซอร์โวมอเตอร์ SG-90 ซึ่งเป็นมอเตอร์แรงบิดสูงที่สามารถรับน้ำหนักได้มากถึง 2.5 กก. (1 ซม.)

กล้อง USB

กล้อง USB เพื่อให้เกมโต้ตอบกับการประมวลผลภาพ

สายจัมเปอร์บางสายใช้สำหรับต่อสเต็ปเปอร์มอเตอร์และ Raspberry Pi

ขั้นตอนที่ 4: เบิร์น Raspbian ลงในการ์ด SD หรือไม่

เบิร์น Raspbian ลงในการ์ด SD ?
เบิร์น Raspbian ลงในการ์ด SD ?
เบิร์น Raspbian ลงในการ์ด SD ?
เบิร์น Raspbian ลงในการ์ด SD ?
เบิร์น Raspbian ลงในการ์ด SD ?
เบิร์น Raspbian ลงในการ์ด SD ?

Raspbian คือตัวเลือกการกระจาย Linux ที่ทำงานบน Raspberry Pi ในคู่มือนี้ เราจะใช้เวอร์ชัน Lite แต่เวอร์ชันเดสก์ท็อป (ซึ่งมาพร้อมกับสภาพแวดล้อมแบบกราฟิก) ก็สามารถใช้ได้เช่นกัน

  • ดาวน์โหลด 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 ติดตั้ง opencv pip ติดตั้ง numpy pip ติดตั้ง scikit-learn pip ติดตั้ง scikit-image pip ติดตั้ง h5py pip ติดตั้ง Keras pip ติดตั้ง pip tensorflow ติดตั้ง Werkzeug pip ติดตั้ง Keras-Applications pip ติดตั้ง Keras-Preprocessing pip ติดตั้ง keras-squeezenet pip ติดตั้ง astor pip ติดตั้ง tensorboard pip ติดตั้ง tensorflow-estimator pip ติดตั้ง mock pip ติดตั้ง grpcio pip ติดตั้ง absl-pypip ติดตั้ง gast pip ติดตั้ง joblib pip ติดตั้ง Markdown pip ติดตั้ง protobuf pip ติดตั้ง PyYAML pip ติดตั้งหก

หากคุณประสบปัญหาใด ๆ กับ OpenCVpackage ฉันขอแนะนำอย่างยิ่งให้ติดตั้งแพ็คเกจเหล่านี้

sudo apt-get ติดตั้ง libhdf5-dev

sudo apt-get ติดตั้ง libhdf5-serial-dev sudo apt-get ติดตั้ง libatlas-base-dev sudo apt-get ติดตั้ง libjasper-dev sudo apt-get ติดตั้ง libqtgui4 sudo apt-get ติดตั้ง libqt4-test

เราได้ติดตั้งการพึ่งพาที่จำเป็นทั้งหมดสำหรับโครงการนี้ ชุดข้อมูลจัดทำขึ้นโดยการรวบรวมและจัดเรียงรูปภาพภายใต้ป้ายกำกับที่เหมาะสม

ที่นี่ เราสร้างภาพชุดข้อมูลสำหรับฉลากหิน กระดาษ และกรรไกรโดยใช้ตัวอย่างต่อไปนี้

ร้อย = เฟรม[100:500, 100:500]

save_path = os.path.join(img_class_path, '{}.jpg'.format(นับ + 1)) cv2.imwrite(save_path, ROI)

รูปภาพจะถูกจับภาพสำหรับแต่ละฉลาก (หิน กระดาษ กรรไกร และ ไม่มี)

ขั้นตอนที่ 6: การออกแบบ NN & การฝึกโมเดล ⚒️⚙️

การออกแบบ NN & การฝึกโมเดล ⚒️⚙️
การออกแบบ NN & การฝึกโมเดล ⚒️⚙️

แกนหลักของโครงการนี้คือตัวแยกประเภทรูปภาพที่จัดประเภทหนึ่งในสามหมวดหมู่ ในการสร้างลักษณนาม เราใช้ CNN (Convolutional Network) ที่ผ่านการฝึกอบรมล่วงหน้าที่เรียกว่า SqueezeNet

ที่นี่เราใช้ Keras และ TensorFlow เพื่อสร้างโมเดล SqueezeNet ซึ่งสามารถระบุท่าทางได้ รูปภาพที่เราสร้างในขั้นตอนก่อนหน้านี้ใช้เพื่อฝึกโมเดล โมเดลนี้ได้รับการฝึกอบรมโดยใช้ชุดข้อมูลที่สร้างขึ้นสำหรับ Epochs (รอบ) ที่ไม่ได้กล่าวถึง

โมเดลได้รับการกำหนดค่าด้วยไฮเปอร์พารามิเตอร์ดังที่แสดงด้านล่าง

รุ่น = ลำดับ ([SqueezeNet(input_shape=(227, 227, 3), include_top=False), ถอนออก(0.5), Convolution2D(NUM_CLASSES, (1, 1), padding='ถูกต้อง'), การเปิดใช้งาน ('relu'), GlobalAveragePooling2D(), การเปิดใช้งาน ('softmax')])

ในขณะที่โมเดลกำลังฝึกอยู่ คุณจะพบความสูญเสียและความถูกต้องของแบบจำลองสำหรับแต่ละยุค และความแม่นยำจะเพิ่มขึ้นในบางช่วงเวลาหลังจากผ่านไปสองสามยุค

ใช้เวลาประมาณ 2 ชั่วโมงในการสร้างแบบจำลองที่มีความแม่นยำสูงสุดหลังจากผ่านไป 10 ยุค หากคุณพบข้อผิดพลาดในการจัดสรรหน่วยความจำ ให้ทำตามขั้นตอนต่อไปนี้ (ขอบคุณ Adrian)

หากต้องการเพิ่มพื้นที่สวอปของคุณ ให้เปิด /etc/dphys-swapfile แล้วแก้ไขตัวแปร CONF_SWAPSIZE:

# CONF_SWAPSIZE=100

CONF_SWAPSIZE=1024

สังเกตว่าฉันกำลังเพิ่ม swap จาก 100MB เป็น 1024MB จากนั้นให้เริ่มบริการ swap ใหม่:

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

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

บันทึก:

การเพิ่มขนาดสวอปเป็นวิธีที่ดีในการทำให้เมมโมรี่การ์ดของคุณหมด ดังนั้นอย่าลืมยกเลิกการเปลี่ยนแปลงนี้แล้วเริ่มบริการสวอปใหม่เมื่อคุณทำเสร็จแล้ว คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการ์ดหน่วยความจำขนาดใหญ่ที่เสียหายได้ที่นี่

ขั้นตอนที่ 7: ทดสอบโมเดล ✅

ทดสอบโมเดล✅
ทดสอบโมเดล✅
ทดสอบโมเดล✅
ทดสอบโมเดล✅
ทดสอบโมเดล✅
ทดสอบโมเดล✅

เมื่อโมเดลถูกสร้างขึ้น มันจะสร้างไฟล์เอาท์พุต "rock-paper-scissors-model.h5" ไฟล์นี้ใช้เป็นแหล่งที่มาเพื่อทดสอบว่าระบบสามารถระบุท่าทางมือต่างๆ และสามารถแยกแยะการกระทำได้หรือไม่

โมเดลถูกโหลดในสคริปต์ python ดังนี้

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) พิมพ์ ("คาดการณ์: {}".format (move_name))

รันสคริปต์ test.py เพื่อทดสอบโมเดลด้วยอิมเมจทดสอบต่างๆ

python3 test.py

ตอนนี้โมเดลพร้อมที่จะตรวจจับและทำความเข้าใจท่าทางของมือแล้ว

ขั้นตอนที่ 8: เกม Rock-Paper-Scissors

เกมกรรไกรกระดาษหิน
เกมกรรไกรกระดาษหิน

เกมใช้ฟังก์ชันการสร้างตัวเลขสุ่มเพื่อตัดสินการเคลื่อนไหวของคอมพิวเตอร์ เป็นไปตามกฎดังกล่าวข้างต้นเพื่อตัดสินผู้ชนะ เกมดังกล่าวได้รับการออกแบบด้วยสองโหมด: โหมดปกติและโหมดอัจฉริยะ โดยโหมดอัจฉริยะจะตอบโต้การเคลื่อนไหวของผู้ใช้ นั่นคือ คอมพิวเตอร์ชนะการเคลื่อนไหวทั้งหมดต่อผู้ใช้

cap = cv2. VideoCapture(0) # ในการจับภาพจากกล้อง

ตอนนี้เรามาสร้างเกมในโหมด Normal โดยที่ระบบ / Raspberry Pi ถ่ายภาพมือและวิเคราะห์และระบุท่าทางของมือ จากนั้นใช้เครื่องกำเนิดตัวเลขสุ่ม การย้ายคอมพิวเตอร์จะเล่น ผู้ชนะจะถูกเลือกตามกฎแล้วแสดงบนหน้าจอ เริ่มเกมโดยใช้คำสั่งต่อไปนี้

python3 play.py

ขั้นตอนที่ 9: การรวมเซอร์โวมอเตอร์ ?

ในที่สุด เพิ่มเซอร์โวมอเตอร์ในโครงการนี้ เซอร์โวมอเตอร์คือ GPIO pin 17 ของ Raspberry Pi ซึ่งมีฟังก์ชั่น PWM เพื่อควบคุมมุมของการหมุน

เซอร์โวมอเตอร์ที่ใช้ในโครงการนี้คือ SG-90 สามารถหมุนตามเข็มนาฬิกาและทวนเข็มนาฬิกาได้ถึง 180 °

การเชื่อมต่อจะได้รับดังต่อไปนี้

เซอร์โวมอเตอร์ - Raspberry Pi

Vcc - +5V

GND - GND

สัญญาณ - GPIO17

ไลบรารีเช่น RPi. GPIO และเวลาถูกใช้ในโครงการนี้

นำเข้า RPi. GPIO เป็น GPIO

เวลานำเข้า

พิน GPIO ได้รับการกำหนดค่าเป็น PWM โดยใช้บรรทัดต่อไปนี้

servoPIN = 17

GPIO.setmode (GPIO. BCM) GPIO.setup (เซอร์โวพิน, GPIO. OUT)

GPIO Pin 17 ได้รับการกำหนดค่าให้ใช้เป็น PWM ที่ความถี่ 50Hz มุมของเซอร์โวมอเตอร์ทำได้โดยการตั้งค่ารอบการทำงาน (Ton & Toff) ของ PWM

หน้าที่ = มุม/18 + 2

GPIO.output(servoPIN, True) p. ChangeDutyCycle(duty) time.sleep(1) GPIO.output(servoPIN, เท็จ) p. ChangeDutyCycle(0)

สิ่งนี้จะสร้างมุมขั้นที่ต้องการสำหรับทุกพัลส์ ซึ่งจะให้มุมการหมุนที่ต้องการ

ตอนนี้ฉันได้นำแผนภูมิและหั่นเป็นสามส่วน สำหรับหิน กระดาษ และกรรไกร เซอร์โวมอเตอร์ถูกตรึงไว้ที่กึ่งกลางของแผนภูมิ ตัวชี้/แผ่นปิดเชื่อมต่อกับเพลาของเซอร์โวมอเตอร์ เพลานี้ชี้ไปที่การเคลื่อนที่ของคอมพิวเตอร์ตามตรรกะที่คำนวณไว้ในสคริปต์

ขั้นตอนที่ 10: การทำงานของโครงการ ?

Image
Image

และตอนนี้ก็ถึงเวลาเล่นแล้ว มาดูการทำงานของโครงการกัน

หากคุณประสบปัญหาใด ๆ ในการสร้างโครงการนี้ อย่าลังเลที่จะถามฉัน โปรดแนะนำโครงการใหม่ที่คุณต้องการให้ฉันทำต่อไป

ยกนิ้วให้ถ้ามันช่วยคุณได้จริงๆ และติดตามช่องของฉันสำหรับโครงการที่น่าสนใจ:)

แชร์วิดีโอนี้หากคุณต้องการ

ยินดีที่ได้ติดตาม:

ขอบคุณที่อ่าน!

ขั้นตอนที่ 11: รหัส - โครงการ Repo

รหัสถูกเพิ่มไปยังที่เก็บ GitHub ซึ่งสามารถพบได้ในส่วนรหัส

Rahul24-06 / Rock-Paper-Scissors -

แนะนำ: