kshitizrimal / deepStyle
Detta är en TensorFlow-implementering av flera tekniker som beskrivs i artiklarna:
- Image Style Transfer Using Convolutional Neural Networksav 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
Därtill presenteras tekniker för semantisk segmentering och multipel stilöverföring.
Algoritmen Neural Style syntetiserar en pastisch genom att separera och kombinera innehållet i en bild med stilen i en annan bild med hjälp av konvolutionella neurala nätverk (CNN). Nedan följer ett exempel på överföring av den konstnärliga stilen i The Starry Night till ett fotografi av ett afrikanskt lejon:
Överföring av stilen i olika konstverk till samma innehållsbild ger kvalitativt övertygande resultat:
Här återger vi figur 3 från den första uppsatsen, som återger ett fotografi av Neckarfronten i Tübingen, Tyskland, i stilen av fem olika ikoniska målningar: The Shipwreck of the Minotaur, The Starry Night, Composition VII, The Scream, Seated Nude:
Avvägning mellan innehåll och stil
Den relativa vikten av stil och innehåll kan kontrolleras.
Här renderar vi med en ökande stilvikt applicerad på Red Canna:
Flera stilbilder
Mer än en stilbild kan användas för att blanda flera konstnärliga stilar.
Översta raden (vänster till höger): Skräpet + Komposition VII, Sittande naken + Komposition VII
Understa raden (från vänster till höger): 7474>Skulpturerna: ”The Starry Night + The Scream”, ”The Scream + Composition VII”, ”Seated Nude + Composition VII”:
Stilinterpolering
När man använder flera stilbilder kan man styra graden av blandning mellan bilderna.
Översta raden (från vänster till höger): innehållsbild, .2 The Starry Night + .8 The Scream, .8 The Starry Night + .2 The Scream
Understa raden (från vänster till höger): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold
Överför stil men inte färg
Färgschemat i originalbilden kan bevaras genom att inkludera flaggan --original_colors
. Färgerna överförs med hjälp av antingen YUV-, YCrCb-, CIE L*a*b*- eller CIE L*u*v*-färgrymderna.
Här återges figur 1 och figur 2 i den tredje artikeln med användning av enbart luminansöverföring:
Vänster till höger: innehållsbild, stiliserad bild, stiliserad bild med innehållsbildens originalfärger
Texturer
Algoritmen är inte begränsad till konstnärliga målningsstilar. Den kan också tillämpas på fotografiska texturer för att skapa pareidoliska bilder.
Segmentering
Stilen kan överföras till semantiska segmenteringar i innehållsbilden.
Flera stilar kan överföras till innehållsbildens förgrund och bakgrund.
Vänster till höger: innehållsbild, förgrundsstil, bakgrundsstil, förgrundsmask, bakgrundsmask, stiliserad bild
Video
Animeringar kan återges genom att algoritmen tillämpas på varje källavsnitt. För bästa resultat initieras gradientnedgången med den tidigare stiliserade bilden som förvrängts till den aktuella bilden i enlighet med det optiska flödet mellan paret av bilder. Förlustfunktioner för tidsmässig konsistens används för att straffa pixlar som utesluter uteslutna områden och rörelsegränser.
Övre raden (från vänster till höger): Källbilder, visualiserat optiskt flöde med grundsanning
Understa raden (från vänster till höger):
Initialisering av gradientnedgång
Initialiseringen av gradientnedgången styrs med hjälp av --init_img_type
för enskilda bilder och --init_frame_type
eller --first_frame_type
för videoframar. Vitt brus gör det möjligt att generera ett godtyckligt antal distinkta bilder. Medan initialisering med en fast bild alltid konvergerar till samma resultat.
Här återger vi figur 6 från den första artikeln:
Övre raden (från vänster till höger): Initialiserad med innehållsbilden, stilbilden, vitt brus (RNG-utsäde 1)
Understa raden (från vänster till höger): Initialiserad med vitt brus (RNG-seed 2, 3, 4)
Skiktrepresentationer
Funktionernas komplexitet och storleken på det receptiva fältet ökar nedåt i CNN-hierarkin.
Här återger vi figur 3 från den ursprungliga artikeln:
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 |
Rader: ökande delmängder av CNN-skikt; i.T.ex. innebär ”conv4_1” att man använder ”conv1_1”, ”conv2_1”, ”conv3_1”, ”conv4_1”.
Kolumner: alfa/beta-förhållandet mellan rekonstruktionen av innehållet och stilen (se ”Content / Style Tradeoff”).
Setup
Beroenden:
- tensorflow
- opencv
Valfria (men rekommenderade) beroenden:
- CUDA 7.5+
- cuDNN 5.0+
Efter att ha installerat beroendena:
- Hämta VGG-19-modellens vikter (se avsnittet ”VGG-VD-modeller från projektet Very Deep Convolutional Networks for Large-Scale Visual Recognition”). Mer information om VGG-19-nätverket finns här.
- När du har laddat ner kopierar du viktfilen
imagenet-vgg-verydeep-19.mat
till projektkatalogen.
Användning
Grundläggande användning
Enkel bild
- Kopiera 1 innehållsbild till standardkatalogen för bildinnehåll
./image_input
- Kopiera 1 eller flera stilbilder till standardkatalogen för stilbilder
./styles
- Kör kommandot:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>
Exempel:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
Anmärkning: Följande bildformat stöds: .png
, .jpg
, .ppm
, .pgm
Anmärkning: Sökvägar till bilder bör inte innehålla tecknet ~
för att representera din hemkatalog; du bör istället använda en relativ sökväg eller den absoluta sökvägen.
Videoramar
- Kopiera 1 innehållsvideo till standardkatalogen för videoinnehåll
./video_input
- Kopiera 1 eller flera stilbilder till standardkatalogen för stilar
./styles
- Kör kommandot:
bash stylize_video.sh <path_to_video> <path_to_style_image>
Exempel:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Anmärkning: Stödda videoformat är bland annat: .mp4
, .mov
, .mkv
Avancerad användning
Enstaka bilder eller videoframes
- Kopiera innehållsbilder till standardkatalogen för bildinnehåll
./image_input
eller kopiera videoframes till standardkatalogen för videoinnehåll./video_input
- Kopiera en eller flera stilbilder till standardkatalogen för stilar
./styles
- Skynda kommandot med specifika argument:
python neural_style.py <arguments>
Exempel (en enda bild):
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;
Om du vill använda flera stilbilder skickar du en lista med bildnamn och bildvikter som är åtskilda från mellanslag på följande sätt:
--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5
Exempel (videoframes):
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;
Observera att du måste ha beräknat det optiska flödet framåt och bakåt mellan bilderna när du använder --init_frame_type prev_warp
. Se ./video_input/make-opt-flow.sh
och ./video_input/run-deepflow.sh
Argument
-
--content_img
: Filnamn på innehållsbilden. Exempel:lion.jpg
-
--content_img_dir
: Relativ eller absolut katalogsökväg till innehållsbilden. Standard:./image_input
-
--style_imgs
: Filnamn för stilbilderna. Om du vill använda flera stilbilder kan du skicka en lista som är separerad från mellanslag. Exempel:--style_imgs starry-night.jpg
-
--style_imgs_weights
: Blandningsvikter för varje stilbild. Standard:1.0
(förutsätter endast 1 stilbild) -
--style_imgs_dir
: Relativ eller absolut katalogsökväg till stilbilderna. Standard:./styles
-
--init_img_type
: Bild som används för att initiera nätverket. Valmöjligheter:content
,random
,style
. Standard: :content
-
--max_size
: Maximal bredd eller höjd för de ingående bilderna. Standard:512
-
--content_weight
: Vikt för innehållsförlustfunktionen. Standard:5e0
-
--style_weight
: Vikt för stilförlustfunktionen. Standard:1e4
-
--tv_weight
: Vikt för den totala variationsförlustfunktionen. Standardvärde:1e-3
-
--temporal_weight
: Vikt för den temporala förlustfunktionen. Standard:2e2
-
--content_layers
: Namn på VGG-19-skikt som används för innehållsbilden och som är separerade i rymden. Standard:conv4_2
-
--style_layers
: VGG-19-skiktnamn separerade i rymden som används för stilbilden. Standard:relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
-
--content_layer_weights
: Varje innehållsskikts vikt i förhållande till innehållsförlusten, separerad från varandra. Standard:1.0
-
--style_layer_weights
: Rymdseparerade vikter för varje stillager till förlusten. Standard:0.2 0.2 0.2 0.2 0.2
-
--original_colors
: Boolsk flagga som anger om stilen överförs men inte färgerna. -
--color_convert_type
: Färgrymder (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) för luminansmatchningskonvertering till originalfärger. Valmöjligheter:yuv
,ycrcb
,luv
,lab
. Standard:yuv
-
--style_mask
: Boolesk flagga som anger om stilen överförs till maskerade områden. -
--style_mask_imgs
: Filnamn på stilmaskbilderna (exempel:face_mask.png
). Om du vill använda flera stilmaskeringsbilder kan du skicka en lista med mellanslag åtskild. Exempel:--style_mask_imgs face_mask.png face_mask_inv.png
-
--noise_ratio
: Interpolationsvärde mellan innehållsbilden och brusbilden om nätverket initieras medrandom
. Standardvärde:1.0
-
--seed
: Frö för slumptalsgeneratorn. Standard:0
-
--model_weights
: VGG-19-nätverkets vikter och bias. Ladda ner här. Standard:imagenet-vgg-verydeep-19.mat
-
--pooling_type
: Typ av pooling i det konvolutionella neurala nätverket. Valmöjligheter:avg
,max
. Standard:avg
-
--device
: GPU- eller CPU-enhet. GPU-läge rekommenderas starkt men kräver NVIDIA CUDA. Valmöjligheter:/gpu:0
/cpu:0
. Standard:/gpu:0
-
--img_output_dir
: Katalog att skriva utdata till. Standard:./image_output
-
--img_name
: Filnamn på utdatabilden. Standard:result
-
--verbose
: Boolsk flagga som anger om uttalanden ska skrivas ut till konsolen.
Optimeringsargument
-
--optimizer
: Förlustminimeringsoptimering. L-BFGS ger bättre resultat. Adam använder mindre minne. Valmöjligheter:lbfgs
,adam
. Standard:lbfgs
-
--learning_rate
: Parameter för inlärningshastighet för Adam-optimeringen. Standard:1e0
-
--max_iterations
: Max antal iterationer för Adam- eller L-BFGS-optimeringen. Standard:1000
-
--print_iterations
: Antal iterationer mellan utskriftsanvisningar för optimeraren. Standard:50
-
--content_loss_function
: Olika konstanter K i innehållsförlustfunktionen. Valmöjligheter:1
,2
,3
. Standard:1
Video Frame Arguments
-
--video
: Boolesk flagga som anger om användaren skapar en video. -
--start_frame
: Första bildrutan: : Första bildrutan. Standard:1
-
--end_frame
: Sista bildnumret: : Sista bildnumret. Standard:1
-
--first_frame_type
: Bild som används för att initiera nätverket vid rendering av den första ramen. Valmöjligheter:content
,random
,style
. Standard:random
-
--init_frame_type
: Bild som används för att initialisera nätverket under varje rendering efter den första ramen. Valmöjligheter:prev_warped
,prev
,content
,random
,style
. Standard:prev_warped
-
--video_input_dir
: Relativ eller absolut katalogsökväg till inmatningsramar. Standard:./video_input
-
--video_output_dir
: Relativ eller absolut katalogsökväg för att skriva utdatarutor till. Standard:./video_output
-
--content_frame_frmt
: Formatsträng för inmatningsramar. Standard:frame_{}.png
-
--backward_optical_flow_frmt
: Formatsträng för bakåtriktade optiska flödesfiler. Standard:backward_{}_{}.flo
-
--forward_optical_flow_frmt
: Formatsträng för framåtriktade optiska flödesfiler. Standard:forward_{}_{}.flo
-
--content_weights_frmt
: Formatsträng för konsistensfiler för optiska flöden. Standard:reliable_{}_{}.txt
-
--prev_frame_indices
: Föregående ramar som ska beaktas för långsiktig tidsmässig konsistens. Standard:1
-
--first_frame_iterations
: Maximalt antal optimeringsiterationer för den första ramen. Standard:2000
-
--frame_iterations
: Maximalt antal optimeringsiterationer för varje ram efter den första ramen. Standard:800
Frågor och felaktigheter
Sänd frågor eller problem:
Minne
Som standard använder neural-style-tf
NVIDIA cuDNN GPU-backend för konvolutioner och L-BFGS för optimering.Dessa ger bättre och snabbare resultat, men kan förbruka mycket minne. Du kan minska minnesanvändningen med följande:
- Använd Adam: Lägg till flaggan
--optimizer adam
för att använda Adam istället för L-BFGS. Detta bör avsevärt minska minnesanvändningen, men kräver att andra parametrar justeras för att få bra resultat. Du bör särskilt experimentera med olika värden för--learning_rate
,--content_weight
,--style_weight
- Minska bildstorleken: Du kan minska storleken på den genererade bilden med argumentet
--max_size
.
Implementeringsdetaljer
Alla bilder renderades på en maskin med:
- CPU: Intel Core i7-6800K @ 3.40GHz × 12
- GPU: NVIDIA GeForce GTX 1080/PCIe/SSE2
- OS: Linux Ubuntu 16.04.1 LTS 64-bitars
- CUDA: 8.0
- python: 2.7.12
- tensorflow: 0.10.0rc
- opencv: 2.4.9.1
Tack
Implementationen är baserad på projekten:
- Torch (Lua)-implementation ’neural-style’ av jcjohnson
- Torch (Lua)-implementation ’artistic-videos’ av manuelruder
Källvideoframar hämtades från:
- MPI Sintel Flow Dataset
Konstnärliga bilder skapades av moderna konstnärer:
- Alex Grey
- Minjae Lee
- Leonid Afremov
- Françoise Nielly
- James Jean
- Ben Giles
- Callie Fink
- H.R. Giger
- Voka
De konstnärliga bilderna skapades av populära historiska konstnärer:
- Vincent Van Gogh
- Wassily Kandinsky
- Georgia O’Keeffe
- Jean-Michel Basquiat
- Édouard Manet
- Pablo Picasso
- Joseph Mallord William Turner
- Frida Kahlo
Bash-skalskripten för testning skapades av min bror Sheldon Smith.
Citat
Om du finner den här koden användbar för din forskning, vänligen citera:
@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}},}