Aprendizagem de Máquina é Divertido! Parte 7

Abusando de Redes Adversárias Geradoras para Produzir Arte de 8-bits

Josenildo Costa da Silva
Machina Sapiens
12 min readSep 18, 2018

--

Nota do Tradutor: Este post é uma tradução de um artigo por Adam Geitgey, de uma série de artigos originalmente em inglês. Leia a série completa original: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, Part 7 e Part 8!

Você pode ler em português a Parte 1, Parte 2, Parte 3, Parte 4, Parte 5, Parte 6, Parte 7 e Parte 8.

Modelos geradores (generative models) são utilizados para gerar dados, tais como foto, filmes ou música, através do computador.

Há poucos anos, Alec Radford publicou um artigo (baseado no trabalho de Ian Goodfellow) que mudou a forma de se pensar sobre a construção de modelos geradores com aprendizagem de máquina. A nova abordagem é chamada Redes Adversarias Geradoras Convolucionais Profundas, RAGCPs (Deep Convolutional Generative Adversarial Networks, DCGANs).

RAGCPs são capazes de gerar imagens originais fotorealísticas utilizando uma combinação intrincada de duas redes neurais profundas que competem entre si. As imagens abaixo foram todas geradas por uma RAGCP:

Imagens do artigo original de Alec Radford’s sobre RAGCP

Pesquisadores da área de IA consideram que modelos geradores são importantes porque prometem ser um ponto fundamental para construção de sistemas que podem consumir dados brutos do mundo real e construir compreensão a partir destes automaticamente.

Mas vamos utilizar modelos geradores para fazer algo mais fútil — fazer arte para video games de 8 bits!

Toda a arte nesta fase deste game foi gerada por computador.

O Objetivo dos Modelos Geradores

Mas por quê exatamente os pesquisadores em IA estão construindo sistemas complexos para gerar imagens deformadas de quartos?

A ideia principal é que se você pode gerar imagens de alguma coisa, você deve tem alguma compreesão desta coisa.

Veja esta imagem:

Um cão. Mais especificamente meu cachorro (de Adam Geitgei).

Instantâneamente você sabe que é a imagem de um cachorro — uma coisa peluda com quatro patas e um rabo. Mas para o computador, a imagem é apenas uma grade de números representando a cor de cada pixel. O computador não possui uma compreensão de que a imagem representa um conceito.

Mas imagine agora que nós mostramos milhares de imagens de cães para o computador e que, após ser exposto a estas imagens, o computador é capaz de gerar novas imagens de cães por conta própria — incluindo diferentes raças de cães e imagens de vários ângulos diferentes. Talvez até pudéssemos pedir alguns tipos específicos de imagens, por exemplo “um beagle visto de lado”.

Se o computador for capaz de fazer isto e as imagens produzidas apresentarem o número correto de patas, rabos, orelhas, será uma prova de que o computador sabe quais partes compõe um “cachorro” mesmo que não se tenha dito isto explicitamente. Então, de certo modo, um bom modelo gerador é uma prova de compreensão básica — pelo menos em nível pré-escolar.

É por isso que os pesquisadores estão tão entusiasmados com os modelos geradores. Eles parecem ser um modo de fazer computadores compreenderem conceitos de modo implícito. Isto é um grande passo em relação aos sistemas atuais que podem apenas aprender a partir de dados de treinamento que tenha sido cuidadosamente anotado previamente por humanos.

Mas se toda esta pesquisa resulta em programas que podem gerar imagens de cães, quantos anos mais temos que esperar até ter um calendário anual completo só de cachorro totalmente gerado por computador?

Sim, os robôs vão acabar tomando todos os nossos empregos.

E se podemos construir um programa que compreende cães, por que não fazer um programa que compreenda qualquer outra coisa? Que tal um programa que possa gerar um número ilimitado de fotos com pessoas apertando as mãos? Tenho certeza que alguém iria pagar por isso.

Bem… é uma péssima ideia para uma start-up de IA. Mas eu definitivamente já ouvi ideias piores, então … quem sabe?

Certo, talvez um programa que gere fotos comerciais de mal gosto não seja tão interessante. Mas dada a taxa de progresso na área de modelos geradores só nos últimos anos, quem sabe onde estaremos daqui a 5 ou 10 anos. O que acontecerá se alguém inventar um sistema que gere filmes inteiros? Ou música? Ou video games?

