kshitizrimal / deepStyle

Ott 19, 2021
admin

Questa è un’implementazione TensorFlow di diverse tecniche descritte nei documenti:

  • Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
  • Trasferimento di stile artistico per video da Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
  • Preservare il colore nel trasferimento di stile artistico neurale da Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman

Inoltre, vengono presentate tecniche per la segmentazione semantica e il trasferimento di stili multipli.

L’algoritmo Neural Style sintetizza un pastiche separando e combinando il contenuto di un’immagine con lo stile di un’altra immagine usando reti neurali convoluzionali (CNN). Di seguito un esempio di trasferimento dello stile artistico di The Starry Night su una fotografia di un leone africano:

Trasferire lo stile di varie opere d’arte alla stessa immagine di contenuto produce risultati qualitativamente convincenti:

Qui riproduciamo la figura 3 del primo articolo, che rende una fotografia del Neckarfront di Tubinga, Germania, nello stile di 5 diversi dipinti iconici Il naufragio del Minotauro, La notte stellata, Composizione VII, L’urlo, Nudo seduto:

Content / Style Tradeoff

Il peso relativo dello stile e del contenuto può essere controllato.

Qui renderizziamo con un peso crescente dello stile applicato a Red Canna:

Immagini di stili multipli

Può essere usata più di un’immagine di stile per fondere più stili artistici.

Fila superiore (da sinistra a destra): The Starry Night + The Scream, The Scream + Composition VII, Seated Nude + Composition VII
Fila inferiore (da sinistra a destra): Seated Nude + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull

Style Interpolation

Quando si usano più immagini di stile, il grado di fusione tra le immagini può essere controllato.

Fila superiore (da sinistra a destra): immagine contenuto, .2 The Starry Night + .8 The Scream, .8 The Starry Night + .2 The Scream
Fila in basso (da sinistra a destra): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold

Trasferire lo stile ma non il colore

Lo schema dei colori dell’immagine originale può essere preservato includendo la bandiera --original_colors. I colori sono trasferiti usando gli spazi colore YUV, YCrCb, CIE L*a*b*, o CIE L*u*v*.

Qui riproduciamo la figura 1 e la figura 2 del terzo articolo usando il trasferimento della sola luminanza:

Da sinistra a destra: immagine del contenuto, immagine stilizzata, immagine stilizzata con i colori originali dell’immagine del contenuto

Textures

L’algoritmo non è limitato a stili di pittura artistica. Può anche essere applicato a texture fotografiche per creare immagini pareidoliche.

Segmentazione

Lo stile può essere trasferito a segmentazioni semantiche nell’immagine di contenuto.

Stili multipli possono essere trasferiti al primo piano e allo sfondo dell’immagine del contenuto.

Da sinistra a destra: immagine contenuto, stile primo piano, stile sfondo, maschera primo piano, maschera sfondo, immagine stilizzata

Video

Le animazioni possono essere rese applicando l’algoritmo ad ogni frame sorgente. Per ottenere i migliori risultati, la discesa del gradiente è inizializzata con il fotogramma precedentemente stilizzato e deformato al fotogramma corrente secondo il flusso ottico tra la coppia di fotogrammi. Le funzioni di perdita per la coerenza temporale sono utilizzate per penalizzare i pixel che escludono le regioni disoccluse e i confini del movimento.


Fila in alto (da sinistra a destra): fotogrammi sorgente, flusso ottico ground-truth visualizzato
Fila in basso (da sinistra a destra): regioni disoccluse e confini del movimento, fotogrammi stilizzati

Inizializzazione della discesa del gradiente

L’inizializzazione della discesa del gradiente è controllata usando --init_img_type per immagini singole e --init_frame_type o --first_frame_type per fotogrammi video. Il rumore bianco permette di generare un numero arbitrario di immagini distinte. Mentre, l’inizializzazione con un’immagine fissa converge sempre allo stesso output.

Qui riproduciamo la figura 6 dal primo articolo:

Riga in alto (da sinistra a destra): Inizializzato con l’immagine di contenuto, l’immagine di stile, rumore bianco (seme RNG 1)
Fila inferiore (da sinistra a destra): Inizializzato con rumore bianco (semi RNG 2, 3, 4)

Rappresentazioni dei livelli

Le complessità delle caratteristiche e le dimensioni del campo recettivo aumentano lungo la gerarchia CNN.

Qui riproduciamo la figura 3 dell’articolo originale:

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

Righe: sottoinsiemi crescenti di strati CNN; cioèe. ‘conv4_1’ significa usare ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’.
Colonne: rapporto alfa/beta della ricostruzione del contenuto e dello stile (vedi Content / Style Tradeoff).

Setup

Dipendenze:

  • tensorflow
  • opencv

