kshitizrimal / deepStyle
Dit is een TensorFlow implementatie van verschillende technieken beschreven in de papers:
- Image Style Transfer Using Convolutional Neural Networksby Leon A. Gatys, Alexander S. Ecker, Matthias Bethge
- Artistieke stijloverdracht voor video’s door Manuel Ruder, Alexey Dosovitskiy, Thomas Brox
- Behoud van kleur in neurale Artistieke Stijloverdracht door Leon A. Gatys, Matthias Bethge, Aaron Hertzmann, Eli Shechtman
Daarnaast worden technieken gepresenteerd voor semantische segmentatie en meervoudige stijloverdracht.
Het Neural Style algoritme synthetiseert een pastiche door de inhoud van een beeld te scheiden en te combineren met de stijl van een ander beeld met behulp van convolutionele neurale netwerken (CNN). Hieronder ziet u een voorbeeld van het overbrengen van de artistieke stijl van De Sterrennacht op een foto van een Afrikaanse leeuw:
Het overbrengen van de stijl van verschillende kunstwerken op hetzelfde inhoudsbeeld levert kwalitatief overtuigende resultaten op:
Hierbij reproduceren we figuur 3 uit de eerste paper, die een foto van het Neckarfront in Tübingen, Duitsland weergeeft in de stijl van 5 verschillende iconische schilderijen De Schipbreuk van de Minotaurus, De Sterrennacht, Compositie VII, De Schreeuw en Zittend naakt:
Content / Style Tradeoff
Het relatieve gewicht van de stijl en de inhoud kan worden gecontroleerd.
Hier renderen we met een toenemend stijlgewicht toegepast op Red Canna:
Meerdere stijlafbeeldingen
Meer dan één stijlafbeelding kan worden gebruikt om meerdere artistieke stijlen te mengen.
Top rij (van links naar rechts): De Sterrennacht + De Schreeuw, De Schreeuw + Compositie VII, Zittend naakt + Compositie VII
Bodemrij (van links naar rechts): Seated Nude + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull
Style Interpolation
Bij gebruik van meerdere stijlbeelden kan de mate van overvloeiing tussen de beelden worden geregeld.
Top rij (van links naar rechts): inhoudsbeeld, .2 The Starry Night + .8 De Schreeuw, .8 De Sterrennacht + .2 De Schreeuw
Onderste rij (van links naar rechts): .2 Overziel + .8 Versheid van Koude, .5 Overziel + .5 Versheid van Koude, .8 Overziel + .2 Versheid van Koude
Stijl overzetten maar geen kleur
Het kleurenschema van de originele afbeelding kan worden behouden door de vlag --original_colors
op te nemen. Kleuren worden overgebracht met behulp van ofwel de YUV, YCrCb, CIE L*a*b*, of CIE L*u*v* kleurruimten.
Hierbij reproduceren we Figuur 1 en Figuur 2 uit het derde paper met gebruikmaking van luminantie-overdracht:
Links naar rechts: inhoudsbeeld, gestileerd beeld, gestileerd beeld met de oorspronkelijke kleuren van het inhoudsbeeld
Texturen
Het algoritme is niet beperkt tot artistieke schilderstijlen. Het kan ook worden toegepast op fotografische texturen om pareidolic beelden te creëren.
Segmentatie
Stijl kan worden overgebracht naar semantische segmentaties in het inhoudsbeeld.
Meerdere stijlen kunnen worden overgebracht naar de voorgrond en achtergrond van het inhoudsbeeld.
Links naar rechts: inhoudsafbeelding, voorgrondstijl, achtergrondstijl, voorgrondmasker, achtergrondmasker, gestileerde afbeelding
Video
Animaties kunnen worden gerenderd door het algoritme toe te passen op elk bronframe. Voor de beste resultaten wordt de gradiëntafdaling geïnitialiseerd met het eerder gestileerde frame dat volgens de optische stroom tussen de twee frames is afgebogen naar het huidige frame. Verliesfuncties voor temporele consistentie worden gebruikt om pixels te bestraffen die uitgesloten gebieden en bewegingsgrenzen uitsluiten.
Top rij (van links naar rechts): bronframes, ground-truth optische stroom gevisualiseerd
Bodem rij (van links naar rechts): uitgesloten gebieden en bewegingsgrenzen, gestileerde frames
Gradient Descent Initialization
De initialisatie van de gradient descent wordt geregeld met --init_img_type
voor enkele beelden en --init_frame_type
of --first_frame_type
voor video frames. Met witte ruis kan een willekeurig aantal afzonderlijke beelden worden gegenereerd. Terwijl initialiseren met een vast beeld altijd convergeert naar dezelfde output.
Hierbij reproduceren we figuur 6 uit het eerste artikel:
Top rij (van links naar rechts): Geïnitialiseerd met de inhoudsafbeelding, de stijlafbeelding, witte ruis (RNG seed 1)
Onderste rij (van links naar rechts): Geïnitialiseerd met witte ruis (RNG seeds 2, 3, 4)
Lagen Representaties
De kenmerkcomplexiteit en receptieve veldgroottes nemen toe naar beneden in de CNN-heirarchie.
Hier reproduceren we figuur 3 uit het oorspronkelijke artikel:
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 |
Rijen: oplopende deelverzamelingen van CNN-lagen; d.w.z.D.w.z. ‘conv4_1’ betekent gebruik van ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’.
Kolommen: alpha/betaverhouding van de inhoud en stijlreconstructie (zie ‘Content / Style Tradeoff’).
Setup
Afhankelijkheden:
- tensorflow
- opencv
Optionele (maar aanbevolen) afhankelijkheden:
- CUDA 7.5+
- cuDNN 5.0+
Na het installeren van de afhankelijkheden:
- Download de VGG-19 modelgewichten (zie de “VGG-VD modellen van het Very Deep Convolutional Networks for Large-Scale Visual Recognition project” sectie). Meer info over het VGG-19 netwerk vindt u hier.
- Na het downloaden kopieert u het gewichtenbestand
imagenet-vgg-verydeep-19.mat
naar de projectdirectory.
Gebruik
Basisgebruik
Enkele afbeelding
- Kopieer 1 inhoudsafbeelding naar de standaard map voor inhoudsafbeeldingen
./image_input
- Kopieer 1 of meer stijlafbeeldingen naar de standaard map voor stijlafbeeldingen
./styles
- Run het commando:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>
Voorbeeld:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
Noot: Ondersteunde beeldformaten zijn onder andere: .png
, .jpg
, .ppm
, .pgm
Note: Paden naar afbeeldingen mogen niet het teken ~
bevatten om uw thuismap weer te geven; u moet in plaats daarvan een relatief pad of het absolute pad gebruiken.
Videoframes
- Kopieer 1 inhoudsvideo naar de standaardmap voor video-inhoud
./video_input
- Kopieer 1 of meer stijlafbeeldingen naar de standaardmap voor stijl
./styles
- Voer het commando uit:
bash stylize_video.sh <path_to_video> <path_to_style_image>
Voorbeeld:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Noot: Ondersteunde videoformaten zijn onder meer: .mp4
, .mov
, .mkv
Geavanceerd gebruik
Enkele afbeelding of videoframes
- Kopieer inhoudsafbeeldingen naar de standaard map voor beeldinhoud
./image_input
of kopieer videoframes naar de standaard map voor video-inhoud./video_input
- Kopieer 1 of meer stijlafbeeldingen naar de standaard stijlmap
./styles
- Voer het commando uit met specifieke argumenten:
python neural_style.py <arguments>
Voorbeeld (Enkel beeld):
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 meerdere stijlbeelden te gebruiken, geeft u een door een spatie gescheiden lijst van de beeldnamen en beeldgewichten door zoals dit:
--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5
Voorbeeld (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;
Noot: Wanneer u --init_frame_type prev_warp
gebruikt, moet u van tevoren de achterwaartse en voorwaartse optische stroom tussen de frames berekend hebben. Zie ./video_input/make-opt-flow.sh
en ./video_input/run-deepflow.sh
Argumenten
-
--content_img
: Bestandsnaam van het inhoudsbeeld. Voorbeeld:lion.jpg
-
--content_img_dir
: Relatief of absoluut directory pad naar de inhoudsafbeelding. Standaard:./image_input
-
--style_imgs
: Bestandsnamen van de stijl afbeeldingen. Om meerdere stijl-afbeeldingen te gebruiken, geef een lijst door gescheiden door spaties. Voorbeeld:--style_imgs starry-night.jpg
-
--style_imgs_weights
: De overvloeigewichten voor elke stijlafbeelding. Standaard:1.0
(gaat uit van slechts 1 stijlafbeelding) -
--style_imgs_dir
: Relatief of absoluut directorypad naar de stijlafbeeldingen. Standaard:./styles
-
--init_img_type
: Afbeelding gebruikt om het netwerk te initialiseren. Keuzes:content
,random
,style
. Standaard:content
-
--max_size
: Maximale breedte of hoogte van de invoerafbeeldingen. Standaard:512
-
--content_weight
: Gewicht voor de inhoud verliesfunctie. Standaard:5e0
-
--style_weight
: Gewicht voor de stijl verlies functie. Standaard:1e4
-
--tv_weight
: Gewicht voor de totale variationele verliesfunctie. Standaard:1e-3
-
--temporal_weight
: Gewicht voor de temporele verliesfunctie. Standaard:2e2
-
--content_layers
: Door ruimte gescheiden VGG-19 laagnamen gebruikt voor het inhoudsbeeld. Standaard:conv4_2
-
--style_layers
: Van ruimte gescheiden VGG-19 laagnamen gebruikt voor het stijlbeeld. Standaard:relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
-
--content_layer_weights
: Ruimte-gescheiden gewichten van elke inhoudslaag aan het inhoudsverlies. Standaard:1.0
-
--style_layer_weights
: Ruimte-gescheiden gewichten van elke stijllaag aan het verlies. Standaard:0.2 0.2 0.2 0.2 0.2
-
--original_colors
: Boolean vlag die aangeeft of de stijl wordt overgedragen, maar niet de kleuren. -
--color_convert_type
: Kleurruimten (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) voor luminantie-matching conversie naar originele kleuren. Keuzes:yuv
,ycrcb
,luv
,lab
. Standaard:yuv
-
--style_mask
: Booleaanse vlag die aangeeft of de stijl wordt overgebracht naar gemaskeerde gebieden. -
--style_mask_imgs
: Bestandsnamen van de stijlmaskerafbeeldingen (voorbeeld:face_mask.png
). Als u meerdere stijlmaskerafbeeldingen wilt gebruiken, geeft u een lijst door die door een spatie wordt gescheiden. Voorbeeld:--style_mask_imgs face_mask.png face_mask_inv.png
-
--noise_ratio
: Interpolatiewaarde tussen het inhoudsbeeld en het ruisbeeld als het netwerk is geïnitialiseerd metrandom
. Standaard:1.0
-
--seed
: Zaad voor de willekeurige getallengenerator. Standaard:0
-
--model_weights
: Gewichten en biases van het VGG-19 netwerk. Hier te downloaden. Standaard:imagenet-vgg-verydeep-19.mat
-
--pooling_type
: Type pooling in convolutioneel neuraal netwerk. Keuzes:avg
,max
. Standaard:avg
-
--device
: GPU of CPU apparaat. GPU mode ten zeerste aanbevolen, maar vereist NVIDIA CUDA. Keuzes:/gpu:0
/cpu:0
. Standaard:/gpu:0
-
--img_output_dir
: Directory om uitvoer naar te schrijven. Standaard:./image_output
-
--img_name
: Bestandsnaam van de uitvoerafbeelding. Standaard:result
-
--verbose
: Booleaanse vlag die aangeeft of verklaringen naar de console moeten worden afgedrukt.
Optimalisatie-argumenten
-
--optimizer
: Verlies minimalisatie optimalisator. L-BFGS geeft betere resultaten. Adam gebruikt minder geheugen. Keuzes:lbfgs
,adam
. Standaard:lbfgs
-
--learning_rate
: Leersnelheid parameter voor de Adam optimizer. Standaard:1e0
-
--max_iterations
: Max aantal iteraties voor de Adam of L-BFGS optimizer. Standaard:1000
-
--print_iterations
: Aantal iteraties tussen afdrukstatements van de optimizer. Standaard:50
-
--content_loss_function
: Verschillende constanten K in de inhoud verliesfunctie. Keuzes:1
,2
,3
. Standaard:1
Video Frame Argumenten
-
--video
: Booleaanse vlag die aangeeft of de gebruiker een video aan het maken is. -
--start_frame
: Eerste frame nummer. Standaard:1
-
--end_frame
: Laatste frame nummer. Standaard:1
-
--first_frame_type
: Afbeelding gebruikt om het netwerk te initialiseren tijdens het renderen van het eerste frame. Keuzes:content
,random
,style
. Standaard:random
-
--init_frame_type
: Beeld gebruikt om het netwerk te initialiseren tijdens de rendering na het eerste frame. Keuzes:prev_warped
,prev
,content
,random
,style
. Standaard:prev_warped
-
--video_input_dir
: Relatief of absoluut mappad naar invoerframes. Standaard:./video_input
-
--video_output_dir
: Relatief of absoluut mappad om uitvoerframes naar te schrijven. Standaard:./video_output
-
--content_frame_frmt
: Format string van invoerframes. Standaard:frame_{}.png
-
--backward_optical_flow_frmt
: Format string van achterwaartse optical flow bestanden. Standaard:backward_{}_{}.flo
-
--forward_optical_flow_frmt
: Format string van voorwaartse optische stroom bestanden. Standaard:forward_{}_{}.flo
-
--content_weights_frmt
: Format string van optical flow consistentiebestanden. Standaard:reliable_{}_{}.txt
-
--prev_frame_indices
: Vorige frames om in aanmerking te nemen voor langdurige temporele consistentie. Standaard:1
-
--first_frame_iterations
: Maximum aantal optimalisator iteraties van het eerste frame. Standaard:2000
-
--frame_iterations
: Maximum aantal optimizer iteraties voor elk frame na het eerste frame. Standaard:800
Vragen en Errata
Stuur vragen of problemen:
Geheugen
Standaard gebruikt neural-style-tf
de NVIDIA cuDNN GPU backend voor convoluties en L-BFGS voor optimalisatie.Deze produceren betere en snellere resultaten, maar kunnen veel geheugen verbruiken. U kunt het geheugengebruik verminderen met het volgende:
- Gebruik Adam: Voeg de vlag
--optimizer adam
toe om Adam te gebruiken in plaats van L-BFGS. Dit zou het geheugengebruik aanzienlijk moeten verminderen, maar zal afstemming van andere parameters vereisen voor goede resultaten; in het bijzonder zou u moeten experimenteren met verschillende waarden van--learning_rate
,--content_weight
,--style_weight
- Verminder de beeldgrootte: U kunt de grootte van de gegenereerde afbeelding verkleinen met het
--max_size
argument.
Implementatie Details
Alle afbeeldingen werden gerenderd op een machine met:
- 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
Erkenningen
De implementatie is gebaseerd op de projecten:
- Torch (Lua) implementatie ‘neural-style’ door jcjohnson
- Torch (Lua) implementatie ‘artistic-videos’ door manuelruder
Bronnen videoframes werden verkregen uit:
- MPI Sintel Flow Dataset
Artistieke beelden werden gemaakt door de moderne kunstenaars:
- Alex Grey
- Minjae Lee
- Leonid Afremov
- Françoise Nielly
- James Jean
- Ben Giles
- Callie Fink
- H.R. Giger
- Voka
Artistieke beelden werden gemaakt door de populaire historische kunstenaars:
- Vincent Van Gogh
- Wassily Kandinsky
- Georgia O’Keeffe
- Jean-Michel Basquiat
- Édouard Manet
- Pablo Picasso
- Joseph Mallord William Turner
- Frida Kahlo
Bash shell scripts om te testen werden gemaakt door mijn broer Sheldon Smith.
Citation
Als u deze code nuttig vindt voor uw onderzoek, kunt u citeren:
@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}},}