0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Neural Style TransferのLua実装で佐々木希を印象派風、ジブリ「アリエッティ」風、北斎風、ギリシャ彫刻風に変えてみた

Last updated at Posted at 2021-08-10

動かしたスクリプト

Neural Style TransferのLua実装をMacbook(macOS Catalina)で動かしてみました。
MacbookでLuaを動かすための環境構築については、この記事の後半に記載しています。

なお、本手法の背景にある技術については、次の2つがわかりやすいです。

実行コード

  • __thは、Lua言語__の実行コマンドです。
  • (コマンドライン引数) -style_image : 指定した画像ファイルの「画風」を模倣します。
  • (コマンドライン引数) -content_image : 指定した画像ファイルを、上記の「画風」の筆致に書き換えます。
Terminal
% th neural_style.lua -style_image examples/inputs/ghibli_portrait.jpg -content_image examples/inputs/nozomi2.jpg  -gpu -1  

出力結果

__th neural_style.lua__の実行場所(カレント・ディレクトリ)に、以下のファイルが出力されます。
末尾の数字が大きくなるほど、処理が進んだあとに出力されたファイルです。
__out_900.png__が__最終的に出力された納品ファイル__です。

  • out.png
  • out_100.png
  • out_200.png
  • out_300.png
  • out_400.png
  • out_500.png
  • out_600.png
  • out_700.png
  • out_800.png
  • out_900.png

( 生成された画像 )

( その他の画像も試してみました )

環境構築

Terminal
electron@diynoMacBook-Pro ~ % cd Desktop 
electron@diynoMacBook-Pro Desktop % git clone https://github.com/jcjohnson/neural-style.git
Cloning into 'neural-style'...
remote: Enumerating objects: 579, done.
remote: Total 579 (delta 0), reused 0 (delta 0), pack-reused 579
Receiving objects: 100% (579/579), 47.06 MiB | 12.79 MiB/s, done.
Resolving deltas: 100% (269/269), done.
electron@diynoMacBook-Pro Desktop %

中身を確認

Terminal
electron@diynoMacBook-Pro Desktop % cd neural-style 
electron@diynoMacBook-Pro neural-style % ls
INSTALL.md		LICENSE			README.md		examples		models			neural_style.lua

必要なライブラリを追加で入れる

Terminal
electron@diynoMacBook-Pro Desktop % brew install protobuf
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
bupstash
==> Updated Formulae
Updated 11 formulae.
==> Updated Casks
Updated 2 casks.

Warning: protobuf 3.17.3 is already installed and up-to-date.
To reinstall 3.17.3, run:
  brew reinstall protobuf
electron@diynoMacBook-Pro Desktop % 
Terminal
electron@diynoMacBook-Pro Desktop % luarocks install loadcaffe

学習済みのモデルを取得

公式GitHubの説明に従い、__download_models.sh__を実行

Terminal
electron@diynoMacBook-Pro Desktop % cd neural-style
electron@diynoMacBook-Pro neural-style % ls models/download_models.sh
models/download_models.sh
electron@diynoMacBook-Pro neural-style % sh models/download_models.sh

( 省略 )

