Custom Auto-Label Download

Superb AI Custom Auto-Label 다운로드 및 사용

Superb AI Custom Auto-Label 모델을 다운로드하고 사용하려면 아래 예시를 참고하세요.

시작하기

개발 환경 설정은 https://gallery.ecr.aws/r9d1q5w0/cal-examples에서 도움 받을 수 있습니다. 위 링크는 사용자의 Docker 환경 설정에 도움을 제공합니다.
아래는 개발자가 원하는 방식에 맞게 커스텀하여 Custom Auto-Label 모델을 사용할 수 있는 예시 데이터와 코드입니다.

예시 데이터 준비하기

시작하려면 먼저 예시 데이터와 디렉터리를 준비해야 합니다.
1
import os
2
from urllib.request import urlretrieve
3
from zipfile import ZipFile
4
5
example_dir = '/work/examples'
6
zip_file = 'pet-classification.zip'
7
model_file = 'pet-classification.h5'
8
info_file = 'pet-classification.json'
9
img_file = 'dog.png'
10
11
os.makedirs(example_dir, exist_ok=True)
12
zip_path = os.path.join(example_dir, zip_file)
13
model_path = os.path.join(example_dir, model_file)
14
info_path = os.path.join(example_dir, info_file)
15
img_path = os.path.join(example_dir, img_file)
16
17
zip_url = f'https://spbai-superb-biz-test.s3.ap-northeast-2.amazonaws.com/cal-examples/{zip_file}'
18
urlretrieve(zip_url, zip_path)
19
20
with ZipFile(zip_path) as f:
21
f.extract(model_file, path=example_dir)
22
f.extract(info_file, path=example_dir)
23
f.extract(img_file, path=example_dir)
Copied!

Custom Auto-Label 모델 불러오기

아래와 같이 종속성(Dependency)을 설정해야 합니다.
1
import tensorflow as tf
2
from PIL import Image
3
4
%matplotlib inline
5
import matplotlib.pyplot as plt
Copied!
Custom Auto-Label 모델을 실행하기 위해서는 GPU가 필요하기 때문에 GPU를 확인해야 합니다.
1
try:
2
for device in tf.config.list_physical_devices('GPU'):
3
tf.config.experimental.set_memory_growth(device, True)
4
except:
5
pass
Copied!
그리고 다운로드받은 모델을 불러옵니다.
1
model = tf.keras.models.load_model(model_path)
Copied!
출력은 아래처럼 보일 것입니다.
1
Tensor("Placeholder:0", shape=(1, 197, 1), dtype=float32) Tensor("Placeholder_1:0", shape=(), dtype=float32)
2
Tensor("Placeholder:0", shape=(1, 197, 768), dtype=float32) Tensor("Placeholder_1:0", shape=(768,), dtype=float32)
3
Tensor("Placeholder:0", shape=(768,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 768), dtype=float32)
4
Tensor("Placeholder:0", shape=(768,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 768), dtype=float32)
5
Tensor("Placeholder:0", shape=(1, 12, 197, 197), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 12, 197, 197), dtype=float32)
6
Tensor("Placeholder:0", shape=(768,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 768), dtype=float32)
7
Tensor("Placeholder:0", shape=(1, 197, 1), dtype=float32) Tensor("Placeholder_1:0", shape=(), dtype=float32)
8
Tensor("Placeholder:0", shape=(1, 197, 768), dtype=float32) Tensor("Placeholder_1:0", shape=(768,), dtype=float32)
9
Tensor("Placeholder:0", shape=(3072,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 3072), dtype=float32)
10
Tensor("Placeholder:0", shape=(1, 197, 3072), dtype=float32) Tensor("Placeholder_1:0", shape=(), dtype=float32)
11
Tensor("Placeholder:0", shape=(768,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 768), dtype=float32)
12
Tensor("Placeholder:0", shape=(1, 197, 1), dtype=float32) Tensor("Placeholder_1:0", shape=(), dtype=float32)
13
Tensor("Placeholder:0", shape=(1, 197, 768), dtype=float32) Tensor("Placeholder_1:0", shape=(768,), dtype=float32)
14
Tensor("Placeholder:0", shape=(768,), dtype=float32) Tensor("Placeholder_1:0", shape=(1, 197, 768), dtype=float32)
Copied!
Model Summary를 확인할 수 있습니다.
1
model.summary()
Copied!
이에 대한 출력은 아래와 같습니다.
1
Model: "aff9616b-704e-4605-bf38-8e34dacdbd98"
2
_________________________________________________________________
3
Layer (type) Output Shape Param #
4
=================================================================
5
input (InputLayer) [(1, None, None, 3)] 0
6
7
tf_op_layer_channel_flip (T (1, None, None, 3) 0
8
ensorFlowOpLayer)
9
10
resize_and_rescale (Sequent (1, 224, 224, 3) 0
11
ial)
12
13
tf_op_layer_subtract_mean ( (1, 224, 224, 3) 0
14
TensorFlowOpLayer)
15
16
tf_op_layer_DivNoNan (Tenso (1, 224, 224, 3) 0
17
rFlowOpLayer)
18
19
tf_op_layer_Transpose (Tens (1, 3, 224, 224) 0
20
orFlowOpLayer)
21
22
backbone (Functional) (1, 197, 768) 85525248
23
24
tf_op_layer_reshape (Tensor (1, 151296) 0
25
FlowOpLayer)
26
27
head (Functional) (1, 3) 38798595
28
29
tf_op_layer_Sigmoid (Tensor (1, 3) 0
30
FlowOpLayer)
31
32
=================================================================
33
Total params: 124,323,843
34
Trainable params: 124,323,843
35
Non-trainable params: 0
36
_________________________________________________________________
Copied!

