写真をゴッホの画風に変換するWebアプリを作ってみた

この記事は、[求ム！Pythonを使ってAzureで開発する時のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-python) 24日目の記事です。

# はじめに

FlaskとPytorchとAzureを活用して、**写真をゴッホの画風に変換するWebアプリ**を作成してみました。深層学習を使ったWebアプリを作るときに参考にできる記事となるように、環境構築から公開までの手順を紹介させて頂きます。

# 完成品
**1.　Webサイトを開いて処理したい画像を送信すると、**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/25c267bb-91eb-3b9c-4a1f-ae99eaccbc9e.png)

↓選択された画像
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/2712cf4f-0caf-bd34-30ff-67bcea9033f6.jpeg)

**2.　ゴッホ風に変換された画像が返ってきます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/f0b1b136-cd6a-45da-4d75-ad7e59a892d7.png)


ちなみにゴッホの肖像画はこちらです。なんとなく画風が似てるような・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/6b9a935d-1ce7-acbe-bc10-54e6594aece8.png)


# 作成したWebアプリの概要
作成したWebアプリの概要を図にまとめてみました。**今回はWebサーバとしてMicrosoftクラウドサービスのAzureを、無料サービスの範囲(登録後30日間使える¥22,500のクレジット）で使用しました。**実際の画像処理の部分はPytorchで実装されたCycleGANを利用し、Webサイトの見た目はHTMLだけで簡単に作成しました。そして、PythonのAPIであるFlaskにより、PythonとHTMLの連携部分を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/516fc2be-e9c8-c933-575c-b88fee6f445e.png)


# やったこと
CycleGANモデルを実装したWebアプリを作成、公開するまでに、実際にやった作業と所要時間は以下の通りです。

1.WSLの環境構築：30分
2.Python実行環境の構築：30分
3.深層学習モデルの選定：2.5時間
4.AzureのFlaskチュートリアル：30分
5.Webアプリ用にCycleGANのコードを修正：2時間
6.Webアプリのデプロイ：1時間

計：7時間

