kshitizrimal / deepStyle

Out 19, 2021
admin

Esta é uma implementação TensorFlow de várias técnicas descritas nos artigos:

  • Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
  • Transferência de estilo artístico para vídeos por Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
  • Preservação da cor na transferência de estilo artístico neural por Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman

Adicionalmente, são apresentadas técnicas para segmentação semântica e transferência de estilos múltiplos.

O algoritmo Neural Style sintetiza um pastiche separando e combinando o conteúdo de uma imagem com o estilo de outra imagem usando redes neurais convolucionais (CNN). Abaixo está um exemplo de transferência do estilo artístico de The Starry Night para uma fotografia de um leão africano:

Transferir o estilo de várias obras de arte para a mesma imagem de conteúdo produz resultados qualitativamente convincentes:

Aqui reproduzimos a figura 3 do primeiro trabalho, que apresenta uma fotografia do Neckarfront em Tübingen, Alemanha, no estilo de 5 pinturas icônicas diferentes O Naufrágio do Minotauro, A Noite Estrelada, Composição VII, O Grito, Nu Sentado:

Conteúdo / Estilo Tradeoff

O peso relativo do estilo e conteúdo pode ser controlado.

>

Aqui nós renderizamos com um peso crescente do estilo aplicado ao Red Canna:

Imagens de Estilo Múltiplo

Mais de uma imagem de estilo pode ser usada para misturar múltiplos estilos artísticos.

Linha superior (da esquerda para a direita): A Noite Estrelada + O Grito, O Grito + Composição VII, Nua Sentada + Composição VII
Linha de fundo (da esquerda para a direita): Sentado Nu + A Noite Estrelada, A Noite Estrelada + Frescura do Frio, David Bowie + Crânio

>

Interpolação de Estilo

>

Quando se utilizam múltiplas imagens de estilo, o grau de mistura entre as imagens pode ser controlado.

Linha superior (da esquerda para a direita): imagem de conteúdo, .2 A Noite Estrelada + .8 The Scream, .8 The Starry Night + .2 The Scream
Linha de fundo (da esquerda para a direita): .2 Oversoul + .8 Frescura do Frio, .5 Oversoul + .5 Frescura do Frio, .8 Oversoul + .2 Frescura do Frio

Estilo de transferência mas não de cor

O esquema de cores da imagem original pode ser preservado incluindo a bandeira --original_colors. As cores são transferidas usando os espaços de cor YUV, YCrCb, CIE L*a*b*, ou CIE L*u*v*.

Aqui reproduzimos a Figura 1 e a Figura 2 no terceiro papel usando transferência apenas de luminância:

Esquerda para a direita: imagem de conteúdo, imagem estilizada, imagem estilizada com as cores originais da imagem de conteúdo

Texturas

O algoritmo não está restrito a estilos de pintura artística. Ele também pode ser aplicado a texturas fotográficas para criar imagens pareidólicas.

Segmentação

Estilo pode ser transferido para segmentações semânticas na imagem de conteúdo.

Estilos múltiplos podem ser transferidos para o primeiro plano e fundo da imagem de conteúdo.

Esquerda para a direita: imagem de conteúdo, estilo de primeiro plano, estilo de fundo, máscara de primeiro plano, máscara de fundo, imagem estilizada

Vídeo

Animações podem ser renderizadas aplicando o algoritmo a cada frame de origem. Para melhores resultados, a descida de gradiente é inicializada com o frame previamente estilizado empenado para o frame atual de acordo com o fluxo óptico entre o par de frames. As funções de perda de consistência temporal são usadas para penalizar os pixels, excluindo as regiões desclassificadas e os limites de movimento.


Linha superior (da esquerda para a direita): quadros de origem, fluxo óptico de verdade-terra visualizado
Linha inferior (da esquerda para a direita): regiões desclassificadas e limites de movimento, quadros estilizados

Inicialização da descida de gradiente

A inicialização da descida de gradiente é controlada usando --init_img_type para imagens simples e --init_frame_type ou --first_frame_type para quadros de vídeo. O ruído branco permite que um número arbitrário de imagens distintas seja gerado. Já a inicialização com uma imagem fixa converge sempre para a mesma saída.

