Возможно ли использование Image Recognition (CNN) для воспроизведения Flappy Bird?(Нет Q обучения или генетического алгоритма или чего-либо еще) - PullRequest
0 голосов
/ 14 июня 2019

Это мой первый пост, и все, что я знаю, самоучка, поэтому я заранее прошу прощения за любые ошибки, которые я делаю.Дайте мне знать, если есть еще вещи, которые мне нужно включить.* * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1003* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.0,9874 в соотв. И 0,99 вэл.При тестировании модели птица в большинстве случаев стучится в трубу, всего за несколько попыток, когда она получает 2 балла перед смертью.

Можно ли использовать только распознавание изображений для обучения агентаЧто ж?(подробности ниже)

Обучены следующим данным: (изображение, [1,0]) (изображение, [0,1]).,.

Где [1,0] - прыжок, а [0,1] - ничего не делать.

Обучено на 10 000 изображений (8000 из которых увеличены) и проверено на 6000 (4800 -дополнено), получая следующие результаты:

Epoch 50/50 10081/10081 [===================================] - 63s 6 мс / шаг - потеря: 0,0527 - в соотв. 0,9874 - val_loss: 0,0176 - val_acc: 0,9954

from keras.models import load_model
from grabscreen import grab_screen
import cv2
import time
from directkeys import PressKey,ReleaseKey, Space
from getkeys import key_check
import numpy as np
import time


model = load_model('models/flappy_model_4_hl_2fcl_5aug_shuff_50epoch_287.h5')

def jump():
    PressKey(Space)
    ReleaseKey(Space)

def main():
    last_time = time.time()
    #countdown
    for i in list(range(4))[::-1]:
        print(i+1)
        time.sleep(1)

    paused = False

    screen = grab_screen(region=(0,200,600,800))
    screen = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)
    prev = cv2.resize(screen, (150,250))

    while True:

        if not paused:
            screen = grab_screen(region=(0,200,600,800))
            screen = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)

            #last_time = time.time()
            screen = cv2.resize(screen, (150,250))
            screen = [[screen]]
            #print(np.shape(screen))

            prediction = model.predict(screen)[0]
            prediction = np.around(prediction)
            prediction = prediction[0]
            print(prediction)

            last_time = time.time()
            if prediction == 1:
                jump()
                time.sleep(0.2)
                #print('Jump')

            #print('Loop took: ' + str(time.time() - last_time))
        keys = key_check()

        # pause agent
        if 'T' in keys:
            if paused:
                paused = False
                time.sleep(1)
            else:
                paused = True
                ReleaseKey(Space)
                time.sleep(1)

main()

Я ожидал, что агент будет прав примерно в 98% случаев, поэтому он должен достичьхотя бы оценка выше 2, но этого не происходит.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Звучит очень круто и похоже на то, что SethBling сделал для MarI / O.Если вы использовали модель для обучения на основе распознавания препятствий в отображаемых пикселях и достижения цели с наивысшей оценкой, я думаю, что в конечном итоге возможно достичь целевой оценки.

Демонстрация видео: https://www.youtube.com/watch?v=qv6UVOQ0F44

Исходный код: https://pastebin.com/ZZmSNaHX

-- MarI/O by SethBling
-- Feel free to use this code, but please do not redistribute it.
-- Intended for use with the BizHawk emulator and Super Mario World or Super Mario Bros. ROM.
-- For SMW, make sure you have a save state named "DP1.state" at the beginning of a level,
-- and put a copy in both the Lua folder and the root directory of BizHawk.
0 голосов
/ 14 июня 2019

Интересная идея. Я понятия не имею, как работает дряблая птица, но позвольте мне задать вам вопрос: если бы вы, как умный человек, посмотрели на один кадр, созданный игрой, вы бы могли понять, что вы должны или не должны ударить ПРОБЕЛ? Достаточно ли этой информации или вам нужно знать больше контекстной информации? Если этого достаточно, то при достаточно большом тренировочном наборе вы, вероятно, получите разумный результат.

Обратите внимание, что точность 98% не значит много. Например, если эти данные сильно взвешены до 0 (ничего не делать), т. Е. Ничего не делать правильный ответ 90% времени, то ваша модель узнает, что простой вывод 0 100% времени сделает ее Точность 90%. Вам нужно посмотреть на другие метрики, чтобы понять, насколько хорошо работает модель (матрицы путаницы, точный вызов, кривые ROC, AUC) и т. Д.

Если вы обнаружили дисбаланс, вам нужна стратегия для балансировки данных обучения, таких как взвешивание класса или повышение частоты дискретизации в отдельном классе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...