Neural Style Transfer usando Redes Neurais Convolucionais

Original article can be found here (source): Deep Learning on Medium

Boa parte da nossa discussão é sobre características dessas redes e como o algoritmo NST se utiliza delas.

As CNN são redes formadas por camadas que realizam uma operação matemática chamada (pasmém) convolução, onde um tensor input (blocos azuis) é “percorrido” por um tensor filtro (blocos verdes) que extrai características de interesse dessa imagem, como detecção de bordas e padrões complexos.

O resultado dessa operação é um tensor chamado de feature map (ou representação).

São esses feature maps que conterão as características de estilo e conteúdo que queremos extrair no NST.

Cada camada aplica diversos filtros, formando um cubo ou tensor tridimensional. Fonte
  • Para entender melhor as CNNs e ver outros gifs interessantes veja esse artigo.
  • Para uma discussão mais profunda sobre tensores e operações de convolução veja esse outro link.

Rede VGG-19

Arquitetura VGG-19. Fonte.

Na nossa análise utilizaremos uma rede pré-treinada VGG-19. É uma CNN de 19 camadas (16 camadas convolucionais e 3 camadas fully-connected). Ela possui uma arquitetura considerada simples para os padrões do Deep Learning, mas contém um número mostruoso de parâmetros: 143 milhões.

Os feature maps de estilo e conteúdo são extraídos das camadas intermediárias da rede. Dessa forma, as últimas três camadas fully-connected são descartadas (include_top=False na importação do modelo).

Nosso resultado virá da minimização de uma função perda em relação às imagens extraídas das camadas intermediárias.

Max Pooling

A figura acima mostra a arquitetura clássica da VGG-19, porém importaremos ela sem max pooling por razão do custo computacional. Nos testes que fiz, importar o modelo com max pooling no Google Colab eleva bastante o tempo de treinamento de cada imagem, que sem ele já fica em~5 horas.

Porém, se custo computacional não for problema, é interessante que se use o modelo com pooling, pois ele reduz a sensibilidade das features em relação a sua localização na imagem.

No artigo seminal “A Neural Algorithm of Artistic Style” os autores afirmam que obtiveram os melhores resultados quando utilizaram Average pooling ao invés de Max pooling. Para usar pooling devemos passar o parâmetro pooling='avg' ou pooling='max'quando for importar o modelo treinado (o default é pooling=None).

Layers selecionadas

  • Gatys at al. afirmam que as camadas mais altas na rede conseguem capturar “conteúdo de alta-ordem” (high-level content) e seus arranjos sem se ater ao valor específico de cada pixel, por isso são boas representações do conteúdo da imagem . Então para representar o conteúdo usamos uma camada do último bloco covolucional.
  • Para o estilo, queremos features que capturam as informações de textura da imagem. Obtemos isso, segundo os autores, através da correlação entre diferentes representações ao longo das camadas convolucionais.

By including the feature correlations of multiple layers, we obtain a stationary, multi-scale representation of the input image, which captures its texture information but not the global arrangement (Gatys et al.)

Implementação — modelo