kshitizrimal / deepStyle

okt 19, 2021
admin

Ez egy TensorFlow implementációja több technikának, amelyeket a következő cikkekben írtak le:

  • 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

Kiegészítésképpen bemutatjuk a szemantikus szegmentálás és a többszörös stílusátvitel technikáit.

A neurális stílus algoritmus egy pasztichet szintetizál egy kép tartalmának és egy másik kép stílusának elkülönítésével és kombinálásával, konvolúciós neurális hálózatok (CNN) segítségével. Az alábbi példában a Csillagos éj művészi stílusának átvitelét mutatjuk be egy afrikai oroszlánt ábrázoló fényképre:

A különböző művészeti alkotások stílusának átvitele ugyanarra a tartalmi képre minőségileg meggyőző eredményeket hoz:

Itt reprodukáljuk az első dolgozat 3. ábráját, amely a tübingeni Neckarfrontról készült fényképet 5 különböző ikonikus festmény stílusában adja vissza A Minótaurosz hajótörése, A csillagos éjszaka, VII. kompozíció, A sikoly, Ülő akt:

Tartalom / stílus kompromisszum

A stílus és a tartalom relatív súlya szabályozható.

Itt a Red Canna-ra alkalmazott növekvő súlyú stílussal renderelünk:

Több stíluskép

Több stíluskép is használható több művészi stílus keveréséhez.

Felső sor (balról jobbra): Az alsó sor (balról jobbra): Csillagfényes éjszaka + Sikoly, Sikoly + VII. kompozíció, Ülő akt + VII. kompozíció
Az alsó sor (balról jobbra): Csillagfényes éjszaka + Sikoly:

Stílusinterpoláció

A több stíluskép használata esetén szabályozható a képek közötti átfedés mértéke.

Felső sor (balról jobbra): Tartalomkép, .2 A csillagos éjszaka + .8 A sikoly, .8 A csillagfényes éjszaka + .2 A sikoly
Alul sor (balról jobbra): .2 Túlvilág + .8 A hideg frissessége, .5 Túlvilág + .5 A hideg frissessége, .8 Túlvilág + .2 A hideg frissessége

Stílus átvitele, de nem szín

Az eredeti kép színsémája a --original_colors zászló feltüntetésével megőrizhető. A színek átvitele a YUV, YCrCb, CIE L*a*b* vagy CIE L*u*v* színterek használatával történik.

Itt reprodukáljuk a harmadik dolgozat 1. és 2. ábráját a csak fénysűrűség-átvitel alkalmazásával:

Balról jobbra: tartalomkép, stilizált kép, stilizált kép a tartalomkép eredeti színeivel

Textúrák

Az algoritmus nem korlátozódik művészi festészeti stílusokra. Fotográfiai textúrákra is alkalmazható pareidolikus képek létrehozására.

Szegmentálás

A stílus átvihető a tartalmi kép szemantikus szegmentációira.

A tartalomkép előterére és hátterére több stílus is átvihető.

Balról jobbra: tartalomkép, előtér stílus, háttér stílus, előtér maszk, háttér maszk, stilizált kép

Videó

Az egyes forráskockákra az algoritmus alkalmazásával animációkat lehet megjeleníteni. A legjobb eredmény elérése érdekében a gradiens ereszkedést a korábban stilizált képkockával inicializáljuk, amelyet a képkockapár közötti optikai áramlásnak megfelelően az aktuális képkockára warpoltunk. Az időbeli konzisztenciára vonatkozó veszteségfüggvényeket használjuk a kizárt területeket és a mozgáshatárokat kizáró pixelek büntetésére.


Felső sor (balról jobbra): forráskockák, alapigazság szerinti optikai áramlás vizualizálva
alsó sor (balról jobbra): kirekesztett régiók és mozgáshatárok, stilizált képkockák

Gradiens süllyedés inicializálása

A gradiens süllyedés inicializálását a --init_img_type segítségével vezéreljük egyes képek esetén és a --init_frame_type vagy --first_frame_type segítségével videoképek esetén. A fehér zaj lehetővé teszi tetszőleges számú különálló kép generálását. Míg a rögzített képpel való inicializálás mindig ugyanahhoz a kimenethez konvergál.

