텐서플로우 케라스 어플리케이션 EfficientNetB0
텐서플로우는 가장 많이 쓰이는 딥러닝 프레임워크 중 하나이며, 텐서플로우의 확장 라이브러리인 텐서플로우 케라스 어플리케이션은 다양한 사전 훈련된 모델을 제공합니다.
이 튜토리얼에서는 텐서플로우 케라스 어플리케이션에서 제공하는 EfficientNetB0
모델(이미지 분류)을 컴파일하고 RBLN NPU로 추론하는 방법을 배울 수 있습니다.
이 튜토리얼은 두 단계로 구성되어 있습니다:
- 텐서플로우
EfficientNetB0
모델을 컴파일하고 디스크에 저장하는 방법
- 컴파일된 모델을 로드하고 추론하는 방법
사전 준비
시작하기에 앞서 아래의 파이썬 패키지들이 설치되어 있는지 확인합니다:
참고
세부 사항을 생략하고, 빠르게 컴파일 및 추론하는 방법을 확인하려면 요약을 참고하세요. 컴파일 및 추론을 위한 모든 코드가 정리되어있어 빠르게 프로젝트를 시작 할 수 있습니다.
1단계. 컴파일 방법
모델 준비
텐서플로우 케라스 어플리케이션 라이브러리를 통해 EfficientNetB0
모델을 로드하고, tf.function 형태로 변환합니다.
| import tensorflow as tf
from tensorflow.keras.applications.efficientnet import EfficientNetB0
import rebel # RBLN 컴파일러
# 텐서플로우 케라스 어플리케이션 EfficientNetB0 모델 준비
model = EfficientNetB0(weights='imagenet')
func = tf.function(lambda input_img : model(input_img))
|
모델 컴파일
rebel.compile_from_tf_function()
함수를 이용하여 준비 된 텐서플로우 모델(tf.function
)을 컴파일 할 수 있습니다.
| # 모델 컴파일
input_info = [("input_img", [1, 224, 224, 3], tf.float32)]
compiled_model = rebel.compile_from_tf_function(
func,
input_info,
# 호스트에 NPU가 설치되어 있는 경우, 아래의 `npu`인자는 명시하지 않아도 자동으로 감지됩니다.
npu="RBLN-CA12",
)
|
호스트 머신에 NPU가 설치되어 있는 경우, NPU를 자동으로 감지하여 사용하기 때문에 rebel.compile_from_tf_function
함수에 npu
인자를 생략할 수 있습니다.
NPU가 설치되지 않은 호스트 머신에서 컴파일을 수행할 경우 컴파일 함수에 npu
인자를 명시해야 합니다. 그렇지 않으면 에러가 발생합니다.
현재 지원하는 NPU는 RBLN-CA02
, RBLN-CA12
입니다. 사용하려는 NPU의 이름은 NPU가 설치된 호스트 머신에서 rbln-stat
명령어를 통해 확인할 수 있습니다.
컴파일된 모델 저장
compiled_mode.save()
함수를 통해 컴파일된 모델을 디스크에 저장할 수 있습니다.
| # 컴파일된 모델 디스크에 저장
compiled_model.save("efficientnetb0.rbln")
|
2단계. 추론 방법
RBLN 런타임 모듈 rebel.Runtime()
을 통해 이전 단계에서 컴파일된 모델을 로드하고 추론할 수 있습니다.
입력 데이터 준비
EfficientNetB0
모델의 입력으로 사용될 사전처리 된(pre-processed) 이미지를 준비합니다. tf.keras.applications.efficientnet
모듈에서 제공하는 preprocess_input()
함수를 사용하여 입력으로 사용될 이미지의 사전처리 과정을 수행합니다.
| import urllib.request
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.efficientnet import preprocess_input, decode_predictions
import numpy as np
import rebel # RBLN 런타임
# 입력 데이터 준비
img_url = "https://rbln-public.s3.ap-northeast-2.amazonaws.com/images/tabby.jpg"
img_path = "./tabby.jpg"
with urllib.request.urlopen(img_url) as response, open(img_path, "wb") as f:
f.write(response.read())
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
x = np.ascontiguousarray(x)
|
추론
RBLN 런타임 모듈 rebel.Runtime()
을 통해 컴파일된 모델을 로드합니다. RBLN 런타임 모듈의 멤버함수 run()
을 통해 주어진 문장에 대해 추론할 수 있습니다. 또는 __call__
매직함수를 사용할 수도 있습니다.
| # 컴파일된 모델 불러오기
module = rebel.Runtime("efficientnetb0.rbln")
# 추론
rebel_result = module.run(x)
|
print(module)
을 통해 로드 된 모델의 입출력 형태 및 모델크기 등 요약된 정보를 확인할 수 있습니다.
결과 확인
tf.keras.applications.efficientnet
모듈에서 제공하는 decode_predictions()
함수를 사용하여 rebel_result
결과를 디코딩 할 수 있습니다.
| # 결과 확인
print('Top1 category:', decode_predictions(rebel_result, top=1)[0])
|
최종 결과는 아래와 유사합니다:
| Top1 category: [('n02123045', 'tabby', 0.3798828)]
|
요약
텐서플로우 케라스 어플리케이션에서 제공하는 EfficientNetB0
모델의 컴파일을 위한 완성된 코드는 아래와 같습니다:
| import tensorflow as tf
from tensorflow.keras.applications.efficientnet import EfficientNetB0
import rebel # RBLN 컴파일러
# 텐서플로우 케라스 어플리케이션 EfficientNetB0 모델 준비
model = EfficientNetB0(weights='imagenet')
func = tf.function(lambda input_img : model(input_img))
# 모델 컴파일
input_info = [("input_img", [1, 224, 224, 3], tf.float32)]
compiled_model = rebel.compile_from_tf_function(func, input_info)
# 컴파일된 모델 디스크에 저장
compiled_model.save("efficientnetb0.rbln")
|
컴파일된 EfficientNetB0
모델의 추론을 위한 완성된 코드는 아래와 같습니다:
| import urllib.request
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.efficientnet import preprocess_input, decode_predictions
import numpy as np
import rebel # RBLN 런타임
# 입력 데이터 준비
img_url = "https://rbln-public.s3.ap-northeast-2.amazonaws.com/images/tabby.jpg"
img_path = "./tabby.jpg"
with urllib.request.urlopen(img_url) as response, open(img_path, "wb") as f:
f.write(response.read())
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
x = np.ascontiguousarray(x)
# 컴파일된 모델 불러오기
module = rebel.Runtime("efficientnetb0.rbln")
# 추론
rebel_result = module.run(x)
# 결과 확인
print('Top1 category:', decode_predictions(rebel_result, top=1)[0])
|