텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #1 - 템플릿 매칭
머신러닝, 딥러닝

텐서플로우, 케라스로 크롬 공룡게임 AI 만들기 #1 - 템플릿 매칭

반응형

 

 

최근 딥러닝을 공부하면서 가장 처음 만든 모델을 공유하고자 한다. 바로 인터넷 연결이 안될때 즐길수 있는 크롬 브라우저의 공룡게임을 머신러닝으로 학습시켜 제작한 AI이다.

전에 제작한 2018/03/02 - [아두이노/프로젝트] - 아두이노 크롬 공룡게임 자동 플레이 의 AI 버전이라고 생각하면 편하다.

 

이미 모델은 완성되었지만 3단계 정도로 나누어 개발과정을 소개하고자 한다. 만약 완성된 코드가 궁금하다면 필자의 깃허브 링크 https://github.com/Hydragon516/Deep-Learning-Google-Chrome-Dinosaur-Game 에 전체 코드들과 모델 데이터, 실행방법 등을 확인할 수 있다.

 

 

(필자의 딥러닝에 대한 지식은 "모두의 딥러닝"이라는 좋은 입문서의 내용이 전부라서 초보자나 다름없다.)

 

처음 크롬 공룡게임 AI를 계획하고 나서 하고자 한 것은 게임내 데이터를 수집하는 것이다. 알다시피 크롬 공룡게임에는 선인장과 새(또는 익룡) 2가지 장애물이 존재한다. 이 두가지의 장애물의 위치 정보를 받는 것이 첫 과제였다. (물론 장애물의 위치를 알면 타이밍을 맞추어 스페이스바를 누르는 단순 코딩도 가능하기는 하지만 2018/03/02 - [아두이노/프로젝트] - 아두이노 크롬 공룡게임 자동 플레이 에서 다루기도 했고, 목표는 딥러닝이기 때문에 다루지 않겠다.)

 

OpenCV에서 이미지속에 포함된 특정 이미지를 검출하는 방법은 템플릿 매칭을 이용하는 것이다. 대조할 이미지를 일일이 대조하는 약간 무식한 방법이기는 하지만 확실하고 편한 방법이기도 하다. 관련 내용은 https://opencv-python.readthedocs.io/en/latest/doc/24.imageTemplateMatch/imageTemplateMatch.html 를 참고했다.

 

 

 

 

 

 

대조할 이미지는 크게 위의 4가지를 이용했다. 선인장은 여러개가 모여있는 경우도 있지만 가장 앞에 나오는 선인장만 인식할 수 있으면 되기에 위와 같이 선정했다. 새는 날개를 올리고있는 경우 내리고 있는경우 2가지 상태가 존재한다.

 

작성한 코드는 아래와 같다.

import cv2 as cv
import numpy as np

img_rgb = cv.imread('images/test.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)

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 = template2.shape[::-1]
w3, h3 = template3.shape[::-1]
w4, h4 = template4.shape[::-1]

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(res1 >= threshold)
loc4 = np.where(res2 >= threshold)

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

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

for pt in zip(*loc1[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w3, pt[1] + h3), (0, 0, 255), 2)

for pt in zip(*loc2[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w4, pt[1] + h4), (0, 255, 0), 2)

cv.imshow('result', img_rgb)
cv.waitKey(0)

 

필자의 깃허브 페이지 https://github.com/Hydragon516/Deep-Learning-Google-Chrome-Dinosaur-Game에서 다운받아 실행시키는 것이 편하다. (templet.py)

반응형
 

GitHub - Hydragon516/Deep-Learning-Google-Chrome-Dinosaur-Game: Train and make Google chrome dinosaur game AI with tensorflow.

Train and make Google chrome dinosaur game AI with tensorflow. - GitHub - Hydragon516/Deep-Learning-Google-Chrome-Dinosaur-Game: Train and make Google chrome dinosaur game AI with tensorflow.

github.com

 

 

 

테스트 이미지는 위의 이미지를 이용했다. 실행 결과는 아래와 같다.

 

 

선인장의 위치를 잘 찾는다. 이제 다음 글에서 각 장애물의 위치를 찾고 이 좌표 데이터를 이용해 머신러닝으로 학습하는 과정을 다루겠다.

 

반응형
    # 테스트용