Aprendizagem por Reforço com FIFA e Keras

Lezwon Castellino Blocked Desbloquear Seguir Seguindo 11 de setembro de 2018

Recentemente me deparei com um artigo interessante de Chintan Trivedi sobre o treinamento de um modelo via reforço de aprendizagem para dar chutes livres na FIFA. Intrigado com isso, decidi experimentá-lo. Infelizmente, a sessão de habilidades de chute livre não foi desbloqueada na minha nova cópia instalada da FIFA ainda, no entanto, as fotos da prática estavam disponíveis. Animado, experimentei o modelo na habilidade de atirar. Depois de alguns minutos executando o código, percebi que o modelo não foi criado para o ambiente de filmagem. Eu, portanto, decidi passar algum tempo hackeando o código para torná-lo adequado ao ambiente. A seguir estão os resultados do modelo depois de treiná-lo por cerca de 100 épocas.

Fotos aleatórias tiradas pelo modelo durante o treinamento. Fotos tiradas pelo modelo após cerca de 100 épocas.

Eu gostaria de explicar alguns trechos do meu código para aqueles que desejam replicar o resultado ou melhorá-lo. Por favor, note que não sou especialista nesta área. Esta é uma das minhas tentativas iniciais de aprendizado por reforço.

Trending AI Articles:

1. Vamos construir uma rede neural simples!

2. Árvores de decisão no aprendizado de máquina

3. O equilíbrio da IA passiva vs. IA ativa

4. Uma introdução intuitiva ao Machine Learning

Eu recomendo que você leia o artigo de Chintan Trivedi e seus pré-requisitos para obter um contexto do projeto e também sobre o aprendizado de reforço em geral. Chintan fez um trabalho incrível explicando o código.

Então vamos começar. Primeiro de tudo, permita-me explicar o que estou tentando construir e por quê. Quando experimentei o repo da FIFA sobre a habilidade de tiro, achei muito difícil capturar um tiro (um evento de tiro) individualmente e obter seu resultado. Como não há API do FIFA, temos que trabalhar com os dados de imagem fornecidos. Quando eu executei o modelo fornecido por Chintan, a maioria das recompensas coletadas foi atribuída a ações incorretas, pois havia uma incompatibilidade de tempo. Além disso, o modelo atual não utilizou nenhuma camada temporal que pudesse ajudar a prever eventos que ocorrem em uma sequência. Para corrigir estes dois problemas, decidi capturar toda a sequência de habilidades de tirar fotos junto com as ações e alimentá-lo para uma rede neural com LSTMs. Um grande obstáculo que enfrentei aqui foi que enquanto treinava o modelo, eu poderia inserir uma sequência de imagens e uma sequência de ações esperadas, no entanto, ao prever ações em tempo real, precisamos inserir apenas uma imagem e obter uma saída. Esse foi um desafio muito confuso, pois o modelo foi construído para receber apenas insumos em lote. Eu explicarei este assunto mais tarde. Por enquanto, aqui está o modelo que criei com a API Keras.

Como você pode ver o modelo leva em uma seqüência de imagens (cerca de 30) na forma de (30, 256, 256, 3) e produz uma seqüência de ações da forma (30, 4). As 4 ações que são permitidas no jogo são mover para a direita, mover para a esquerda, tiro baixo e tiro alto. A rede neural prevê a probabilidade das ações das quais tomaremos as duas mais altas e executaremos. Eu adicionei um ConvLSTM2D camadas com MaxPooling3D seguido por TimeDistributed Dense Layers. Essas camadas ajudam a manter a forma da sequência e geram uma saída do mesmo tamanho.

Agora, também precisamos capturar os pontos e o texto para sabermos quando a habilidade terminou e qual foi a performance. Para isso, vamos usar a biblioteca Tesseract pelo Google. Tesseract é uma biblioteca de OCR para reconhecimento de texto pelo google. Por favor, siga as instruções aqui para usá-lo. Devemos usar a API PyTesseract para acessá-lo via python. Para detectar o texto na tela, devemos primeiro capturar a tela como uma imagem. Para isso, usamos a biblioteca GrabScreen e encontramos manualmente as coordenadas do texto dos pontos usando algo como pintura.