Se você olhar para daqui a 20 ou 30 anos e apertar bem os olhos, pode já imaginar um mundo onde o entretenimento poderia ser 100% gerado por máquina:

“Um dia estaremos conversando sobre os bons e velhos filmes “feitos à mão” já que o normal será assistir conteúdo (infinito) sob demanda gerado por IA. “ — Andrej Karpathy

A indústria dos jogos é a primeira área de entreternimento que começou a experimentar seriamente a utilização de conteúdo gerado por IA. Além da óbvia interseção entre jogos de computadores e aprendizagem de máquina, há um enorme incentivo para se investir na automação do desenvolvimento de games já que os video games modernos AAA chegam a ter orçamento superior a 300 milhões de dólares.

Ainda estamos nos primórdios dos modelos geradores baseado em aprendizagem de máquina e o seu uso prático ainda é muito restrito, mas dá para se divertir muito tentando coisas novas com eles. Vamos ver o que podemos fazer com um destes modelos.

Como Funcionam as RAGCPs

Para construir uma RAGCP precisamos criar duas redes neurais profundas. Depois colocamos as duas para lutarem entre si, tentando superar uma a outra em um ciclo sem fim. No processo, ambas se tornam mais fortes.

Digamos, por um momento, é um policial recém formado que está sendo treinado para identificar dinheiro falso. Sua tarefa é olhar para uma imagem e dizer se ela representa dinheiro verdadeiro.

Como estamos procurando por objetos em imagens, podemos utilizar uma Rede Neural Convolutiva para esta tarefa. Se você ainda não está familiarizado com Redes Convolutivas, leia um artigo anterior nesta série. Mas a ideia básica é que a rede neural que recebe uma imagem, faz o seu processamento através de várias camadas que podem reconhecer características cada vez mais complexas na imagem e, finalmente, produz como saída um único valor. Neste caso, a rede informa se a imagem contém ou não a representação de dinheiro verdadeiro.

Esta primeira rede neural é chamada de discriminador:

A rede discriminadora

Agora, suponha que a segunda rede neural é um aprendiz de falsificador de dinheiro. Para a segunda rede neural, vamos reverter as camadas de uma Rede Convolutiva normal para que tudo seja executado ao contrário. Assim, ao invés de receber uma imagem e produzir um valor, ela recebe uma lista de valores e produz uma imagem.

Esta segunda rede neural é chamada de gerador:

Uma rede geradora

Agora temos um policial (rede discriminadora) para tenta identificar dinheiro falso e um falsário (rede geradora) que imprime dinheiro falso. Que começe a batalha!

No primeiro round, o gerador vai criar falsificações grotescas que mal se parecem com dinheiro, pois ele ainda não sabe absolutamente nada sobre como dinheiro deve se parecer:

O gerador faz a primeira falsificação (grotesca)

Mas neste ponto, o discriminador é igualmente péssimo na tarefa de identificação, então ele não sabe a diferença:

O discriminador diz que a falsificação é uma nota verdadeira!

Neste ponto, intervimos no processo e informamos ao discriminador que esta nota é falsa. Em seguida mostramos uma nota verdadeira e pedimos para ele descobrir as diferenças entre ambas. O discriminador encontra alguns detalhes que o ajudam a separar notas reais das falsas.

Por exemplo, o discriminador pode perceber que em dinheiro real existe um rosto de pessoa e em dinheiro falso não existe. Com este conhecimento, o discriminador aprende como diferenciar notas falsas das reais. E com isto, ele se torna um pouco melhor na sua tarefa:

O discriminador melhora! Agora ele já identifica as falsificações realmente ruins.

Hora do segundo round. Informamos ao gerador que suas imagens estão sendo rejeitadas e que ele tem que melhorar suas falsificações. Também dizemos que o discriminador agora está procurando faces e, por isso, a melhor maneira de confundir o discriminador é colocar uma face nas notas falsas:

O gerador faz uma melhoria na sua produção de notas falsas

As notas falsas voltam a serem aceitas novamente! Agora o discriminador tem que procurar novas características que o ajudem a separar as notas falsas das verdadeiras.

