CPUやCPU内蔵GPUで、AIの高速な推論が可能なOpenVINO。
TensorFlowで作った学習済みモデルをOpenVINO形式に変換してみましたので紹介します。
※元々kerasで作成した学習済みモデルをTensorFlowに変換してからOpenVINOに変換しています。
keras→TensorFlowの変換は下記を参考にしてください。

2019.10.19追記
OpenVINOをWindowsで永続的に動作させるための環境変数をまとめました。
https://nori-life-log.com/openvinoの環境変数
OpenVINOのインストール
私がインストールした環境はWindows10です。
インストールの手順は下記を参考にしてください。
.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での推論を実施したい場合は手動で環境変数を設定する必要があります。
環境変数の設定は下記を参照してください。

環境変数を設定した状態で、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を使う場合よりも並列数を増やせる
ことが最大のメリットだと私は思っています。
以上!
コメント