OpenVINO python을 이용한 inference 예제

OpenVINO를 이용해서 TensorFlow(Keras)로 training한 모델로 추론(inference)을 수행하는 간단한 예제를 작성해 보았다.

TensorFlow model을 freeze하기

Training된 모델을 model optimizer에 넣기 전에 freeze시켜야 하는데, output_node_names를 입력하라는 오류 메세지가 계속 뜬다면 제대로 freezing을 수행했는지 확인해 보는게 좋다. 알아보기 쉽게 하기 위해 입출력 layer에 ‘name=’ parameter로 다음과 같이 이름을 지정해 주었다.

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28), name='input'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax', name='output')
])

그러면 layer의 이름들을 출력할 때 다음과 같이 나온다. 전체 MINST model training과 freezing 과정은 이 CoLab에 적어 두었으니 참조.

------------------------------------------------------------
Frozen model layers:
x
sequential/input/Const
sequential/input/Reshape
sequential/dense/MatMul/ReadVariableOp/resource
sequential/dense/MatMul/ReadVariableOp
sequential/dense/MatMul
sequential/dense/BiasAdd/ReadVariableOp/resource
sequential/dense/BiasAdd/ReadVariableOp
sequential/dense/BiasAdd
sequential/dense/Relu
sequential/dropout/Identity
sequential/output/MatMul/ReadVariableOp/resource
sequential/output/MatMul/ReadVariableOp
sequential/output/MatMul
sequential/output/BiasAdd/ReadVariableOp/resource
sequential/output/BiasAdd/ReadVariableOp
sequential/output/BiasAdd
sequential/output/Softmax
Identity
------------------------------------------------------------

모델 옵티마이저(mo-tf.py)

Freeze된 모델을 다운로드 받은 후에 TensorFlow용 model optimizer인 mo-tf.py를 실행 시키면 model을 나타내는 xml file과 weight값을 저장하는 bin file이 생성된다. 이 때 training된 모델은 입력 shape을 [-1, 28, 28]로 알고 있기 때문에 음수가 아닌 값을 넣어 달라는 에러가 생긴다. –input_shape parameter를 다음과 같이 적어준다.

/opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py --input_model ./model/mnist_model/frozen_graph.pb  --input_shape [28,28]

OpenVINO를 이용한 inference

Model optimizer가 수행되었다면 이제 xml file을 이용해 model을 load하고 inference를 수행하면 된다. 다음은 Training 후 freezing과 model optimization이 수행된 XML file을 이용해서 inference를 수행하는 간단한 코드이다.

출력결과

$ python3 ./infer_mnist.py ./model/mnist_model/frozen/frozen_graph.xml

        Model path= ./model/mnist_model/frozen/frozen_graph.xml 
        Device= CPU
Accuracy: 0.9789 (hit: 9789/ miss: 211)

stb library를 이용한 간단한 이미지 읽고 쓰기

stb는 라이센스 걱정없이 사용할 수 있는 간단한 이미지 읽고 쓰기, 폰트, vorbis등에 대한 퍼블릭 도메인 구현으로 간단한 이미지 처리 등을 지원하기 위해 임베디드 시스템 등에서 고려해 볼만 하다. 다음은 테스트용 이미지(아무 포맷)를 읽어서 BMP로 저장하는 예제이다.

XCode에서 OpenCL 개발환경 설정과 간단한 디바이스 정보 출력 예제

  1. XCode에서 새로운 프로젝트를 생성하고 macOS의 Command Line Tool을 선택한다.
  2. Project를 선택하고 ‘Build Phases’ -> ‘Link Binary With Libraries’에서 더하기(+)를 선택한 후 OpenCL framework을 선택한다.

아래의 예제 코드는 OpenCL programming by example의 2장에 나오는 내용을 약간 변경한 것으로 AMD 라데온 Pro 455와 Intel HD graphics 530두 개의 GPU가 달린 2016년 맥북프로에서 실행하면 다음과 같은 결과가 출력된다.

Number of platforms: 1
3 devices found in platform0
	Name: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
	Type: 2
	Image support: 1
	Vendor: Intel
	Driver ver.: 1.1
	Device ver.: OpenCL 1.2 
	Compute units: 8
	Max clock: 2700 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

	Name: Intel(R) HD Graphics 530
	Type: 4
	Image support: 1
	Vendor: Intel Inc.
	Driver ver.: 1.2(Aug 31 2020 22:26:30)
	Device ver.: OpenCL 1.2 
	Compute units: 24
	Max clock: 1050 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

	Name: AMD Radeon Pro 455 Compute Engine
	Type: 4
	Image support: 1
	Vendor: AMD
	Driver ver.: 1.2 (Sep 11 2020 22:04:49)
	Device ver.: OpenCL 1.2 
	Compute units: 12
	Max clock: 855 MHz
		Denorms: 1
		INF and quiet NaNs: 1
		Round to nearest: 1
		Round to zero: 1
		Round to INF: 1
		FMA: 1

Program ended with exit code: 0