前提
すでにopenvinoが使えるものとする
tensorflowでMNISTのモデルを学習
tensorflow==1.15を使用
train.py
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# Load and preprocess the MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# Build the model
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Compile and train the model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test))
# Save the model's checkpoints
checkpoint_path = "./saved_model/model_checkpoint.ckpt"
model.save_weights(checkpoint_path)
# Save the model as a frozen graph
sess = tf.keras.backend.get_session()
# Get the graph definition
output_node_names = [node.op.name for node in model.outputs]
graph_def = sess.graph.as_graph_def()
# Convert variables to constants and remove training-only operations
from tensorflow.python.framework import graph_util
frozen_graph_def = graph_util.convert_variables_to_constants(sess, graph_def, output_node_names)
# Write the frozen graph to a file
with tf.gfile.GFile("./saved_model/frozen_graph.pb", "wb") as f:
f.write(frozen_graph_def.SerializeToString())
print("Frozen graph saved as 'frozen_graph.pb'")
IR形式に変換
$ cd /opt/intel/openvino_2021/deployment_tools/model_optimizer/
$ python3.7 mo.py --input_model "/root/MNIST/saved_model/frozen_graph.pb" --output_dir "/root/MNIST/IR/" --input_shape [1,28,28,1]
出力
Model Optimizer arguments:
Common parameters:
- Path to the Input Model: /root/MNIST/saved_model/frozen_graph.pb
- Path for generated IR: /root/MNIST/IR/
- IR output name: frozen_graph
- Log level: ERROR
- Batch: Not specified, inherited from the model
- Input layers: Not specified, inherited from the model
- Output layers: Not specified, inherited from the model
- Input shapes: [1,28,28,1]
- Mean values: Not specified
- Scale values: Not specified
- Scale factor: Not specified
- Precision of IR: FP32
- Enable fusing: True
- Enable grouped convolutions fusing: True
- Move mean values to preprocess section: None
- Reverse input channels: False
TensorFlow specific parameters:
- Input model in text protobuf format: False
- Path to model dump for TensorBoard: None
- List of shared libraries with TensorFlow custom layers implementation: None
- Update the configuration file with input/output node names: None
- Use configuration file used to generate the model with Object Detection API: None
- Use the config file: None
Model Optimizer version: 2021.2.0-1877-176bdf51370-releases/2021/2
[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: /root/MNIST/IR/frozen_graph.xml
[ SUCCESS ] BIN file: /root/MNIST/IR/frozen_graph.bin
[ SUCCESS ] Total execution time: 3.27 seconds.
[ SUCCESS ] Memory consumed: 263 MB.
It's been a while, check for a new version of Intel(R) Distribution of OpenVINO(TM) toolkit here https://software.intel.com/content/www/us/en/develop/tools/openvino-toolkit/choose-download.html?cid=other&source=Prod&campid=ww_2021_bu_IOTG&content=upg_pro&medium=organic_uid_agjj or on the GitHub*