Aqui reproduzimos a Figura 6 do primeiro papel:

Linha superior (da esquerda para a direita): Inicializada com a imagem de conteúdo, a imagem de estilo, ruído branco (semente RNG 1)
Linha de fundo (da esquerda para a direita): Inicializada com o ruído branco (RNG seed 2, 3, 4)

Representações em camadas

As complexidades das características e os tamanhos dos campos receptivos aumentam para baixo a herarquia CNN.

Aqui reproduzimos a Figura 3 a partir do papel original:

1 x 10^-5 1 x 10^-4 1 x 10^-3 1 x 10^-2 conv1_1 > conv2_1
conv3_1 > >
conv4_1
conv5_1 > >

Linhas: subgrupos crescentes de camadas CNN; i.e. ‘conv4_1’ significa usar ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’.
Colunas: relação alfa/beta da reconstrução do conteúdo e estilo (ver Tradução do Conteúdo/Estilo).

Configuração

Dependências:

  • fluxo do sensor
  • opencv

Dependências opcionais (mas recomendadas):

  • CUDA 7.5+
  • cuDNN 5.0+

Após a instalação das dependências:

  • Baixar os pesos do modelo VGG-19 (ver a secção “Modelos VGG-VD do projecto Very Deep Convolutional Networks for Large-Scale Visual Recognition”). Mais informações sobre a rede VGG-19 podem ser encontradas aqui.
  • Depois de fazer o download, copie o ficheiro dos pesos imagenet-vgg-verydeep-19.mat para o directório do projecto.

Uso

Uso básico

Imagem única

  1. Copiar 1 imagem de conteúdo para o diretório de conteúdo de imagem padrão ./image_input
  2. Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão ./styles
  3. Executar o comando:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>

Exemplo:

bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg

Nota: Os formatos de imagem suportados incluem: .png, .jpg, .ppm, .pgm

Note: Os caminhos para as imagens não devem conter o caractere ~ para representar seu diretório home; você deve, ao invés disso, usar um caminho relativo ou o caminho absoluto.

Quadros de Vídeo

  1. Copiar 1 vídeo de conteúdo para o diretório de conteúdo de vídeo padrão ./video_input
  2. Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão ./styles
  3. Executar o comando:
bash stylize_video.sh <path_to_video> <path_to_style_image>

Exemplo:

bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg

Nota: Os formatos de vídeo suportados incluem: .mp4, .mov, .mkv

Uso Avançado

Quadros de Vídeo ou Imagem Única

  1. Copiar imagens de conteúdo para o diretório de conteúdo de imagem padrão ./image_input ou copiar quadros de vídeo para o diretório de conteúdo de vídeo padrão ./video_input
  2. Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão ./styles
  3. Executar o comando com argumentos específicos:
python neural_style.py <arguments>

Exemplo (Imagem única):

python neural_style.py --content_img golden_gate.jpg \ --style_imgs starry-night.jpg \ --max_size 1000 \ --max_iterations 100 \ --original_colors \ --device /cpu:0 \ --verbose;

Para usar imagens de vários estilos, passe uma lista separada por espaço dos nomes e pesos das imagens como esta:

--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5

Exemplo (Quadros de Vídeo):

python neural_style.py --video \ --video_input_dir ./video_input/my_video_frames \ --style_imgs starry-night.jpg \ --content_weight 5 \ --style_weight 1000 \ --temporal_weight 1000 \ --start_frame 1 \ --end_frame 50 \ --max_size 1024 \ --first_frame_iterations 3000 \ --verbose;

Nota: Ao usar --init_frame_type prev_warp você deve ter previamente computado o fluxo óptico para trás e para a frente entre os quadros. Ver ./video_input/make-opt-flow.sh e ./video_input/run-deepflow.sh

