wide and deep

Google colaboratory上でMMdnnを使いcaffe→kerasへ学習済みモデル変換

今回したこと

MMdnnを使って配布されている学習済みcaffeモデル(vgg16)をkerasモデルへと変換した.
caffeの環境構築が面倒そうだったので,Google colab上で変換することにした.
(今後caffeでモデル構築することはなさそうだし...)
今回実行したコードはgistに置いている
MMdnn/caffe->keras · GitHub

背景

最近研究として取り組んでいる分野において,実装がcaffeでされていることが多い.
これからモデルを弄っていくにあたって経験のないcaffeだと辛いので
どうにかtf/kerasにできないかと思っていた所,
MMdnnという滅茶苦茶ベンリなものが公開されていることを知った.
安心と信頼のMS製
github.com

始めはローカルで使用しようと考えていたが,
当方windows環境でのcaffe環境構築が面倒臭そう独特だったので
Google colaboratory上で環境を作成し,変換することにした.

使い方の調査

MMdnnの使い方は日本語記事もある程度見つかるので,それらを参考に
あとは公式referenceが詳しいので必読
エイバースの中の人 : MMdnnを使用してモデルをcaffeからkerasに変換する
深層学習モデルの相互変換ツールMMdnnを試す - Qiita

インストール

pipからインストールするらしい

python -m pip install --upgrade pip
pip install mmdnn

まずは使用法を確認

mmconvert -h
usage: mmconvert [-h]
                 [--srcFramework {caffe,caffe2,cntk,mxnet,keras,tensorflow,tf,pytorch}]
                 [--inputWeight INPUTWEIGHT] [--inputNetwork INPUTNETWORK]
                 --dstFramework
                 {caffe,caffe2,cntk,mxnet,keras,tensorflow,coreml,pytorch,onnx}
                 --outputModel OUTPUTMODEL [--dump_tag {SERVING,TRAINING}]

optional arguments:
  -h, --help            show this help message and exit
  --srcFramework {caffe,caffe2,cntk,mxnet,keras,tensorflow,tf,pytorch}, -sf {caffe,caffe2,cntk,mxnet,keras,tensorflow,tf,pytorch}
                        Source toolkit name of the model to be converted.
  --inputWeight INPUTWEIGHT, -iw INPUTWEIGHT
                        Path to the model weights file of the external tool
                        (e.g caffe weights proto binary, keras h5 binary
  --inputNetwork INPUTNETWORK, -in INPUTNETWORK
                        Path to the model network file of the external tool
                        (e.g caffe prototxt, keras json
  --dstFramework {caffe,caffe2,cntk,mxnet,keras,tensorflow,coreml,pytorch,onnx}, -df {caffe,caffe2,cntk,mxnet,keras,tensorflow,coreml,pytorch,onnx}
                        Format of model at srcModelPath (default is to auto-
                        detect).
  --outputModel OUTPUTMODEL, -om OUTPUTMODEL
                        Path to save the destination model
  --dump_tag {SERVING,TRAINING}
                        Tensorflow model dump type

これを見ると大体こんなになる感じかなと想像

mmconvert --srcFramework [caffe] --inputWeight [.caffemodel] --inputNetwork [.prototxt] --dstFramework [keras] --outputModel [.h5]

MMdnnを使うには双方のフレームワークがインストールされていなければならない(それはそう)
kerasはインストール済みだったのでcaffeのインストールについて調査

caffeインストール

colaboratory上にはデフォルトでcaffeが入っているわけではないので
自力でインストールする
ちょうど良さげなQAに従い,インストールする
stackoverflow.com

apt install -y caffe-cuda

実際にモデル変換を行ってみる

まずはdrive経由でファイルを取得する

from google.colab import drive
drive.mount('/content/drive')

今回は取得したファイルパスを簡単にしておく

!ln -s /content/drive/My\ Drive/Colab\ Notebooks/files vgg

ファイル構造はこんな感じ

vgg/
┣ deploy-vgg16.prototxt
┗ minc-vgg16.caffemodel

実際に変換を行ったコマンドは下記の通り

!mmconvert --srcFramework caffe --inputWeight vgg/minc-vgg16.caffemodel --inputNetwork vgg/deploy-vgg16.prototxt --dstFramework keras --outputModel ~/minc-vgg16.h5 --inputShape 10,3,224,224

inputShapeを指定しない場合、None例外が発生します。
エイバースの中の人 : MMdnnを使用してモデルをcaffeからkerasに変換する

らしいので,inputShapeをモデルにあわせて設定した.
ファイルが出力されていることを確認し

ls ~
# minc-vgg16.h5

kerasからモデルを読み込めることを確認した

import keras
model = keras.models.load_model('/root/minc-vgg16.h5')
loss = keras.losses.categorical_crossentropy
optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)

model.compile(loss=loss, optimizer=optimizer, metrics=['accuracy'])
model.summary()
# -------------------------------
# -------------------------------
# relu7 (Activation)           (None, 4096)              0         
# _________________________________________________________________
# fc8-20_1 (Dense)             (None, 23)                94231     
# _________________________________________________________________
# prob (Activation)            (None, 23)                0         
# =================================================================
# Total params: 134,354,775
# Trainable params: 134,354,775
# Non-trainable params: 0
# _________________________________________________________________

まとめ

今回は学習済みcaffeモデルをMMdnnを用いてkerasモデルへと変換した.
環境を汚さない・楽にするためにGoogle colaboratoryを利用したので,
環境依存なしに変換できることを確認した.
実際のコードを下記に貼り付けておく
gist.github.com