Imagem de pontos enviada ao PyTesseract

Depois de extrairmos a área de texto, precisamos pré-processar a imagem para que o pytesseract nos forneça bons resultados de reconhecimento de caracteres. Eu converti o plano de fundo para branco puro e os pontos de primeiro plano para preto usando numpy.

Pontuação captura código para FIFA

Também precisamos capturar a seção 'RETRY DRILL' para detectar se a sessão de habilidade terminou de maneira semelhante.

Sistema de recompensa

O modelo anterior utilizou o algoritmo DQN para prever a próxima ação. No entanto, sinto que só pode ser usado para ambientes em que temos controle total sobre o ambiente e podemos executar um evento por vez e receber seu resultado. Algo como o ambiente OpenAI Gym é perfeito para o DQN. Para o nosso caso, eu acabei de substituir o DQN por uma função de recompensa simples que diz que se o total de pontos após a habilidade for maior que 4000, recompense todas as ações nessa sequência com 1. Se os pontos forem menores que 3500, as ações recebem uma recompensa de -1. Usando esse método, oferecemos recompensas para todo o lote de ações, em vez de apenas uma ação.

Cálculo de recompensa para toda a sequência

Manipulando o modelo

Como mencionei anteriormente, temos um problema no qual treinamos nosso modelo em uma sequência, mas durante a previsão temos apenas 1 imagem para fornecer e esperar uma saída. Bem, nós lidamos com isso criando uma matriz dummy numérica de zeros com forma (30, 256, 256, 3). Quando desejamos prever uma ação, substituímos o último elemento da sequência numpy pela imagem, ou seja, zeros [timesteps-1] = imagem. Na sequência de saída, vamos escolher o último conjunto de ações, ou seja, ações [timesteps-1] e escolher duas ações com os valores mais altos. Eu entendo que isso não é uma solução perfeita. Eu mesmo não tinha certeza de usá-lo. No entanto, parece funcionar até certo ponto.

Vamos combinar tudo isso junto e começar a treinar nosso modelo. A seguir estão alguns dos parâmetros importantes que estou usando.

Começamos em nosso arquivo main.py, onde inicializamos nosso modelo e começamos o treinamento. O arquivo train.py contém o código principal de treinamento. Nosso modelo começa a tomar ações aleatórias no começo para aprender sobre o meio ambiente. Horas extras, o modelo aprende as ações necessárias para obter mais recompensas e começa a jogar sozinho. Todas as ações realizadas são armazenadas junto com suas capturas de tela e recompensas no arquivo ExperienceReplay.py . Quando for necessário treinar, um lote é solicitado a partir do ExperienceReplay.py e o modelo é treinado.

Todo o propósito do arquivo de repetição de experiência é armazenar todos os dados gravados e atribuir recompensas às ações. Quando solicitado para um lote, o módulo cria um par de entradas (imagens) e um conjunto de recompensas para as ações. O método get_batch seleciona 3 sequências aleatórias para treinar e acrescenta a recompensa a todas as ações nessa sequência.

O último módulo é o módulo da FIFA, que é a interface entre o modelo e o jogo. Ele nos ajuda a detectar a pontuação, verificar se a broca acabou, reiniciar a broca, obter o estado atual e, o mais importante, executar ações por meio do método ato. A função get_reward retorna 1 se a pontuação final estiver acima de 4000, 0 se acima de 3500 e -1 se for menor que 3500. O código é bastante autoexplicativo.

Para começar a treinar, inicie o FIFA em um modo de janela com resolução de 1280×720. Começará no canto superior esquerdo da tela. Não o mova de lá. Escolha jogos de habilidades -> tiro -> tiro de bronze. No train.py, alterne o modo train para 1 e execute-o dentro do python. Clique na janela do FIFA depois de terminar. o programa reconhecerá automaticamente a tela e começará a tocar. Treine até 100 épocas para ver alguns resultados. Seu desempenho aumentará de mais difícil para excelente.

Resultados durante épocas iniciaisResultados após 100 épocas

O código inteiro está disponível no Github . Por favor, forneça comentários ou sugestões de melhoria. Obrigado.

Não se esqueça de nos dar o seu ?!

Texto original em inglês.