深層学習モデルの相互変換ツールMMdnnを試す

#MMdnnとは？
Microsoft Researchにより開発が進められているオープンソースの深層学習モデルの変換と可視化を行うツールです。中間表現を経由することで様々なフレームワーク間でのモデルデータの相互変換を実現しています。
これはものすごいパワーを秘めていそうな雰囲気です。
[github:Microsoft/MMdnn](https://github.com/Microsoft/MMdnn)


#サポートしているフレームワーク
上記githubのサイトに詳細な表や説明があるのでここでは簡単に。

以下のフレームワークでモデルの相互運用が可能になります。
Caffe、Keras、Tensorflow、CNTK、MXNet、PyTorch、CoreML

ONNXへの変換もサポートしていますが、こちらは一方通行で、ONNXから別形式は未対応らしいです。

テスト済みのモデルとしては、
VGG19、Inception v4、ResNet v2、SqueezeNet　あたりは全フレームワークでOKらしいです。

Caffeのサポートが若干弱めですが、MobileNet V2や、NASNetも多くのフレームワークで相互運用が可能です。

実に凄まじい威力です。
代表的なモデルに対応していれば、実用面ではそこまで困りません。
多くの場合は代表的なモデルの転移学習だったり、もっとシンプルなモデルだったりするため、意外と使えると思います。

#インストールしてみる

インストールは簡単です。
コマンドラインで以下を打ち込むだけです。

```
$ pip install mmdnn
```
これで安定版がインストールされます。
もちろん、Windows(Anaconda)でも同じコマンドでいけます。


#モデルを変換してみる
今後のニーズが出てきそうというのと、個人的に必要ということで、
今回はKerasモデル → ONNXを試してみたいと思います。

pipでインストールしましたが、pythonコードにimportして使うわけではありません。
コマンドラインから実行していきます。
windowsの人はpipコマンドを実行するのと同じコマンドプロンプトを使います。

##学習済みモデルの入手
変換に使うモデルを入手します。
何が使えるかは以下のコマンドで分かります。

```
$ mmdownload -f keras
Support frameworks: {'yolo2', 'inception_v3', 'xception', 'nasnet', 'densenet', 'vgg19', 'mobilenet', 'resnet50', 'vgg16', 'inception_resnet_v2'}
```
色々ダウンロードできそうです。
ここでは試しにinception_v3を選択します。

```
$ mmdownload -f keras -n inception_v3 -o ./
```
モデルはカレントディレクトリに「imagenet_inception_v3.h5」という名前で保存されます。

##モデルをONNXモデルに変換
モデルを変換していきます。
ここで、前提になるライブラリがインストールされている必要があります。

###前提ライブラリのインストール

```
$ pip install tensorflow        ←GPU版/CPU版どちらも可
$ pip install keras
$ pip install onnx-tf
```
これでOKです。

###モデルの変換処理
なんと以下のコマンドのみです。

```
$ mmconvert -sf keras -iw imagenet_inception_v3.h5 -df onnx -om imagenet_inception_v3.onnx
```
実行すると「imagenet_inception_v3.h5」というkerasモデルファイルに対して、「imagenet_inception_v3.onnx」というファイルが生成されます。

特にコーディングも無く大変簡単に完了しました。

引数の意味は以下のPythonファイルを見れば書いてあります。
[ MMdnn/mmdnn/conversion/_script/convert.py](https://github.com/Microsoft/MMdnn/blob/master/mmdnn/conversion/_script/convert.py)

簡単に解説すると、

 - -sf [framework]・・・・変換元(sauce)のフレームワーク
 - -iw [ファイル]・・・・・入力する重みファイル
 - -in [ファイル]・・・・・入力するネットワークファイル
 - -df [framework]・・・・変換先(destination)フレームワーク
 - -om [ファイル]・・・・・出力先のモデルファイル名

kerasのモデルファイルはネットワークを含んでいるのでネットワークを指定する必要は無いです。

#モデルを可視化してみる
先ほどダウンロードしたモデルファイル（imagenet_inception_v3.h5）を可視化していきます。
コマンドプロンプトにて以下のコマンドを実行します。

```
$ mmtoir -f keras -w imagenet_inception_v3.h5 -o keras_inception_v3
```
すると、「keras_inception_v3.json」というファイルが生成されます。

このファイルを可視化するためにはクラウド上にて処理を行います。
以下のリンクを開きます。
http://mmdnn.eastasia.cloudapp.azure.com:8080/

以下の画面が出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248663/38fc478b-c9f5-c5ea-380f-9a71b076a0aa.png)
「Choose Your Model」のところの「参照...」から先ほど作成した「keras_inception_v3.json」を指定します。

するとモデルが可視化されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248663/2a7b0ba6-cebb-1941-71ef-3d2b6b244456.png)
ホイールでスクロールができると書いてあるが、Edgeはクリック以外効かない。
Firefoxもホイール操作は効かないが、ドラッグでのスクロール操作は効く。

個人的にはWEBサイト全体を画像して確認するのが良い気がする。
(例えば、Firefoxなら右クリック>スクリーンショットを撮る>ページ全体を保存 など)


#感想
大変便利で強力なツールだと思います。
特にモデルの相互変換が効くのは強力です。
個人的にはonnxモデルへの変換が簡単なのが一番うれしいです。

WindowsMLによるONNXサポートがあることを考えると、
好きなフレームワークでモデル作成 → ONNXモデルに変換 → WindowsMLを利用してソフト作成
の流れが成立します。

また、可視化についても便利で、
私は現状kerasをメインで使用していますが、モデルの可視化ツールは開発が終了しているライブラリを使うなど使いにくい側面があるので、簡単に可視化できるのはありがたいです。
これで報告資料作りも楽になりますね！