Itt reprodukáljuk az első dolgozat 6. ábráját:

Felső sor (balról jobbra): Inicializálva a tartalmi képpel, a stílusképpel, fehér zajjal (RNG mag 1)
Alul sor (balról jobbra): Fehér zajjal inicializálva (RNG magok 2, 3, 4)

Rétegreprezentációk

A jellemzőkomplexitás és a receptív mező mérete a CNN-heirarchiában lefelé haladva növekszik.

Itt reprodukáljuk a 3. ábrát az eredeti cikkből:

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

Rows: CNN-rétegek növekvő részhalmazai; i.pl. ‘conv4_1’ a ‘conv1_1’, ‘conv2_1’, ‘conv3_1’, ‘conv4_1’ használatát jelenti.
Sorok: a tartalom és a stílus rekonstrukciójának alfa/béta aránya (lásd Content / Style Tradeoff).

Setup

Függőségek:

  • tensorflow
  • opencv

Opcionális (de ajánlott) függőségek:

  • CUDA 7.5+
  • cuDNN 5.0+

A függőségek telepítése után:

  • Töltse le a VGG-19 modell súlyait (lásd a “VGG-VD modellek a Very Deep Convolutional Networks for Large-Scale Visual Recognition projektből” részt). További információ a VGG-19 hálózatról itt található.
  • A letöltés után másolja a imagenet-vgg-verydeep-19.mat súlyok fájlt a projekt könyvtárába.

Használat

Alapvető használat

Egyetlen kép

  1. 1 tartalmi kép másolása az alapértelmezett képtartalom könyvtárba ./image_input
  2. 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba ./styles
  3. Futtassa a parancsot:

bash stylize_image.sh <path_to_content_image> <path_to_style_image>

Példa:

bash stylize_image.sh ./image_input/lion.jpg ./styles/kandinsky.jpg

Megjegyzés: A támogatott képformátumok a következők: .png, .jpg, .ppm, .pgm

Megjegyzés: A képekhez vezető elérési utak nem tartalmazhatják a ~ karaktert, amely az otthoni könyvtárat jelöli; ehelyett relatív elérési utat vagy abszolút elérési utat kell használni.

Videóképek

  1. 1 tartalmi videó másolása az alapértelmezett videótartalom könyvtárba ./video_input
  2. 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba ./styles
  3. Futtassa a parancsot:
bash stylize_video.sh <path_to_video> <path_to_style_image>

Példa:

bash stylize_video.sh ./video_input/video.mp4 ./styles/kandinsky.jpg

Megjegyzés: A támogatott videóformátumok a következők: .mp4, .mov, .mkv

Speciális használat

Egyetlen kép vagy videókeret

  1. Tartalomképek másolása az alapértelmezett képtartalom könyvtárba ./image_input vagy videókeretek másolása az alapértelmezett videotartalom könyvtárba ./video_input
  2. 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba ./styles
  3. Futtassa a parancsot meghatározott argumentumokkal:
python neural_style.py <arguments>

Példa (egyetlen kép):

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;

Több stíluskép használatához adja át a képnevek és képsúlyok szóközzel elválasztott listáját a következőképpen:

--style_imgs starry_night.jpg the_scream.jpg --style_imgs_weights 0.5 0.5

Példa (videóképek):

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;

Megjegyzés: A --init_frame_type prev_warp használatakor korábban ki kell számítania a képkockák közötti visszafelé és előre irányuló optikai áramlást. Lásd ./video_input/make-opt-flow.sh és ./video_input/run-deepflow.sh