2021-08-09 02:15:52 (6.50 MB/s) - `VGG_ILSVRC_19_layers.caffemodel' へ保存完了 [574671192/574671192]

electron@diynoMacBook-Pro neural-style % 

出来上がったディレクトリ構成

Terminal
electron@diynoMacBook-Pro neural-style % tree                        
.
├── INSTALL.md
├── LICENSE
├── README.md
├── examples
│   ├── inputs
│   │   ├── brad_pitt.jpg
│   │   ├── escher_sphere.jpg
│   │   ├── frida_kahlo.jpg
│   │   ├── golden_gate.jpg
│   │   ├── hoovertowernight.jpg
│   │   ├── picasso_selfport1907.jpg
│   │   ├── seated-nude.jpg
│   │   ├── shipwreck.jpg
│   │   ├── starry_night.jpg
│   │   ├── starry_night_crop.png
│   │   ├── starry_night_google.jpg
│   │   ├── the_scream.jpg
│   │   ├── tubingen.jpg
│   │   └── woman-with-hat-matisse.jpg
│   ├── multigpu_scripts
│   │   └── starry_stanford.sh
│   └── outputs
│       ├── golden_gate_escher.png
│       ├── golden_gate_kahlo.png
│       ├── golden_gate_matisse.png
│       ├── golden_gate_scream.png
│       ├── golden_gate_seated.png
│       ├── golden_gate_starry.png
│       ├── golden_gate_starry_scale05.png
│       ├── golden_gate_starry_scale1.png
│       ├── golden_gate_starry_scale2.png
│       ├── golden_gate_starry_scream_1_9.png
│       ├── golden_gate_starry_scream_3_7.png
│       ├── golden_gate_starry_scream_5_5.png
│       ├── golden_gate_starry_scream_7_3.png
│       ├── golden_gate_starry_scream_9_1.png
│       ├── original_color
│       │   ├── tubingen_composition_vii.png
│       │   ├── tubingen_scream.png
│       │   ├── tubingen_seated_nude.png
│       │   ├── tubingen_shipwreck.png
│       │   └── tubingen_starry.png
│       ├── pitt_picasso_content_0025_style_10.png
│       ├── pitt_picasso_content_01_style_10.png
│       ├── pitt_picasso_content_1_style_10.png
│       ├── pitt_picasso_content_5_style_10.png
│       ├── pitt_picasso_nin_opencl.png
│       ├── starry_stanford_big.png
│       ├── starry_stanford_big_2.png
│       ├── starry_stanford_bigger.png
│       ├── tubingen_composition_vii.png
│       ├── tubingen_scream.png
│       ├── tubingen_scream_composition_vii.png
│       ├── tubingen_seated_nude.png
│       ├── tubingen_seated_nude_composition_vii.png
│       ├── tubingen_shipwreck.png
│       ├── tubingen_starry.png
│       ├── tubingen_starry_scream.png
│       └── tubingen_starry_seated.png
├── models
│   ├── VGG_ILSVRC_19_layers.caffemodel
│   ├── VGG_ILSVRC_19_layers_deploy.prototxt
│   ├── download_models.sh
│   └── vgg_normalised.caffemodel
└── neural_style.lua

6 directories, 59 files
electron@diynoMacBook-Pro neural-style % 

取得した学習済みモデルを確認

Terminal
electron@diynoMacBook-Pro neural-style % ls models
VGG_ILSVRC_19_layers.caffemodel		VGG_ILSVRC_19_layers_deploy.prototxt	download_models.sh			vgg_normalised.caffemodel
electron@diynoMacBook-Pro neural-style % 

画風変換させたい画像ファイルを置く

( 格納場所 )
examples/input直下

Terminal
electron@diynoMacBook-Pro neural-style % ls examples/inputs 
brad_pitt.jpg			golden_gate.jpg			nozomi2.jpg			shipwreck.jpg			the_scream.jpg
escher_sphere.jpg		hoovertowernight.jpg		picasso_selfport1907.jpg	starry_night.jpg		tubingen.jpg
frida_kahlo.jpg			nanao.webp			renoir_portrait.jpg		starry_night_crop.png		woman-with-hat-matisse.jpg
ghibli_portrait.jpg		nozomi.jpg			seated-nude.jpg			starry_night_google.jpg
electron@diynoMacBook-Pro neural-style % 

参照先の画風(が映った)画像ファイルを置く。

( 格納場所 )
examples/input直下

今回は、Google画像検索でwebから取得してきたルノワール作の肖像画の画像ファイルをおきます。

  • renoir_portrait.jpg

画風変換処理の実行

Terminal
electron@diynoMacBook-Pro neural-style % th neural_style.lua -style_image examples/inputs/ghibli_portrait.jpg -content_image examples/inputs/nozomi2.jpg  -gpu -1  
Successfully loaded models/VGG_ILSVRC_19_layers.caffemodel
conv1_1: 64 3 3 3
conv1_2: 64 64 3 3
conv2_1: 128 64 3 3
conv2_2: 128 128 3 3
conv3_1: 256 128 3 3
conv3_2: 256 256 3 3
conv3_3: 256 256 3 3
conv3_4: 256 256 3 3
conv4_1: 512 256 3 3
conv4_2: 512 512 3 3
conv4_3: 512 512 3 3
conv4_4: 512 512 3 3
conv5_1: 512 512 3 3
conv5_2: 512 512 3 3
conv5_3: 512 512 3 3
conv5_4: 512 512 3 3
fc6: 1 1 25088 4096
fc7: 1 1 4096 4096
fc8: 1 1 4096 1000
Setting up style layer  	2	:	relu1_1	
Setting up style layer  	7	:	relu2_1	
Setting up style layer  	12	:	relu3_1	
Setting up style layer  	21	:	relu4_1	
Setting up content layer	23	:	relu4_2	
Setting up style layer  	30	:	relu5_1	
Capturing content targets	
nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> (8) -> (9) -> (10) -> (11) -> (12) -> (13) -> (14) -> (15) -> (16) -> (17) -> (18) -> (19) -> (20) -> (21) -> (22) -> (23) -> (24) -> (25) -> (26) -> (27) -> (28) -> (29) -> (30) -> (31) -> (32) -> (33) -> (34) -> (35) -> (36) -> (37) -> output]
  (1): nn.TVLoss
  (2): nn.SpatialConvolution(3 -> 64, 3x3, 1,1, 1,1)
  (3): nn.ReLU
  (4): nn.StyleLoss
  (5): nn.SpatialConvolution(64 -> 64, 3x3, 1,1, 1,1)
  (6): nn.ReLU
  (7): nn.SpatialMaxPooling(2x2, 2,2)
  (8): nn.SpatialConvolution(64 -> 128, 3x3, 1,1, 1,1)
  (9): nn.ReLU
  (10): nn.StyleLoss
  (11): nn.SpatialConvolution(128 -> 128, 3x3, 1,1, 1,1)
  (12): nn.ReLU
  (13): nn.SpatialMaxPooling(2x2, 2,2)
  (14): nn.SpatialConvolution(128 -> 256, 3x3, 1,1, 1,1)
  (15): nn.ReLU
  (16): nn.StyleLoss
  (17): nn.SpatialConvolution(256 -> 256, 3x3, 1,1, 1,1)
  (18): nn.ReLU
  (19): nn.SpatialConvolution(256 -> 256, 3x3, 1,1, 1,1)
  (20): nn.ReLU
  (21): nn.SpatialConvolution(256 -> 256, 3x3, 1,1, 1,1)
  (22): nn.ReLU
  (23): nn.SpatialMaxPooling(2x2, 2,2)
  (24): nn.SpatialConvolution(256 -> 512, 3x3, 1,1, 1,1)
  (25): nn.ReLU
  (26): nn.StyleLoss
  (27): nn.SpatialConvolution(512 -> 512, 3x3, 1,1, 1,1)
  (28): nn.ReLU
  (29): nn.ContentLoss
  (30): nn.SpatialConvolution(512 -> 512, 3x3, 1,1, 1,1)
  (31): nn.ReLU
  (32): nn.SpatialConvolution(512 -> 512, 3x3, 1,1, 1,1)
  (33): nn.ReLU
  (34): nn.SpatialMaxPooling(2x2, 2,2)
  (35): nn.SpatialConvolution(512 -> 512, 3x3, 1,1, 1,1)
  (36): nn.ReLU
  (37): nn.StyleLoss
}
Capturing style target 1	
Running optimization with L-BFGS	
<optim.lbfgs> 	creating recyclable direction/step/history buffers	
Iteration 50 / 1000	
  Content 1 loss: 2231081.250000	
  Style 1 loss: 26797.116089	
  Style 2 loss: 429528.759766	
  Style 3 loss: 237259.130859	
  Style 4 loss: 935653.027344	
  Style 5 loss: 1072.086716	
  Total loss: 3861391.370773	
Iteration 100 / 1000	
  Content 1 loss: 1698894.843750	
  Style 1 loss: 20820.108032	
  Style 2 loss: 217066.943359	
  Style 3 loss: 105750.048828	
  Style 4 loss: 440574.316406	
  Style 5 loss: 1030.835247	
  Total loss: 2484137.095623	
Iteration 150 / 1000	
  Content 1 loss: 1498420.468750	
  Style 1 loss: 16410.388184	
  Style 2 loss: 134153.186035	
  Style 3 loss: 68532.604980	
  Style 4 loss: 308941.406250	
  Style 5 loss: 1057.839489	
  Total loss: 2027515.893688	
Iteration 200 / 1000	
  Content 1 loss: 1372491.875000	
  Style 1 loss: 12948.892212	
  Style 2 loss: 89896.453857	
  Style 3 loss: 48842.700195	
  Style 4 loss: 267218.017578	
  Style 5 loss: 1086.896801	
  Total loss: 1792484.835644	
Iteration 250 / 1000	
  Content 1 loss: 1301307.109375	
  Style 1 loss: 10226.798248	
  Style 2 loss: 63556.909180	
  Style 3 loss: 38473.391724	
  Style 4 loss: 244541.113281	
  Style 5 loss: 1106.688213	
  Total loss: 1659212.010021	
Iteration 300 / 1000	
  Content 1 loss: 1246721.328125	
  Style 1 loss: 7762.709045	
  Style 2 loss: 44931.973267	
  Style 3 loss: 31255.328369	
  Style 4 loss: 234602.148438	
  Style 5 loss: 1122.317696	
  Total loss: 1566395.804939	
Iteration 350 / 1000	
  Content 1 loss: 1212946.796875	
  Style 1 loss: 5538.634109	
  Style 2 loss: 31816.052246	
  Style 3 loss: 26545.123291	
  Style 4 loss: 224237.402344	
  Style 5 loss: 1124.403763	
  Total loss: 1502208.412628	
Iteration 400 / 1000	
  Content 1 loss: 1184374.921875	
  Style 1 loss: 3667.434692	
  Style 2 loss: 22393.768311	
  Style 3 loss: 22884.857178	
  Style 4 loss: 217541.186523	
  Style 5 loss: 1136.209774	
  Total loss: 1451998.378353	
Iteration 450 / 1000	
  Content 1 loss: 1162057.890625	
  Style 1 loss: 2371.082497	
  Style 2 loss: 16727.882385	
  Style 3 loss: 20576.927185	
  Style 4 loss: 213357.006836	
  Style 5 loss: 1143.882465	
  Total loss: 1416234.671993	
Iteration 500 / 1000	
  Content 1 loss: 1142415.234375	
  Style 1 loss: 1541.375446	
  Style 2 loss: 13419.105530	
  Style 3 loss: 18727.278137	
  Style 4 loss: 211519.213867	
  Style 5 loss: 1154.151821	
  Total loss: 1388776.359177	
Iteration 550 / 1000	
  Content 1 loss: 1127063.281250	
  Style 1 loss: 1043.627071	
  Style 2 loss: 11696.353149	
  Style 3 loss: 17628.172302	
  Style 4 loss: 210361.962891	
  Style 5 loss: 1168.090439	
  Total loss: 1368961.487103	
Iteration 600 / 1000	
  Content 1 loss: 1114870.156250	
  Style 1 loss: 739.654446	
  Style 2 loss: 10621.449280	
  Style 3 loss: 16743.675232	
  Style 4 loss: 209458.129883	
  Style 5 loss: 1180.265617	
  Total loss: 1353613.330708	
Iteration 650 / 1000	
  Content 1 loss: 1105306.796875	
  Style 1 loss: 577.065754	
  Style 2 loss: 9999.113464	
  Style 3 loss: 16162.327576	
  Style 4 loss: 209075.170898	
  Style 5 loss: 1185.475159	
  Total loss: 1342305.949726	
Iteration 700 / 1000	
  Content 1 loss: 1097775.546875	
  Style 1 loss: 509.323359	
  Style 2 loss: 9730.662537	
  Style 3 loss: 15708.894348	
  Style 4 loss: 208598.071289	
  Style 5 loss: 1191.439152	
  Total loss: 1333513.937559	
Iteration 750 / 1000	
  Content 1 loss: 1091324.140625	
  Style 1 loss: 497.316933	
  Style 2 loss: 9601.439667	
  Style 3 loss: 15372.019958	
  Style 4 loss: 208578.417969	
  Style 5 loss: 1194.777966	
  Total loss: 1326568.113117	
Iteration 800 / 1000	
  Content 1 loss: 1086343.281250	
  Style 1 loss: 509.478331	
  Style 2 loss: 9581.963348	
  Style 3 loss: 15085.220337	
  Style 4 loss: 208392.163086	
  Style 5 loss: 1198.876667	
  Total loss: 1321110.983019	
Iteration 850 / 1000	
  Content 1 loss: 1082268.046875	
  Style 1 loss: 525.061035	
  Style 2 loss: 9557.526398	
  Style 3 loss: 14868.060303	
  Style 4 loss: 208396.752930	
  Style 5 loss: 1200.657749	
  Total loss: 1316816.105289	
Iteration 900 / 1000	
  Content 1 loss: 1079115.000000	
  Style 1 loss: 538.488197	
  Style 2 loss: 9574.259186	
  Style 3 loss: 14729.005432	
  Style 4 loss: 208432.568359	
  Style 5 loss: 1201.611710	
  Total loss: 1313590.932884	
Iteration 950 / 1000	
  Content 1 loss: 1076711.718750	
  Style 1 loss: 550.451899	
  Style 2 loss: 9597.094727	
  Style 3 loss: 14648.091125	
  Style 4 loss: 208304.809570	
  Style 5 loss: 1201.183987	
  Total loss: 1311013.350058	
Iteration 1000 / 1000	
  Content 1 loss: 1074437.421875	
  Style 1 loss: 560.825729	
  Style 2 loss: 9608.381653	
  Style 3 loss: 14544.635010	
  Style 4 loss: 208378.100586	
  Style 5 loss: 1202.579880	
  Total loss: 1308731.944733	
<optim.lbfgs> 	reached max number of iterations	
electron@diynoMacBook-Pro neural-style % 

出力ファイルを確認

カレントディレクトリに、以下のファイルが出力される。

  • out.png
  • out_100.png
  • out_200.png
  • out_300.png
  • out_400.png
  • out_500.png
  • out_600.png
  • out_700.png
  • out_800.png
  • out_900.png
Terminal
electron@diynoMacBook-Pro neural-style % open out_900.png
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?