Blog

Blog: Colorindo imagens com Deep Learning


Alguns meses atrás eu assisti ao filme They shall not grow old do diretor Peter Jackson, o mesmo que dirigiu “O Senhor dos Anéis”, e uma das coisas que me deixaram fascinado com o filme (e acredito que todos que o assistiram também sentiram isso) foi a técnica de coloração utilizada nos fragmentos de vídeos de mais de 100 anos atrás.

Para quem não viu ainda o filme e não faz ideia do que eu estou falando, o filme “They shall not grow old” retrata o período da primeira guerra mundial (1914) e em todo o filme foram utilizadas fotos e filmagens reais da época. Porém, todas as cenas foram restauradas e colorizadas, pois afinal naquela época todas as filmagens eram em preto e branco com câmeras que, apesar de excelentes para o período, eram de qualquer forma uma tecnologia de 100 anos atrás.

Resolvi então tentar entender como funcionava o processo de restauração e colorização das imagens em filmes e o como eles sabiam exatamente quais eram as cores originais.

Para minha surpresa, existe uma verdade inconveniente em relação a colorização de filmes: a escolha das cores a serem utilizadas são muito mais um exercício de pesquisa histórica do que de fato alguma técnica de ciência de dados. A maioria dos filmes e fotos colorizadas é muito mais um processo artístico de tentar escolher a melhor cor que se adeque a imagem e do que necessariamente acertar a real cor de determinado objeto ou peça de roupa. Elementos que eram na cor marrom, por exemplo, podem ser coloridos em vermelho dependendo da pesquisa feita e inclinação de escolha pelo editor da imagem.

Tendo em vista esse problema, resolvi pesquisar como isso poderia ser resolvido e automatizado com o uso de Machine Learning. Se alimentarmos um algoritmo com milhares de imagens de coisas, será que ele conseguiria colorir um objeto antigo ou foto em preto e branco?

Colorful Image Colorization

Um artigo muito interessante publicado por Zhang et al. intitulado de Colorful Image Colorization, explorou a aplicação de redes neurais para colorir imagens em tons de cinza. Os autores treinaram um modelo de Convolution Neural Networks (CNN) em mais de 1 milhão de imagens e conseguiram “enganar” 32% das pessoas através de um teste de turing, ao mostrar imagens pintadas pelo algoritmo e imagens reais com cor.

Uma implementação deste estudo também foi realizada por Adrian Rosebrock do site Pyimage search.

Vamos agora ver como podemos colorir imagens utilizando esta metodologia.

Os códigos para aplicação do modelo podem ser encontrados no site do Pyimage, no Github do autor Richard Zhang ou também em meu repositório do Github.

Com uma simples execução através da linha de comando é possível colorir qualquer imagem.

python bw2color_image.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --image images/cat.jpg

Testes preliminares

Na primeira tentativa, testei com uma imagem de paisagem disponibilizada no artigo de Zhang et al., para verificar se o modelo pré-treinado estava realmente funcionando. O resultado foi bem satisfatório.

Imagem de paisagem, disponibilizada no artigo do Zhang et al.

Em seguida testei com uma imagem do animal mais presente na internet, e fiquei realmente impressionado com a rapidez do modelo e fidelidade das cores.

Colorindo a imagem de um Gato.

Primeira Guerra

Satisfeito com os resultados da imagem da paisagem e do gato, resolvi testar de fato com imagens da Primeira Guerra, e o resultados foram bem interessantes.

Escolhi algumas imagens que ilustravam diferentes momentos da Guerra para ver como o modelo desempenhava em diferentes objetos e cenas.

Primeiro Teste. Soldados americanos que serviram na Primeira Guerra.

Nesta primeira imagem, vemos alguns soldados do exército americano. Podemos ver que o algoritmo conseguiu distinguir as pessoas do fundo e coloriu, o que aparentam ser árvores, no tom correto de verde. As vestes também seguem uma cor próxima do real, um tom marrom amarelado. Contudo, os tons de pele e detalhes das roupas não foram coloridos muito bem.

Segundo teste. Soldados almoçando durante a Primeira Guerra.

Nesta segunda imagem que retrata alguns soldados almoçando de forma descontraída, vemos que o algoritmo teve um desempenho melhor na coloração das roupas e também conseguiu extrair o fundo. Aparentemente os soldados estão em uma trincheira, com um barranco ao fundo. É possível ver alguns ramos de árvores e acredito que por isso o algoritmo coloriu com um verde forte.

Terceiro teste. Tanques de guerra em comboio.

Nesta terceira imagem vemos um arsenal de tanques de guerra em comboio para algum lugar. Fiquei realmente satisfeito com a performance do algoritmo nesta imagem. Conseguimos ver que ele coloriu corretamente o chão de grama e a cor dos tanques, além de identificar um céu aparentemente nublado.

Quarto teste. Bandeira americana ao fundo.

Nesta quarta imagem, apesar de claramente borrada e com as cores espaçadas, é possível ver que o algoritmo tentou acrescentar o tom avermelhado da bandeira americana e também coloriu o verde das plantas ao fundo de forma correta.

Logo abaixo alguns outros testes interessantes:

Under the hood

Mas final como isso realmente funciona? Este método conhecido como Convolutional Neural Networks (CNN) ou em português Rede Neural Convolucional, é uma classe de rede neural do tipo feed-forward, onde as imagens são convertidas em blocos menores permitindo um rápido processamento. No caso deste modelo em particular são utilizadas camadas conv, ReLU e seguidas por uma camada BatchNorm.

Esquema da CNN utilizada para identificar as cores das imagens.

Atualmente o método de CNN tem sido muito utilizado para reconhecimento de imagem. Quase todas as competições envolvendo imagens disponibilizadas no Kaggle.com possuem soluções engenhosas utilizando CNN. Este método também pode ser utilizado não apenas para imagens, mas também para a identificação de sons e voz, através da transformações dos espectros do som em imagens e em seguida aplicado a um modelo de CNN.

Basicamente as imagens são transformadas em valores numéricos e em seguida passam por transformações ou “convoluções” que fazem a identificação de padrões nas imagens.

Imagem retirada do curso de CNN da deeplearning.ai

O algoritmo identifica os objetos na imagem e aplica as cores. Nos testes realizados foi utilizado um modelo pré-treinado disponibilizado pelo próprio autor Richard Zhang:

colorization_release_v2.caffemodel

É possível utilizar dados próprios para treinar o modelo seguindo as orientações no Github do Richard Zhang. Certamente se for utilizado mais imagens para treinamento do modelo, a precisão na coloração das imagens tende a melhorar.

Conclusões

Apesar de possuir algumas limitações, este modelo mostra o potencial que a utilização de machine learning e especialmente a técnica de CNN pode trazer para diversas áreas. A possibilidade de usar inteligência artificial para rapidamente colorir imagens abre grandes inovações tanto na área de pesquisa quanto na área de produções de vídeos e filmes por exemplo.

Imagino que muitos estúdios de animações pelo mundo devem estar começando a utilizar machine learning para acelerar o criação de seus filmes. É uma forma engenhosa de colorir rapidamente cenários de forma automática sem demandar muito tempo de seus designers e animadores.

Source: Artificial Intelligence on Medium

Leave a Reply

Your email address will not be published. Required fields are marked *

Back To Top
a

Display your work in a bold & confident manner. Sometimes it’s easy for your creativity to stand out from the crowd.

Social