모델 실행하기

Superb AI Custom Auto-Label 모델을 실행하기 위해서는 우선 이미지를 불러와야 합니다.
1
pil_img = Image.open(img_path)
2
plt.imshow(pil_img)
3
plt.show()pyt
Copied!
그리고 이미지를 모델의 요구 형식에 맞게 만들기 위해 preprocess_image 명령(함수)을 만들었습니다.
1
def preprocess_image(pil_img, input_width, input_height):
2
# Resize PIL image to (w, h) and convert to (1, h, w, 3) tensor
3
resized_img = pil_img.resize((input_width, input_height))
4
tensor_hwc = tf.keras.preprocessing.image.img_to_array(resized_img)
5
tensor_1hwc = tf.expand_dims(tensor_hwc, 0)
6
return tensor_1hwcpy
Copied!
그리고 여기에서 input_width와 height을 설정하는데요. 여기서는 임의로 224로 설정하였고, 사용자는 필요한 대로 설정하시면 됩니다.
1
input_width = input_height = 224
2
tensor_1hwc = preprocess_image(pil_img, input_width, input_height)
3
tensor_1hwc.shape
Copied!
이 모든 작업이 완료되면 이제 예측 모델을 실행합니다.
1
prediction = model.predict(tensor_1hwc)
Copied!
출력은 아래와 같이 보일 것입니다:
1
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/261/Mean:0", shape=(1, 197, 1), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/263_const2/Const:0", shape=(), dtype=float32)
2
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/266/Mul:0", shape=(1, 197, 768), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/267_const2/Const:0", shape=(768,), dtype=float32)
3
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/270_const1/Const:0", shape=(768,), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/269/Tensordot:0", shape=(1, 197, 768), dtype=float32)
4
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/285_const1/Const:0", shape=(768,), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/284/Tensordot:0", shape=(1, 197, 768), dtype=float32)
5
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/311/truediv:0", shape=(1, 12, 197, 197), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/319_const2/Const:0", shape=(1, 12, 197, 197), dtype=float32)
6
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/333_const1/Const:0", shape=(768,), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/332/Tensordot:0", shape=(1, 197, 768), dtype=float32)
7
Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/341/Mean:0", shape=(1, 197, 1), dtype=float32) Tensor("aff9616b-704e-4605-bf38-8e34dacdbd98/backbone/343_const2/Const:0", shape=(), dtype=float32)
Copied!
이 출력에 대해 ‘prediction[0]’을 실행하면 출력은 아래와 같은 배열로 나오며, 이는 각 클래스에 대한 예측 번호입니다. 추후에 사용자가 더 사용하기 쉽도록 개선할 예정입니다.
1
array([9.9952102e-01, 4.4798324e-04, 2.0798518e-04], dtype=float32)
Copied!

소요 시간 측정하기

모델을 실행시켰다면, 이제 모델의 소요 시간을 확인합니다.
1
import time
2
from contextlib import contextmanager
3
4
# For type hints
5
from typing import Iterator, Callable
6
7
@contextmanager
8
def eval_latency() -> Iterator[Callable]:
9
t_start = time.time()
10
timer = lambda: time.time() - t_start
11
yield timer
12
13
with eval_latency() as timer:
14
prediction = model.predict(tensor_1hwc)
15
16
print(f'Elapsed time: {timer():.3f}s')
Copied!
출력은 아래와 같이 보일 것입니다:
1
Elapsed time: 0.080s
Copied!

