はじめに
エッジでのDeep Learningを考えた時、tfliteに変換することが必要です。
というわけで、
PyTorchで学習したモデルをTFLiteモデルに変換して使う - qiita
ほぼこれですが、僕のマシンでは動かない部分があったので置いておきます。
元記事では
pytorch -> onnx -> keras -> tflite
という手順で変換を行なっていますが、本記事では
pytorch -> onnx -> tensorflow(.pbファイル) -> tflite
という手順での変換を行いました。
使うモデル
エッジでStyle Transferしたいですよね。
というわけで、軽くて動きそうなのでpytorch/examples/tree/master/fast_neural_style - githubを変換します。
Style Transfer(画風変換)
Style Transferとは、その名の通りイラストなどを含む画像の、画風を変換するというタスクです。
このタスクでは、画像というのが『内容(content)』と『スタイル(style)』の組み合わせであると考え、内容をそのままにしたままスタイルのみを変換する、ということを考えます。
以下の画像の例では、一番上の元の画像の内容を保ったまま、各行の左のスタイル画像のスタイルを転写しています。
また、以下の画像では左の、荒いスケッチを入力するだけで右の写真のような画像を生成する、ということが研究レベルではできています。
(大事なことなので二度言いますが、右の画像は現実のものではなく、左のスケッチから生成したものです)
元動画リンク
余談ですが、一時期話題になった、SNOWの顔画像の年齢を変更する機能なども、画風変換です。
モデルの変換
実行環境
- onnx-tf == 1.5.0
- onnx-coreml == 1.0
- tensorflow == 1.15.0
- torch == 1.3.0
- torchvision == 0.4.2
※pytorchですが、動かなかった場合はpyTorchは1.1系、torchvisionは0.3系でトライしていただければと思います
※tensorflowは1.15以外だと動作ができているのは確認してません。
1.14でもそれ以下でもダメでしたし、2.0のベータ版でもエラーでした。
PyTorch -> onnx
onnx tutorialを参考にしました。
$ pip install torchvision onnx-coreml
$ git clone https://github.com/pytorch/examples
$ cd examples/fast_neural_style
$ ./download_saved_models.sh
$ convert -size 250x540 xc:white png24:dummy.jpg
$ python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/mosaic.pth --cuda 0 --export_onnx ./saved_models/mosaic.onnx
onnx -> tensorflow
onnx-tensorflowを利用します。
$ onnx-tf convert -i /path/to/mosaic.onnx -o /path/to/mosaic.pb
tensorflow -> tflite
import tensorflow as tf
input_arrays = ["image_array"]
output_arrays = ["converted_array"]
converter = tf.lite.TFLiteConverter.from_frozen_graph(
save_path,
input_arrays,
output_arrays
)
tflite_model = converter.convert()
これによりmosaic.tflite
を得ることができました。