Colorindo a Antiga Porto Alegre com #DeOldify

Source: Deep Learning on Medium

Colorindo a Antiga Porto Alegre com #DeOldify

Gasômetro em pleno funcionamento, visto do Guaíba em 1969. Fonte

Colorização de fotografias antigas é um problema importante, inclusive com relevância comercial (vide seriado “Segunda Guerra em Cores”, disponível na Netflix). Entretanto, se efetuada à mão e dependendo do nível de detalhe da fotografia, ela pode acarretar num processo longo e complicado. Esse trabalho pode ser simplificado por algoritmos de coloração que completam o serviço a partir de pequenas “dicas” do usuário, que se responsabiliza por indicar a cor de algumas regiões manualmente. Mesmo que técnicas tradicionais de coloração digital sejam capazes de delimitar automaticamente as regiões que serão coloridas, não é possível fugir da necessidade de recorrer a input humano para identificar qual cor será pintada em cada região. Isso porque esse conhecimento, além de empírico, é muito vasto e portanto não está ao alcance dos algoritmos modernos. Certo?

Há 5 anos, responderíamos essa pergunta com um estrondoso e definitivo “sim”. Entretanto, o panorama da tecnologia foi transformado durante a última década e permanece sendo continuamente reinventado devido ao advento do Deep Learning. Situado dentro da área de estudo de Machine Learning (aprendizado de máquina), que se encarrega do estudo de algoritmos que aprendem a resolver problemas a partir de exemplos, deep learning se refere ao desenvolvimento destes algoritmos por meio de redes neurais artificiais — modelos matemáticos vagamente inspirados no funcionamento de redes neurais biológicas.

Essas redes neurais artificiais são “treinadas” a partir de uma vasta quantidade de exemplos, e são capazes de reter o conhecimento empírico que nós, humanos, capturamos tão bem. Essas redes são definidas por um número gigantesco de parâmetros. Cada combinação de parâmetros produz um resultado potencialmente diferente, e resultados teóricos garantem que, respeitadas algumas condições, existe pelo menos uma combinação de parâmetros capaz de produzir uma rede que soluciona o problema. O treinamento consiste em definir uma função de erro, ou loss, que penaliza os erros do modelo, e calibrar os parâmetros iteradamente até que a loss se torne suficentemente pequena.

No nosso caso específico, os exemplos correspondem a centenas de milhares de pares de imagens. Cada par é produzido a partir da decomposição de uma imagem colorida qualquer na sua luminância (isto é, a sua versão preto-e-branco) e apenas as suas cores.

À esquerda, a luminância da imagem. À direita, o mapa de cores (matiz e saturação) produzido pelo algoritmo.

O objetivo da rede é aprender um mapeamento entre a primeira e a segunda imagem, ou seja: ser capaz de produzir, a partir de uma imagem em preto-e-branco, uma camada adicional de cores a ser sobreposta a ela de modo a produzir uma imagem colorida. Guardadas as devidas proporções, isso corresponde a aprender as pinceladas de tinta que um artista sobreporia à fotografia original num processo artesanal de coloração. A maneira mais direta e intuitiva de treinar uma rede com esse objetivo é usando uma “loss perceptual”, ou seja, uma função de erro que penaliza a diferença entre o valor real e o valor produzido pela rede na cor de cada pixel da imagem. Infelizmente, essa penalização não é suficiente para resolver o problema, e é fácil de entender o porquê. Algumas imagens podem admitir múltiplas respostas (por exemplo, um fusca pode ser pintado tanto de azul quanto de vermelho, desde que seja bem colorizado), mas a loss perceptual enviesa o modelo para uma única. Um modelo treinado com X fotos de fuscas azuis e X fotos de fuscas vermelhos será penalizado ao desviar tanto da cor azul quanto da vermelha, e portanto optará por chutar uma cor no meio do caminho, com tom roxo. Quando usamos loss perceptual, a rede acaba aprendendo a usar esse tipo de estratégia num nível muito maior, abrangendo todas as classes de objetos, e acaba chutando de maneira predominante a cor verde, que por estar no ponto médio do espectro de cores, estatisticamente mantém o erro numa faixa moderada — porém ainda insuficiente para resolver o problema.

O modelo #DeOldify, proposto por Jason Antic, ataca o problema usando treinamento adversário, uma técnica poderosa usada em muitos modelos generativos. Já que a loss perceptual não funciona tão bem, a ideia é propor uma loss de mais alto nível, algo que poderia ser chamado de loss “conceitual”. Ao invés de penalizarmos as diferenças no nível da percepção visual (pixels), vamos penalizar as diferenças no nível da conceitualização da imagem (carros, edifícios, cachorros, etc). Infelizmente não existe nenhuma operação simples capaz de conceitualizar imagens nesse nível abstrato, mas é aí que as redes neurais oferecem ajuda mais uma vez: podemos treinar um segundo modelo para atuar como função de loss. O propósito desse modelo, chamado discriminante, seria separar imagens coloridas autênticas de imagens coloridas por um algoritmo. Se tivermos esse modelo à disposição, podemos usá-lo para treinar o modelo generativo, cujo novo objetivo seria “enganar” o discriminante, ou seja, produzir imagens tão indistinguíveis quanto possível de imagens autênticas. Na prática, ambos os modelos são treinados juntos, com propósitos opostos: o discriminante é treinado para “denunciar” imagens produzidas pelo gerador, enquanto o gerador é treinado para enganar o discriminante. Ao longo do tempo, a competição rende bons resultados, e o gerador aprende a produzir colorações verossímeis. O #DeOldify implementa alguns truques adicionais, treinando ambas as redes de maneira separada antes de dar início ao treinamento adversário, que é bastante custoso computacionalmente pois precisa ser rodado por um número suficientemente alto de iterações para que ambos os modelos atinjam um ponto de equilíbrio.

A título de experimento, produzi colorações de dezenas de imagens em preto-e-branco da antiga Porto Alegre (décadas 1920–1970) usando o #DeOldify, produzindo resultados muito satisfatórios. Por exemplo, essa fotografia do Arroio Dilúvio ainda limpo e banhável:

Arroio Dilúvio limpo. Fonte: http://g1.globo.com/rs/rio-grande-do-sul/noticia/2016/03/g1-compara-mudanca-ao-longo-dos-anos-de-cinco-locais-de-porto-alegre.html

Ou ainda, a Praça da Matriz nas décadas de 1910 e 1920: