본문 바로가기

Python

OpenVINO 사용 방법 정리2 - TF2

320x100
320x100

 

 

 최근에 모델 변환할 일이 생겨서 이전 글에 내가 정리한 대로 진행했는데 에러가 뜨더라. 이유를 찾아보니 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://www.intel.co.kr/content/www/kr/ko/support/articles/000088875/software/development-software.html

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