tf.function을 사용하여 Inference 속도 향상

Superb AI는 모델을 실행하는데 소요되는 시간을 단축할 수 있는 방법을 개발했습니다. 바로 위 작업의 소요 시간은 0.08초였는데요.
아래 작업은 위 작업과 동일한 환경(NVIDIA TITAN RTX)에서 수행되었고, Superb AI는 ‘tf.function’을 사용해 Inference 속도를 향상시켰습니다.
아래는 ‘tf.function’을 통해 모델이 더 빠르게 실행되도록 설정하는 코드입니다.
1
from functools import partial
2
3
def predict_wrapper(pil_img, model):
4
return model(pil_img)
5
6
# Wrap the model for faster computation using tf.function
7
predict_tf_function = tf.function(partial(predict_wrapper, model=model))
8
9
# Preload the function
10
dummy_input = tf.zeros((1, input_height, input_width, 3))
11
_ = predict_tf_function(dummy_input)ㅔㅛ
Copied!
이제 fast_predict 명령(함수)을 실행하여 모델이 얼마나 더 빨리 실행되는지 확인합니다.
1
def fast_predict(tensor_1hwc):
2
prediction = predict_tf_function(tensor_1hwc)
3
return prediction[0].numpy()
4
5
with eval_latency() as timer:
6
prediction = fast_predict(tensor_1hwc)
7
8
print(f'Elapsed time: {timer():.3f}s')
Copied!
이에 대한 출력은 아래와 같습니다:
1
Elapsed time: 0.017s
Copied!
모델 속도를 높이기 전에는 소요 시간이 0.08초였으나 Superb AI가 제공한 방법을 통해 0.017초로 단축된 것을 확인할 수 있습니다.

예측 결과 출력하기

모델을 실행하고 이에 대한 소요 시간을 확인했으므로, 이제 사용자는 필요한 정보를 얻는 데 도움이 되는 기능을 제공받을 수 있습니다.
우선, 모델을 실행합니다.
1
import os, json
2
3
model_info_path = os.path.splitext(model_path)[0] + '.json'
4
model_info = json.load(open(model_info_path))
5
model_info
Copied!
이에 대한 출력은 아래와 같습니다:
1
{'name': 'Pet Classification',
2
'category': 'Pet',
3
'type': 'radio',
4
'options': [{'name': 'Dog'}, {'name': 'Cat'}, {'name': 'Other'}],
5
'performances': [{'name': 'Dog',
6
'precision': 0.9996667777407531,
7
'recall': 0.9996667777407531,
8
'f_score': 0.9996667727407532},
9
{'name': 'Cat',
10
'precision': 0.9990009990009991,
11
'recall': 0.9990009990009991,
12
'f_score': 0.9990009940009992},
13
{'name': 'Other', 'precision': 0.0, 'recall': 0.0, 'f_score': 0.0}]}
Copied!
Superb AI는 클래스에 가장 높은 confidence score를 제공하며 모든 클래스에 confidence score를 제공하는 두 가지 명령(함수)을 제공합니다.
  1. 1.
    get_top1_class
1
def get_top1_class(prediction, model_info):
2
cls_index = prediction.argmax()
3
cls = model_info['options'][cls_index]
4
confidence = prediction[cls_index]
5
return { 'name': cls['name'], 'confidence': confidence }
6
7
get_top1_class(prediction, model_info)pyt
Copied!
1
{'name': 'Dog', 'confidence': 0.999521}
Copied!
2. get_all_classes
1
def get_all_classes(prediction, model_info):
2
return [
3
{ 'name': cls['name'], 'confidence': confidence }
4
for cls, confidence in zip(model_info['options'], prediction)
5
if confidence > cls.get('score_thres', 0)
6
]
7
8
get_all_classes(prediction, model_info)
Copied!
1
[{'name': 'Dog', 'confidence': 0.999521},
2
{'name': 'Cat', 'confidence': 0.00044798324},
3
{'name': 'Other', 'confidence': 0.00020798518}]
Copied!
전체 예시 파일은 아래 링크에서 확인할 수 있습니다.

Custom Auto-Label 예시 패키지 사용하기: KerasModel 예시

우리는 고유한 Custom Auto-Label 모델을 더 편리하게 사용할 수 있도록 cal-examples라는 Python package를 만들었습니다. 이 패키지는 bash shell을 통해 접근할 수 있으며 /root/.local/lib/python3.7/site-packages/cal_examples/에 위치한 docker image를 통해 설치할 수 있습니다.

준비

