TensorFlowの学習済みモデルをOpenVINOに変換する

ソフトウェア

 

CPUやCPU内蔵GPUで、AIの高速な推論が可能なOpenVINO

TensorFlowで作った学習済みモデルをOpenVINO形式に変換してみましたので紹介します。

 

※元々kerasで作成した学習済みモデルをTensorFlowに変換してからOpenVINOに変換しています。

keras→TensorFlowの変換は下記を参考にしてください。

kerasで作った学習済みモデルを.pbファイルに変換する
kerasで作った学習済みモデルをpbファイルに変換したので備忘録です。 やりたかったこと やりたかったことは、 kerasで作った学習済みモデルをOpenVINOに変換 です。 複数の...

 

2019.10.19追記

OpenVINOをWindowsで永続的に動作させるための環境変数をまとめました。

https://nori-life-log.com/openvinoの環境変数

 

 

OpenVINOのインストール

 

私がインストールした環境はWindows10です。

インストールの手順は下記を参考にしてください。

Install Intel® Distribution of OpenVINO™ toolkit for Windows* 10 - OpenVINO Toolkit

 

.pbファイルをOpenVINOに変換

 

ここでは「tf_model.pb」というTensorflowの学習済みモデルをOpenVINO形式に変換しています。

変換すると、modelフォルダの下に以下のファイルが生成されます。

  • tf_model.xml
  • tf_model.bin

 

変換は下記のようなbatファイルで実現できました。

最後の「FP32」は「FP16」と記述しても動作しましたが、環境によっては動作しないようです。

 

python "C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\model_optimizer\mo_tf.py" --input_model "tf_model.pb" --output_dir "model" -b 1 --data_type FP32
 

 

OpenVINOで推論

 

OpenVINOで推論するには環境変数を設定する必要があるので、コマンドプロンプトを立ち上げ、以下のbatを実行します。

C:\Program Files (x86)\IntelSWTools\openvino\bin\setupvars.bat

 

Windowsの場合、上記batを実行したコマンドプロンプトでないとOpenVINOでの推論ができません。

永続的にOpenVINOでの推論を実施したい場合は手動で環境変数を設定する必要があります。

環境変数の設定は下記を参照してください。

Windows®10で OpenVINO™環境変数を永続的に設定します。
OpenVINO™・ツールキットの環境変数を手動で永続的に設定する方法について説明します。

 

環境変数を設定した状態で、OpenVINOでの推論を実現したプログラムを載せます。

from openvino import inference_engine as ie
from openvino.inference_engine import IENetwork, IEPlugin
from PIL import Image
import numpy as np

class OpenVinoModel:
    def __init__(self, model_xml_path, model_bin_path, device):
        self.size_x = 512
        self.size_y = 512
        self.size_c = 3
        self.model_xml_path = model_xml_path
        self.model_bin_path = model_bin_path
        self.device = device
        self.cpu_ext_path = r'C:\Program Files (x86)\IntelSWTools\openvino\deployment_tools\inference_engine\bin\intel64\Release\cpu_extension_avx2.dll'
        self.plugin = IEPlugin(self.device)
        if self.device == 'CPU':
            self.plugin.add_cpu_extension(self.cpu_ext_path)
        net = IENetwork.from_ir(model=self.model_xml_path, weights=self.model_bin_path)
        self.input_blob = next(iter(net.inputs))
        self.out_blob = next(iter(net.outputs))
        self.exec_net = self.plugin.load(network=net)

    def predict(self, img_path):
        img = self.pre_process_image(img_path)
        res = self.exec_net.infer(inputs={self.input_blob: img})
        output_node_name = list(res.keys())[0]
        res = res[output_node_name]
        return res

    def pre_process_image(self, imagePath):
        n, c, h, w = [1, self.size_c, self.size_x, self.size_y]
        image = Image.open(imagePath)
        processedImg = image.resize((h, w), resample=Image.BILINEAR)
        processedImg = (np.array(processedImg) - 0) / 255.0
        processedImg = processedImg.transpose((2, 0, 1))
        processingImg = processingImg.reshape((n, c, h, w))
        return processingImg

コンストラクタでOpenVINOモデルの.xmlファイルと.binファイルのパスを指定します。

デバイスにCPUを使用する場合、拡張ファイルを設定しないと動作しない場合があるので、add_cpu_extensionで拡張ファイルの設定をします。

 

また、PILで画像ファイルを読み込むと、(height, weight, channel)のような構造で画像が読み込まれます。

OpenVINOでは画像を(channel, height, weight)として扱うので、pre_process_imageで変換しています。

 

 

まとめ

 

TensorFlow(keras)で作った学習済みモデルをOpenVINOで推論してみました。

 

OpenVINOを使ってCPUで高速に推論ができれば、

コンピュータのメモリに学習済みモデルを展開できるので、GPUを使う場合よりも並列数を増やせる

ことが最大のメリットだと私は思っています。

 

以上!

コメント