최근에 모델 변환할 일이 생겨서 이전 글에 내가 정리한 대로 진행했는데 에러가 뜨더라. 이유를 찾아보니 Tensorflow2로 학습된 모델을 변환하려면 OpenVINO 2021.3 이상의 버전을 사용해야 했고, 설치하는 방법도 과거보다 훨씬 쉬워진 것 같아서 추가로 정리하고자 한다.
1. Install OpenVINO
다른 파이썬 라이브러리처럼 pip을 지원한다! exe 파일을 통해 설치하던 이전 방식보다 훨씬 편해졌다.
## 가상환경 생성
conda create --name openvino python=3.8
conda activate openvino
## OpenVINO 설치
pip install openvino-dev[tensorflow2]==2021.4.2
2. Freezing model
h5를 pb로 변환하는 데에 사용되는 코드가 TF1랑 TF2랑 다르다. 아래 코드를 통해 변환하면 된다.
from glob import glob
import os
import tensorflow as tf
import efficientnet.tfkeras
from tensorflow.keras.models import load_model
from tensorflow.python.framework import graph_io
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
def freezing_model_tf1(path):
tf.keras.backend.set_learning_phase(0)
model = load_model(path, compile=False)
outputs = [t.op.name for t in model.outputs]
session = tf.keras.backend.get_session()
with session.graph.as_default():
graph_def_inf = tf.graph_util.remove_training_nodes(
session.graph.as_graph_def())
graph_def_frozen = tf.graph_util.convert_variables_to_constants(
session, graph_def_inf, outputs)
return graph_def_frozen
def freezing_model_tf2(path):
## https://jimmy-shen.medium.com/how-to-freeze-graph-in-tensorflow-2-x-3a3238c70f19
model = load_model(path, compile=False)
# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))
# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
return frozen_func.graph
if __name__=="__main__":
tf_version = tf.__version__[0]
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
keras_root = './keras'
save_root = './frozen'
save_flag = False
keras_paths = sorted(glob(f"{keras_root}/*"))
for path in keras_paths:
if tf_version == '1':
frozen_model = freezing_model_tf1(path)
if save_flag:
graph_io.write_graph(
frozen_model,
save_root,
f"{os.path.basename(path).split('.')[0]}.pb",
as_text=False)
tf.keras.backend.clear_session()
else:
frozen_model = freezing_model_tf2(path)
if save_flag:
tf.io.write_graph(
frozen_model,
save_root,
f"{os.path.basename(path).split('.')[0]}.pb",
as_text=False)
tf.keras.backend.clear_session()
3. Convert .pb model to .xml and .bin
내가 참고한 사이트에서 주피터 노트북을 통해 변환하는 방법에 대해 설명해주고 있으니(이 방식이 훨씬 쉬움), 나는 이와는 다르게 직접 cmd 명령어로 변환하는 방법에 대해 정리하고자 한다. 거창한 거 없이 cmd창 키고 아래 명령어 쓰면 끝!
mo --input_model ./test.pb --input_shape [1,64,64,3] --output_dir ./ --data_type FP32
(사실 openvino 설치된 경로로 이동해야되는 줄 알았는데 그냥 바로 사용할 수 있었네...)
4. Inference OpenVINO
pip을 통해 openvino를 설치했을 때 가장 좋은 점은 setupvars.bat를 실행하지 않아도 된다는 점이다! 가상환경 활성화하고 바로 import해서 사용하면 문제 없이 실행된다.
< 참고 사이트 >
https://ballentain.tistory.com/78
https://pub.towardsai.net/introduction-to-intel-distribution-of-openvino-toolkit-b1ba5b0cf24f
https://www.kaggle.com/code/raymondlo84/mnist-with-openvino-and-tensorflow-on-kaggle
'Python' 카테고리의 다른 글
Visual Studio Code 임시 저장 경로 (0) | 2024.05.06 |
---|---|
자주 쓰는 코드 (0) | 2023.09.19 |
내가 자주 쓰는 파이썬 정규표현식 정리 (0) | 2023.01.13 |
Anaconda 가상 환경 Export 방법 (offline / Linux / tar.gz) (0) | 2022.08.01 |
OpenVINO 사용 방법 정리 (0) | 2022.07.20 |