Dipendenze opzionali (ma raccomandate):

  • CUDA 7.5+
  • cuDNN 5.0+

Dopo aver installato le dipendenze:

  • Scaricare i pesi del modello VGG-19 (vedere la sezione “Modelli VGG-VD dal progetto Very Deep Convolutional Networks for Large-Scale Visual Recognition”). Maggiori informazioni sulla rete VGG-19 possono essere trovate qui.
  • Dopo il download, copiate il file dei pesi imagenet-vgg-verydeep-19.mat nella directory del progetto.

Uso

Uso di base

Immagine singola

  1. Copia 1 immagine di contenuto nella directory predefinita del contenuto dell’immagine ./image_input
  2. Copia 1 o più immagini di stile nella directory predefinita dello stile ./styles
  3. Esegui il comando:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>

Esempio:

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

Nota: I formati immagine supportati includono: .png, .jpg, .ppm, .pgm

Nota: I percorsi alle immagini non dovrebbero contenere il carattere ~ per rappresentare la tua home directory; dovresti invece usare un percorso relativo o il percorso assoluto.

Video Frames

  1. Copia 1 contenuto video nella directory predefinita dei contenuti video ./video_input
  2. Copia 1 o più immagini di stile nella directory predefinita degli stili ./styles
  3. Esegui il comando:
bash stylize_video.sh <path_to_video> <path_to_style_image>

Esempio:

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

Nota: I formati video supportati includono: .mp4, .mov, .mkv

Uso avanzato

Immagine singola o fotogrammi video

  1. Copia le immagini del contenuto nella directory predefinita del contenuto immagine ./image_input o copia i fotogrammi video nella directory predefinita del contenuto video ./video_input
  2. Copia 1 o più immagini di stile nella directory predefinita dello stile ./styles
  3. Esegui il comando con argomenti specifici:
python neural_style.py <arguments>

Esempio (Immagine singola):

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;

Per usare più immagini di stile, passare una lista separata da spazi dei nomi delle immagini e dei pesi delle immagini come questa:

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

Esempio (Video Frames):

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: Quando si usa --init_frame_type prev_warp è necessario aver precedentemente calcolato il flusso ottico avanti e indietro tra i frame. Vedi ./video_input/make-opt-flow.sh e ./video_input/run-deepflow.sh

Argomenti

  • --content_img: Nome del file dell’immagine del contenuto. Esempio: lion.jpg
  • --content_img_dir: Percorso di directory relativo o assoluto dell’immagine del contenuto. Predefinito: ./image_input
  • --style_imgs: Nomi dei file delle immagini di stile. Per usare più immagini di stile, passare una lista separata da spazi. Esempio: --style_imgs starry-night.jpg
  • --style_imgs_weights: I pesi di miscelazione per ogni immagine di stile. Predefinito: 1.0 (assume solo 1 immagine di stile)
  • --style_imgs_dir: Percorso di directory relativo o assoluto per le immagini di stile. Predefinito: ./styles
  • --init_img_type: Immagine usata per inizializzare la rete. Scelte: content, random, style. Predefinito: content
  • --max_size: Larghezza o altezza massima delle immagini in ingresso. Predefinito: 512
  • --content_weight: Peso per la funzione di perdita del contenuto. Predefinito: 5e0
  • --style_weight: Peso per la funzione di perdita dello stile. Predefinito: 1e4
  • --tv_weight: Peso per la funzione di perdita variazionale totale. Predefinito: 1e-3
  • --temporal_weight: Peso per la funzione di perdita temporale. Predefinito: 2e2
  • --content_layers: Nomi dei livelli VGG-19 separati dallo spazio usati per l’immagine del contenuto. Predefinito: conv4_2
  • --style_layers: Nomi dei livelli VGG-19 separati dallo spazio usati per l’immagine di stile. Predefinito: relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: Pesi separati dallo spazio di ogni livello di contenuto per la perdita di contenuto. Predefinito: 1.0
  • --style_layer_weights: Pesi separati dallo spazio di ogni strato di stile alla perdita. Predefinito: 0.2 0.2 0.2 0.2 0.2
  • --original_colors: flag booleano che indica se lo stile viene trasferito ma non i colori.
  • --color_convert_type: Spazi colore (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) per la conversione della luminanza ai colori originali. Scelte: yuv, ycrcb, luv, lab. Predefinito: yuv
  • --style_mask: flag booleano che indica se lo stile viene trasferito alle regioni mascherate.
  • --style_mask_imgs: Nomi di file delle immagini delle maschere di stile (esempio: face_mask.png). Per usare più immagini di maschere di stile, passare una lista separata da spazi. Esempio: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: Valore di interpolazione tra l’immagine del contenuto e l’immagine del rumore se la rete è inizializzata con random. Predefinito: 1.0
  • --seed: Seme per il generatore di numeri casuali. Predefinito: 0
  • --model_weights: Pesi e bias della rete VGG-19. Scarica qui. Predefinito:imagenet-vgg-verydeep-19.mat
  • --pooling_type: Tipo di pooling nella rete neurale convoluzionale. Scelte: avg, max. Predefinito: avg
  • --device: Dispositivo GPU o CPU. La modalità GPU è altamente raccomandata ma richiede NVIDIA CUDA. Scelte: /gpu:0 /cpu:0. Predefinito: /gpu:0
  • --img_output_dir: Directory in cui scrivere l’output. Predefinito: ./image_output
  • --img_name: Nome del file dell’immagine in uscita. Predefinito: result
  • --verbose: Flag booleano che indica se le dichiarazioni devono essere stampate nella console.

