写真をモネ風タッチに変換する(magenta image_stylization)

# はじめに

[tensorflow/magenta](https://github.com/tensorflow/magenta)に「[Style Transfer](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)」というモデルが追加されていたので試してみました。
StyleTransferは、入力した画像を、学習した絵のテイストに変換してくれるモデルです。

変換前後
![twitter_acount.jpg](https://qiita-image-store.s3.amazonaws.com/0/82763/05b9fcae-ab30-c67a-71ff-c9068d819b8b.jpeg)![stylized-monet_9.png](https://qiita-image-store.s3.amazonaws.com/0/82763/d01bfa7a-4751-8672-226e-bf6a6b1b9558.png)



下記の論文を実装したものとのことです。
[A Learned Representation for Artistic Style. Vincent Dumoulin, Jon Shlens, Manjunath Kudlur.](https://arxiv.org/pdf/1610.07629v1.pdf)

# やってみる

それではStyleTransferの[README](https://github.com/tensorflow/magenta/tree/master/magenta/models/image_stylization)通りにやっていきます。

## セットアップ
magentaのセットアップは[こちら](https://github.com/tensorflow/magenta/blob/master/README.md)から。
私は、AutomatedInstallで進めています。

インストールしたら`source activate magenta`で起動。


## 学習済みモデルのダウンロード

- monet
- varied

の2つの学習済みモデルがあるので、ダウンロードします。


## コマンド

terminalで下記のコマンドを実行します。

```
$ image_stylization_transform \
      --num_styles=<NUMBER_OF_STYLES> \
      --checkpoint=/path/to/model.ckpt \
      --input_image=/path/to/image.jpg \
      --which_styles="[0,1,2,5,14]" \
      --output_dir=/tmp/image_stylization/output \
      --output_basename="stylized"
```

- `num_styles`には参照するckptがmonetなら`10`,variedなら`32`を入力します。(monetは10パターン、variedは32パターンあるとの意味かと思います。)

- `checkpoint`,`input_image`にはそれぞれのパスを入力。

- `which_styles`はモデルには保存されているStyleの重みを設定したりするものです。
例えば

```
which_styles="{0:0.1,1:0.1,2:0.1,3:0.1,4:0.1,5:0.1,6:0.1,7:0.1,8:0.1,9:0.1}"
```

であれば、monetの10パターンの重みを等しくした画像1枚を作成してくれます。また、

```
which_styles="[0,1,2,3,4,5,6,7,8,9]"
```

とすると、それぞれのパターンにつき1つずつの画像を作成してくれます。

## コード全体

monetの10パターンすべてについて1つずつ画像を出す場合のコードはこちら。

```
image_stylization_transform --num_styles=10  --checkpoint=/Users/hoge/Downloads/multistyle-pastiche-generator-monet.ckpt --input_image=/Users/hoge/Downloads/twitter_acount.jpg  --which_styles="[0,1,2,3,4,5,6,7,8,9]" --output_dir=/Users/hoge/Downloads/ --output_basename="stylized-monet"
```

# 完成した画像

twitterアカウントの画像をmonet風に変換してみました。

元の画像はこちら
![twitter_acount.jpg](https://qiita-image-store.s3.amazonaws.com/0/82763/8b5e0b7f-3fd7-2992-a591-1ba0502c7097.jpeg)

変換後の画像はこちら
monet-0
![stylized-monet_0.png](https://qiita-image-store.s3.amazonaws.com/0/82763/1db43bb2-0874-0fe7-6697-e78814fc7d30.png)

monet-1
![stylized-monet_1.png](https://qiita-image-store.s3.amazonaws.com/0/82763/43ae4dd0-1615-2110-442d-5068eabe0b43.png)

monet-2
![stylized-monet_2.png](https://qiita-image-store.s3.amazonaws.com/0/82763/f3cf97e0-ef39-a45a-09d8-42ac5741f5ee.png)

monet10パターンを均等に
![stylized_0_100_1_100_2_100_3_100_4_100_5_100_6_100_7_100_8_100_9_100.png](https://qiita-image-store.s3.amazonaws.com/0/82763/cc62048f-d24f-5f13-cb75-592dbc434e36.png)


また、variedという学習済みモデルには、いろいろなアーティストのタッチが入っています。
元の画像から大きく変化するものもあり、面白いですね。


varied-0 Roy Lichtenstein, Bicentennial Print (1975).(?)
![stylized_2_0.png](https://qiita-image-store.s3.amazonaws.com/0/82763/09ea8b49-1cc9-e7bc-3d20-383366993407.png)

varied-31 Wassily Kandinsky, White Zig Zags (1922).(?)
![stylized_varied_31.png](https://qiita-image-store.s3.amazonaws.com/0/82763/500064bc-08a3-49b3-55fb-8961751d6054.png)



# 注意点

- 変換する画像ファイルが大きいと、PCの容量不足で落ちてしまいました。（1.8MB。上の元画像は20KB。）
- 一度に32枚の画像を作成しようとすると、いつまでたっても返ってきませんでした。15枚ぐらいまでは行けそうでした。


# おわりに
活用すると、画像加工アプリなどが作れそうですね。

magentaではアーティストの音楽をもとに、テイストを真似た楽曲の作成もできますが、音楽と比べて画像の方が、よりもとにしたアーティストのテイストがわかりやすいなと感じました。

magenta、どんどんモデルが追加されてて楽しいなぁ。
ありがとうございました。