Inference
classification.InferenceHandler
학습한 Classification 모델을 사용하여 검사를 하기 위한 InferenceHandler class 입니다.
Usage
# InferenceHandler 빌드
inferene_build_config = {
"checkpoint_path": CHECKPOINT_PATH,
"password": PASSWORD,
"device": DEVICE,
}
error, message, inference_handler = InferenceHandler.build(inferene_build_config)
assert error >= 0, f"[CODE] ({error}) {message}"
# SummaryHandler 빌드
n_classes = CONFIG["n_classes"]
summary_build_config = {
"n_classes": n_classes,
}
error, message, summary_handler = SummaryHandler.build(summary_build_config)
assert error >= 0, f"[CODE] ({error}) {message}"
# 모듈 정보 확인
error, message, metadata = read_metadata(CHECKPOINT_PATH)
assert error >= 0, f"[CODE] ({error}) {message}"
print("Inference metadata:", metadata)
# 인퍼런스 옵션 초기값 확인
inference_options = {
"outputs.class_activation_map": True,
"outputs.time": False,
"params.additional_scores": [10] * n_classes,
}
print("Default inference options:")
for key in list(inference_options) + ["params.batch_size"]:
error, message, value = inference_handler.get_default_inference_option(key)
assert error >= 0, f"[CODE] ({error}) {message}"
print(f" {key}: {value}")
# 디벨로퍼: 인퍼런스 옵션 변경
for key, value in inference_options.items():
error, message, _ = inference_handler.set_inference_option(key, value)
assert error >= 0, f"[CODE] ({error}) {message}"
# 디벨로퍼: metadata에 inference_option 저장 (예시)
metadata["inference_options"] = inference_options
error, message, _ = write_metadata(CHECKPOINT_PATH, metadata)
assert error >= 0, f"[CODE] ({error}) {message}"
# 인퍼런스 옵션이 잘 변경되었는지 확인
print("Inference options:")
for key in inference_options:
error, message, value = inference_handler.get_inference_option(key)
assert error >= 0, f"[CODE] ({error}) {message}"
print(f" {key}: {value}")
# 디벨로퍼: Analyze 수행
for image_id, image_info in DATA["validation_images"].items():
image_info["save_dir"] = os.path.join(INFERENCE_PATH, str(image_id))
image = {image_id: image_info}
error, message, results = inference_handler.analyze(images=image, labeled=True)
assert error >= 0, f"[CODE] ({error}) {message}"
# 디벨로퍼: Summary
error, message, results = summary_handler.summarize_analysis(images=DATA["validation_images"], labeled=True)
assert error >= 0, f"[CODE] ({error}) {message}"
print("Analysis summary:", results)
# 런타임: 핸들러 빌드
error, message, metadata = read_metadata(CHECKPOINT_PATH)
assert error >= 0, f"[CODE] ({error}) {message}"
inferene_build_config["inference_options"] = metadata["inference_options"]
error, message, inference_handler = InferenceHandler.build(inferene_build_config)
assert error >= 0, f"[CODE] ({error}) {message}"
# 런타임 검사: 후처리까지 한번에 최적화된 연산으로 수행
image_id = next(iter(DATA["validation_images"]))
image_path = DATA["validation_images"][image_id]["path"]
error, message, output = inference_handler.infer_and_postprocess(images=[image_path])
assert error >= 0, f"[CODE] ({error}) {message}"
print("Runtime (infer_and_postprocess):", output)
build(config)
classmethod
InferenceHandler class의 instance를 생성합니다.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
config |
dict
|
InferenceHandler를 build 하기 위한 config가 담겨 있는 dictionary 입니다. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
InferenceHandler |
InferenceHandler
|
build가 완료된 classification.InferenceHandler class의 instance를 반환합니다. |
get_default_inference_option(key)
Inference & postprocess 옵션의 기본 설정 값을 반환합니다.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key |
str
|
옵션 key |
required |
Returns:
| Name | Type | Description |
|---|---|---|
Any |
Any
|
옵션 value |
Keys
사용 가능한 key와 value 목록:
{
"outputs.class_activation_map": bool, # (default True, output 중 class_activation_map 계산할 지 여부. True인 경우 계산)
"outputs.time": bool, # (default False, 인퍼런스 시 각 요소에 걸린 시간 측정 여부. True인 경우 측정)
"params.additional_scores": list[Union[int, float]], # scores_including_add를 계산할 때, scores_original에 더해지는 값입니다. 각 값은 [0, 100] 범위의 실수. (default [0.0, ... , 0.0])
"params.batch_size": int, # `infer_and_postprocess`에 한 번에 입력할 수 있는 최대 이미지 개수 입니다.
# 파라미터가 변경되는 경우 해당 값으로 warmup을 수행합니다.
# (default 1)
}
사용 예시:
get_inference_option(key)
현재 설정된 inference & postprocess 옵션 값을 읽습니다.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key |
str
|
옵션 key |
required |
Returns:
| Name | Type | Description |
|---|---|---|
Any |
Any
|
옵션 value |
Keys
get_default_inference_option과 동일합니다.
set_inference_option(key, value)
Inference & postprocess 옵션을 설정합니다.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key |
str
|
설정하고자 하는 옵션 key 입니다. |
required |
value |
Any
|
설정하고자 하는 옵션 value 입니다. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
None |
None
|
None |
Keys
get_default_inference_option과 동일합니다.
infer_and_postprocess(images)
image의 list를 입력으로 받아 모델 인퍼런스와 후처리를 수행합니다. (for Runtime) 실시간 검사를 위해 연산 과정이 최적화되어 있으며, 중간 결과를 제거하고 postprocess 최종 결과만을 반환합니다.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
images |
Union[list[ndarray], list[str]]
|
required |
Returns:
analyze(images, labeled)
images들에 대한 모델 인퍼런스 후, analysis 결과 계산
Parameters:
Returns: dict: Analysis 결과
{
"{image_id}": {
"predictions": { # 아래 키들 중 inference_options에 설정된 출력 값들만 포함.
"scores_original": ndarray(float32, shape=(N)), # 모델이 예측한 점수입니다. 점수가 높을수록 해당 클래스일 확률이 높다는 뜻입니다.
"scores_including_add": ndarray(float32, shape=(N)), # scores_original에 user가 설정한 additional_scores를 더한 값입니다.
"class_index": int, # 최종 선택된 class index 입니다. scores_including_add 값 중 가장 높은 점수를 가지는 class 입니다.
"class_activation_map": ndarray(uint8, shape=(H, W)), # 모델이 입력으로 받은 이미지를 특정 클래스로 분류한 이유를 나타내는 heatmap 입니다. **(outputs.class_activation_map=True)인 경우에만 나옴**
"correct": bool, # True면 정답, False면 오답. **(labeled=True)인 경우에만 나옴**
"time": { # inference에 소요된 시간을 담고있는 dictionary 입니다 (단위: ms). **(outputs.time=True)인 경우에만 나옴**
"imread_time": float, # 실제 image를 load하여 연구팀이 사용하는 image format (PIL)으로 변경하기까지 걸리는 시간 (각 이미지 별로 걸리는 시간)
"inference_time": float, # resize, roi, tensorize, network forward 등을 포함하는 시간 (각 이미지 별로 걸리는 시간)
"post_processing_time": float, # postprocess에 걸린 시간 (각 이미지 별로 걸리는 시간)
},
},
},
... # 입력으로 넣어준 이미지 개수만큼 반복
}
Note1
analyze() 함수를 사용하기 위해서는 inference_options 중 outputs.class_activation_map=True & outputs.class_index=True 여야 합니다.
Note2
모델 빌드 및 인퍼런스 없이 저장되어있는 network output을 활용하여 analyze하고 싶은 경우에는 AnalysisHandler.analyze를 호출해야 합니다.
warmup()
현재 설정된 inference 옵션을 바탕으로 warmup을 수행합니다.
warmup은, 현재 inference_option이 잘 동작하는지 확인 + GPU를 첫 호출시 속도가 느린 이슈를 해결하기 위해,
현재 inference_option에 맞춰 더미 입력에 대한 InferenceHandler.infer_and_postprocess를 호출합니다.