kshitizrimal / deepStyle
Aceasta este o implementare TensorFlow a mai multor tehnici descrise în lucrările:
- Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
- Artistic style transfer for videosby Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
- Preserving Color in Neural Artistic Style Transferby Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman
În plus, sunt prezentate tehnici de segmentare semantică și de transfer de stiluri multiple.
Algoritmul Neural Style sintetizează o pastișă prin separarea și combinarea conținutului unei imagini cu stilul unei alte imagini folosind rețele neuronale convoluționale (CNN). Mai jos este prezentat un exemplu de transfer al stilului artistic al operei The Starry Night (Noaptea înstelată) pe o fotografie a unui leu african:
Transferul stilului diferitelor opere de artă pe aceeași imagine de conținut produce rezultate calitativ convingătoare:
Reproducem aici figura 3 din prima lucrare, care redă o fotografie a frontului Neckar din Tübingen, Germania, în stilul a 5 picturi iconice diferite Naufragiul Minotaurului, Noaptea înstelată, Compoziția VII, Țipătul, Nud așezat:
Content / Style Tradeoff
Ponderea relativă a stilului și a conținutului poate fi controlată.
Aici redăm cu o pondere din ce în ce mai mare a stilului aplicată la Red Canna:
Imagini de stil multiple
Se pot folosi mai multe imagini de stil pentru a îmbina mai multe stiluri artistice.
Rândul de sus (de la stânga la dreapta): Noaptea înstelată + Țipătul, Țipătul + Compoziția VII, Nud așezat + Compoziția VII
Rândul de jos (de la stânga la dreapta): Seated Nude + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull
Style Interpolation
Când se folosesc mai multe imagini de stil, se poate controla gradul de îmbinare dintre imagini.
Rândul de sus (de la stânga la dreapta): Content image, .2 The Starry Night + .8 The Scream, .8 The Starry Night + .2 The Scream
Rândul de jos (de la stânga la dreapta): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold
Transferă stilul, dar nu și culoarea
Schema de culori a imaginii originale poate fi păstrată prin includerea steagului --original_colors
. Culorile sunt transferate folosind fie spațiile de culoare YUV, YCrCb, CIE L*a*b*, fie CIE L*u*v*.
Reproducem aici figura 1 și figura 2 din cea de-a treia lucrare, folosind transferul numai de luminanță:
De la stânga la dreapta: imaginea de conținut, imaginea stilizată, imaginea stilizată cu culorile originale ale imaginii de conținut
Texturi
Agoritmul nu este constrâns de stilurile artistice de pictură. El poate fi aplicat, de asemenea, la texturi fotografice pentru a crea imagini pareidolice.
Segmentarea
Stilul poate fi transferat la segmentări semantice în imaginea de conținut.
Stilurile multiple pot fi transferate la prim-planul și fundalul imaginii de conținut.
De la stânga la dreapta: imagine de conținut, stil de prim-plan, stil de fundal, stil de fundal, mască de prim-plan, mască de fundal, imagine stilizată
Video
Animațiile pot fi redate prin aplicarea algoritmului la fiecare cadru sursă. Pentru cele mai bune rezultate, coborârea gradientului este inițializată cu cadrul stilizat anterior deformat la cadrul curent în funcție de fluxul optic dintre perechea de cadre. Funcțiile de pierdere pentru consecvența temporală sunt utilizate pentru a penaliza pixelii care exclud regiunile dezacoperite și limitele mișcării.
Rândul de sus (de la stânga la dreapta): cadre sursă, fluxul optic ground-truth vizualizat
Rândul de jos (de la stânga la dreapta): regiuni dezacoperite și limite de mișcare, cadre stilizate
Inițializarea coborârii gradientului
Inițializarea coborârii gradientului este controlată folosind --init_img_type
pentru imagini unice și --init_frame_type
sau --first_frame_type
pentru cadre video. Zgomotul alb permite generarea unui număr arbitrar de imagini distincte. În timp ce inițializarea cu o imagine fixă converge întotdeauna la același rezultat.
Reproducem aici figura 6 din prima lucrare:
Rândul de sus (de la stânga la dreapta): Inițializat cu imaginea de conținut, imaginea de stil, zgomot alb (sămânța RNG 1)
Rândul de jos (de la stânga la dreapta): Inițializat cu zgomot alb (semințe RNG 2, 3, 4)
Reprezentări ale straturilor
Complexitatea caracteristicilor și dimensiunile câmpului receptiv cresc în josul ierarhiei CNN.
Reproducem aici figura 3 din lucrarea originală:
1 x 10^-5 | 1 x 10^-4 | 1 x 10^-3 | 1 x 10^-2 | conv1_1 | conv2_1 | conv2_1 |
conv3_1 | ||||
conv4_1 | ||||
conv5_1 |
Rânduri: subseturi crescânde de straturi CNN; i.e. ‘conv4_1’ înseamnă utilizarea ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’.
Columne: raportul alfa/beta al reconstrucției conținutului și stilului (a se vedea Content / Style Tradeoff).
Setup
Dependențe:
- tensorflow
- opencv
Dependențe opționale (dar recomandate):
- CUDA 7.5+
- cuDNN 5.0+
După instalarea dependențelor:
- Descărcați greutățile modelului VGG-19 (consultați secțiunea „VGG-VD models from the Very Deep Convolutional Networks for Large-Scale Visual Recognition project”). Mai multe informații despre rețeaua VGG-19 pot fi găsite aici.
- După descărcare, copiați fișierul cu greutăți
imagenet-vgg-verydeep-19.mat
în directorul proiectului.
Utilizare
Utilizare de bază
Imagine unică
- Copiază 1 imagine de conținut în directorul implicit de conținut al imaginii
./image_input
- Copiază 1 sau mai multe imagini de stil în directorul implicit de stil
./styles
- Executați comanda:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>
Exemplu:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
Nota: Formatele de imagine acceptate includ: .png
, .jpg
, .ppm
, .pgm
Nota: Căile de acces la imagini nu trebuie să conțină caracterul ~
pentru a reprezenta directorul dvs. personal; în schimb, trebuie să utilizați o cale relativă sau calea absolută.
Cadre video
- Copiază 1 conținut video în directorul implicit de conținut video
./video_input
- Copiază 1 sau mai multe imagini de stil în directorul implicit de stil
./styles
- Executați comanda:
bash stylize_video.sh <path_to_video> <path_to_style_image>
Exemplu:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Nota: Formatele video acceptate includ:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Nota: Formatele video acceptate includ: .mp4
, .mov
, .mkv
Utilizare avansată
Imagine unică sau cadre video
- Copiază imagini de conținut în directorul implicit de conținut de imagini
./image_input
sau copiază cadre video în directorul implicit de conținut video./video_input
- Copiază 1 sau mai multe imagini de stil în directorul implicit de stil
./styles
- Executați comanda cu argumente specifice:
python neural_style.py <arguments>
Exemplu (o singură imagine):
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;
Pentru a utiliza mai multe imagini de stil, treceți o listă de nume de imagini și ponderi ale imaginilor, separate prin spații, astfel:
--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5
Exemplu (cadre video):
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: Când utilizați --init_frame_type prev_warp
trebuie să fi calculat în prealabil fluxul optic înainte și înapoi între cadre. A se vedea ./video_input/make-opt-flow.sh
și ./video_input/run-deepflow.sh
Argumente
-
--content_img
: Numele de fișier al imaginii de conținut. Exemplu:lion.jpg
-
--content_img_dir
: Calea de directoare relativă sau absolută către imaginea de conținut. Implicit:./image_input
-
--style_imgs
: Numele de fișier al imaginilor de stil. Pentru a utiliza mai multe imagini de stil, se trece o listă separată prin spații. Exemplu:--style_imgs starry-night.jpg
-
--style_imgs_weights
: Ponderile de amestecare pentru fiecare imagine de stil. Implicit:1.0
(presupune o singură imagine de stil) -
--style_imgs_dir
: Calea de directoare relativă sau absolută către imaginile de stil. Implicit:./styles
-
--init_img_type
: Imaginea utilizată pentru a inițializa rețeaua. Opțiuni:content
,random
,style
. Implicit:content
-
--max_size
: Lățimea sau înălțimea maximă a imaginilor de intrare. Implicit:512
-
--content_weight
: Pondere pentru funcția de pierdere a conținutului. Implicit:5e0
-
--style_weight
: Pondere pentru funcția de pierdere a stilului. Implicit:1e4
-
--tv_weight
: Pondere pentru funcția de pierdere variațională totală. Implicit:1e-3
-
--temporal_weight
: Pondere pentru funcția de pierdere temporală. Implicit:2e2
-
--content_layers
: Nume de straturi VGG-19 separate spațial utilizate pentru imaginea de conținut. Implicit:conv4_2
-
--style_layers
: Nume de straturi VGG-19 separate spațial utilizate pentru imaginea de stil. Implicit:relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
-
--content_layer_weights
: Ponderi separate spațial ale fiecărui strat de conținut față de pierderea de conținut. Implicit:1.0
-
--style_layer_weights
: Ponderi separate spațial ale fiecărui strat de stil față de pierdere. Implicit:0.2 0.2 0.2 0.2 0.2
-
--original_colors
: Indicator boolean care indică dacă stilul este transferat, dar nu și culorile. -
--color_convert_type
: Spații de culoare (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) pentru conversia de potrivire a luminanței la culorile originale. Alegeri:yuv
,ycrcb
,luv
,lab
. Implicit:yuv
yuv
-
--style_mask
: Indicator boolean care indică dacă stilul este transferat în regiunile mascate. -
--style_mask_imgs
: Numele de fișier al imaginilor de mascare a stilului (exemplu:face_mask.png
). Pentru a utiliza mai multe imagini de măști de stil, treceți o listă separată prin spații. Exemplu:--style_mask_imgs face_mask.png face_mask_inv.png
-
--noise_ratio
: Valoarea de interpolare între imaginea de conținut și imaginea de zgomot dacă rețeaua este inițializată curandom
. Implicit:1.0
-
--seed
: Semințe pentru generatorul de numere aleatoare. Implicit:0
-
--model_weights
: Ponderi și polarizări ale rețelei VGG-19. Descărcați aici. Implicit:imagenet-vgg-verydeep-19.mat
-
--pooling_type
: Tipul de pooling în rețeaua neuronală convoluțională. Opțiuni:avg
,max
. Implicit:avg
-
--device
: Dispozitiv GPU sau CPU. Modul GPU este foarte recomandat, dar necesită NVIDIA CUDA. Alegeri:/gpu:0
/cpu:0
. Default:/gpu:0
-
--img_output_dir
: Directorul în care se scrie ieșirea. Default:./image_output
-
--img_name
: Numele de fișier al imaginii de ieșire. Default:result
-
--verbose
: Indicator boolean care indică dacă declarațiile trebuie să fie tipărite în consolă.
Argumente de optimizare
-
--optimizer
: Optimizator de minimizare a pierderilor. L-BFGS oferă rezultate mai bune. Adam folosește mai puțină memorie. Opțiuni:lbfgs
,adam
. Default:lbfgs
-
--learning_rate
: Parametrul ratei de învățare pentru optimizatorul Adam. Default:1e0
-
--max_iterations
: Numărul maxim de iterații pentru optimizatorul Adam sau L-BFGS. Default:1000
-
--print_iterations
: Numărul de iterații între instrucțiunile de imprimare ale optimizatorului. Default:50
-
--content_loss_function
: Constante diferite K în funcția de pierdere a conținutului. Alegeri:1
,2
,3
. Default:1
Argumente cadru video
-
--video
: Indicator boolean care indică dacă utilizatorul creează un videoclip. -
--start_frame
: Numărul primului cadru. Default:1
-
--end_frame
: Numărul ultimului cadru. Default:1
-
--first_frame_type
: Imagine utilizată pentru a inițializa rețeaua în timpul redării primului cadru. Alegeri:content
,random
,style
. Default:random
-
--init_frame_type
: Imagine utilizată pentru a inițializa rețeaua în timpul fiecărei redări după primul cadru. Alegeri:prev_warped
,prev
,content
,random
,style
. Default:prev_warped
-
--video_input_dir
: Calea de directoare relativă sau absolută către cadrele de intrare. Default:./video_input
-
--video_output_dir
: Calea de directoare relativă sau absolută în care se scriu cadrele de ieșire. Default:./video_output
-
--content_frame_frmt
: Șir de format al cadrelor de intrare. Default:frame_{}.png
-
--backward_optical_flow_frmt
: Șirul de format al fișierelor de flux optic inversat. Default:backward_{}_{}.flo
-
--forward_optical_flow_frmt
: Șirul de format al fișierelor de flux optic înainte. Default:forward_{}_{}.flo
-
--content_weights_frmt
: Șirul de format al fișierelor de consistență a fluxului optic. Default:reliable_{}_{}.txt
-
--prev_frame_indices
: Cadrele anterioare care trebuie luate în considerare pentru coerența temporală pe termen lung. Default:1
-
--first_frame_iterations
: Numărul maxim de iterații ale optimizatorului pentru primul cadru. Default:2000
-
--frame_iterations
: Numărul maxim de iterații ale optimizatorului pentru fiecare cadru după primul cadru. Default:800
Întrebări și erate
Să trimiteți întrebări sau probleme:
Memorie
În mod implicit, neural-style-tf
utilizează backend-ul GPU NVIDIA cuDNN pentru convoluții și L-BFGS pentru optimizare. acestea produc rezultate mai bune și mai rapide, dar pot consuma multă memorie. Puteți reduce utilizarea memoriei cu următoarele:
- Utilizați Adam: Adăugați stegulețul
--optimizer adam
pentru a utiliza Adam în loc de L-BFGS. Acest lucru ar trebui să reducă semnificativ utilizarea memoriei, dar va necesita reglarea altor parametri pentru rezultate bune; în special, ar trebui săexperimentați cu diferite valori ale--learning_rate
,--content_weight
,--style_weight
- Reduce image size: Puteți reduce dimensiunea imaginii generate cu ajutorul argumentului
--max_size
.
Detalii de implementare
Toate imaginile au fost redate pe o mașină cu:
- 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
Recunoștințe
Implementarea se bazează pe proiectele:
- Implementarea Torch (Lua) ‘neural-style’ de jcjohnson
- Implementarea Torch (Lua) ‘artistic-videos’ de manuelruder
Cadrele video sursă au fost obținute din:
- MPI Sintel Flow Dataset
Imaginile artistice au fost create de artiștii moderni:
- Alex Grey
- Minjae Lee
- Leonid Afremov
- Françoise Nielly
- James Jean
- Ben Giles
- Callie Fink
- H.R. Giger
- Voka
Imaginile artistice au fost create de artiști istorici populari:
- Vincent Van Gogh
- Wassily Kandinsky
- Georgia O’Keeffe
- Jean…Michel Basquiat
- Édouard Manet
- Pablo Picasso
- Joseph Mallord William Turner
- Frida Kahlo
Scripturile de shell Bash pentru testare au fost create de fratele meu Sheldon Smith.
Citare
Dacă găsiți acest cod util pentru cercetarea dumneavoastră, vă rugăm să citați:
@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}},}
.