kshitizrimal / deepStyle

loka 19, 2021
admin

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

  1. Kopioi 1 sisältökuva oletusarvoiseen kuvasisältöhakemistoon ./image_input
  2. Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon ./styles
  3. 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

  1. Kopioi 1 sisältövideo oletusarvoiseen videosisältöhakemistoon ./video_input
  2. Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon ./styles
  3. 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

  1. Kopioi sisältökuvat oletusarvoiseen kuvasisältöhakemistoon ./image_input tai kopioi videokehykset oletusarvoiseen videosisältöhakemistoon ./video_input
  2. Kopioi 1 tai useampi tyylikuva oletusarvoiseen tyylikuvahakemistoon ./styles
  3. 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 arvolla random. 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}},}

Vastaa

Sähköpostiosoitettasi ei julkaista.