Érvek

  • --content_img: A tartalomkép fájlneve. Példa: lion.jpg
  • --content_img_dir: A tartalomkép relatív vagy abszolút könyvtár elérési útvonala. Alapértelmezett: ./image_input
  • --style_imgs: A stílusképek fájlnevei. Több stíluskép használatához adjon meg egy szóközzel elválasztott listát. Példa: --style_imgs starry-night.jpg
  • --style_imgs_weights: Az egyes stílusképek keverési súlyai. Alapértelmezett: 1.0 (csak 1 stílusképet feltételez)
  • --style_imgs_dir: A stílusképek relatív vagy abszolút könyvtárának elérési útvonala. Alapértelmezett: ./styles
  • --init_img_type: A hálózat inicializálásához használt kép. Választható: content, random, style. Alapértelmezett: content
  • --max_size: A bemeneti képek maximális szélessége vagy magassága. Alapértelmezett: 512
  • --content_weight: A tartalomvesztési függvény súlya. Alapértelmezett: 5e0
  • --style_weight: A stílusveszteség-függvény súlya. Alapértelmezett: 1e4
  • --tv_weight: A teljes variációs veszteségfüggvény súlya. Alapértelmezett: 1e-3
  • --temporal_weight: Az időbeli veszteségfüggvény súlya. Alapértelmezett: 2e2
  • --content_layers: A tartalomképhez használt VGG-19 rétegnevek térben elválasztva. Alapértelmezett: conv4_2
  • --style_layers: A stílusképhez használt, térben elválasztott VGG-19 rétegnevek. Alapértelmezett: relu1_1 relu2_1 relu3_1 relu4_1 relu5_1
  • --content_layer_weights: Az egyes tartalmi rétegek térben elválasztott súlyai a tartalomvesztéshez. Alapértelmezett: 1.0
  • --style_layer_weights: Az egyes stílusrétegek térben elválasztott súlyai a veszteséghez. Alapértelmezett: 0.2 0.2 0.2 0.2 0.2
  • --original_colors: Boolean flag, amely jelzi, hogy a stílus átadásra kerül-e, de a színek nem.
  • --color_convert_type: Színterek (YUV, YCrCb, CIE L*u*v*, CIE L*a*b*) az eredeti színekhez való fénysűrűség-egyeztető konverzióhoz. Választási lehetőségek: yuv, ycrcb, luv, lab. Alapértelmezett: yuv
  • --style_mask: Boolean flag, amely jelzi, hogy a stílus átkerül-e a maszkolt régiókra.
  • --style_mask_imgs: A stílusmaszk képek fájlnevei (példa: face_mask.png). Több stílusmaszk kép használatához adjon meg egy szóközzel elválasztott listát. Példa: --style_mask_imgs face_mask.png face_mask_inv.png
  • --noise_ratio: Interpolációs érték a tartalomkép és a zajkép között, ha a hálózatot random-vel inicializáljuk. Alapértelmezett: 1.0
  • --seed: A véletlenszám-generátor magja. Alapértelmezett: 0
  • --model_weights: A VGG-19 hálózat súlyai és torzításai. Letöltés itt. Alapértelmezett:imagenet-vgg-verydeep-19.mat
  • --pooling_type: A pooling típusa a konvolúciós neurális hálózatban. Választható: avg, max. Alapértelmezett: avg
  • --device: GPU vagy CPU eszköz. A GPU mód erősen ajánlott, de NVIDIA CUDA-t igényel. Választási lehetőségek: /gpu:0 /cpu:0. Alapértelmezett: /gpu:0
  • --img_output_dir: A kimenetet író könyvtár. Alapértelmezett: ./image_output
  • --img_name: A kimeneti kép fájlneve. Alapértelmezett: result
  • --verbose: Boolean flag, amely jelzi, hogy az utasításokat ki kell-e írni a konzolra.

Optimalizálás érvek

  • --optimizer: Veszteségminimalizálási optimalizáló. Az L-BFGS jobb eredményeket ad. Adam kevesebb memóriát használ. Választási lehetőségek: lbfgs, adam. Alapértelmezett: lbfgs
  • --learning_rate: Tanulási sebesség paraméter az Adam optimalizálóhoz. Alapértelmezett: 1e0

  • --max_iterations: Az Adam vagy L-BFGS optimalizáló maximális iterációszáma. Alapértelmezett: 1000
  • --print_iterations: Az optimalizáló nyomtatási utasítások közötti iterációk száma. Alapértelmezett: 50
  • --content_loss_function: Különböző K konstansok a tartalmi veszteségfüggvényben. Választások: 1, 2, 3. Alapértelmezett: 1

