HDR 파노라마 생성 모델 학습 가이드¶
1. 개요¶
이 문서는 물리적 정합성 기반 HDR 파노라마 생성 모델의 학습 방법을 설명합니다. 전체 학습 과정은 두 단계로 나뉩니다. Stage 1에서는 합성 데이터로 구조를 학습하고, Stage 2에서는 실측 데이터로 물리적 휘도를 보정합니다.
2. 환경 설정¶
2.1 하드웨어 요구사항¶
학습에는 VRAM 24GB 이상의 GPU가 필요합니다. RTX 3090, RTX 4090, RTX 5090 등을 권장합니다. Full FP32 연산을 사용하므로 FP16 대비 메모리 사용량이 증가합니다.
저장 공간은 데이터셋과 체크포인트를 포함하여 최소 100GB가 필요합니다. 학습 중 스냅샷이 주기적으로 저장되므로 여유 공간을 확보해두는 것이 좋습니다.
2.2 소프트웨어 의존성¶
기존 StyleLight 환경에 추가로 다음 패키지가 필요합니다.
HDR 파일 처리를 위해 skylibs 패키지를 설치합니다. 이 패키지는 EXR과 HDR 파일을 읽고 쓰는 기능을 제공합니다. OpenEXR 라이브러리도 함께 설치해야 합니다.
LPIPS 패키지는 Consistency Loss 계산에 사용됩니다. 설치하지 않으면 L1 손실로 대체되어 작동하지만, 더 좋은 결과를 위해 설치를 권장합니다.
SwinIR는 초해상도에 사용됩니다. 설치하지 않으면 Lanczos 보간으로 대체됩니다. 최종 품질을 위해서는 SwinIR 사용을 권장합니다.
2.3 환경 확인¶
CUDA가 정상적으로 설치되었는지 확인합니다. PyTorch에서 GPU를 인식하는지, 어떤 GPU가 사용 가능한지 확인하세요.
3. 데이터셋 준비¶
3.1 필요한 데이터셋¶
두 가지 데이터셋이 필요합니다.
S2R-HDR: Unreal Engine 5로 생성된 합성 HDR 파노라마 데이터셋입니다. Stage 1 학습에 사용됩니다. 합성 데이터이므로 양이 풍부하고 다양한 장면을 포함하지만, 절대 휘도 스케일이 실제와 다를 수 있습니다.
Laval Photometric Indoor: 색차계로 보정된 실측 HDR 데이터셋입니다. Stage 2 학습에 사용됩니다. 절대 휘도(cd/m²) 스케일이 정확하지만 데이터 양이 상대적으로 적습니다.
데이터셋 다운로드는 사용자가 직접 수행해야 합니다.
3.2 데이터셋 전처리¶
다운로드한 데이터셋을 학습에 적합한 형태로 변환해야 합니다. data_preprocessing/prepare_datasets.py 스크립트를 사용합니다.
S2R-HDR 데이터셋의 경우, 원본 디렉토리와 출력 디렉토리를 지정하여 전처리를 실행합니다. 모든 이미지가 512×1024 Equirectangular 형식으로 변환되고, FP32 EXR로 저장됩니다. --generate-json 옵션을 추가하면 StyleGAN 학습에 필요한 dataset.json 파일도 생성됩니다.
Laval 데이터셋도 동일한 방식으로 전처리합니다. 추가로 HDR 파일 헤더에 포함된 노출값(EXPOSURE)을 읽어 절대 휘도 스케일로 변환합니다.
3.3 데이터셋 검증¶
전처리가 완료되면 유효성을 검사합니다. 검증 스크립트는 각 이미지의 형태가 올바른지, NaN이나 무한대 값이 없는지, 음수 값이 없는지 확인합니다. 유효하지 않은 파일이 발견되면 목록과 함께 오류 원인이 출력됩니다.
3.4 예상 디렉토리 구조¶
전처리가 완료되면 다음과 같은 디렉토리 구조가 됩니다. 각 데이터셋 폴더에는 EXR 파일들과 dataset.json 파일이 있어야 합니다.
4. Stage 1 학습: 구조 학습¶
4.1 학습 목표¶
Stage 1의 목표는 HDR 파노라마의 구조적 특징을 학습하는 것입니다. 실내 공간의 형태, 창문 위치, 조명 배치 등을 파악하여 그럴듯한 파노라마를 생성할 수 있도록 합니다.
이 단계에서는 DTAM을 적용하지 않습니다. 구조 학습에 집중하기 위해 기본 GAN 손실과 LPIPS 지각적 손실만 사용합니다. 물리적 휘도의 정확성은 Stage 2에서 보정합니다.
4.2 학습 설정¶
Full FP32 정밀도를 사용합니다. HDR 이미지의 높은 동적 범위를 정확하게 표현하려면 FP32가 필수입니다. FP16을 사용하면 고휘도 영역에서 오버플로우가 발생할 수 있습니다.
Generator 출력층에는 Softplus 활성화 함수를 사용합니다. 물리적 휘도는 항상 0 이상이어야 하므로, 출력 범위를 [0, ∞)로 제한합니다.
4.3 학습 실행¶
train_stage1.py 스크립트로 학습을 시작합니다. 필수 옵션은 데이터셋 경로(--data)와 출력 디렉토리(--outdir)입니다.
GPU 개수와 배치 크기는 하드웨어에 맞게 조정합니다. RTX 3090 1개로 학습할 경우 배치 크기 2가 적당합니다. 다중 GPU를 사용하면 배치 크기를 늘릴 수 있습니다.
학습 기간은 --kimg 옵션으로 지정합니다. 기본값은 10000 kimg(천만 이미지)입니다. 이는 데이터셋 크기와 원하는 품질에 따라 조정할 수 있습니다.
4.4 학습 모니터링¶
학습 중에는 주기적으로 스냅샷이 저장됩니다. 출력 디렉토리에 생성된 log.txt 파일에서 손실 값과 메트릭을 확인할 수 있습니다.
생성된 이미지는 fakes*.png 파일로 저장됩니다. 학습이 진행됨에 따라 이미지 품질이 향상되는지 시각적으로 확인하세요.
4.5 학습 재개¶
학습이 중단된 경우 --resume 옵션으로 재개할 수 있습니다. 마지막으로 저장된 스냅샷 파일을 지정하면 해당 시점부터 학습이 계속됩니다.
4.6 체크포인트 선택¶
학습이 완료되면 최적의 체크포인트를 선택해야 합니다. FID 점수가 가장 낮은 시점이 이상적이지만, 생성 이미지의 시각적 품질도 함께 고려하세요. 경험적으로 전체 학습의 70-80% 시점에서 좋은 결과를 얻는 경우가 많습니다.
선택한 체크포인트는 Stage 2 학습의 시작점이 됩니다.
4.7 예상 학습 시간¶
학습 시간은 GPU 성능과 배치 크기에 따라 달라집니다. RTX 3090 1개, 배치 크기 2로 10000 kimg를 학습하는 데 약 7일이 소요됩니다. RTX 4090이나 RTX 5090을 사용하면 시간을 단축할 수 있습니다.
5. Stage 2 학습: 물리 보정¶
5.1 학습 목표¶
Stage 2의 목표는 물리적 휘도 정합성을 보정하는 것입니다. Stage 1에서 학습한 구조적 지식을 보존하면서, DGP 계산에 중요한 휘도 영역의 정확도를 향상시킵니다.
이 단계에서는 S2R-Adapter(Sim-to-Real Adapter)를 사용합니다. Stage 1 모델의 원본 가중치는 동결하고, 2-브랜치 구조로 효율적인 도메인 적응을 수행합니다. scale1, scale2 파라미터로 전송 브랜치의 기여도를 조절하여 구조적 지식을 보존하면서 물리적 보정을 수행합니다.
5.2 DTAM 설정¶
DTAM(이중 임계값 적응형 마스킹)은 휘도 구간에 따라 다른 학습 가중치를 부여합니다. 기본 설정은 다음과 같습니다.
T_onset은 300 cd/m²로, 이 값 이상부터 가중치가 증가하기 시작합니다. T_peak는 1000 cd/m²로, 이 값 이상에서는 최대 가중치가 적용됩니다. 최대 가중치는 기본 가중치의 10배입니다.
이 파라미터들은 DGP 계산의 특성에 맞게 설정되었습니다. 특정 조명 환경에서 다른 값이 더 적합할 수 있으므로, 필요에 따라 조정하세요.
5.3 손실 함수 구성¶
Stage 2의 손실 함수는 세 가지 요소로 구성됩니다.
물리 손실(L_phys)은 DTAM 가중치와 PU21 인코딩을 결합합니다. 예측 휘도와 정답 휘도를 각각 PU21로 인코딩한 후, DTAM 가중치를 곱한 L1 손실을 계산합니다.
일관성 손실(L_consist)은 Stage 1 모델과의 구조적 차이를 측정합니다. 두 모델의 출력을 톤매핑한 후 LPIPS로 비교합니다. 이 손실이 없으면 물리 보정 과정에서 구조가 과도하게 변형될 수 있습니다.
GAN 손실(L_GAN)은 기본 StyleGAN2 적대적 손실입니다. 생성 이미지의 현실성을 유지합니다.
세 손실의 가중치는 CLI 옵션으로 조정할 수 있습니다. 기본값은 물리 손실 1.0, 일관성 손실 0.5, GAN 손실 1.0입니다.
5.4 S2R-Adapter 설정¶
S2R-Adapter는 2-브랜치 구조를 사용합니다:
공유 브랜치 (Share Branch)
- 원본 가중치 동결
- Stage 1에서 학습된 구조적 지식 보존
전송 브랜치 (Transfer Branch)
- Transfer1 (r1=1): 전역적 도메인 이동
- Transfer2 (r2=128): 세밀한 도메인 적응
스케일링 계수 (scale1, scale2)
- 일반 모드: 고정값(1.0) 또는 학습 가능 파라미터로 설정
- TTA 모드: 입력 불확실성에 따라 동적 조절 (선택적)
2-브랜치 구조로 전체 파라미터의 약 7-8%만 학습합니다.
5.5 학습 실행¶
train_stage2.py 스크립트로 학습을 시작합니다. 필수 옵션은 Stage 1 체크포인트(--stage1_ckpt), 데이터셋 경로(--data), 출력 디렉토리(--outdir)입니다. S2R-Adapter 관련 옵션(--adapter_r1, --adapter_r2, --init_scale1, --init_scale2)으로 세부 설정을 조정할 수 있습니다.
Stage 1보다 짧은 학습 기간이 필요합니다. 기본값은 5000 kimg로, Stage 1의 절반입니다. S2R-Adapter는 효율적인 파라미터만 학습하므로 수렴이 빠릅니다.
5.6 예상 학습 시간¶
Stage 2는 Stage 1보다 빠르게 완료됩니다. RTX 3090 1개, 배치 크기 2로 5000 kimg를 학습하는 데 약 3일이 소요됩니다.
5.7 S2R-Adapter 상세 설정¶
5.7.1 스케일 학습 활성화¶
Stage 2 학습 시 S2R-Adapter의 스케일링 계수(scale1, scale2)를 학습 가능하게 설정하면, 최적의 도메인 적응 비율이 자동으로 학습됩니다.
# 스케일을 학습 가능한 파라미터로 변환
make_scales_learnable(generator)
# 옵티마이저에 스케일링 계수 포함
params = get_s2r_adapter_parameters(generator, include_scales=True)
optimizer = torch.optim.Adam(params, lr=0.002)
5.7.2 수동 스케일 조절¶
특정 스케일 값을 직접 설정할 수도 있습니다:
5.8 Test-Time Adaptation (TTA)¶
TTA는 추론 시점에 입력의 불확실성을 측정하여 스케일을 동적으로 조절하는 기법입니다.
TTA 사용 주의
Laval 데이터로 파인튜닝된 모델은 TTA가 불필요합니다. TTA는 학습에 사용되지 않은 새로운 도메인에서 추론할 때만 선택적으로 활성화하세요.
5.8.1 TTA 작동 원리¶
- 입력 증강: 입력에 여러 변형(노출, 화이트밸런스, 뒤집기 등) 적용
- 각 증강된 입력으로 순전파
- 출력들의 분산(불확실성) 계산
- 불확실성에 따라 스케일 동적 조절:
scale1 = 1 - U(x)(불확실성 높으면 공유 브랜치 감소)scale2 = 1 + U(x)(불확실성 높으면 전송 브랜치 증가 = 임시 파인튜닝 할 것이므로)
- 임시 정답 생성: 현재 입력 이미지에 대한 임시 정답
- 어댑터 임시 파인튜닝: 출력값이 가짜 정답과 비슷해지도록 역전파를 통해 전송 브랜치의 가중치 업데이트
5.8.2 TTA 사용 방법¶
TTA를 사용하려면 MyCoach 클래스의 train_with_tta 메서드를 호출합니다. 주요 파라미터는 다음과 같습니다:
- use_tta: TTA 활성화 여부 (True로 설정)
- adaptive_scale: 불확실성 기반 동적 스케일 조절 여부
- num_augmentations: 적용할 증강 개수 (기본값 5)
메서드 실행 후 반환되는 결과에서 계산된 불확실성 값(uncertainty)과 적용된 스케일(scale1, scale2)을 확인할 수 있습니다.
5.8.3 TTA 증강 종류¶
| 증강 | 설명 | 용도 |
|---|---|---|
ExpAug |
노출 조정 (EV ±1~2) | 조명 변화 시뮬레이션 |
WBAug |
화이트 밸런스 (RGB 가중치) | 색온도 변화 시뮬레이션 |
PermAug |
채널 순열 | 색상 불변성 테스트 |
FlipAug |
수평/수직 뒤집기 | 공간 불변성 테스트 |
IdentityAug |
원본 유지 | 기준점 |
5.8.4 TTA 권장 설정¶
| 시나리오 | TTA | 증강 개수 | 비고 |
|---|---|---|---|
| Laval 파인튜닝 후 추론 | OFF | - | 기본 설정 |
| 새 도메인 추론 | ON | 5 | 불확실성 측정 |
| 빠른 추론 필요 | OFF | - | TTA는 N배 추론 비용 |
상세 기술 문서는 S2R-Adapter 기술 문서를 참조하세요.
6. 추론 및 검증¶
6.1 파이프라인 개요¶
학습이 완료되면 Stage 2 체크포인트로 HDR 이미지를 생성할 수 있습니다. 전체 파이프라인은 다음 단계를 거칩니다.
먼저 Generator가 512×1024 Equirectangular HDR 파노라마를 생성합니다. 그 다음 전방 180° 영역을 512×512로 크롭합니다. SwinIR(또는 Lanczos)로 1024×1024로 업스케일한 후, Angular Fisheye 프로젝션으로 변환합니다. 마지막으로 Radiance HDR 형식으로 저장합니다.
6.2 추론 실행¶
inference/validation_pipeline.py 스크립트로 추론을 실행합니다. 필수 옵션은 체크포인트 경로(--checkpoint)와 출력 파일 경로(--output)입니다.
SwinIR 모델이 있으면 --sr_model 옵션으로 지정할 수 있습니다. 없으면 Lanczos 보간이 사용됩니다.
시드를 지정하면(--seed) 동일한 이미지를 재현할 수 있습니다. 디버깅이나 비교 실험에 유용합니다.
--save_intermediate 옵션을 추가하면 중간 결과(파노라마, 크롭, 업스케일)도 함께 저장됩니다.
6.3 출력 파일 형식¶
생성되는 HDR 파일은 Radiance RGBE 형식입니다. 파일 헤더에 VIEW 정보(-vta -vv 180 -vh 180)가 포함되어 evalglare가 Angular Fisheye 프로젝션으로 인식합니다.
6.4 evalglare 실행¶
evalglare 실행은 사용자가 직접 수행합니다. 생성된 HDR 파일을 evalglare에 전달하면 DGP 값을 계산할 수 있습니다.
evalglare의 다양한 옵션을 활용하면 눈부심 소스 시각화, 상세 분석 등을 수행할 수 있습니다.
7. 평가¶
7.1 물리적 정합성 평가¶
생성된 HDR 이미지의 물리적 정확도를 평가하려면 metrics/physical_metrics.py 모듈을 사용합니다. 예측 HDR과 정답 HDR을 비교하여 다양한 메트릭을 계산합니다.
7.2 주요 메트릭¶
수직 조도 오차율(ΔEv): 파노라마 전체에서 수직면에 입사하는 조도를 적분하여 계산합니다. 목표는 10% 미만입니다. 이 값이 크면 DGP 계산 결과가 실제와 크게 달라질 수 있습니다.
전이 구간 RMSE: 300~1000 cd/m² 영역의 휘도 오차입니다. DGP에 가장 큰 영향을 미치는 구간으로, 이 값이 낮을수록 DGP 계산이 정확합니다.
DGP 등급 분류 정확도: Imperceptible/Perceptible/Disturbing/Intolerable 4등급 분류의 일치율입니다. 실용적 관점에서 가장 중요한 메트릭입니다. 정확한 DGP 값보다 올바른 등급 분류가 건축 조명 설계에서 더 유용합니다.
7.3 보조 메트릭¶
휘도 히스토그램 유사도는 전체 휘도 분포가 얼마나 유사한지 측정합니다. 히스토그램 교차, KL 발산, Earth Mover's Distance 등을 계산합니다.
피크 휘도 정확도는 최대 휘도값이 얼마나 정확한지 측정합니다. 눈부심 소스(광원)의 휘도를 정확하게 재현하는 것이 중요합니다.
8. 문제 해결¶
8.1 메모리 부족¶
CUDA 메모리가 부족하면 배치 크기를 줄이세요. 배치 크기 1도 가능하지만, 학습 시간이 늘어납니다.
그래디언트 체크포인팅을 활성화하면 메모리 사용량을 줄일 수 있지만, 코드 수정이 필요합니다.
8.2 학습 불안정¶
손실이 급격히 증가하거나 발산하면 R1 정규화 가중치(gamma)를 높여보세요. 기본값보다 2배 정도 높은 값을 시도해볼 수 있습니다.
학습률을 낮추는 것도 도움이 됩니다. 학습 스크립트 내 옵티마이저 설정을 수정하세요.
8.3 Stage 2 발산¶
Stage 2에서 구조가 과도하게 변형되면 일관성 손실 가중치를 높이세요. 기본값 0.5를 1.0이나 2.0으로 올려보세요.
S2R-Adapter의 scale1, scale2를 낮추는 것도 효과적입니다. 기본값 1.0을 0.5로 줄이면 보정 강도가 약해집니다.
8.4 HDR 파일 문제¶
HDR 파일 로드에 실패하면 skylibs와 OpenEXR이 올바르게 설치되었는지 확인하세요. 패키지를 재설치해보세요.
evalglare가 VIEW 헤더를 인식하지 못하면, 생성된 HDR 파일의 헤더를 확인하세요. VIEW= -vta -vv 180 -vh 180 라인이 있어야 합니다.
9. 전체 학습 과정 논리적 흐름¶
1단계: 데이터 준비¶
S2R-HDR(합성)과 Laval(실측) 데이터셋을 학습에 적합한 형태로 변환합니다.
세부 흐름:
-
원본 다운로드: S2R-HDR과 Laval Photometric Indoor 데이터셋을 각각 다운로드합니다.
-
해상도 통일: 다양한 크기의 원본 이미지를 512×1024 Equirectangular 형식으로 변환합니다. Lanczos 리샘플링으로 품질 저하를 최소화합니다.
-
휘도 스케일 보정: Laval 데이터셋의 경우 HDR 헤더에 포함된 EXPOSURE 값을 읽어 절대 휘도(cd/m²) 스케일로 변환합니다. S2R-HDR은 상대적 스케일을 유지합니다.
-
FP32 EXR 저장: 모든 이미지를 32비트 부동소수점 EXR 형식으로 저장합니다. 이 과정에서 음수 값은 0으로 클램핑됩니다.
-
유효성 검사: 각 이미지의 형태, NaN/Inf 존재 여부, 음수 값 유무를 확인합니다.
2단계: Stage 1 학습 (구조)¶
S2R-HDR 합성 데이터로 HDR 파노라마의 공간 구조를 학습합니다.
세부 흐름:
-
데이터 로드: HDRPhysicalDataset이 FP32 EXR을 로드하고, 톤매핑 없이 선형 휘도를 유지합니다.
-
Generator 순전파: 잠재 벡터(z)로부터 512×1024 HDR 파노라마를 생성합니다. Softplus 활성화로 출력이 항상 0 이상이 되도록 보장합니다.
-
손실 계산: 세 가지 손실을 계산합니다.
- L_GAN: Discriminator를 속이는 적대적 손실
- L_LPIPS: 지각적 유사성 손실
-
L_L2: 픽셀 단위 재구성 손실
-
역전파: 총 손실에 대해 그래디언트를 계산합니다. Full FP32로 연산하여 고휘도 영역의 정밀도를 유지합니다.
-
가중치 갱신: Adam 옵티마이저로 Generator와 Discriminator 가중치를 업데이트합니다.
-
스냅샷 저장: 일정 간격으로 체크포인트(.pkl)와 생성 샘플을 저장합니다.
핵심 설정: - DTAM: OFF (가중치 없는 균일 학습) - 정밀도: Full FP32 - 활성화: Softplus
3단계: 체크포인트 선택¶
Stage 1 학습 결과에서 최적의 체크포인트를 선정합니다.
세부 흐름:
-
FID 점수 확인: 학습 로그에서 각 스냅샷의 FID 점수를 확인합니다. 낮을수록 좋습니다.
-
생성 샘플 시각 검토: fakes*.png 파일들을 검토하여 구조적 품질(창문 형태, 공간 일관성 등)을 평가합니다.
-
최적 시점 결정: FID가 최저인 시점과 시각적 품질이 가장 좋은 시점을 종합적으로 고려합니다. 일반적으로 전체 학습의 70~80% 시점이 적합합니다.
-
체크포인트 복사: 선택한 체크포인트를 Stage 2 학습의 입력으로 사용할 경로에 복사합니다.
4단계: Stage 2 학습 (물리 보정)¶
Laval 실측 데이터로 물리적 휘도 정합성을 보정합니다.
세부 흐름:
Stage 1 로드 → S2R-Adapter 적용 → 데이터 로드 → 순전파 → DTAM 가중치 계산 → 물리 손실 계산 → 일관성 손실 계산 → 역전파 → S2R-Adapter 파라미터 갱신
-
Stage 1 로드: Stage 1 체크포인트를 로드하고 모든 가중치를 동결(freeze)합니다.
-
S2R-Adapter 적용: Generator의 affine 레이어에 2-브랜치 S2R-Adapter를 삽입합니다. r1=1, r2=128로 전체 파라미터의 약 7-8%만 학습 가능하게 설정합니다.
-
데이터 로드: Laval 데이터셋을 로드합니다. 절대 휘도(cd/m²) 스케일이 보존된 상태입니다.
-
순전파: Stage 2 Generator가 HDR 파노라마를 생성합니다.
-
DTAM 가중치 계산: 정답 휘도값에 따라 픽셀별 가중치를 계산합니다.
- 300 cd/m² 미만: 가중치 1.0 (배경)
- 300~1000 cd/m²: 가중치 1.0→10.0 (전이 구간, S자 곡선)
-
1000 cd/m² 이상: 가중치 10.0 (눈부심 영역)
-
물리 손실 계산: 예측과 정답을 각각 PU21로 인코딩한 후, DTAM 가중치를 곱한 L1 손실을 계산합니다.
-
일관성 손실 계산: Stage 1 모델과 Stage 2 모델의 출력을 톤매핑한 후 LPIPS로 비교합니다. 구조적 변형을 억제합니다.
-
역전파: L_total = L_phys + 0.5×L_consist + L_GAN에 대해 그래디언트를 계산합니다.
-
S2R-Adapter 파라미터 갱신: 동결된 원본 가중치는 그대로 두고, S2R-Adapter의 전송 브랜치(Transfer1, Transfer2)만 업데이트합니다.
핵심 설정: - DTAM: ON (전이 구간 강조) - S2R-Adapter: r1=1, r2=128 (2-브랜치 구조) - scale1, scale2: 도메인 유사도에 따른 비율 조절 - 일관성 손실 가중치: 0.5
5단계: 추론¶
Stage 2 체크포인트로 원형어안 HDR 파일을 생성합니다.
세부 흐름:
-
체크포인트 로드: Stage 2 체크포인트를 로드하고 평가 모드로 설정합니다.
-
파노라마 생성: 잠재 벡터로부터 512×1024 Equirectangular HDR 파노라마를 생성합니다.
-
전방 180° 크롭: 파노라마에서 전방을 향하는 180° 영역을 512×512로 추출합니다. 가로 방향 중앙 절반을 잘라냅니다.
-
초해상도 업스케일: SwinIR 모델로 512×512를 1024×1024로 업스케일합니다. SwinIR이 없으면 Lanczos 보간을 사용합니다. HDR 휘도 스케일이 보존되도록 선형 공간에서 처리합니다.
-
Angular Fisheye 변환: Equirectangular 좌표를 Angular Fisheye(-vta) 좌표로 변환합니다. 이 프로젝션은 evalglare가 기대하는 형식입니다.
-
VIEW 헤더 삽입: Radiance HDR 파일에
VIEW= -vta -vv 180 -vh 180헤더를 삽입합니다. evalglare가 프로젝션 타입을 자동 인식합니다. -
HDR 저장: Radiance RGBE 형식(.hdr)으로 저장합니다.
6단계: 평가¶
생성된 HDR의 물리적 정확도를 정량적으로 평가합니다.
세부 흐름:
-
HDR 로드: 생성된 HDR과 정답 HDR을 로드합니다.
-
휘도 계산: RGB를 휘도(Y = 0.2126R + 0.7152G + 0.0722B)로 변환합니다.
-
구간별 RMSE 계산: 휘도 구간을 나누어 각각의 RMSE를 계산합니다.
- 배경 구간: 300 cd/m² 미만
- 전이 구간: 300~1000 cd/m² (DGP에 가장 중요)
-
눈부심 구간: 1000 cd/m² 이상
-
수직 조도 계산: 파노라마 전체에서 수직면에 입사하는 조도(Ev)를 적분합니다. 예측값과 정답의 오차율(ΔEv)을 계산합니다. 목표는 10% 미만입니다.
-
DGP 등급 분류: evalglare로 계산된 DGP 값을 4등급으로 분류합니다.
- Imperceptible: DGP < 0.35
- Perceptible: 0.35 ≤ DGP < 0.40
- Disturbing: 0.40 ≤ DGP < 0.45
-
Intolerable: DGP ≥ 0.45
-
결과 집계: 모든 테스트 이미지에 대해 메트릭을 평균하고, DGP 등급 분류 정확도(일치율)를 계산합니다.
10. 전체 워크플로우 요약¶
-
데이터셋 준비: S2R-HDR과 Laval 데이터셋을 다운로드하고 전처리합니다.
-
Stage 1 학습: S2R-HDR로 구조를 학습합니다. 약 7일 소요됩니다.
-
체크포인트 선택: Stage 1 학습 결과에서 최적의 체크포인트를 선택합니다.
-
Stage 2 학습: Laval로 물리적 보정을 수행합니다. 약 3일 소요됩니다.
-
추론: 학습된 모델로 원형어안 HDR을 생성합니다.
-
평가: evalglare로 DGP를 계산하고, 물리적 메트릭으로 정확도를 평가합니다.
전체 과정은 데이터 준비부터 평가까지 약 2주가 소요됩니다. GPU 성능에 따라 단축될 수 있습니다.