안녕하세요, MoonLight입니다.
이번 Post에서는 Tensorflow Model을 모바일 Device, 임베디드 혹은 IoT 기기에서 배포하고 실행하기 위한 File Format인
TFLite(TensorFlow Lite)을 사용하는 방법에 대해서 알아보도록 하겠습니다.
TFLite은 앞서 말씀드렸듯이 Computing Power가 낮은 Device에서도 원래 Model과 동일한 성능이 나올 수 있도록
변환된 File Format입니다.
제가 실제로 수행했던 Project에서도 임베디드 디바이스에 모델을 실행하는 경우에 TFLite / ONNX 등의 File Format이 많이
사용되더라구요.
TFLite는 기존에 있던 Model File을 변환하는 것이 주된 목적이기 때문에 우선 Model Conversion을 알아보고,
다른 사람이 만든 TFLite Model File을 읽어서 사용하는 방법도 알아보도록 하겠습니다.
0. Model Conversion
TFLite Model Converter는 tf.lite.TFLiteConverter가 그 역할을 수행합니다.
Tensorflow 2.x Model을 TFLite File로 Conversion하는 Function은 총 3가지가 있는데, 우리는 대부분 기존 Model File을 TFLite로 변환하는 것이 목적이므로 tf.lite.TFLiteConverter.from_saved_model()를 사용해 보도록 하겠습니다.
사용법은 매우 간단합니다. 아래 예제 Code를 보시죠
import tensorflow as tf
# Converter를 초기화 합니다.
# from_saved_model()의 Parameter는 기존 Model File이 저장되어 있는 Folder의 Path를 넣어줍니다.
converter = tf.lite.TFLiteConverter.from_saved_model("Sample_CheckPoints")
# 만들어진 Converter의 convert() 함수를 Call합니다.
tflite_model = converter.convert()
# Convert한 Model을 .tflite File Format으로 저장합니다.
with open('Sample_CheckPoints.tflite', 'wb') as f:
f.write(tflite_model)
제가 Test시에 사용한 원래 Model의 크기는 292MB 정도였는데, TFLite 변환 File의 크기는 95MB 정도로 줄어있었습니다.
1. Model Load
이번에는 다른 사람이 배포한 TFLite File을 Load하여 사용하는 예제를 보도록 하죠.
다양한 플랫폼에서 TFLite를 사용할 수 있도록 다양한 언어를 지원합니다.
대표적으로, Java, Swift, Objective-C, C++, Python 등의 언어를 지원합니다.
이번 Post에서는 Python으로 TFLite를 Load하여 Inference를 하는 예제를 알아보도록 하죠
다른 언어관련 자료는 아래 Link를 참조해 주시기 바랍니다.
https://www.tensorflow.org/lite/guide/inference?hl=ko
import numpy as np
import tensorflow as tf
Python에서 TFLite File을 Load하기 위해서는 tf.lite.Interpreter() API를 사용합니다.
사용법은 아래와 같고, Parameter로는 Load할 TFLite File Path를 넣어주면 됩니다.
# TFLite model file을 Losd하고, 그에 맞는 Tensor를 할당합니다.
interpreter = tf.lite.Interpreter(model_path="Sample_CheckPoints.tflite")
interpreter.allocate_tensors()
TFLite File이 제대로 Load되었는지 확인한 번 해봅시다.
# Load한 TFLite Model의 입출력 Tensor 정보를 확인해 봅니다.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
제가 사용한 TFLite Model은 224x224 크기의 Color Image를 입력으로 받아서, Binary Classification하는 Model입니다.
아래에 보시면 정보가 제대로 올라오고 있네요.
input_details
[{'name': 'serving_default_resnet50_input:0',
'index': 0,
'shape': array([ 1, 224, 224, 3]),
'shape_signature': array([ -1, 224, 224, 3]),
'dtype': numpy.float32,
'quantization': (0.0, 0),
'quantization_parameters': {'scales': array([], dtype=float32),
'zero_points': array([], dtype=int32),
'quantized_dimension': 0},
'sparsity_parameters': {}}]
output_details
[{'name': 'StatefulPartitionedCall:0',
'index': 189,
'shape': array([1, 2]),
'shape_signature': array([-1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0),
'quantization_parameters': {'scales': array([], dtype=float32),
'zero_points': array([], dtype=int32),
'quantized_dimension': 0},
'sparsity_parameters': {}}]
임의의 Data를 넣어서 Inference Test를 한 번 해보도록 하겠습니다.
원래대로라면 실제 Image를 변환해서 넣어햐 하지만서도...
input_shape = input_details[0]['shape']
input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
get_tensor() 함수는 Tensor Data의 Copy를 가져오므로 이를 이용해서 결과를 예쁘게 뽑아냅니다.
output_data = interpreter.get_tensor(output_details[0]['index'])
print(output_data)
[[0.909831 0.09016905]]
이번 Post에서는 TFLite File Format을 만들고 이를 이용하는 방법에 대해서 알아보았습니다.
도움이 되셨기를 바라며, 다음에 또 만나요~!
'Deep_Learning' 카테고리의 다른 글
Tensorflow GPU Docker Install on WSL2 - #2 (0) | 2024.02.02 |
---|---|
No module named 'PIL' 오류 해결 방법 (0) | 2024.01.31 |
LFW(Labeled Faces in the Wild) Dataset (0) | 2024.01.17 |
import __future__ 구문의 의미 (2) | 2024.01.11 |
Deep Learning Compiler 종류 (1) | 2024.01.02 |