OKI「AE2100」向け OpenVINO Model Optimizerの使い方 (物体検出モデル編)

<font color="Red">**この記事はAE2100標準コンテナイメージ Ubuntu 20.04 LTS + OpenVINO 2021.4.1 LTS版 (ae2100_openvino_ubuntu20_runtime_2021.4.1.tar)を対象としています。**</font>
<font color="Red">**また、AE2100のファームウェアについては2021年10月公開のv3.6.0を使用し、HDDL DaemonはOpenVINO 2021.4.1 LTS用に更新してください。**</font>
**HDDL Daemonの更新手順については、v3.6.0のファームウェア同梱の手順書をご参照ください。**

# 要約

この記事では、物体検出のディープラーニング・モデルに対してModel Optimizerを適用する方法を説明します。
また、Model Optimizerによる変換後のモデルをAE2100のUbuntu + OpenVINOコンテナへデプロイし、推論を実行します。

# はじめに

前回の記事「[OKI「AE2100」向け OpenVINO Model Optimizerの使い方 (画像分類モデル編)](https://qiita.com/sa9moto/items/5cd935ec76bffe7d4767)」では、画像分類モデルに対してOpenVINOのModel Optimizerを使用する方法を説明しました。

この記事ではModel Optimizerを使用して物体検出モデルをIRへ変換する方法について説明します。
Model Optimizerの概要につきましては、[前回の記事](https://qiita.com/sa9moto/items/5cd935ec76bffe7d4767)をご参照ください。

なお今回の記事ではOpenVINOのバージョンとして2021.4.1を扱います。
OpenVINO 2021からTensorFlow 2のモデルに対応されたため、TensorFlow 2 Object Detection APIの訓練済みモデルをModel OptimizerによりIRへ変換する方法について説明します。

# TensorFlow 2 Object Detection APIのモデルへのModel Optimizer使用方法

## 事前準備

Ubuntu開発環境上にOpenVINOおよびModel Optimizerのインストールを行ってください。
開発環境とAE2100コンテナとでOpenVINOのバージョン2021.4.1を揃えてください。

なおAVX命令に非対応のプロセッサー上でModel Optimizerを使用したTensorFlowモデルの変換を行うと、エラー「core dumped (Illegal instruction)」 が発生します。
開発環境として、Intel製プロセッサーを用いる場合にはCore i もしくはXeon系のプロセッサーを搭載したPC等をご用意ください。

詳細は「AE2100 シリーズ SDK 取扱説明書 ―DeepLearning 編―」(版数: 1.3)をご参照ください。

## モデルの用意

IRへ変換するモデルを開発環境上に用意します。

今回はTensorFlow 2 Object Detection APIのDetection Model Zooから訓練済み物体検出モデル(SSD MobileNet v2 320x320)を取得します。
このモデルはCOCO 2017データセットで訓練済みのモデルです。

[TF2 Detection Model Zoo (models/tf2_detection_zoo.md at master · tensorflow/models · GitHub)](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md)

補足になりますが、Detection Model Zooから取得したモデルに対してお手持ちのデータを使った訓練(転移学習やfine-tuning)を行うことで、物体検出の適用対象に沿ったモデルを作成することができます。
本記事では取得したモデルをそのままIRへ変換するため、転移学習やfine-tuningの方法については説明しません。

ホームディレクトリ直下に作業用ディレクトリを作成し、移動します。
また、`wget`コマンドを用いてwebからモデルファイルをダウンロードし、`tar`コマンドで解凍します。

``` console
# cd
# mkdir mo_object_detection
# cd mo_object_detection
# wget http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_320x320_coco17_tpu-8.tar.gz
# tar xzf ssd_mobilenet_v2_320x320_coco17_tpu-8.tar.gz
```

上記コマンドを実行すると、ディレクトリ`ssd_mobilenet_v2_320x320_coco17_tpu-8`が展開され、その中にモデルファイルが格納されたディレクトリ`checkpoint`および`saved_model`、モデルの設定が記述されたファイル`pipeline.config`があります。
以降ではこの`saved_model`に対してModel Optimizerを適用します。

## Model Optimizerのパラメータ確認

TensorFlow Object Detection APIにより作成したモデルをIRへ変換する場合、Model Optimizerのスクリプト`mo_tf.py`へ下記のページに記載されているパラメータを与えます。
このパラメータ指定により、その他の設定ファイルや複雑な引数を設定する必要なくIRへ変換することができます。

[Loading Non-Frozen Models to the Model Optimizer (Converting a TensorFlow* Model - OpenVINO™ Toolkit)](https://docs.openvinotoolkit.org/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_Object_Detection_API_Models.html)

今回取得したモデルSSD MobileNet v2 320x320の変換に用いる実際のパラメータについては、次節で説明します。

## Model Optimizerの実行

開発環境にてModel Optimizerを実行し、モデルSSD MobileNet v2 320x320をIRへ変換します。

Model OptimizerはPythonにより実行します。また、Pythonの仮想環境上にModel Optimizerの環境を構築した場合には、仮想環境を起動します。

``` console
# cd 
# cd ./mo_object_detection
# source /opt/intel/openvino_2021/deployment_tools/model_optimizer/venv/bin/activate
```

下記のコマンドで`/opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py`を実行し、モデルSSD MobileNet v2 320x320をIRへ変換します。

``` console
# python3 /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py \
--saved_model_dir ./ssd_mobilenet_v2_320x320_coco17_tpu-8/saved_model \
--transformations_config /opt/intel/openvino_2021/deployment_tools/model_optimizer/extensions/front/tf/ssd_support_api_v2.0.json \
--tensorflow_object_detection_api_pipeline_config ./ssd_mobilenet_v2_320x320_coco17_tpu-8/pipeline.config
```

下記の表にパラメータ引数の説明を示します。

| 引数 | 説明 |
| --- | --- |
| `--input_model <frozen.pb>`または`--saved_model_dir <saved_model>` | 	変換対象のモデルファイル。モデルが.pbファイルの場合は`--input_model`を使い`<frozen.pb>`にファイルパスを指定する。モデルがTF2のSaved Model形式の場合には`--saved_model_dir`を使い`<saved_model>`にSaved Modelのディレクトリパスを指定する。 |
| `--transformations_config <subgraph_config.json>` | サブグラフ置換設定ファイル。`<subgraph_config.json>`にサブグラフ置換設定ファイルのパスを指定する。Detection Model Zooにあるモデルを変換する場合には、ディレクトリ`/opt/intel/openvino_2021/deployment_tools/model_optimizer/extensions/front/tf`下にあるサブグラフ置換設定ファイルを使用することができる。どのサブグラフ置換設定ファイルがどのモデルに対応しているかの詳細は[Loading Non-Frozen Models to the Model Optimizer (Converting a TensorFlow* Model - OpenVINO™ Toolkit)](https://docs.openvinotoolkit.org/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_tf_specific_Convert_Object_Detection_API_Models.html#how_to_convert_a_model)を参照。 |
| `--tensorflow_object_detection_api_pipeline_config <pipeline.config>` | Object Detection APIのpipeline設定ファイル。`<pipeline.config>`にpipeline設定ファイルのパスを指定する。Detection Model Zooにあるモデルの場合は`.tar.gz`ファイルを展開して得られる`pipeline.config`のパスを指定する。 |

IRへの変換対象となるモデルの構造にあわせてこれらの引数を変更します。
今回の変換では下記のように引数を指定します。

- `--saved_model_dir ./ssd_mobilenet_v2_320x320_coco17_tpu-8/saved_model`: 取得したモデルSSD MobileNet v2 320x320のSaved Modelを変換するため、ディレクトリパスを指定
- `--transformations_config /opt/intel/openvino_2021/deployment_tools/model_optimizer/extensions/front/tf/ssd_support_api_v2.0.json`: 取得したモデルSSD MobileNet v2 320x320に対応するサブグラフ置換設定ファイル`ssd_support_api_v2.0.json`のパスを指定
- `--tensorflow_object_detection_api_pipeline_config ./ssd_mobilenet_v2_320x320_coco17_tpu-8/pipeline.config`: 取得したモデルのpipeline設定ファイル`pipeline.config`のパスを指定

Model Optimizerの実行が成功すると、IRとして.xml形式のファイルと.bin形式のファイルが得られます。
今回の変換ではSSD MobileNet v2 320x320のIRとして下記のファイルが得られます。

- `saved_model.xml`
- `saved_model.bin`

## アプリケーションの用意およびAE2100へのデプロイ

上記で変換したIRの動作確認をAE2100上で行うプログラムの例として「[OKI AIエッジコンピューター「AE2100」で動く物体検出プログラムを作ろう (1) ―基礎編―](https://qiita.com/TWAT/items/0cbf6286e921f7c5664e)」をご参照ください。
当該記事のソースコード中にIRのファイルパスを指定する箇所があるため、上記で変換したSSD MobileNet v2 320x320のIRを指定するよう適宜変更してください。
また当該記事には今回変換を行ったモデルに対応するCOCO 2017データセットのラベルファイルが記載されており、動作確認にあたって同じラベルファイルを使用することができます。

当該記事のプログラム実行に必要なPython環境をコンテナ上に構築する方法については「[OKI「AE2100」 Ubuntu + OpenVINOコンテナ向け Python環境の構築方法](https://qiita.com/sa9moto/items/8a8d4f90b6f1b5046a9b)」をご参照ください。

なお上記の記事はAE2100のコンテナとして`ubuntu_openvino_2020R3.tar`を対象としていますが、コンテナ`ae2100_openvino_ubuntu20_runtime_2021.4.1.tar`についても同様の手順でプログラムを実行することが可能です。

# おわりに

今回はOpenVINOのModel Optimizerを利用して物体検出モデルをIRへ変換する方法を説明しました。
ご自身で訓練した物体検出モデルやwebから取得した訓練済み物体検出モデルをAE2100へデプロイする際には、本記事をご参照ください。

# 関連記事

- [OKI「AE2100」向け OpenVINO Model Optimizerの使い方 (画像分類モデル編)](https://qiita.com/sa9moto/items/5cd935ec76bffe7d4767)
- [OKI AIエッジコンピューター「AE2100」で動く物体検出プログラムを作ろう (1) ―基礎編―](https://qiita.com/TWAT/items/0cbf6286e921f7c5664e)