Skip to content

Analysis

classification.AnalysisHandler

딥러닝 모델 빌드 없이, 저장된 모델 인퍼런스 결과를 이용해서 analysis를 수행하는 클래스입니다.

Usage
# AnalysisHandler 및 SummaryHandler 빌드
n_classes = CONFIG["n_classes"]
analysis_build_config = {
    "n_classes": n_classes,
}
error, message, analysis_handler = AnalysisHandler.build(analysis_build_config)
assert error >= 0, f"[CODE] ({error}) {message}"

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 = {
    "params.additional_scores": [10] * n_classes,
}
print("Default inference options:")
for key in list(inference_options):
    error, message, value = analysis_handler.get_default_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("./demo/inference_results", str(image_id))
    image = {image_id: image_info}

    error, message, results = analysis_handler.analyze(images=image, labeled=True)
    assert error >= 0, f"[CODE] ({error}) {message}"

error, message, results = summary_handler.summarize_analysis(images=DATA["validation_images"], labeled=True)
assert error >= 0, f"[CODE] ({error}) {message}"
print("Analysis summary:", results)

# 디벨로퍼: 인퍼런스 옵션 변경
for key, value in inference_options.items():
    error, message, _ = analysis_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 = analysis_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 = {image_id: image_info}

    error, message, results = analysis_handler.analyze(images=image, labeled=True)
    assert error >= 0, f"[CODE] ({error}) {message}"

error, message, results = summary_handler.summarize_analysis(images=DATA["validation_images"], labeled=True)
assert error >= 0, f"[CODE] ({error}) {message}"
print("Analysis summary:", results)

build(config) classmethod

AnalysisHandler class의 instance를 생성합니다.

Parameters:

Name Type Description Default
config dict

InferenceHandler를 build 하기 위한 config가 담겨 있는 dictionary 입니다.

{
    "n_classes": int,  # number of data classes (including background class)
    "inference_options": Optional[dict], # 인퍼런스 옵션 config (default None). 구조는 `get_default_inference_option`의 Keys 참고.
}

required

Returns:

Name Type Description
AnalysisHandler AnalysisHandler

build가 완료된 classification.AnalysisHandler class의 instance를 반환합니다.

get_default_inference_option(key)

Postprocess 옵션의 기본 설정 값을 반환합니다.

Parameters:

Name Type Description Default
key str

옵션 key

required

Returns:

Name Type Description
Any Any

옵션 value

Keys

사용 가능한 key와 value 목록:

{
    "params.additional_scores": list[Union[int, float]],  # scores_including_add를 계산할 때, scores_original에 더해지는 값입니다. 각 값은 [0, 100] 범위의 실수. (default [0.0, ... , 0.0])
    "params.num_workers": int, # 동시성 프로그래밍에 적용되는 File I/O를 위한 worker thread의 갯수입니다.
                               # (default 12)
}

사용 예시:

handler.get_default_inference_option(key="outputs.time")
handler.set_inference_option(key="params.additional_scores", value=[0., 0., ...])

Note

AnalysisHandler는 outputs.time을 제공하지 않습니다. (리턴에 time 없음)

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과 동일합니다.

Note1

AnalysisHandler에는 params.batch_size와 outputs.time 파라미터가 없습니다.

analyze(images, labeled)

저장된 network output으로 부터 images들에 대한 analysis 결과 계산

Parameters:

Name Type Description Default
images dict[str, dict]

analysis에 사용할 데이터 리스트.

{
    "{image_id}": {
        "path": Union[str, list[str]],  # 이미지 경로 (multipage인 경우 경로 리스트)
        "width": int,  # image width
        "height": int,  # image height
        "class_index": int,  # ground truth label, **(labeled=False)인 경우 필요하지 않습니다.**
        "save_dir": str, # 해당 이미지의 analysis 결과 저장 directory
    },
    ...,  # times number of images
}

required
labeled bool

label 존재 여부. label 존재 여부에 따라 analysis 결과 dict 구성 요소가 달라집니다.

required

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 입니다.
            "correct": bool,  # True면 정답, False면 오답.  **(labeled=True)인 경우에만 나옴**
        },
    },
    ... # 입력으로 넣어준 이미지 개수만큼 반복
}

Note1

analyze() 함수를 사용하기 위해서는 inference_options 중 outputs.class_index=True 여야 합니다.

Note2

class_activation_map을 얻어야하는 등, 모델 인퍼런스부터 다시해야하는 경우에는, InferenceHandler.analyze를 호출해야 합니다.