콘텐츠로 이동

SaigeSurface

PhotometricStereo.SaigeSurface

Bases: PhotometricStereo

2.5D 이미지 생성을 위한 SaigeSurface class입니다. Usage:

from PhotometricStereo.engine.api import SaigeSurface

saige_surface = SaigeSurface.build(device=0, inference_mode="fast")

# surface normal 계산
error_code, (normal, albedo) = saige_surface.calculate_surface_normal(img_list)

config = {
    "mode": "shape",
    "shader_level": 2,
    "contrast": 15,
    "brightness": 0,
    "normalize_image": True,
}
# or
config = {
    "mode": "depth",
    "sigma": 2,
    "depth_contrast": 0.5,
}

# 이미지 후처리 진행
error_code, result = saige_surface.postprocess(normal, albedo, config)


build(device, inference_mode) classmethod

SaigeSurface class의 instance를 생성합니다.

Parameters:

Name Type Description Default
device DeviceType

GPU device 입니다. str 또는 int로 입력합니다.

required
inference_mode str

인퍼런스 모드입니다. "basic", "fast" 중 선택합니다.

required

calculate_surface_normal_and_albedo(img_list, tilt_degree_list, elevation=30)

4장의 이미지를 이용하여 surface normal과 albedo를 계산합니다. 이미지 순서가 광원 위치 기준 [left, top, right, bottom]으로 정확해야합니다. 이미지 순서가 올바르지 않을 경우, 정확한 결과를 계산할 수 없습니다.

Parameters:

Name Type Description Default
img_list List[ndarray]

Grayscale 이미지 리스트입니다.

img_list = [
    img_left,   # 광원이 왼쪽에 위치한 이미지 (H, W)
    img_top,    # 광원이 위에 위치한 이미지 (H, W)
    img_right,  # 광원이 오른쪽에 위치한 이미지 (H, W)
    img_bottom, # 광원이 아래에 위치한 이미지 (H, W)
]

required
tilt_degree_list List[int]

각 이미지의 광원 방향입니다 (이미지 우측이 0도, 반시계 방향).

tilt_degree_list = [
    180,   # 광원이 왼쪽에 위치한 이미지 기준
    90,    # 광원이 위에 위치한 이미지 기준
    0,  # 광원이 오른쪽에 위치한 이미지 기준
    270, # 광원이 아래에 위치한 이미지 기준
]

required
elevation Optional[int]]

빛의 각도입니다. Defaults to 30.

30

Raises:

Type Description
NotEnoughImageError

이미지 최소 3장이 필요합니다.

ImageAndTiltNumMismatchError

이미지 수와 tilt 수가 동일해야 합니다.

InvalidTiltAngleError

주어진 tilt 조건에서 분석을 수행할 수 없습니다. 다른 tilt 조건이 필요합니다.

InvalidImageShapeError

모든 이미지는 동일한 크기여야 합니다.

InvalidImageShapeError

모든 이미지는 grayscale이어야 합니다.

ElevationAngleOutOfRangeError

Elevation angle이 0보다 작거나 90보다 큽니다.

Returns:

Type Description
Tuple[Tensor, Tensor]

Tuple[torch.Tensor, torch.Tensor]: surface normal, albedo


postprocess(normal, albedo, config)

surface normal map에 이미지 프로세싱 기법을 적용합니다.

  • mode : 용도에 맞게 모드를 선택합니다.
    • shape: 흠집 검사에 적합합니다.
    • gradientX: 표면의 X방향 경사 변화도를 나타냅니다.
    • gradientY: 표면의 Y방향 경사 변화도를 나타냅니다.
    • albedo: 표면 반사도를 표현합니다.
    • depth: 표면의 깊이를 표현합니다.
  • shader_level: 쉐이더 레벨입니다. 낮을 수록 평평하고 높을 수록 입체감이 드러나며, 처리시간이 소폭 증가합니다. (1~5; 기본=2)
  • contrast: 명암비입니다. 낮을 수록 대비가 낮고 높을 수록 대비가 높아집니다. (-100~100, 기본=10)
  • brightness: 이미지 밝기입니다. 낮을 수록 어두워지고 높을 수록 밝아집니다. (-30~30, 기본=0)
  • normalize_image: 결과물의 정규화 여부를 선택합니다. False일 경우 실제 이미지에 더 가깝습니다. (기본=True)
  • sigma: [for depth mode] Depth 이미지의 표현 범위를 조절합니다. 낮을수록 세부 형상이 정확해지지만, 전체적으로 고저차가 드러나지 않습니다. 높을수록 세부 형상이 흐릿해지는 반면, 깊이의 고저차가 더욱 명확히 드러납니다. (2~5, 기본=2)
  • depth_contrast: [for depth mode] Depth 이미지의 대비 정도를 조절합니다 (0.1~1.0, 기본=0.3)

Parameters:

Name Type Description Default
normal Tensor

(3, H, W)의 크기를 가지는 surface normal map입니다.

required
albedo Tensor

(H, W)의 크기를 가지는 albedo map입니다.

required
config dict

이미지 프로세싱 파라미터를 담은 dictionary 입니다.

config = {
    "mode": str, # "shape", "gradientX", "gradientY", "albedo", or "depth"
    "shader_level": int, # 1~5. default = 2
    "contrast": int, # -30~30. default = 15
    "brightness": int, # -30~30. default = 0
    "normalize_image": bool, # default = True
    "sigma": int, # 2~5. default = 2
    "depth_contrast": float, # default = 0.3
}

required

Returns:

Type Description
ndarray

np.ndarray: (H, W)의 크기를 가지는 surface normal map입니다. (0~255)