1
from PIL import Image
2
from cal_examples.models import KerasModel
3
from cal_examples.utils import eval_latency
Copied!
1
try:
2
for device in tf.config.list_physical_devices('GPU'):
3
tf.config.experimental.set_memory_growth(device, True)
4
except:
5
pass
Copied!
1
import os
2
3
example_dir = '/work/examples'
4
model_path = os.path.join(example_dir, 'pet-classification.h5')
5
img_path = os.path.join(example_dir, 'dog.png')
Copied!

Custom Auto-Label 모델 불러오기

다음과 같이 KerasModel을 불러옵니다. 출력은 앞선 경우(Custom Auto-Label 모델 불러오기)와 비슷하게 보일 것입니다.
1
model = KerasModel(model_path)
Copied!
위의 예시와 유사하게, 사용자는 Model summary를 코드로 불러올 수 있습니다.
1
model.model.summary()
Copied!
여기까지 봤을 때, 사용자는 앞선 예제와 큰 차이점을 느끼지 못할 수도 있습니다.
하지만 Superb AI의 패키지를 사용하면 model_info 가져오기를 실행하기 위해 json 파일을 별도로 불러오지 않아도 됩니다.
다음 명령을 실행하기만 하면 됩니다:
1
model.model_info
Copied!

커스텀 패키지로 출력 정보 가져오기

모델을 실행시켰다면, 이제 모델의 소요 시간을 확인합니다.
1
pil_img = Image.open(img_path)
2
3
with eval_latency() as timer:
4
np_prediction = model.predict(pil_img)
5
6
print(f'Elapsed time: {timer():.3f}s')
Copied!
클래스별 결과 출력이 필요할 때, Superb AI가 준비한 패키지를 사용하면 다음과 같이 간단하게 불러올 수 있습니다.
1
print('Top-1 class:', model.get_top1_class(np_prediction))
2
print('All classes:', model.get_all_classes(np_prediction))pyt
Copied!
이에 대한 출력은 아래와 같습니다:
1
Top-1 class: {'name': 'Dog', 'confidence': 0.999521}
2
All classes: [{'name': 'Dog', 'confidence': 0.999521}, {'name': 'Cat', 'confidence': 0.00044798324}, {'name': 'Other', 'confidence': 0.00020798518}]
Copied!
전체 예시 내용은 아래 링크에서 확인할 수 있습니다.

Custom Auto-Label 예시 패키지 사용하기: GradCamModel 예시

이 예시는 위 Keras 모델 예제와 매우 유사하지만 모델이 예측할 때 가장 중점을 두는 부분을 사용자에게 가시적으로 보여주기 위해 히트 맵을 추가하였습니다.

준비

1
from PIL import Image
2
from cal_examples.models import GradCamModel
3
from cal_examples.utils import eval_latency, generate_heatmap_image
4
5
%matplotlib inline
6
import matplotlib.pyplot as plt
Copied!
1
try:
2
for device in tf.config.list_physical_devices('GPU'):
3
tf.config.experimental.set_memory_growth(device, True)
4
except:
5
pass
Copied!
1
import os
2
3
example_dir = '/work/examples'
4
model_path = os.path.join(example_dir, 'pet-classification.h5')
5
img_path = os.path.join(example_dir, 'dog.png')
Copied!

Custom Auto-Label 모델 불러오기

1
model = GradCamModel(model_path)
Copied!

모델 실행하기

모델을 실행한 뒤, 사용자는 Keras Model 예제와 같이 Model Summary 및 Model Info를 확인할 수 있습니다.
GradCamModel 예시의 차이점은 predict_with_gradcam 명령(함수)으로 모델을 실행하는 것입니다.
1
pil_img = Image.open(img_path)
2
3
with eval_latency() as timer:
4
np_prediction, np_heatmap_0to1 = model.predict_with_gradcam(pil_img)
5
6
print(f'Elapsed time: {timer():.3f}s')
Copied!
Superb AI의 패키지를 사용하면 클래스별 결과를 다음과 같이 간단하게 불러올 수 있습니다.
1
print('Top-1 class:', model.get_top1_class(np_prediction))
2
print('All classes:', model.get_all_classes(np_prediction))
Copied!
이미지의 히트 맵은 다음 코드를 통해 확인할 수 있습니다.
1
pil_cam_img = generate_heatmap_image(pil_img, np_heatmap_0to1)
2
3
plt.imshow(pil_cam_img)
4
plt.show()
Copied!
히트 맵 결과는 아래 이미지와 비슷할 것입니다.
전체 예시 파일은 아래 링크에서 확인할 수 있습니다.
다른 질문이 있으신가요? [email protected] 으로 문의주세요.