kshitizrimal / deepStyle
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
- Copiar 1 imagem de conteúdo para o diretório de conteúdo de imagem padrão
./image_input
- Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão
./styles
- 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
- Copiar 1 vídeo de conteúdo para o diretório de conteúdo de vídeo padrão
./video_input
- Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão
./styles
- 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
- 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
- Copiar 1 ou mais imagens de estilo para o diretório de estilo padrão
./styles
- 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 comrandom
. 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}},}