Google ColaboratoryでLINEスタンプ画像生成に挑戦！

#はじめに

今、機械学習の勉強もかねて敵対的生成ネットワーク（GAN）を活用して
LINEスタンプの自動生成を試みようと頑張っています。
>[LINEスタンプをDeepLearningで自動生成してみる【Part 1】](https://qiita.com/ku_don/items/08b8b04d9b94307abb79)

しかし私が所有しているマシンは貧弱なMacbookAirのみ。
実際にDeep Learningのサンプルコードを実行してみると動作にかかる時間が想像以上でした。
（丸３日かけて、期待した結果が得られないこともしばしば）

そこで、学習高速化のためにAWSやMicrosoft Azureなどのクラウドサービスに課金して、一時的にGPUを積んだインスタンスを利用しようと検討してしました。

#機械学習を試すためには課金が必要？

結論から言うと、私がやろうとしている程度のことであれば課金する必要はありませんでした。
Google Colaboratoryを使用すれば、無料で十分高速にDeep Learningのコードを実験することができます。体感で私のノートPCの10倍の速度で学習を進めることができました。いい時代に生まれた！


#Google Colaboratoryの導入

Google Colaboratoryの導入は、Googleアカウントを持っていれば誰でも簡単にできます。
以下の記事を参考に進めることで、難なく設定を完了することができた。
Tipsに関しても多くの記事で、簡潔にまとめられています。

> [【秒速で無料GPUを使う】TensorFlow/Keras/PyTorch/Chainer深層学習環境 on Colaboratory](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)

>[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

PythonやNumply、Tensorflowの環境が始めから備わっているので、特殊なことをしなければ追加でパッケージのインストールも不要です。
ランタイムのタイプはPython3、ハードウェアアクセラレータはGPUに設定してレッツトライ！

##Colaboratory上でコードの実行

シェルコマンドの頭に``` ! ```を付ければ、基本的にローカル環境と同じように動作します。ただ、
ディレクトリ変更だけ例外で、```!cd```でなく```%cd```を使用します。

以降は、DCGAN-tensorflowのコードをGoogle Colaboratory上で動作確認した際の手順になります。


##GITリポジトリのクローンを作成する。

DCGAN-tensorflowのクローンを作成します。

```config
!git clone https://github.com/carpedm20/DCGAN-tensorflow
```


[参考]DCGAN-tensorflow
https://github.com/carpedm20/DCGAN-tensorflow

##Google Drive上に保存したデータセットを持ってくる

入力画像データのzipを自分のGoogle drive上に保存ておき、Google Driveを/driveフォルダにマウントします。Google Driveへのアクセス許可のためのtoken取得リンクからコードを取得して、認証を行います。

[参考]
[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

```python
from google.colab import drive
drive.mount('/content/drive')
```
※上記の通り、以前より簡単にマウントできるようになりました。(2019/02/01)

##データセットのコピー

マウントしたdrive/配下からデータセットAI-st.zipをコピーしてきて、入力データセット保管用のディレクトリ/data内で解凍します。

```python
!mkdir DCGAN-tensorflow/data
!cp drive/AI-st.zip DCGAN-tensorflow/data/AI-st.zip
%cd DCGAN-tensorflow/data
!unzip -q AI-st.zip
```

もし、学習のチェックポイントをGoogle Driveからコピーしてきて更新する場合は以下のコマンドを追加で実行します。

```python
!rm -r /content/DCGAN-tensorflow/checkpoint
!cp -r /content/drive/checkpoint DCGAN-tensorflow/checkpoint
```

##コードの実行

準備が整えば、ローカルで実行していたときと同じようにコードを実行します。コードを実行した後に、生成した画像データ```samples```とログ```logs```とチェックポイント```checkpoint```を、インスタンスがシャットダウンされる前にGoogleDriveに退避させます。

```config

%cd DCGAN-tensorflow
!python main.py --dataset AI-st --batch_size=100 --epoch=25 --input_height=224 --input_width=259 --output_height=128 --output_width=148 --input_fname_pattern="*.png" --train --crop
!cp -r samples /content/drive/samples-on-colab/samples1
!cp -r logs /content/drive/samples-on-colab/logs1
!cp -r checkpoint /content/drive/samples-on-colab/checkpoint1
```


## 生成データの確認

Google Colaboratoryの環境で生成したLINEスタンプ画像をGoogle Drive上で確認します。
以前までは、マシンスペックの制約から出力スタンプの画像サイズを小さくしていましたが、学習速度を大幅に上げることができるので、出力画像サイズを少し上げてみました。

##![test_arange_47.png](https://qiita-image-store.s3.amazonaws.com/0/113129/4630ade8-76d4-a7b0-a412-52cc9ff204b3.png)

無事ローカル環境と同様に、スタンプ画像を生成することが確認できました。

# まとめ

Google Colaboratorを使わない手はないです。煩わしい環境構築も必要なし、それでいて個人では購入のハードルが高いNVIDIAのTeslaを存分に（連続12時間という制約はありますが）利用することができます。GPUが無料で自由に使える環境があることがわかったので、今後はいろいろと試したかったことが捗りそうです。同じように、機械学習を入門しようとしている人はぜひ試しに使ってみてください。

# おまけ

生成した画像を分割するには、Imagemagickのconvertコマンドでサイズを指定してあげれば簡単にできます。今回は、148x128の画像が10x10の100枚結合されたものが入力になります。

```config
$convert test.png -crop 148x128 stamp_%08d.png
```

たった一行のコマンドで以下のように画像を分割することができます。

![スクリーンショット 2018-07-13 21.29.59.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/0a6dba8e-fbb6-459b-2511-ae6b00621f49.jpeg)

試しに、LINE Simulator上に生成画像を貼り付けてみました。

![スクリーンショット 2018-07-12 9.28.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/0348601a-418d-fd4e-0395-b48b947b3445.jpeg)

当初と比べると、画質が上がったこともあり違和感が減ってきたように思います。

引き続き、暇な時にでもLINEスタンプ生成取り組んでいきたいです。

続く。