Argumentos

  • --content_img: Nome de ficheiro da imagem de conteúdo. Exemplo: lion.jpg
  • --content_img_dir: Caminho relativo ou absoluto do diretório para a imagem de conteúdo. Predefinição: ./image_input
  • --style_imgs: Nomes de arquivos das imagens de estilo. Para usar imagens de vários estilos, passe uma lista separada por espaço. Exemplo: --style_imgs starry-night.jpg
  • --style_imgs_weights: Os pesos de mistura para cada imagem de estilo. Por omissão: 1.0 (assume apenas 1 imagem de estilo)
  • --style_imgs_dir: Caminho relativo ou absoluto do diretório para as imagens de estilo. Predefinição: ./styles
  • --init_img_type: Imagem usada para inicializar a rede. Escolhas: content, random, style. Padrão: content
  • --max_size: Largura ou altura máxima das imagens de entrada. Por omissão: 512
  • --content_weight: Peso para a função de perda de conteúdo. Predefinição: 5e0
  • --style_weight: Peso para a função de perda de estilo. Predefinição: 1e4
  • --tv_weight: Peso para a função de perda variacional total. Predefinição: 1e-3
  • --temporal_weight: Peso para a função de perda temporal. Predefinição: 2e2
  • --content_layers: Nomes das camadas VGG-19 separadas por espaço usadas para a imagem de conteúdo. Predefinição: conv4_2
  • --style_layers: Nomes de camadas VGG-19 separadas por espaço usadas para a imagem de estilo. Predefinição: relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: Pesos espaço-separados de cada camada de conteúdo para a perda de conteúdo. Predefinição: 1.0
  • --style_layer_weights: Pesos espaço-separados de cada camada de estilo para a perda. Predefinição: 0.2 0.2 0.2 0.2 0.2
  • --original_colors: Bandeira booleana indicando se o estilo é transferido mas não as cores.
  • --color_convert_type: Espaços de cor (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) para conversão de correspondência de luminância para cores originais. Escolhas: yuv, ycrcb, luv, lab. Por defeito: yuv
  • --style_mask: bandeira booleana indicando se o estilo é transferido para regiões mascaradas.
  • --style_mask_imgs: Nomes de arquivo das imagens da máscara de estilo (exemplo: face_mask.png). Para usar múltiplas imagens de máscaras de estilo, passe uma lista separada por espaço. Exemplo: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: Valor de interpolação entre a imagem de conteúdo e a imagem de ruído se a rede for inicializada com random. Padrão: 1.0
  • --seed: Semente para o gerador de números aleatórios. Por omissão: 0
  • --model_weights: Pesos e enviesamentos da rede VGG-19. Faça o download aqui. Padrão:imagenet-vgg-verydeep-19.mat
  • --pooling_type: Tipo de pooling em rede neural convolucional. Escolhas: avg, max. Padrão: avg
  • --device: GPU ou dispositivo CPU. O modo GPU é altamente recomendado, mas requer NVIDIA CUDA. Opções: /gpu:0 /cpu:0. Por omissão: /gpu:0
  • --img_output_dir: Directório para escrever a saída. Por omissão: ./image_output
  • --img_name: Nome do ficheiro da imagem de saída. Por omissão: result
  • --verbose: Bandeira booleana indicando se as declarações devem ser impressas no console.

Argumentos de otimização

  • --optimizer: Otimizador de minimização de perdas. O L-BFGS dá melhores resultados. Adam usa menos memória. Escolhas: lbfgs, adam. Por omissão: lbfgs
  • --learning_rate: Parâmetro de aprendizagem para o optimizador Adam. Por omissão: 1e0

  • --max_iterations: Número máximo de iterações para o Adam ou optimizador L-BFGS. Por omissão: 1000
  • --print_iterations: Número máximo de iterações entre as declarações de impressão do optimizador. Por omissão: 50
  • --content_loss_function: Constantes K diferentes na função de perda de conteúdo. Escolhas: 1, 2, 3. Por omissão: 1

