chainer-goghをgoogle colaboratoryで動かしてみた話

#この記事は
colaboratoryでAIっぽいことしたいっていうミーハーな人
GPU持ってないけどstyle変換試したいっていう人
向けです

##chainer-goghとは
本家は[ここ](https://github.com/mattya/chainer-gogh)にあります
一言でいえば，**特徴量を入れ替える学習法**でしょうか
CNNでは形状の特徴を強く捉えるため，それ以外の色合いや質感といった特徴の
情報量が少なくなります．
こういった情報量の少ない層を，別の画像のものに置き換えていく．
こうして画風を保ったまま違う絵を描けるようになります．

##colaboratoryについて
Googleが提供しているやつです笑
AWSとかAzureとかとかとは違って，Jupyter Notebookで機械学習を頑張るためのサービスです．
Notebook形式でGPU使えます．
詳しくは[ここ](https://www.codexa.net/how-to-use-google-colaboratory/)！
別に誰かの回し者とかじゃないです．
~~個人的にはNotebook形式なのでコーディングがちょっと...~~

#いざ
##コーディング変更部分
大事なのは2点，細かいのが2点です．
その1．generate_image関数Variableの引数volatileが廃止されているので，それを削除

```chainer-gogh.py
mid_orig = nn.forward(Variable(img_orig, volatile=True))
style_mats = [get_matrix(y) for y in nn.forward(Variable(img_style, volatile=True))]
```
　↓　こうです

```chainer-gogh.py
mid_orig = nn.forward(Variable(img_orig))
style_mats = [get_matrix(y) for y in nn.forward(Variable(img_style))]
```

その2．caffeモジュールをfunctionsからじゃなくてlinksから呼ぶ

```model.py，chainer-gogh.py，chainer-gogh-multi.py
from chainer.functions import caffe
```
　↓　こうです

```model.py，chainer-gogh.py，chainer-gogh-multi.py
from chainer.links import caffe
```

次の2点は趣味でどうぞ◎

その3．generate_image関数の出力を消す

```chainer-gogh.py
if i%100==0:
    print(i,l,L1.data,L2.data)
```
　↓　こうです

```chainer-gogh.py
# if i%100==0:
#     print(i,l,L1.data,L2.data)
```

その4．save_image関数の画像出力先を変える

```chainer-gogh.py
Image.fromarray(im).save(args.out_dir+"/im_%05d.png"%it)
```
　↓　こうです

```chainer-gogh.py
Image.fromarray(im).save("im_%05d.png"%it)
```


##colab.側
入出力関係は[ここ](https://qiita.com/5at00001040/items/d7867974d2fd1d21dbbf)参考にしました．

#いざ
##chainerのインストール
まずはchainerをインストールしましょう．
cupyもしれっといれます．

```
!apt -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!pip install -q cupy-cuda80 chainer
!pip install cupy --no-cache-dir -vvvv
```

##ファイルのアップロード
.pyファイルと.pngファイルをそれぞれのアップロード
 chainer-gogh.py
 models.py
 input.png
 style.png
をアップロードする
inputはベースの画像，styleはマネしたい画風の画像です．

```
from google.colab import files
uploaded = files.upload()
!ls
```

##実行
VGGモデルで実行します．
**ランタイム→ランタイムのタイプを変更→ハードウェアアクセラレータ→GPU**を忘れずに!!

```
!python chainer-gogh.py -m vgg_chainer -i input.png -s style.png -o output_dir -g 0 --width 256
!ls
```

##可視化
出力はこんな感じででます．

>load model... vgg_chainer
('image resized to: ', (1, 3, 256, 256))
('image resized to: ', (1, 3, 128, 256))
chainer-gogh.py  im_01100.png  im_02300.png  im_03500.png  im_04700.png
im_00000.png	 im_01200.png  im_02400.png  im_03600.png  im_04800.png
im_00100.png	 im_01300.png  im_02500.png  im_03700.png  im_04900.png
im_00200.png	 im_01400.png  im_02600.png  im_03800.png  input.png
im_00300.png	 im_01500.png  im_02700.png  im_03900.png  models.py
im_00400.png	 im_01600.png  im_02800.png  im_04000.png  models.pyc
im_00500.png	 im_01700.png  im_02900.png  im_04100.png  output_dir
im_00600.png	 im_01800.png  im_03000.png  im_04200.png  sample_data
im_00700.png	 im_01900.png  im_03100.png  im_04300.png  style.png
im_00800.png	 im_02000.png  im_03200.png  im_04400.png
im_00900.png	 im_02100.png  im_03300.png  im_04500.png
im_01000.png	 im_02200.png  im_03400.png  im_04600.png

で，可視化のコードはこれ

```
from IPython.display import Image,display_png
display_png(Image('im_04900.png'))
```

im_04900の数字を変えて変遷を楽しめます．

##ダウンロード
生成画像をダウンロードしましょう
左側の＞マークでメニューを呼びます
![左.png](https://qiita-image-store.s3.amazonaws.com/0/165289/eeff5c39-168f-4ef9-3aeb-58bb95695029.png)

上のタブをファイルに切り替えます．
あとはファイルを右クリック→ダウンロードです．
![保存.png](https://qiita-image-store.s3.amazonaws.com/0/165289/8601d425-2938-f3de-5bb5-e3e30983b20e.png)

#ふぅ
無事ダウンロードできたでしょうか？
一応Gitに[ポイ](https://github.com/akh1r0ck/gogh-notebook/blob/master/gogh.ipynb)しておきました
画像処理ってわかりやすくていいですよね
以上です．お疲れ様でした笑

変なところあったら教えて下さい．