콘텐츠로 이동

텐서플로우 케라스 어플리케이션 EfficientNetB0

텐서플로우는 가장 많이 쓰이는 딥러닝 프레임워크 중 하나이며, 텐서플로우의 확장 라이브러리인 텐서플로우 케라스 어플리케이션은 다양한 사전 훈련된 모델을 제공합니다.

이 튜토리얼에서는 텐서플로우 케라스 어플리케이션에서 제공하는 EfficientNetB0 모델(이미지 분류)을 컴파일하고 RBLN NPU로 추론하는 방법을 배울 수 있습니다.

이 튜토리얼은 두 단계로 구성되어 있습니다:

  1. 텐서플로우 EfficientNetB0 모델을 컴파일하고 디스크에 저장하는 방법
  2. 컴파일된 모델을 로드하고 추론하는 방법

사전 준비

시작하기에 앞서 아래의 파이썬 패키지들이 설치되어 있는지 확인합니다:

참고

세부 사항을 생략하고, 빠르게 컴파일 및 추론하는 방법을 확인하려면 요약을 참고하세요. 컴파일 및 추론을 위한 모든 코드가 정리되어있어 빠르게 프로젝트를 시작 할 수 있습니다.

1단계. 컴파일 방법

모델 준비

텐서플로우 케라스 어플리케이션 라이브러리를 통해 EfficientNetB0 모델을 로드하고, tf.function 형태로 변환합니다.

1
2
3
4
5
6
7
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)을 컴파일 할 수 있습니다.

1
2
3
4
5
6
7
8
# 모델 컴파일
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__ 매직함수를 사용할 수도 있습니다.

1
2
3
4
5
# 컴파일된 모델 불러오기
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])