텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #2 - 데이터 만들기
머신러닝, 딥러닝

텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #2 - 데이터 만들기

반응형

2019/01/26 - [프로그래밍/딥러닝] - 텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #1 - 템플릿 매칭

이전 글에 이어서 이번에는 텐서플로우로 학습할 데이터를 생성하는 과정을 소개한다.

 

make_data.py

import numpy as np
from PIL import ImageGrab
import cv2
import cv2 as cv
import keyboard

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

f = open("dino.txt", 'w')

while(True):
        data = [0, 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)

        if keyboard.is_pressed('space'):
                data[6] = 1

        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)

        write = "%d,%d,%d,%d,%d,%d,%d\n" % (data[0], data[1], data[2], data[3], data[4], data[5], data[6])
        f.write(write)

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

 

이전글의 유튜브 영상처럼 크롬 공룡게임을 화면 반만큼 띄워두고 실행 시키면 된다. (컴퓨터에 설정된 해상도에 따라 약간의 위치 조정이 필요할 수 도있다.) 실행 후 장애물에 맞추어 스페이스바를 누르면서 게임을 진행하면 된다. 이때 게임은 낮과 밤이 교차하는 약 700~800점 근방까지만 실행하면 된다. 이제 q를 눌러 프로그램을 종료하면 dino.txt라는 파일로 학습 데이터가 저장될 것이다. 

아래는 파일의 일부분이다.

반응형
0,0,0,0,0,0,0
0,0,0,0,0,0,0
559,0,0,0,0,0,0
515,0,0,0,0,0,0
471,0,0,0,0,0,0
425,0,0,0,0,0,0
380,0,0,0,0,0,0
335,0,0,0,0,0,0
290,0,0,0,0,0,0
244,0,0,0,0,0,0
199,0,0,0,0,0,0
155,0,0,0,0,0,1
111,0,0,0,0,0,1
66,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,563,134,0
0,0,511,131,0,0,0
0,0,461,131,0,0,0
0,0,0,0,412,134,0
0,0,0,0,362,134,0
0,0,311,139,0,0,0
0,0,252,139,0,0,0
0,0,0,0,204,142,1
0,0,0,0,154,142,1
0,0,114,139,0,0,1
0,0,64,139,0,0,0
0,0,0,0,4,142,0
0,0,0,0,0,0,0
0,595,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0
0,0,0,0,0,0,0

이 파일의 이름을 변경해 dino.csv로 확장자 명을 바꾸어 같은 위치에 저장하면 된다.

 

반응형
    # 테스트용