一番手間がかかったのは、深層学習モデルの選定とWebアプリ用向けへのコードの修正です。
[前回](https://qiita.com/m-naoki/items/058e00eacf0da92bb157)はWebアプリでの画像の取り扱いに苦戦したのですが、今回はその辺りのトラブルなく、デプロイ作業自体は1時間くらいでできました。

# 1. WSLの環境構築（Windowsの場合のみ）
ほとんどの機械学習ライブラリとGithubで公開されている深層学習モデルは、LinuxのUbuntuファーストで開発されています。そのため、OSがWindowsであることにより発生する余計な作業を省くために、WSL環境を構築します。
※最近WSLが[NVIDIA製のGPU演算](https://qiita.com/ksasaki/items/ee864abd74f95fea1efa)にも対応したので、WSLを使った高速な深層学習モデル学習が可能となり、非常に使いやすくなりました。

WSLのインストール方法は、[Microsoft公式のWSLインストールガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)が一番分かりやすいと思います。

私は以下のLinuxディストリビューションを選択しました。

|OS環境    |Linuxディストリビューション|
|----------|--------------------------|
|Windows10(64ビット)　ver. 20H2(OSビルド 19042.685)  |Ubuntu 20.04 LTS         |

インストールが完了したらコマンドプロンプトやWindows ターミナルで「wsl」と入力すれば起動されます。
※小ネタですが、任意のフォルダのアドレス部分に「wsl」と入力すれば、それをカレントフォルダとしてWSLが起動してくれます。

以下のコマンドで目的のUbuntuがインストールできたか確認しましょう。

```terminal:ubuntuのバージョン確認
> lsb_release -a
```

正常にインストールできたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/263a5024-7552-1239-3c20-bd56556a6b24.png)


# 2. Python実行環境の構築

WSL上にPythonの実行環境を整備するために、Anacondaをインストールしていきます。（LinuxやMacの方は、普通のAnacondaインストーラを実行すれば良いです）
WSL上でのAnacondaインストールについては、[こちらの記事](https://qiita.com/knkm3001/items/37614597fcd20c89d658)がシンプルで分かりやすいと思います。

ちなみに最近、[Anacondaの大規模な商用利用は有料](https://www.anaconda.com/terms-of-service)となったようですので、ご注意下さい。
※参考：[Anaconda パッケージリポジトリが「大規模な」商用利用では有償になっていた](https://qiita.com/tfukumori/items/f8fc2c53077b234384fc)


WSLを起動した上で、下記のコマンドを入力してPythonのバージョンを確認できます。

```:pythonのバージョン確認
$ python --version
```

正常にインストールされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/fa2450dd-2aa6-b610-1e47-dccfd6d7b425.png)

# 3. 深層学習モデルの選定
Webアプリに実装する機械学習モデルを選びます。
なんとなくGAN系モデルで良いものがないかとGithubで探していたところ、[CycleGAN](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)を見つけました。理論が気になる方向けに、論文は[こちら](https://arxiv.org/abs/1703.10593)。
Githubコードを流用する場合には、ライセンスにも注意しましょう。上記のコードは、BSD Licenseとなっていたので、基本的に商用利用もOKです。
※あくまで個人的な意見ですが、実装コードの読み易さはPytorch>TensorFlowです。また、スターが多くて(300～)バグが少なそうなコードがお勧めです。

ちなみに今回利用したリポジトリには、以下のような訓練済みモデルが用意されていました。
・モノクロ画像をカラーに着色
・馬をシマウマに変換（よく見ますね）
・夏の風景を冬の風景に変換


また、CycleGANの[デモサイト](https://affinelayer.com/pixsrv/)もあります。
このサイトでは自分の描いた輪郭からオリジナル猫を生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/d59f4705-19bb-6517-8e89-7f629c2afc0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/24825219-d9ea-7757-934f-e72f721c7695.png)

# 4. AzureのFlaskチュートリアル
選定した機械学習モデルのデプロイには、[Azure App Service on Linux](https://docs.microsoft.com/ja-jp/azure/app-service/overview)とPythonのAPIであるFlaskを使います。
Azure App Service on Linuxは、面倒な環境構築をすることなくLinux上で非常に簡単でWebアプリをデプロイすることができるサービスです。

Azureのアカウント登録を済ませたら、デプロイまでの流れを学ぶために[公式チュートリアル](https://docs.microsoft.com/ja-jp/azure/app-service/quickstart-python?tabs=bash&pivots=python-framework-flask)をやっていきます。

**Hello, Azure!サイトの作成まで出来たら、ひとまずOKです。**


# 5. Webアプリ用にCycleGANのコードを修正
続いて、Githubで公開されている[CycleGANコード](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)をWebアプリ仕様に修正します。
たいていの深層学習モデルのレポジトリには、学習済みのモデルを使って、入力データから推論を行うためのスクリプトがあると思います。(上記のレポジトリでいうtest.pyファイル)
これを修正することで、Webアプリのメインコードから呼び出す画像処理の関数として利用します。

主に修正したのは以下の2点です。

**推論コード(test.py)の不要部分の削除と関数化**
モデル可視化コードなど不要な部分を削除しました。
main.pyから呼び出す関数の形にしました。それに伴い、推論で出力されたデータのpyorchのTensor型⇒numpy変換の処理などを入れました。

**argparseの修正**
argparseは、コマンドラインから引数を受け取る処理を簡単に実装できる便利なライブラリです。最近の深層学習モデル実装ではたいてい使われている印象ですが、Webアプリの関数として使う場合は不要なので修正しました。（不要なものは削除、残りは全てDefaultで指定しました）
また、ここでCPUの指定や、使用モデルと学習済みパラメータの指定も行います。

他の深層学習モデルであっても、PytorchやTensorFlowで書かれていれば同じようなポイントを修正すれば使えるようになると思います。

# 6. Webアプリのデプロイ
Azure App Service on Linux上にWebアプリをデプロイしていきます。
以下のようなフォルダ構造にしました。

My folder (任意の名前でOK)
　├ mlmodel/
　│　    └ CycleGAN model
　├ templates/
　│　    └ index.html
　├ app.py
　└ requirements.txt

それぞれの役割を簡単に書いていきます。
・**mlmodel**：機械学習モデルのソースコードや学習済み重みを保存しています。
・**templates**：htmlファイルを保存しています。
・**app.py**：データ処理やhtmlとの連携について書かれたpythonファイルです。アプリ内で最初に実行されるスクリプトです。
・**requirements.txt**：app.pyの実行に必要なpythonライブラリとバージョンが書かれたファイルです。デプロイ時にこれ通りに自動で環境構築してくれます。

既にチュートリアルをやってWebアプリをデプロイする準備は整っているので、下記の1行を実行するだけです。

```:pythonのバージョン確認
$ az webapp up --sku F1 --name <app-name>
```

ちなみに--skuの引数でマシンのレベルを選択できます。F1であれば無料で使えるのですが、無料クレジットが¥22,500あるので、私はRAMが3.50 GBのS2を選択しました。
選択可能なオプションは[こちら](https://azure.microsoft.com/ja-jp/pricing/details/app-service/windows/)で確認できます。

# ソースコード
デプロイしたコードはこちらのGithubレポジトリで公開しています。

https://github.com/m-naoki/cyclegan2gogh-webapp

上記レポジトリには学習済みモデルも含まれているのでそのまま動きますが、mlmodelフォルダ内には学習用コードも保存されているので、自分で画像を用意してモデルを学習させることもできます。

# 参考
[UbuntuでのGPUディープラーニング環境の構築](https://www.atmarkit.co.jp/ait/articles/1908/29/news020.html)
[CUDA on WSL User Guide](https://qiita.com/ksasaki/items/ee864abd74f95fea1efa)
[pytorch-CycleGAN-and-pix2pix](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)
[Anaconda Terms of Service](https://www.anaconda.com/terms-of-service)
[クイック スタート:Azure App Service on Linux で Python アプリを作成する](https://docs.microsoft.com/ja-jp/azure/app-service/quickstart-python?tabs=bash&pivots=python-framework-flask)

# 終わりに
最後まで読んで頂きありがとうございました。かなり駆け足になってしまいましたが、なんとか1日で環境構築から公開までできました。