🐾

OpenVINOを使用したモデルの変換(PyTorch -> ONNX -> OpenVINO -> TFLite

2022/07/11に公開

概要

 公開されているモデルを最終的にTFLiteの形式へ変換するのに使用した手順です。
 TFLiteまで変換しなくても、途中のモデルまでの変換や、PyTorchからじゃなくてもONNXからの変換でも同様の手順で変換できると思います。
 本記事では、YuNetを変換するモデルとして使用します。他のモデルでもモデルのパラメータなどを変更すれば、同様の手順で変換できると思います。
 基本的にPyTorch, ONNX, Caffe, OpenVINO (NCHW) のモデルをTensorflow / TensorflowLite (NHWC) へお手軽に変換するの手順どおりにやれば問題なく変換できると思います。本記事は、自分でもやってみた系の備考録です。

環境

 本記事での実行環境です。

docker run -it ubuntu:20.04

準備

1. モデルのダウンロード

 以下のリンクからYuNetのPyTorchのモデルをダウンロードします。

YuNetのPyTorchモデルへのリンク

2. OpenVINO Toolkitのインストール

 以下のリンクからOpenVINO Toolkitをaptする設定をします。

Intel® Distribution of OpenVINO™ Toolkitへのリンク

  • Runtime
  • Linux
  • 2021.4.2 LTS
  • APT

 上記の条件にてDownloadする。以下のコマンドにてOpenVINO Toolkitのインストールを行う。

apt install gnupg
apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB
echo "deb https://apt.repos.intel.com/openvino/2021 all main" | tee /etc/apt/sources.list.d/intel-openvino-2021.list
apt update
apt install intel-openvino-runtime-ubuntu20-2021.4.752

 モデル変換のスクリプトは、以下のパスにあります。

/opt/intel/openvino_2021/deployment_tools/model_optimizer

手順

1. PyTorch -> ONNX変換

pytorch_to_onnx.pyというスクリプトを使用して変換します。

pip install onnx torch torchvision
python3.8 /opt/intel/openvino_2021.4.752/deployment_tools/open_model_zoo/tools/downloader/src/open_model_zoo/model_tools/internal_scripts/pytorch_to_onnx.py --import-module yufacedetectnet --model-name YuFaceDetectNet --input-shape 1,3,540,960 --weights yunet_final.pth --output-file yunet_from_pytorch.onnx --input-names "input" --output-names "loc,conf,iou" --model-param=phase="'test'" --model-param=size=None

2. Optimizeモデル

 モデルをonnx-simplifierにて最適化します

pip install numpy onnx-simplifier
python3.8 -m onnxsim yunet_from_pytorch.onnx yunet_from_pytorch_opt.onnx

3. ONNX -> OpenVINO

 OpenVINOの形式へ変換します。この変換によりbin, mapping, xmlの3つのファイルが生成されます。

pip install networkx defusedxml
python3.8 /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo.py --output_dir </path/to/dir> --data_type FP32 --input_model yunet_from_pytorch_opt.onnx

4. OpenVINO -> TFLite

 OpenVINOからTFLite形式へ変換します。FP32形式だけ生成します。

pip install tensorflow
pip install openvino2tensorflow --upgrade
pip install tensorflow-datasets
openvino2tensorflow --model_path yunet_from_pytorch_opt.xml --model_output_path tflite_models --output_no_quant_float32_tflite

最後に

 モデル変換wizardであるPINTO0309さんの記事を多く参考にしました。PINTO_model_zooにないモデルを変換しようと思ったときに、試した手順をまとめたものです。
 [NCHW]形式を[NHWC]形式へ変換する手順としては、今の所唯一の手段?ではないかと思います。openvino2tensorflowを開発してくださった、PINTO0309さんへは感謝しかありません。未動作確認情報としては、tfliteだとモデル実行時にinterpreterで変換できるらしいのですが、動作確認までとっていません。
 自分でやってみてハマったのは、実際に変換したモデルを動作させるところで、エラーとなったところです。モデルの変換自体は正常に終了するので、動作環境とモデル変換の環境の違いには注意する必要があると思いました。

Discussion