kshitizrimal / deepStyle
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 tartalmi kép másolása az alapértelmezett képtartalom könyvtárba
./image_input
- 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba
./styles
- 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 tartalmi videó másolása az alapértelmezett videótartalom könyvtárba
./video_input
- 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba
./styles
- 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
- 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
- 1 vagy több stíluskép másolása az alapértelmezett stíluskönyvtárba
./styles
- 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ózatotrandom
-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}},}