kshitizrimal / deepStyle
Tämä on TensorFlow-toteutus useista tekniikoista, jotka on kuvattu artikkeleissa:
- 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
Lisäksi esitellään tekniikoita semanttista segmentointia ja moninkertaista tyylinsiirtoa varten.
Neuraalinen tyylinsiirtoalgoritmi syntetisoi pastissin erottelemalla ja yhdistämällä yhden kuvan sisällön ja toisen kuvan tyylin käyttämällä konvolutiivisia neuroverkkoja (CNN). Alla on esimerkki The Starry Night -teoksen taiteellisen tyylin siirtämisestä afrikkalaista leijonaa esittävään valokuvaan:
Erilaisten taideteosten tyylin siirtäminen samaan sisältökuvaan tuottaa laadullisesti vakuuttavia tuloksia:
Tässä toistetaan kuva 3 ensimmäisestä artikkelista, jossa valokuva Neckarin rintamamaisemasta Tübingenissä, Saksassa, renderöidään viiden erilaisen ikonisen maalauksen tyyliin Minotaurin haaksirikko, Tähtikirkas yö, Sävellyskokonaisuus VII, Huuto, Istuva alaston:
Content / Style Tradeoff
Tyylin ja sisällön suhteellista painoarvoa voidaan hallita.
Tässä renderöidään kasvavalla tyylin painolla sovellettuna Red Canna:
Useita tyylikuvia
Useampaa kuin yhtä tyylikuvaa voidaan käyttää useiden taiteellisten tyylien sekoittamiseen.
Ylärivi (vasemmalta oikealle): Alarivi (vasemmalta oikealle): Tähtiyö + Huuto, Huuto + Kompositio VII, Istuva alaston + Kompositio VII
Alarivi (vasemmalta oikealle): Seated Nude + The Starry Night, Oversoul + Freshness of Cold, David Bowie + Skull
Style Interpolation
Käytettäessä useita tyylikuvia voidaan hallita kuvien välisen sulautumisen astetta.
Ylärivillä (vasemmalta oikealle): Sisällönkuva, .2 Tähtitaivaan yö + .8 Huuto, ,8 Tähtiyö + ,2 Huuto
Alarivi (vasemmalta oikealle): ,2 Ylivieska + ,8 Kylmän raikkaus, ,5 Ylivieska + ,5 Kylmän raikkaus, ,8 Ylivieska + ,2 Kylmän raikkaus
Siirretään tyyliä, mutta ei väriä
Alkuperäisen kuvan värisävyjä voidaan säilyttää ottamalla mukaan lipputunnus --original_colors
. Värit siirretään käyttämällä joko YUV-, YCrCb-, CIE L*a*b*- tai CIE L*u*v*-väriavaruutta.
Tässä toistetaan kolmannen artikkelin kuvat 1 ja 2, joissa käytetään pelkkää luminanssisiirtoa:
Vasemmalta oikealle: sisältökuva, tyylitelty kuva, tyylitelty kuva, jossa on käytetty sisältökuvan alkuperäisiä värejä
Tekstuurit
Algoritmia ei ole rajoitettu taiteellisiin maalaustyyliin. Sitä voidaan soveltaa myös valokuvatekstuureihin pareidolisten kuvien luomiseksi.
Segmentointi
Tyyli voidaan siirtää sisällönkuvan semanttisiin segmentointeihin.
Sisältökuvan etualalle ja taustalle voidaan siirtää useita tyylejä.
Vasemmalta oikealle: Sisältökuva, etualan tyyli, taustan tyyli, etualan maski, taustan maski, tyylitelty kuva
Videokuva
Animaatioita voidaan renderöidä soveltamalla algoritmia kuhunkin lähdekuvaan. Parhaiden tulosten saamiseksi gradienttilasku alustetaan aiemmin stilisoidulla kehyksellä, joka on loimennettu nykyiseen kehykseen kehysparin välisen optisen virtauksen mukaisesti. Ajallisen johdonmukaisuuden tappiofunktioita käytetään rankaisemaan pikseleistä, jotka jättävät pois suljettuja alueita ja liikerajoja.
Ylärivi (vasemmalta oikealle): lähdekehykset, ground-truth optinen virtaus visualisoitu
Alarivi (vasemmalta oikealle): poissuljetut alueet ja liikerajat, tyylitellyt kehykset
Gradienttilaskeutumisen alustaminen
Gradienttilaskeutumisen alustamista ohjataan käyttämällä --init_img_type
yksittäisten kuvien osalta ja --init_frame_type
tai --first_frame_type
videokehysten osalta. Valkoisen kohinan avulla voidaan luoda mielivaltainen määrä erillisiä kuvia. Kun taas alustaminen kiinteällä kuvalla konvergoi aina samaan tulokseen.
Tässä toistetaan kuva 6 ensimmäisestä paperista:
Ylärivi (vasemmalta oikealle): Aloitetaan sisältökuvalla, tyylikuvalla, valkoisella kohinalla (RNG-siemen 1)
Alarivi (vasemmalta oikealle): Initialisoitu valkoisella kohinalla (RNG-siemenet 2, 3, 4)
Kerrosrepresentaatiot
Ominaisuuksien monimutkaisuus ja reseptiivisten kenttien koot kasvavat CNN-perhearkiassa alaspäin.
Tässä toistetaan kuva 3 alkuperäisestä artikkelista:
1 x 10^-5 | 1 x 10^-4 | 1 x 10^-3 | 1 x 10^-2 | ||
conv1_1 | conv2_1 | conv3_1 | |||
conv4_1_1 | |||||
conv5_1 |
Rivit: CNN-kerrosten kasvavat osajoukot; i.esim. ’conv4_1’ tarkoittaa, että käytetään ’conv1_1’, ’conv2_1’, ’conv3_1’, ’conv4_1’.
Sarakkeet: sisällön ja tyylin rekonstruktion alfa/beta-suhde (ks. Content / Style Tradeoff).
Setup
Riippuvuudet:
- tensorflow
- opencv
Valinnaiset (mutta suositeltavat) riippuvuudet:
- CUDA 7.5+
- cuDNN 5.0+
Kun olet asentanut riippuvuudet:
- Lataa VGG-19-mallin painot (katso ”VGG-VD-mallit Very Deep Convolutional Networks for Large-Scale Visual Recognition -projektista”). Lisätietoja VGG-19-verkosta löytyy täältä.
- Lataamisen jälkeen kopioi painotiedosto
imagenet-vgg-verydeep-19.mat
projektin hakemistoon.
Käyttö
Peruskäyttö
Yksittäinen kuva
- Kopioi 1 sisältökuva oletusarvoiseen kuvasisältöhakemistoon
./image_input
- Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon
./styles
- Ajoita komento:
bash stylize_image.sh <path_to_content_image> <path_to_style_image>
Esimerkki:
bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg
Huomautus: Tuettuja kuvaformaatteja ovat mm: .png
, .jpg
, .ppm
, .pgm
Huomautus: Kuvien polkujen ei pitäisi sisältää ~
-merkkiä, joka edustaa kotihakemistoasi; käytä sen sijaan suhteellista polkua tai absoluuttista polkua.
Videokehykset
- Kopioi 1 sisältövideo oletusarvoiseen videosisältöhakemistoon
./video_input
- Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon
./styles
- Suorita komento:
bash stylize_video.sh <path_to_video> <path_to_style_image>
Esimerkki:
bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg
Huomautus: Tuettuja videoformaatteja ovat mm. seuraavat: .mp4
, .mov
, .mkv
Lisäkäyttö
Yksittäiset kuva- tai videokehykset
- Kopioi sisältökuvat oletusarvoiseen kuvasisältöhakemistoon
./image_input
tai kopioi videokehykset oletusarvoiseen videosisältöhakemistoon./video_input
- Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon
./styles
- Ajoita komento tietyin argumentein:
python neural_style.py <arguments>
Esimerkki (yksittäinen kuva):
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;
Käyttääksesi useita tyylikuvia, anna välilyönnillä erotettu luettelo kuvien nimistä ja kuvien painoista seuraavasti:
--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5
Esimerkki (videokehykset):
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;
Huomautus: Käyttäessäsi komentoa --init_frame_type prev_warp
, sinun on täytynyt aiemmin laskea kehysten välinen optinen virtaus taaksepäin ja eteenpäin. Katso ./video_input/make-opt-flow.sh
ja ./video_input/run-deepflow.sh
Argumentit
-
--content_img
: Sisältökuvan tiedostonimi. Esimerkki:lion.jpg
-
--content_img_dir
: Sisältökuvan suhteellinen tai absoluuttinen hakemistopolku. Oletusarvo:./image_input
-
--style_imgs
: Tyylikuvien tiedostonimet. Jos haluat käyttää useita tyylikuvia, anna välilyönnillä erotettu luettelo. Esimerkki:--style_imgs starry-night.jpg
-
--style_imgs_weights
: Kunkin tyylikuvan häivytyspainot. Oletusarvo:1.0
(oletetaan, että on vain yksi tyylikuva) -
--style_imgs_dir
: Suhteellinen tai absoluuttinen hakemistopolku tyylikuviin. Oletus:./styles
-
--init_img_type
: Verkon alustamiseen käytettävä kuva. Vaihtoehdot:content
,random
,style
. Oletusarvo:content
-
--max_size
: Syöttökuvien enimmäisleveys tai -korkeus. Oletusarvo:512
-
--content_weight
: Sisältöhäviöfunktion paino. Oletusarvo:5e0
-
--style_weight
: Tyylihäviöfunktion painoarvo. Oletus:1e4
-
--tv_weight
: Paino kokonaisvariaatiohäviöfunktiolle. Oletus:1e-3
-
--temporal_weight
: Paino ajalliselle häviöfunktiolle. Oletus:2e2
-
--content_layers
: Avaruuserotetut VGG-19-kerrosten nimet, joita käytetään sisältökuvassa. Oletusarvo:conv4_2
-
--style_layers
: Avaruuserotetut VGG-19-kerrosten nimet, joita käytetään tyylikuvassa. Oletusarvo:relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
-
--content_layer_weights
: Kunkin sisältökerroksen painotukset sisältöhäviölle välilyönnein eroteltuna. Oletusarvo:1.0
-
--style_layer_weights
: Kunkin tyylikerroksen avaruuserotetut painot häviölle. Oletusarvo:0.2 0.2 0.2 0.2 0.2
-
--original_colors
: Boolen lippu, joka ilmaisee, siirretäänkö tyyli mutta ei värejä. -
--color_convert_type
: Väriavaruudet (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) luminanssia vastaavaa muunnosta varten alkuperäisiin väreihin. Valinnat:yuv
,ycrcb
,luv
,lab
. Oletusarvo:yuv
-
--style_mask
: Boolen lippu, joka ilmaisee, siirretäänkö tyyli peitetyille alueille. -
--style_mask_imgs
: Tyylin maskikuvien tiedostonimet (esimerkki:face_mask.png
). Jos haluat käyttää useita tyylimaskikuvia, anna välilyönnillä erotettu luettelo. Esimerkki:--style_mask_imgs face_mask.png face_mask_inv.png
-
--noise_ratio
: Sisältökuvan ja kohinakuvan välinen interpolointiarvo, jos verkko on alustettu arvollarandom
. Oletusarvo:1.0
-
--seed
: Satunnaislukugeneraattorin siemen. Oletusarvo:0
-
--model_weights
: VGG-19-verkon painot ja vinoutumat. Lataa tästä. Oletus:imagenet-vgg-verydeep-19.mat
-
--pooling_type
: Konvoluutiohermoverkon poolityyppi. Valinnat:avg
,max
. Oletus:avg
-
--device
: GPU- tai CPU-laite. GPU-tila on erittäin suositeltava, mutta vaatii NVIDIA CUDA:n. Vaihtoehdot:/gpu:0
/cpu:0
. Oletusarvo:/gpu:0
-
--img_output_dir
: Hakemisto, johon tulosteet kirjoitetaan. Oletus:./image_output
-
--img_name
: Tulostuskuvan tiedostonimi. Oletus:result
-
--verbose
: Boolen lippu, joka ilmoittaa, tulostetaanko lausekkeet konsoliin.
Optimointiargumentit
-
--optimizer
: Häviön minimoinnin optimoija. L-BFGS antaa parempia tuloksia. Adam käyttää vähemmän muistia. Vaihtoehtoja:lbfgs
,adam
. Oletusarvo:lbfgs
-
--learning_rate
: Adam-optimoijan oppimisnopeusparametri. Oletusarvo:1e0
-
--max_iterations
: Adamin tai L-BFGS-optimoijan iteraatioiden enimmäismäärä. Oletusarvo:1000
-
--print_iterations
: Optimointilaitteen tulostuslausekkeiden välisten iteraatioiden määrä. Oletusarvo:50
-
--content_loss_function
: Eri vakiot K sisältöhäviöfunktiossa. Valinnat:1
,2
,3
. Oletusarvo:1
Videokehys Argumentit
-
--video
: Boolen lippu, joka ilmaisee, onko käyttäjä luomassa videota. -
--start_frame
: Ensimmäisen kehyksen numero. Oletusarvo:1
-
--end_frame
: Viimeisen kuvan numero. Oletus:1
-
--first_frame_type
: Kuva, jota käytetään verkon alustamiseen ensimmäisen kehyksen renderöinnin aikana. Vaihtoehdot:content
,random
,style
. Oletusarvo:random
-
--init_frame_type
: Kuva, jota käytetään verkon alustamiseen jokaisen ensimmäisen kehyksen jälkeisen renderöinnin aikana. Vaihtoehdot:prev_warped
,prev
,content
,random
,style
. Oletusarvo:prev_warped
-
--video_input_dir
: Suhteellinen tai absoluuttinen hakemistopolku syöttökehyksiin. Oletus:./video_input
-
--video_output_dir
: Suhteellinen tai absoluuttinen hakemistopolku, johon tuloskehykset kirjoitetaan. Oletus:./video_output
-
--content_frame_frmt
: Syötettävien kehysten muotoilujono. Oletus:frame_{}.png
-
--backward_optical_flow_frmt
: Taaksepäin suuntautuvien optisten virtaustiedostojen muotoilujono. Oletus:backward_{}_{}.flo
-
--forward_optical_flow_frmt
: Eteenpäin suuntautuvien optisten virtaustiedostojen muotoilujono. Oletus:forward_{}_{}.flo
-
--content_weights_frmt
: Optisen virtauksen johdonmukaisuustiedostojen muotoilujono. Oletus:reliable_{}_{}.txt
-
--prev_frame_indices
: Edelliset kehykset, jotka otetaan huomioon pitkän aikavälin ajallista johdonmukaisuutta varten. Oletusarvo:1
-
--first_frame_iterations
: Ensimmäisen kehyksen optimointi-iteraatioiden enimmäismäärä. Oletusarvo:2000
-
--frame_iterations
: Optimointiohjelman iteraatioiden enimmäismäärä jokaisessa kehyksessä ensimmäisen kehyksen jälkeen. Oletusarvo:800
Kysymyksiä ja virheitä
Lähetä kysymyksiä tai ongelmia:
Muisti
Oletusarvoisesti neural-style-tf
käyttää NVIDIA:n cuDNN GPU-taustapohjaa konvoluutioihin ja L-BFGS:ää optimointiin. nämä tuottavat parempia ja nopeampia tuloksia, mutta voivat kuluttaa paljon muistia. Voit vähentää muistinkäyttöä seuraavilla tavoilla:
- Käytä Adamia: Lisää lippu
--optimizer adam
käyttääksesi Adamia L-BFGS:n sijaan. Tämän pitäisi vähentää muistinkäyttöä merkittävästi, mutta vaatii muiden parametrien virittämistä hyvien tulosten saamiseksi; erityisesti kannattaa kokeilla eri arvoja--learning_rate
,--content_weight
,--style_weight
- Pienennä kuvakokoa: Voit pienentää tuotetun kuvan kokoa
--max_size
-argumentilla.
Toteutuksen yksityiskohdat
Kaikki kuvat renderöitiin koneella, jossa oli:
- 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
Kiitokset
Toteutus perustuu projekteihin:
- Torch (Lua) toteutus ’neural-style’ by jcjohnson
- Torch (Lua) toteutus ’artistic-videos’ by manuelruder
Lähteenä olevat videokuvat saatiin osoitteesta:
- MPI Sintel Flow Dataset
Taiteelliset kuvat ovat nykytaiteilijoiden luomia:
- Alex Grey
- Minjae Lee
- Leonid Afremov
- Françoise Nielly
- James Jean
- Ben Giles
- Callie Fink
- H.R. Giger
- Voka
Taiteellisia kuvia loivat suositut historialliset taiteilijat:
- Vincent Van Gogh
- Wassily Kandinsky
- Georgia O’Keeffe
- Jean-Michel Basquiat
- Édouard Manet
- Pablo Picasso
- Joseph Mallord William Turner
- Frida Kahlo
Testauksessa käytettävät Bash-selkäruiskuskriptit loi veljeni Sheldon Smith.
Citation
Jos löydät tämän koodin hyödylliseksi tutkimuksessasi, siteeraa:
@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}},}