Este jogo entre as duas redes continua milhares de rounds até que ambas sejam experts. Ao fim do processo, o gerador estará produzindo falsificações quase perfeitas e o discriminador terá se tornado em um mestre detetive capaz de identifica mesmo os menores erros nas falsificações.

Assim que as redes estejam suficientemente tão bem treinadas que humanos possam se impressionar com as imagens falsas, podemos utilizar tais imagens para qualquer propósito que desejarmos.

Aplicando RGACPs à Video Games

Já sabemos como RGACPs funcionam, vamos ver se podemos usá-las para criar arte para video games no estilo dos anos 1980.

Vamos construir uma RGACP que tenta produzir imagens para video games da Nintendo Entretainment System (NES) a partir de capturas de telas de games.

A ideia é que se pudermos gerar telas com elementos visuais dos video games, poderíamos copiar e colar pedaços destas telas geradas e utilizar em nosso próprio video game estilo retrô. Como as imagens geradas são de games que nunca existiram, isto não vai nem mesmo ser um roubo (talvez … voltaremos a esta questão mais tarde).

Arte para video games naquela época era muito simples. Como o NES tinha muito pouca memória (os games utilizavam muito menos memória que a utilizada por este artigo!) os programadores tinham que utilizar vários truques para fazer a arte visual do game caber na memória. Para maximizar o espaço limitado, os jogos utilizavam recortes gráficos pequenos que eram utilizados para construir todas as telas a partir de uns poucos recortes repetidos (geralmente de 16x16 pixels).

Por exemplo, a tela inicial de ‘The Legend of Zelda’ é construida a partir de apenas 8 recortes únicos:

Aqui, uma amostra dos recortes para toda o mapa de ‘The Legend of Zelda’:

Algumas vezes as cores são trocadas para que áreas diversas pareçam diferentes, mas é só isso.

Nosso objetivo é criar uma folha de recortes similar para nosso game. Devido a isto, não estamos realmente preocupados se as telas geradas são completamente realísticas. Ao invés disso, estamos interessados apenas nos formatos e padrões que possamos utilizar como recortes de 16x16 no nosso game — coisas como pedras, água, pontes, etc. A partir deles, iremos construir nossas próprias fases do game no estilo 8 bits.

Obtendo Dados para Treinamento

Para treinar nosso sistema, precisamos de uma quantidade enorme de dados. Felizmente, existem mais de 700 jogos para o NES à nossa disposição.

Eu utilizei o wget para baixar todos as capturas de tela dos jogos NES a partir do The Video Game Museum website (me descupem por raspar o site de vocês!). Após alguns minutos eu já havia baixado mais de 10 mil capturas de telas de jogos NES:

Uma pequena amostra das 10 mil capturas de tela que compoem nosso conjunto de dados

Atualmente, RGACPs só conseguem trabalhar com imagens pequenas — quadrados de 256 pixels mais ou menos. Mas a resolução de tela do NES era de apenas 256 x 224 pixels, portanto, isso não será um problema. Para tornar as coisas ainda mais simples, eu reduzi cada tela capturada para um quadrado de 224 pixels.

Configurando a RGACP

Há muitas implementações RGACPs de código aberto no github que você pode tentar. Eu utilizei a Tensorflow implementation de Taehoon Kim. Como as RGACPs são não-supervisionadas, tudo que você precisa fazer é colocar os dados em uma pasta, ajustar os parâmetros básicos, iniciar o treinamento e aguardar para ver os resultados que conseguimos.

Abaixo, uma amostra visual dos dados originais de treinamento:

Agora, podemos iniciar o treinamento. Inicialmente, a saída do gerador é ruido apenas. Mas lentamente, ele começa a apresentar resultados melhores:

Depois de muitas iterações de treinamento, as imagens começam a parecer uma versão pesadelo dos jogos clássicos da Nintendo:

Continuando o treinamento, os primeiros tijolos e blocos começam a aparecer. Pode-se ver também elementos de tela tais como barras de vida e até algum texto:

Aqui é que as coisas se complicam. Como dizer que o computador está gerando arte completamente nova e não apenas reutilizando arte diretamente das imagens de treinamento? Em duas das imagens acima, pode-se ver claramente o menu do Super Mario Bros. 3 e o cabeçalho e tijolos do Super Mario original.

