Conteúdo deste notebook:
"""
Define uma folha de estilos pro notebook
"""
from IPython.core.display import HTML
def css_styling():
styles = "<style>" + open("./estilos.css", "r").read() + "</style>"
return HTML(styles)
css_styling()
Este é um projeto para a disciplina de Aprendizado de Máquina do DCC/UFMG em 2021/1, ministrada por Adriano Veloso. O objetivo é estudar o uso de algoritmos de aprendizado para a geração de conteúdo procedural para jogos. Neste momento, focou-se em imagens de personagens em pixel art.
Foi usado o dataset TinyHero, que é composto por $3648$ arquivos de imagem $(64, 64, 4)$ divididos em $4$ classes, cada uma representando uma direção para onde o personagem está virado.
Os estudos desenvolvidos neste projeto contemplaram uso de redes convolucionais para classificação, geração de novas imagens usando redes adversariais convolucionais e a geração da pose de um personagem (direita) dada apenas uma única imagem em outra pose (de frente). Também foi feita uma rotina para extrair mais imagens (além do TinyHero) a partir do software RPG Maker 2000.
O que foi desenvolvido:
Este notebook mostra apenas os principais resultados.
O notebook 00-pick-images-from-rpgmaker.ipynb contém o código para gerar um novo dataset de imagens de personagens em pixel art em $4$ direções. Foram geradas $96$ imagens de $(64, 64, 4)$ divididas nas $4$ classes.
Esse minidataset foi gerado para avaliar o classificador de poses que foi treinado apenas com os dados do dataset TinyHero pra verificar o impacto de ter uma distribuição de dados distinta do momento de teste e do de validação. E o resultado foi terrível, conforme esperado :). Isso será descrito no próximo experimento.
Veja o notebook 01-pose-classifier-cnn.ipynb para ver a implementação. Neste experimento foi desenvolvido um classificador CNN para estimar a pose da imagem de um personagem. A rede gerada possui a seguinte arquitetura:
Há 2 sequências de convolução e max pooling, seguidas de duas camadas totalmente conectadas. A última tem ativação softmax com 4 saídas e indica a confiança do modelo na classificação de cada exemplo quanto às 4 classes (costas, esquerda, frente, direita). Ao todo foram menos de $25.000$ parâmetros treináveis.
O treinamento e validação foram feitos no dataset TinyHero em proporção 80/20%:
Em apenas 10 épocas a rede foi capaz de atingir acurácia bem próxima de $100%$ no dataset TinyHero, com o qual foi treinada:
Como um pequeno teste, após ter sido treinada em TinyHero, a rede foi avaliada para classificar o minidataset gerado pela coleta de imagens do RPG Maker 2000 (descrito no passo anterior). Ele possui apenas $96$ imagens e, apesar de ter sido fornecido à rede com um formato idêntico ao TinyHero $(64, 64, 4)$, originalmente suas imagens tinham $(32, 24, 4)$. Além disso, o estilo artístico é um pouco diferente se comparado ao TinyHero.
Ao fazer a previsão das $96$ imagens quanto a suas poses, os resultados não foram satisfatórios:
Tanto os exemplos de previsão quanto a matriz de confusão dão ideia dos acertos e erros do classificador nesse dataset.
Isso é explicado pelo fato de que a distribuição das imagens no conjunto de treinamento foi radicalmente diferente da distribuição nesse teste com outro dataset.
Ainda assim, é interessante notar que houve vários acertos apesar do classificador nunca ter visto nenhuma das imagens do RPG Maker.
Em casos assim, é importante:
O terceiro experimento pode ser visto no notebook 02-generate-new-sprite.ipynb. O objetivo foi de treinar uma DCGAN no conjunto de dados TinyHero para gerar novas imagens de personagens em pixel art nessas $4$ direções.
A rede generativa adversarial convolucional profunda (DCGAN) é dividida em uma rede geradora e outra discriminativa que competem e evoluem em prol de possibilitar que a geradora consiga produzir imagens semelhantes às do treinamento.
Ambas redes foram relativamente rasas, com ~3 camadas e foram treinadas ao longo de $250$ épocas. Os resultados não foram muito satisfatórios, conforme pode ser visto no resultado final:
Do ponto de vista da competição entre gerador e discriminador, seus erros ao longo das épocas evoluíram da seguinte forma:
Tanto a arquitetura quanto hiperparâmetros de otimização e inicialização de pesos podem ser experimentados e acredita-se que existam hipóteses de modelos que fornecerão resultados melhores.
Além disso, com a DCGAN vanilla não é possível definir qual classe de imagem se deseja gerar. Para tanto, foram propostas as conditional GANs justamente para fornecer um controle de qual classe será gerada.
O quarto e último experimento foi feito no notebook 03-side2side.ipynb. Nele o objetivo foi de usar uma conditional DCGAN para, dada a imagem de um personagem em uma pose, gerar a sua imagem em outra das 3 poses restantes.
Para isso foi usada a arquitetura de redes geradoras Pix2Pix (Isola et al. 2017) com algumas adaptações.
Assim como os demais experimentos, foi usado do dataset TinyHero configurado de forma a
estabelecer pares de imagens de personagens na pose frente
para direita
:
A rede geradora foi construída baseada no modelo U-net que reduz a dimensionalidade espacial da entrada até $(1, 1)$ e depois a reconstrói até o tamanho original, usando skip connections entre as camadas de redução e as de aumento.
Já a rede discriminadora é uma CNN que classifica por patches de $(30, 30)$ da entrada, conforme previsto pela arquitetura Pix2Pix.
O treinamento foi feito ao longo de $100.000$ passos de processamento de batch (de tamanho $1$) e os resultados foram bem positivos:
É interessante notar, nesse exemplo, que apenas olhando a imagem de entrada do personagem, não é possível inferir que ele possui cabelo, nem a presença e cor dos olhos. Mas a rede foi capaz de inferir esses detalhes possivelmente a partir de exemplos de outros personagens com os quais treinou.
Mais exemplos:
Neste último é interessante notar que a imagem gerada está mais correta do que a esperada (!!). Nitidamente,
no dataset TinyHero as poses direita
e esquerda
são um simples espelhamento no eixo Y. Contudo, em
personagens sem simetria por esse eixo, o dataset provê a pose direita
ou esquerda
incorreta. E a
rede foi capaz de gerar uma imagem mais correta do que o próprio rótulo.