Skip to content

Inference

generation.Inferencer

학습한 Generator 모델을 사용하여 검사를 하기 위한 Inferencer class 입니다.

Usage
# 인퍼런스 모듈 빌드
inference_build_config = {
    "checkpoint_path": CHECKPOINT_PATH,
    "password": PASSWORD,
    "device": DEVICE,
}
error, inferencer = Inferencer.build(inference_build_config)
assert error >= 0

# 모듈 정보 확인
error, metadata = read_metadata(CHECKPOINT_PATH)
assert error >= 0
print("Inference metadata:", metadata)

# 인퍼런스 옵션 초기값 확인
n_classes = CONFIG["n_classes"]
inference_options = {
    "image.n_blending_pixels": 2,
    "mask.clip_out_of_box_area": True,
    "mask.ignore_uninterested_class": True,
    "mask.smooth_mask": False,
    "mask.box_to_seg_ratio_range": [0.0, 1.0],
    "mask.refine_prediction": False,
    "mask.area_ratio_threshold": 0.25,
    "mask.ignore_small_segments": False,
}
print("Default inference options:")
for key in inference_options:
    error, value = inferencer.get_default_inference_option(key)
    assert error >= 0
    print(f"  {key}: {value}")

# 디벨로퍼: Analyze 수행
error, _ = inferencer.set_analysis_data(images=DATA["validation_images"], labeled=True)
assert error >= 0

error, analysis_steps = inferencer.initialize_analysis()
assert error >= 0

for _ in range(analysis_steps):
    error, _ = inferencer.step_analysis()
    assert error >= 0

error, analysis_results = inferencer.finalize_analysis()
assert error >= 0
print("Analysis results:", analysis_results)

# 디벨로퍼: 인퍼런스 옵션 변경
for key, value in inference_options.items():
    error, _ = inferencer.set_inference_option(key, value)
    assert error >= 0

# 디벨로퍼: metadata에 inference_option 저장 (예시)
metadata["inference_options"] = inference_options
error, _ = write_metadata(CHECKPOINT_PATH, metadata)
assert error >= 0

# 인퍼런스 옵션이 잘 변경되었는지 확인
print("Inference options:")
for key in inference_options:
    error, value = inferencer.get_inference_option(key)
    assert error >= 0
    print(f"  {key}: {value}")

# 디벨로퍼: 새로운 세팅으로 Analyze 재수행
error, analysis_results = inferencer.analyze_with_existing_data()
assert error >= 0
print("Analysis results:", analysis_results)

# 런타임: 핸들러 빌드
error, metadata = read_metadata(CHECKPOINT_PATH)
assert error >= 0
inference_build_config["inference_options"] = metadata["inference_options"]
error, inferencer = InferenceHandler.build(inference_build_config)
assert error >= 0

# 런타임 검사: 후처리까지 한번에 최적화된 연산으로 수행
image_path = DATA["validation_images"][image_id]["path"]
error, output = inferencer.infer_and_postprocess(images=[image_path])
assert error >= 0
print("Runtime (infer_and_postprocess):", output)

build(config) classmethod

Inferencer class의 instance를 생성합니다.

Parameters:

Name Type Description Default
config Dict

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

{
    "checkpoint_path": str,     # 체크포인트 경로
    "password": Optional[str],  # 체크포인트 패스워드 (default None)
    "device": Union[int, str],  # GPU 번호 (int) or "cpu" (str) (default "cpu")
}

required

Returns:

Name Type Description
Inferencer

build가 완료된 generation.Inferencer 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 목록:

{
    "image.n_blending_pixels": int,  # (default 2, 결함 생성 영역과 기존 이미지를 얼마나 부드럽게 이어붙일 지 결정.)
    "mask.clip_out_of_box_area": bool,  # (default True, True 일 시 박스 모드 인퍼런스 시 박스 바깥의 영역에 결함을 생성하지 않도록 제한.)
    "mask.ignore_uninterested_class": bool,  # (default True, True 일 시 모드 인퍼런스 시 입력한 라벨 클래스 이외의 클래스는 생성하지 않도록 제한.)
    "mask.smooth_mask": bool,  # (default False, True 일 시 박스 모드 인퍼런스 시 생성된 결함 세그먼트 형상을 뭉툭하게 처리함.)
    "mask.box_to_seg_ratio_range": List[float],  # (default: [0.0, 1.0], 박스 모드 인퍼런스 시 박스 사이즈 대비 생성 세그먼트 사이즈 비율을 제한하는 파라미터. 0.0~1.0 레인지)
    "mask.refine_prediction": bool,  # (default False, 위 기능을 활성화하는 파라미터. 현재 사용하지 않는 파라미터.)
    "mask.area_ratio_threshold": float,  # (default 0.25, 박스 모드 인퍼런스 시 여러 결함 세그먼트가 생성될 경우 상대적으로 자잘한 세그먼트를 제거하기 위한 파라미터. 0.25일 경우 가장 큰 세그먼트 대비 1/4배 이하의 사이즈를 가지는 세그먼트를 결과에서 제거함.)
    "mask.ignore_small_segments": bool,  # (default False, 위 기능을 활성화하는 파라미터.)
}

사용 예시:

inferencer.get_default_inference_option(key="image.n_blending_pixels")
inferencer.set_inference_option(key="image.n_blending_pixels", value=5)

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(input)

image의 List를 입력으로 받아 모델 인퍼런스와 후처리를 수행합니다. (for Runtime) 실시간 검사를 위해 연산 과정이 최적화되어 있으며, 중간 결과를 제거하고 postprocess 최종 결과만을 반환합니다.

Parameters:

Name Type Description Default
images Union[List[np.ndarray], List[str]]
- List[np.ndarray]: numpy image가 들어있는 List 입니다. 각 image는 다음 제약 조건을 갖습니다.
                    data type: uint8
                    channel: H x W / H x W x 1 - Gray
                             H x W x 3 - RGB
                             H x W x 4 - RGBA
- List[str]: image 경로가 들어있는 List 입니다.
- List[List[np.ndarray]]: multipage인 경우 사용.
- List[List[str]]: multipage인 경우 사용.
required

Returns:

Type Description
List[Dict]

List[Dict]: image의 postprocess 결과들이 들어있는 List 입니다.

[
    {  # 아래 키들 중 inference_options에 설정된 출력 값들만 포함.
        "mask": ndarray(uint8, shape=(H, W)),  # 각 픽셀이 예측된 클래스를 값으로 갖는 array 입니다.
        "scoremap": ndarray(uint8, shape=(C, H, W)),  # 각 클래스별로 픽셀의 score가 저장된 array
        "objects": [  # 클래스별로 contouring을 해서 얻은 object들의 리스트. (List[Dict])
            {  # segmentation object 구조
                "class_index": int,
                "contours": [  # cv2 형식의 contours. 0번째 contour가 outer, 나머지는 모두 inner.
                    ndarray(int32, shape=(52, 1, 2)),
                    ndarray(int32, shape=(44, 1, 2)),
                    ndarray(int32, shape=(11, 1, 2)),
                    ...,  # times number of contours
                ],
            },
            ...,  # times number of objects
        ],
    },
    ...,  # times number of images
]