Video Frame Arguments

  • --video: Boolean flag, amely jelzi, hogy a felhasználó videót készít-e.
  • --start_frame: Az első képkocka száma. Alapértelmezett: 1
  • --end_frame: Utolsó képkocka száma. Alapértelmezett: 1
  • --first_frame_type: Az első képkocka renderelése során a hálózat inicializálásához használt kép. Választási lehetőségek: content, random, style. Alapértelmezett: random
  • --init_frame_type: A hálózat inicializálására használt kép az első képkockát követő minden renderelés során. Választási lehetőségek: prev_warped, prev, content, random, style. Alapértelmezett: prev_warped
  • --video_input_dir: Relatív vagy abszolút könyvtár elérési útja a bemeneti képkockákhoz. Alapértelmezett: ./video_input
  • --video_output_dir: Relatív vagy abszolút könyvtár elérési útja a kimeneti képkockák írásához. Alapértelmezett: ./video_output
  • --content_frame_frmt: A bemeneti képkockák formázási karakterlánca. Alapértelmezett: frame_{}.png
  • --backward_optical_flow_frmt: A visszafelé irányuló optikai áramlási fájlok formázási karakterlánca. Alapértelmezett: backward_{}_{}.flo
  • --forward_optical_flow_frmt: Az előremenő optikai áramlási fájlok formázási karakterlánca. Alapértelmezett: forward_{}_{}.flo
  • --content_weights_frmt: Az optikai áramlás konzisztenciafájlok formázási karakterlánca. Alapértelmezett: reliable_{}_{}.txt
  • --prev_frame_indices: A hosszú távú időbeli konzisztencia szempontjából figyelembe veendő korábbi képkockák. Alapértelmezett: 1
  • --first_frame_iterations: Az első képkocka optimalizáló iterációinak maximális száma. Alapértelmezett: 2000
  • --frame_iterations: Az optimalizáló iterációk maximális száma az első képkocka után minden egyes képkockához. Alapértelmezett: 800

Kérdések és hibajavítások

Kérdések vagy problémák küldése:

Memória

Alapértelmezés szerint a neural-style-tf az NVIDIA cuDNN GPU backendjét használja a konvolúciókhoz és az L-BFGS-t az optimalizáláshoz. ezek jobb és gyorsabb eredményeket adnak, de sok memóriát fogyasztanak. A memóriahasználatot a következőkkel csökkentheti:

  • Adam használata: Adja hozzá a --optimizer adam jelzőt az Adam használatához az L-BFGS helyett. Ez jelentősencsökkenti a memóriahasználatot, de a jó eredményekhez más paraméterek beállítása szükséges; különösen a --learning_rate, --content_weight, --style_weight
  • Képméret csökkentése: A --max_size argumentummal csökkentheti a generált kép méretét.

Megvalósítás részletei

A képek renderelése egy olyan gépen történt, amelynek:

  • CPU-ja van: 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

Köszönetnyilvánítás

Az implementáció a következő projekteken alapul:

  • Torch (Lua) implementáció ‘neural-style’ by jcjohnson
  • Torch (Lua) implementáció ‘artistic-videos’ by manuelruder

A forrás videóképek a következőkből származnak:

  • MPI Sintel Flow Dataset

A művészi képeket a modern művészek készítették:

  • Alex Grey
  • Minjae Lee
  • Leonid Afremov
  • Françoise Nielly
  • James Jean
  • Ben Giles
  • Callie Fink
  • H.R. Giger
  • Voka

A művészi képeket a népszerű történelmi művészek készítették:

  • Vincent Van Gogh
  • Wassily Kandinsky
  • Georgia O’Keeffe
  • Jean-Michel Basquiat
  • Édouard Manet
  • Pablo Picasso
  • Joseph Mallord William Turner
  • Frida Kahlo

A teszteléshez a bátyám, Sheldon Smith készítette a bash shell szkripteket.

Idézet

Ha ezt a kódot hasznosnak találja a kutatásaihoz, kérjük, hivatkozzon:

@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}},}

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.