Vomitar dados de treinamento é algo que pode acontecer. Ao se usar uma base de treinamento grande e com treinamento muito curto, podemos tentar reduzir a chance disto ocorrer. Mas é uma questão espinhosa e ainda é tema de pesquisa atualmente.

Como nosso objetivo aqui é estético, mexi no modelo até que ele produzisse arte que me parecesse original. Mas não posso provar que a arte gerada é totalmente original, exceto fazendo uma busca nos dados de treinamnto e verificando que lá não há nada similar.

Com algumas horas de treinamnto, as imagens geradas continham recortes de 16x16 que me pareceram bacanas. Eu estava procurando por variações de blocos de pedra, padrões de tijolos, padrões de água, arbustos, e recortes de cenário geral que tivesse atmosfera mal-assombrada.

Em seguida é necessário pré-processar as imagens geradas para ter certeza que eles utilizem apenas as 64 cores disponível no NES:

O Nintendo original só conseguia reproduzir estas 64 cores. Tecnicamente há apenas 54 cores únicas, pois algumas delas são duplicadas.

Abri então as imagens geradas no Tiled Map Editor. A partir dele, pude facilmente pegar os recortes 16x16 que correspondiam à estética que me interessava:

Os recortes que eu escolhi a partir da telas geradas

No Tiled Map Editor, eu organizei os recortes 16x16 em um layout de nível que lembrasse uma fase do jogo ‘Castlevania’:

Para mim, parece bom! Não esqueça que eu não modifiquei nada com um editor de imagens. Cada recorte veio direto do modelo RAGCP.

Vamos adicionar os principais personagens e alguns inimigo de ‘Castlevania’ para ver como esta fase ficaria na prática:

Para um efeito completo, vamos ver como ficaria a fase com os elementos internos do jogo com o menu adicionado:

Tããããão assustadooooor

Eu acho que está parecido com os jogos NES que eu lembro! Não estou dizendo que é a melhor arte NES já criada, mas certamente não é a pior:

The Cheetahmen não é um bom jogo.

É só isso?

Eu fico realmente excitado com modelos geradores como este. Acho facinante a ideia de um dia podermos gerar arte sem fim em computadores. Mas quando falo com outras pessoas sobre isto, algumas vezes as pessoas dizem: “é só isso? está muito básico.”

Há certamente muito exagero em torno de modelos geradores atualmente. RAGs já estão sendo chamadas de o futuro da IA, apesar de serem notoriamente difíceis de treinar e limitadas a gerar imagens muito pequenas. De fato, atualmente os melhores modelos podem gerar apenas imagens de cães mutantes do tamanho de um selo postal:

Um monstro de um pesadelo! Imagem de um artigo Tutorial do Ian Goodfellow sobre RAGs

Há alguns anos, porém, não podíamos fazer absolutamente nada parecido com isto. Na época, ficamos bastante excitados com imagens geradas parecidas com esta:

É uma bicicleta! Eu juro!

A tecnologia está melhorando a cada dia. Aqui um exemplo de um artigo aleatório, publicado à época da escrita deste post, que utiliza RAGs para envelhecer o rosto de uma pessoa:

Imagem do artigo “Face Aging With Conditional Generative Adversarial Networks

Se as coisas continuarem neste rítimo, não irá demorar muito até que os modelos geradores se tornem uma ferramenta popular de criação. É um ótimo momento para começar a experimentar!

Continue aprendendo

Se você quiser aprender em maior profundidade sobre os modelos geradores de RAGCPs, aqui estão algumas indicações de material de estudo (todos em inglês):

Nota do autor: Se você gostou deste artigo, considere assinar a minha lista de emails Machine Learning is Fun! Só irei enviar mensagens quando eu tiver alguma coisa nova e interessante para compartilhar. Esta é a melhor maneira de ficar sabendo quando eu escrever mais artigos iguais a este.

Você pode me seguir no Twitter em @ageitgey, me enviar email diretamente ou me encontrar no linkedin. Eu vou adorar poder ajudá-lo ou a sua equipe com aprendizagem de máquina.

--

--