Argomenti di ottimizzazione

  • --optimizer: Ottimizzatore di minimizzazione delle perdite. L-BFGS dà risultati migliori. Adam usa meno memoria. Scelte: lbfgs, adam. Predefinito: lbfgs
  • --learning_rate: Parametro del tasso di apprendimento per l’ottimizzatore Adam. Predefinito: 1e0

  • --max_iterations: Numero massimo di iterazioni per l’ottimizzatore Adam o L-BFGS. Predefinito: 1000
  • --print_iterations: Numero di iterazioni tra le istruzioni di stampa dell’ottimizzatore. Predefinito: 50
  • --content_loss_function: Diverse costanti K nella funzione di perdita del contenuto. Scelte: 1, 2, 3. Predefinito: 1

Video Frame Arguments

  • --video: Flag booleano che indica se l’utente sta creando un video.
  • --start_frame: Numero del primo fotogramma. Predefinito: 1
  • --end_frame: Numero ultimo fotogramma. Predefinito: 1
  • --first_frame_type: Immagine usata per inizializzare la rete durante il rendering del primo frame. Scelte: content, random, style. Predefinito: random
  • --init_frame_type: Immagine usata per inizializzare la rete durante ogni rendering dopo il primo frame. Scelte: prev_warped, prev, content, random, style. Predefinito: prev_warped
  • --video_input_dir: Percorso di directory relativo o assoluto per i frame di input. Predefinito: ./video_input
  • --video_output_dir: Percorso directory relativo o assoluto per scrivere i fotogrammi in uscita. Predefinito: ./video_output
  • --content_frame_frmt: Stringa di formato dei frame di input. Predefinito: frame_{}.png
  • --backward_optical_flow_frmt: Stringa di formato dei file di flusso ottico all’indietro. Predefinito: backward_{}_{}.flo
  • --forward_optical_flow_frmt: Stringa di formato dei file di flusso ottico in avanti. Predefinito: forward_{}_{}.flo
  • --content_weights_frmt: Stringa di formato dei file di coerenza del flusso ottico. Predefinito: reliable_{}_{}.txt
  • --prev_frame_indices: Fotogrammi precedenti da considerare per la coerenza temporale a lungo termine. Predefinito: 1
  • --first_frame_iterations: Numero massimo di iterazioni dell’ottimizzatore del primo frame. Default: 2000
  • --frame_iterations: Numero massimo di iterazioni dell’ottimizzatore per ogni fotogramma dopo il primo. Default: 800

Domande ed errori

Invia domande o problemi:

Memoria

Di default, neural-style-tf usa il backend GPU NVIDIA cuDNN per le convoluzioni e L-BFGS per l’ottimizzazione. Puoi ridurre l’uso della memoria con quanto segue:

  • Usa Adam: aggiungi il flag --optimizer adam per usare Adam invece di L-BFGS. Questo dovrebbe ridurre significativamente l’uso della memoria, ma richiederà la regolazione di altri parametri per ottenere buoni risultati; in particolare si dovrebbe sperimentare con diversi valori di --learning_rate, --content_weight, --style_weight
  • Ridurre la dimensione dell’immagine: Puoi ridurre la dimensione dell’immagine generata con l’argomento --max_size.

Dettagli di implementazione

Tutte le immagini sono state renderizzate su una macchina con:

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

Riconoscimenti

L’implementazione è basata sui progetti:

  • Implementazione Torch (Lua) ‘neural-style’ di jcjohnson
  • Implementazione Torch (Lua) ‘artistic-videos’ di manuelruder

I frame video di partenza sono stati ottenuti da:

  • MPI Sintel Flow Dataset

Le immagini artistiche sono state create dagli artisti moderni:

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

Le immagini artistiche sono state create dai popolari artisti storici:

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

Gli script della shell Bash per i test sono stati creati da mio fratello Sheldon Smith.

Citazione

Se trovi questo codice utile per la tua ricerca, per favore cita:

@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}},}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.