kshitizrimal / deepStyle
Dette er en TensorFlow-implementering af flere af de teknikker, der er beskrevet i artiklerne:
- Image Style Transfer Using Convolutional Neural Networksaf Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
- Kunstnerisk stiloverførsel til videoeraf Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
- Bevarelse af farve i neural kunstnerisk stiloverførselaf Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman
Der præsenteres desuden teknikker til semantisk segmentering og overførsel af flere stilarter.
Den neurale stilalgoritme syntetiserer en pastiche ved at adskille og kombinere indholdet af et billede med stilen af et andet billede ved hjælp af konvolutionelle neurale netværk (CNN). Nedenfor er et eksempel på overførsel af den kunstneriske stil fra The Starry Night til et fotografi af en afrikansk løve:
Transferering af stilen fra forskellige kunstværker til det samme indholdsbillede giver kvalitativt overbevisende resultater:
Her gengiver vi figur 3 fra den første artikel, som gengiver et fotografi af Neckarfront i Tübingen, Tyskland, i stil med 5 forskellige ikoniske malerier The Shipwreck of the Minotaur, The Starry Night, Composition VII, The Scream, Seated Nude:
Afvejning mellem indhold og stil
Den relative vægt af stil og indhold kan styres.
Her renderes med en stigende stilvægt anvendt på Red Canna:
Flere stilbilleder
Mere end ét stilbillede kan bruges til at blande flere kunstneriske stilarter.
Overste række (fra venstre til højre): Stjerneskud + Skriget, Skriget + Komposition VII, Siddende nøgen + Komposition VII
Underste række (fra venstre til højre): 7474>Skulpturerne i højre række (fra venstre til højre): “The Starry Night + The Scream, The Scream + Composition VII, Seated Nude + Composition VII”: Siddende nøgen + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull
Style Interpolation
Når der anvendes flere stilbilleder, kan graden af blanding mellem billederne styres.
Overste række (fra venstre til højre): indholdsbillede, .2 The Starry Night + .8 The Scream, .8 The Starry Night + .2 The Scream
Underste række (fra venstre til højre): .2 Oversoul + .8 Freshness of Cold, .5 Oversoul + .5 Freshness of Cold, .8 Oversoul + .2 Freshness of Cold
Overfør stil, men ikke farve
Det originale billedes farveskema kan bevares ved at inkludere flaget --original_colors
. Farver overføres ved hjælp af enten YUV-, YCrCb-, CIE L*a*b*- eller CIE L*u*v*-farverummet.
Her gengiver vi figur 1 og figur 2 i den tredje artikel, hvor der kun anvendes luminansoverførsel:
Venstre til højre: indholdsbillede, stiliseret billede, stiliseret billede med de oprindelige farver i indholdsbilledet
Teksturer
Algoritmen er ikke begrænset til kunstneriske malestilarter. Den kan også anvendes på fotografiske teksturer for at skabe pareidolske billeder.
Segmentering
Stilen kan overføres til semantiske segmenteringer i indholdsbilledet.
Multiple styles can be transferred to the foreround and background of the content image.
Vest til højre: indholdsbillede, forgrundsstil, baggrundsstil, forgrundsmaske, baggrundsmaske, stiliseret billede
Video
Animationer kan gengives ved at anvende algoritmen på hvert enkelt kildebillede. For at opnå de bedste resultater initialiseres gradientafstigningen med den tidligere stiliserede ramme, der er forvredet til den aktuelle ramme i overensstemmelse med det optiske flow mellem rampeparret. Tabsfunktioner for tidsmæssig konsistens anvendes til at straffe pixels, der udelukker udelukkede regioner og bevægelsesgrænser.
Overste række (fra venstre til højre): Kildebilleder, optisk flow visualiseret som sandhed på jorden
Nederste række (fra venstre til højre):
Initialisering af gradientafstamning
Initialiseringen af gradientafstamningen styres ved hjælp af --init_img_type
for enkeltbilleder og --init_frame_type
eller --first_frame_type
for videobilleder. Hvid støj gør det muligt at generere et vilkårligt antal forskellige billeder. Hvorimod initialisering med et fast billede altid konvergerer til det samme output.
Her gengiver vi figur 6 fra den første artikel:
Overste række (fra venstre til højre): Initialiseret med indholdsbilledet, stilbilledet, hvid støj (RNG frø 1)
Underste række (fra venstre til højre): Initialiseret med hvid støj (RNG-frø 2, 3, 4)
Lagrepræsentationer
Funktionernes kompleksitet og receptive feltstørrelser øges nedad i CNN-hierarkiet.
Her gengiver vi figur 3 fra den oprindelige artikel:
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ækker: stigende delmængder af CNN-lag; i.f.eks. betyder “conv4_1”, at der anvendes “conv1_1”, “conv2_1”, “conv3_1”, “conv4_1”.
Søjler: alfa/beta-forholdet mellem indholds- og stilrekonstruktionen (se indhold/stilsafvejning).
Opsætning
Afhængigheder:
- tensorflow
- opencv
Valgfrie (men anbefalede) afhængigheder:
- CUDA 7.5+
- cuDNN 5.0+
Efter installation af afhængighederne:
- Download VGG-19-modelvægtene (se afsnittet “VGG-VD-modeller fra projektet “Very Deep Convolutional Networks for Large-Scale Visual Recognition””). Du kan finde flere oplysninger om VGG-19-netværket her.
- Når du har downloadet, skal du kopiere vægtefilen
imagenet-vgg-verydeep-19.mat
til projektmappen.
Anvendelse
Grundlæggende anvendelse
Enkelt billede
- Kopier 1 indholdsbillede til standardmappen for indholdsbilleder
./image_input
- Kopier 1 eller flere stilbilleder til standardmappen for stilbilleder
./styles
- Kør kommandoen:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>
Eksempel:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
Bemærk: Følgende billedformater understøttes:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
.png
, .jpg
, .ppm
, .pgm
Bemærk: Stier til billeder bør ikke indeholde ~
-tegnet for at repræsentere din hjemmemappe; du bør i stedet bruge en relativ sti eller den absolutte sti.
Videobilleder
- Kopier 1 indholdsvideo til mappen med standardvideoindhold
./video_input
- Kopier 1 eller flere stilbilleder til mappen med standardstil
./styles
- Kør kommandoen:
bash stylize_video.sh <path_to_video> <path_to_style_image>
Eksempel:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Bemærk: Understøttede videoformater omfatter: .mp4
, .mov
, .mkv
Avanceret brug
Enkelte billeder eller videobilleder
- Kopier indholdsbilleder til standardmappen for billedindhold
./image_input
eller kopier videobilleder til standardmappen for videoinhold./video_input
- Kopier 1 eller flere stilbilleder til standardmappen for stil
./styles
- Kør kommandoen med specifikke argumenter:
.mp4
,.mov
,.mkv
- Kopier kommandoen med specifikke argumenter:
./styles
./styles
- Kopier et eller flere stilbilleder til standardmappen for stil:
python neural_style.py <arguments>
Eksempel (enkelt billede):
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;
For at bruge flere stilbilleder skal du sende en mellemrumsadskilt liste over billednavne og billedvægte som følger:
--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5
Eksempel (videobilleder):
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;
Bemærk: Når du bruger --init_frame_type prev_warp
, skal du forinden have beregnet det optiske flow fremad og bagud mellem billederne. Se ./video_input/make-opt-flow.sh
og ./video_input/run-deepflow.sh
Argumenter
-
--content_img
: Filenavn på indholdsbilledet. Eksempel:lion.jpg
-
--content_img_dir
: Relativ eller absolut mappesti til indholdsbilledet. Standard:./image_input
-
--style_imgs
: Filenavne for stilbillederne. Hvis du vil bruge flere stilbilleder, skal du angive en liste adskilt af mellemrum. Eksempel:--style_imgs starry-night.jpg
-
--style_imgs_weights
: Blandingsvægtene for hvert stilbillede. Standard:1.0
(forudsætter kun 1 stilbillede) -
--style_imgs_dir
: Relativ eller absolut mappesti til stilbillederne. Standard:./styles
-
--init_img_type
: Billede, der bruges til at initialisere netværket. Valgmuligheder:content
,random
,style
. Standard:content
-
--max_size
: Maksimal bredde eller højde for de indgående billeder. Standard:512
-
--content_weight
: Vægt for indholdstabsfunktionen. Standard:5e0
-
--style_weight
: Vægt for tabsfunktionen for stil. Standard:1e4
-
--tv_weight
: Vægt for den samlede variationstabsfunktion. Standard:1e-3
-
--temporal_weight
: Vægt for den tidsmæssige tabsfunktion. Standard:2e2
-
--content_layers
: VGG-19-lagnavne adskilt fra rummet, der anvendes til indholdsbilledet. Standard:conv4_2
-
--style_layers
: VGG-19-lagnavne adskilt fra hinanden i rummet, der anvendes til stilbilledet. Standard:relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
-
--content_layer_weights
: Rumseparerede vægte for hvert indholdslag i forhold til indholdstabet. Standard:1.0
-
--style_layer_weights
: Rumseparerede vægte for hvert stillag til tabet. Standard:0.2 0.2 0.2 0.2 0.2
-
--original_colors
: Boolsk flag, der angiver, om stilen overføres, men ikke farverne. -
--color_convert_type
: Farverum (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) til luminansmatchende konvertering til de originale farver. Valgmuligheder:yuv
,ycrcb
,luv
,lab
. Standardværdi:yuv
-
--style_mask
: Boolsk flag, der angiver, om stilen overføres til maskerede områder. -
--style_mask_imgs
: Filnavne på stilmaskebillederne (eksempel:face_mask.png
). Hvis du vil bruge flere stilmaskebilleder, skal du sende en liste med mellemrumsadskillelse. Eksempel:--style_mask_imgs face_mask.png face_mask_inv.png
-
--noise_ratio
: Interpolationsværdi mellem indholdsbilledet og støjbilledet, hvis netværket er initialiseret medrandom
. Standard:1.0
-
--seed
: Seed til generatoren af tilfældige tal. Standard:0
-
--model_weights
: Vægte og bias i VGG-19-netværket. Download her. Standard:imagenet-vgg-verydeep-19.mat
-
--pooling_type
: Type pooling i det konvolutionelle neurale netværk. Valgmuligheder:avg
,max
. Standard: :avg
-
--device
: GPU- eller CPU-enhed. GPU-tilstand anbefales stærkt, men kræver NVIDIA CUDA. Valgmuligheder:/gpu:0
/cpu:0
. Standard:/gpu:0
-
--img_output_dir
: Mappe til at skrive output til. Standard:./image_output
-
--img_name
: Filnavn på outputbilledet. Standard:result
-
--verbose
: Boolsk flag, der angiver, om udsagn skal udskrives til konsollen.
Optimeringsargumenter
-
--optimizer
: Tabsminimeringsoptimeringsoptimering. L-BFGS giver bedre resultater. Adam bruger mindre hukommelse. Valgmuligheder:lbfgs
,adam
. Standard:lbfgs
-
--learning_rate
: Parameter for indlæringshastighed for Adam-optimeringen. Standard:1e0
-
--max_iterations
: Max. antal iterationer for Adam- eller L-BFGS-optimeringen. Standard:1000
-
--print_iterations
: Antal iterationer mellem optimizerens udskriftsangivelser. Standard:50
-
--content_loss_function
: Forskellige konstanter K i indholdstabsfunktionen. Valgmuligheder:1
,2
,3
. Standard:1
Videoramme Argumenter
-
--video
: Boolsk flag, der angiver, om brugeren opretter en video. -
--start_frame
: Første rammenummer. Standard:1
-
--end_frame
: Sidste rammenummer. Standard:1
-
--first_frame_type
: Billede, der bruges til at initialisere netværket under gengivelsen af den første ramme. Valgmuligheder:content
,random
,style
. Standard:random
-
--init_frame_type
: Billede, der bruges til at initialisere netværket under hver rendering efter den første ramme. Valgmuligheder:prev_warped
,prev
,content
,random
,style
. Standard:prev_warped
-
--video_input_dir
: Relativ eller absolut mappesti til inputrammer. Standard:./video_input
-
--video_output_dir
: Relativ eller absolut mappesti til at skrive outputrammer til. Default:./video_output
-
--content_frame_frmt
: Formatstreng for inputrammer. Default:frame_{}.png
-
--backward_optical_flow_frmt
: Formatstreng for optiske flowfiler bagud. Default:backward_{}_{}.flo
-
--forward_optical_flow_frmt
: Formatstreng for fremadrettede optiske flowfiler. Default:forward_{}_{}.flo
-
--content_weights_frmt
: Formatstreng for konsistensfiler for optisk flow. Default:reliable_{}_{}.txt
-
--prev_frame_indices
: Tidligere rammer, der skal tages i betragtning for langsigtet tidsmæssig konsistens. Default:1
-
--first_frame_iterations
: Maksimalt antal optimeringsiterationer af den første ramme. Default:2000
-
--frame_iterations
: Maksimalt antal optimeringsiterationer for hver enkelt ramme efter den første ramme. Default:800
Spørgsmål og fejl og mangler
Send spørgsmål eller problemer:
Hukommelse
Som standard bruger neural-style-tf
NVIDIA cuDNN GPU-backend til konvolutioner og L-BFGS til optimering. disse giver bedre og hurtigere resultater, men kan forbruge meget hukommelse. Du kan reducere hukommelsesforbruget med følgende:
- Brug Adam: Tilføj flaget
--optimizer adam
for at bruge Adam i stedet for L-BFGS. Dette skulle reducere hukommelsesforbruget betydeligt, men det vil kræve justering af andre parametre for at opnå gode resultater; især bør du eksperimentere med forskellige værdier af--learning_rate
,--content_weight
,--style_weight
- Reducer billedstørrelsen: Du kan reducere størrelsen af det genererede billede med
--max_size
-argumentet.
Implementeringsdetaljer
Alle billeder blev renderet på en maskine med:
- 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
Anerkendelser
Implementeringen er baseret på projekterne:
- Torch (Lua)-implementering ‘neural-style’ af jcjohnson
- Torch (Lua)-implementering ‘artistic-videos’ af manuelruder
Kildevideorammer blev indhentet fra:
- MPI Sintel Flow Dataset
Kunstneriske billeder blev skabt af de moderne kunstnere:
- Alex Grey
- Minjae Lee
- Leonid Afremov
- Françoise Nielly
- James Jean
- Ben Giles
- Callie Fink
- H.R. Giger
- Voka
De kunstneriske billeder blev skabt af de populære historiske kunstnere:
- Vincent Van Gogh
- Wassily Kandinsky
- Georgia O’Keeffe
- Jean-Michel Basquiat
- Édouard Manet
- Pablo Picasso
- Joseph Mallord William Turner
- Frida Kahlo
Bash-shellskripter til testning blev oprettet af min bror Sheldon Smith.
Citation
Hvis du finder denne kode nyttig til din forskning, bedes du citere:
@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}},}