텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #4 - 모델 실행
머신러닝, 딥러닝

텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #4 - 모델 실행

반응형

이전글  2019/01/30 - [프로그래밍/딥러닝] - 텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #3 - 데이터 학습 및 모델 만들기 에 이어서 마지막 단계이다.

 

 

직전 단계에 제작한 모델에는 장애물에 좌표에 따른 점프 타이밍이 학습되어있는 상태이다. 이 모델을 실행하는 방법은 아래와 같다.

 

AI_play.py

from keras.models import load_model
import numpy as np
from PIL import ImageGrab
import cv2
import cv2 as cv
import keyboard

model = load_model('dino.h5')

template1 = cv.imread('images/cactus1.png', 0)
template2 = cv.imread('images/cactus2.png', 0)
template3 = cv.imread('images/bird1.png', 0)
template4 = cv.imread('images/bird2.png', 0)
w1, h1 = template1.shape[::-1]
w2, h2 = template1.shape[::-1]
w3, h3 = template1.shape[::-1]
w4, h4 = template1.shape[::-1]

def process_img(original_image):

        img_gray = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)

        return img_gray

while(True):
        data = [0, 0, 0, 0, 0, 0, 0]
        Input =[0, 0, 0, 0, 0, 0]

        screen =  np.array(ImageGrab.grab(bbox=(160, 80, 800, 300)))
        img_gray = process_img(screen)

        res1 = cv.matchTemplate(img_gray, template1, cv.TM_CCOEFF_NORMED)
        res2 = cv.matchTemplate(img_gray, template2, cv.TM_CCOEFF_NORMED)
        res3 = cv.matchTemplate(img_gray, template3, cv.TM_CCOEFF_NORMED)
        res4 = cv.matchTemplate(img_gray, template4, cv.TM_CCOEFF_NORMED)

        threshold = 0.8
        loc1 = np.where(res1 >= threshold)
        loc2 = np.where(res2 >= threshold)
        loc3 = np.where(res3 >= threshold)
        loc4 = np.where(res4 >= threshold)



        for pt in zip(*loc1[::-1]):
                cv.rectangle(img_gray, pt, (pt[0] + w1, pt[1] + h1), (0, 0, 255), 2)
                data[0] = pt[0]
                break

        for pt in zip(*loc2[::-1]):
                cv.rectangle(img_gray, pt, (pt[0] + w2, pt[1] + h2), (0, 0, 255), 2)
                data[1] = pt[0]
                break

        for pt in zip(*loc3[::-1]):
                cv.rectangle(img_gray, pt, (pt[0] + w3, pt[1] + h3), (0, 0, 255), 2)
                data[2] = pt[0]
                data[3] = pt[1]
                break

        for pt in zip(*loc4[::-1]):
                cv.rectangle(img_gray, pt, (pt[0] + w4, pt[1] + h4), (0, 0, 255), 2)
                data[4] = pt[0]
                data[5] = pt[1]
                break

        #print(data)

        Input[0] = data[0]
        Input[1] = data[1]
        Input[2] = data[2]
        Input[3] = data[3]
        Input[4] = data[4]
        Input[5] = data[5]

        result = model.predict(np.expand_dims(Input, axis=0))

        print(result)

        if result > 0.4:
            keyboard.press('space')

        else:
            keyboard.release('space')


        cv2.imshow('window', img_gray)
        #cv2.imshow('window2', cv2.cvtColor(screen, cv2.COLOR_BGR2RGB))
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break

 

실행 결과는 아래와 같다.

반응형

 

학습데이터가 적은편 치고는 잘 된다. 다만 새는 적게나와 학습량이 적어 잘 피하지 못하며 낮밤이 바뀌어도 인식하지 못한다.

 

최근에는 벽돌깨는 게임(Break game)도 학습해봤다.

 

 

모든 소스코드는 필자의 깃허브 페이지에서도 확인가능하다.

https://github.com/Hydragon516/Deep-Learning-Google-Chrome-Dinosaur-Game

https://github.com/Hydragon516/Deep-Learning-Break-Game

 

반응형
    # 테스트용