Argumentos do quadro de vídeo

  • --video: Bandeira booleana indicando se o usuário está criando um vídeo.
  • --start_frame: Primeiro número de frame. Padrão: 1
  • --end_frame: Último número de frame. Por omissão: 1
  • --first_frame_type: Imagem usada para inicializar a rede durante a renderização do primeiro frame. Escolhas: content, random, style. Predefinição: random
  • --init_frame_type: Imagem usada para inicializar a rede durante cada renderização após o primeiro frame. Escolhas: prev_warped, prev, content, random, style. Por omissão: prev_warped
  • --video_input_dir: Caminho de diretório relativo ou absoluto para os quadros de entrada. Por defeito: ./video_input
  • --video_output_dir: Caminho de directório relativo ou absoluto para escrever frames de saída. Por defeito: ./video_output
  • --content_frame_frmt: Formatar sequência de frames de entrada. Predefinição: frame_{}.png
  • --backward_optical_flow_frmt: Formatar cadeia de ficheiros de fluxo óptico para trás. Predefinição: backward_{}_{}.flo
  • --forward_optical_flow_frmt: Formatar cadeia de ficheiros de fluxo óptico para a frente. Por omissão: forward_{}_{}.flo
  • --content_weights_frmt: Formatar seqüência de arquivos de consistência de fluxo óptico. Por omissão: reliable_{}_{}.txt
  • --prev_frame_indices: Quadros anteriores a considerar para consistência temporal de longo prazo. Default: 1
  • --first_frame_iterations: Número máximo de iterações optimizadoras do primeiro frame. Default: 2000
  • --frame_iterations: Número máximo de iterações do optimizador para cada frame após o primeiro frame. Default: 800

Perguntas e Erratas

Enviar perguntas ou problemas:

Memória

Por defeito, neural-style-tf utiliza o backend da GPU NVIDIA cuDNN para convoluções e L-BFGS para optimização. Estes produzem resultados melhores e mais rápidos, mas podem consumir muita memória. Você pode reduzir o uso de memória com o seguinte:

  • Use Adam: Adicione a bandeira --optimizer adam para usar Adam ao invés de L-BFGS. Isto deve reduzir significativamente o uso de memória, mas irá requerer o ajuste de outros parâmetros para bons resultados; em particular, você deve exportar com valores diferentes de --learning_rate, --content_weight, --style_weight
  • Reduzir o tamanho da imagem: Você pode reduzir o tamanho da imagem gerada com o argumento --max_size argumento.

Detalhes de implementação

Todas as imagens foram renderizadas em uma máquina com:

  • CPU: Intel Core i7-6800K @ 3.40GHz × 12
  • GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
  • SO: Linux Ubuntu 16.04.1 LTS 64-bit
  • CUDA: 8.0
  • python: 2.7.12
  • fluxo tensor: 0.10.0rc
  • opencv: 2.4.9.1

Agradecimentos

A implementação é baseada nos projectos:

  • Torch (Lua) implementação ‘neural-style’ de jcjohnson
  • Torch (Lua) implementação ‘artistic-videos’ de manuelruder

Fonte de frames de vídeo foram obtidos a partir de:

  • MPI Sintel Flow Dataset

As imagens artísticas foram criadas pelos artistas modernos:

  • Alex Grey
  • Minjae Lee
  • Leonid Afremov
  • Françoise Nielly
  • James Jean
  • Ben Giles
  • Callie Fink
  • H.R. Giger
  • Voka

As imagens artísticas foram criadas pelos artistas históricos populares:

  • Vincent Van Gogh
  • Wassily Kandinsky
  • Georgia O’Keeffe
  • Jean-Michel Basquiat
  • Édouard Manet
  • Pablo Picasso
  • Joseph Mallord William Turner
  • >

  • Frida Kahlo
  • >

>

Escriptografias de teste foram criadas pelo meu irmão Sheldon Smith.

Citação

Se achar este código útil para a sua pesquisa, por favor cite:

@misc{Smith2016, author = {Smith, Cameron}, title = {neural-style-tf}, year = {2016}, publisher = {GitHub}, journal = {GitHub repository}, howpublished = {\url{https://github.com/cysmith/neural-style-tf}},}

Deixe uma resposta

O seu endereço de email não será publicado.