물리적 정합성 기반 HDR 파노라마 생성 모델 구현 계획¶
1. 프로젝트 개요¶
1.1 목표¶
23mm 렌즈(약 63° 화각)로 촬영한 단일 NFoV HDR 이미지로부터 180° 반구형 HDR 파노라마를 생성하는 것이 목표입니다. 생성된 파노라마는 건축 조명 설계에서 사용하는 DGP(주광 눈부심 확률) 계산에 활용되므로, 물리적으로 정확한 휘도값을 출력해야 합니다.
1.2 핵심 요구사항¶
기존 StyleLight 모델은 시각적 품질에 초점을 맞추어 톤매핑된 LDR 이미지를 생성합니다. 하지만 DGP 계산을 위해서는 절대 휘도(cd/m²) 단위의 물리적으로 정확한 HDR 출력이 필요합니다. 특히 300~1000 cd/m² 범위의 "전이 구간"에서 휘도 정확도가 DGP 계산 결과에 큰 영향을 미칩니다.
1.3 환경 정보¶
- GPU: RTX 5090 클라우드 대여 예정
- 데이터셋: 사용자가 직접 다운로드 (S2R-HDR, Laval Photometric)
- 초해상도 모델: SwinIR 사용 예정
- 평가 도구: evalglare는 사용자가 직접 실행 (원형어안 HDR 파일 출력까지만 구현)
2. 기술적 배경¶
2.1 왜 기존 방식이 문제인가¶
기존 StyleLight는 HDR 이미지를 톤매핑하여 [-1, 1] 범위로 정규화합니다. 이 과정에서 물리적 휘도 정보가 손실됩니다. 또한 FP16 혼합 정밀도를 사용하여 고휘도 영역(10,000 cd/m² 이상)에서 오버플로우가 발생할 수 있습니다.
2.2 DTAM (이중 임계값 적응형 마스킹)¶
DGP 계산에서 가장 중요한 휘도 구간은 300~1000 cd/m²입니다. 이 "전이 구간"에서의 오차가 DGP 등급 분류에 결정적인 영향을 미칩니다. DTAM은 이 구간에 더 높은 학습 가중치를 부여하여 모델이 해당 영역을 정확하게 학습하도록 유도합니다.
가중치 함수는 세 구간으로 나뉩니다: - 배경 구간 (< 300 cd/m²): 가중치 1.0 - 전이 구간 (300~1000 cd/m²): 가중치가 1.0에서 10.0까지 점진적으로 증가 - 눈부심 구간 (≥ 1000 cd/m²): 최대 가중치 10.0 유지
2.3 PU21 인코딩¶
인간 시각 시스템은 휘도를 로그 스케일로 인지합니다. PU21(Perceptually Uniform 2021)은 물리적 휘도를 지각적으로 균일한 값으로 변환하여, 손실 함수가 인간 시각 특성에 맞게 오차를 측정하도록 합니다.
2.4 2단계 학습 전략¶
한 번에 구조와 물리적 정합성을 모두 학습하기는 어렵습니다. 따라서 두 단계로 나누어 학습합니다:
- Stage 1: 합성 데이터(S2R-HDR)로 파노라마의 구조적 특징을 학습
- Stage 2: 실측 데이터(Laval)로 물리적 휘도 정합성을 보정
Stage 2에서는 Stage 1의 구조적 지식을 보존하기 위해 S2R-Adapter(Sim-to-Real Adapter)를 사용합니다. 원본 가중치는 동결하고, 2-브랜치 구조(공유 브랜치 + 전송 브랜치)로 효율적인 도메인 적응을 수행합니다. 전송 브랜치는 Transfer1(r1=1)과 Transfer2(r2=128)로 구성되며, scale1, scale2 파라미터로 각 전송 브랜치의 기여도를 조절할 수 있습니다.
3. 마일스톤별 구현 계획¶
M1: 인프라 구축 및 데이터 파이프라인¶
데이터 로더 수정¶
기존 데이터 로더는 HDR 이미지를 톤매핑하여 LDR로 변환합니다. 물리적 휘도를 보존하려면 톤매핑 없이 원본 HDR 값을 그대로 로드해야 합니다.
새로운 HDRPhysicalDataset 클래스를 추가하여 EXR/HDR 파일을 FP32 정밀도로 직접 로드합니다. 이 로더는 선형 휘도 스케일을 유지하며, 음수 값 제거와 Lanczos 리샘플링만 수행합니다.
데이터셋 전처리 파이프라인¶
S2R-HDR과 Laval 데이터셋을 학습에 적합한 형태로 변환하는 전처리 스크립트를 작성합니다. 모든 이미지를 512×1024 Equirectangular 형식으로 통일하고, FP32 EXR로 저장합니다.
Laval 데이터셋의 경우 HDR 파일 헤더에 포함된 노출값(EXPOSURE)을 읽어 절대 휘도 스케일로 변환합니다.
M2: 모델 아키텍처 수정¶
출력층 활성화 함수 변경¶
기존 Generator의 출력층은 선형 활성화를 사용하여 음수 값이 출력될 수 있습니다. 물리적 휘도는 항상 0 이상이어야 하므로, Softplus 활성화 함수로 변경합니다.
Softplus는 ReLU와 달리 0 근처에서 부드럽게 변화하여 그래디언트 소실 문제가 없고, 출력 범위가 [0, ∞)로 HDR 휘도 표현에 적합합니다.
Full FP32 강제화¶
기존 StyleGAN2는 메모리 효율을 위해 상위 해상도 레이어에서 FP16을 사용합니다. 하지만 HDR 이미지의 높은 동적 범위(10^-3 ~ 10^5 cd/m²)를 정확히 표현하려면 FP32가 필요합니다.
학습 설정에서 num_fp16_res=0으로 설정하여 모든 레이어가 FP32로 연산하도록 강제합니다. 또한 conv_clamp=None으로 설정하여 활성화 클램핑을 제거합니다.
M3: Stage 1 학습 (구조 학습)¶
Stage 1에서는 S2R-HDR 합성 데이터셋으로 HDR 파노라마의 구조적 특징을 학습합니다. 이 단계에서는 DTAM을 적용하지 않고 기본 GAN 손실과 LPIPS 지각적 손실만 사용합니다.
합성 데이터는 양이 풍부하고 다양한 장면을 포함하므로 구조 학습에 적합합니다. 다만 절대 휘도 스케일이 실측 데이터와 다를 수 있어 물리적 정합성은 Stage 2에서 보정합니다.
주요 설정: - 데이터셋: S2R-HDR - 해상도: 512×1024 - 정밀도: Full FP32 - 활성화: Softplus - DTAM: OFF
M4: Stage 2 학습 (물리 보정)¶
DTAM 가중치 함수 구현¶
training/dtam.py에 DTAM 클래스를 구현합니다. 입력 휘도에 따라 가중치를 계산하며, 전이 구간(300~1000 cd/m²)에서 가중치가 점진적으로 증가하는 S자 곡선을 따릅니다.
기본 파라미터는 T_onset=300, T_peak=1000, α=9.0, γ=2.0입니다. 이 값들은 DGP 계산의 특성에 맞게 설정되었으며, 필요에 따라 조정할 수 있습니다.
PU21 인코딩 구현¶
training/pu21.py에 PU21 인코더를 구현합니다. 물리적 휘도를 지각적으로 균일한 값으로 변환하여 손실 함수가 인간 시각 특성에 맞게 오차를 측정하도록 합니다.
물리 손실 함수¶
물리 손실(L_phys)은 DTAM 가중치와 PU21 인코딩을 결합합니다. 예측 휘도와 정답 휘도를 각각 PU21로 인코딩한 후, DTAM 가중치를 곱한 L1 손실을 계산합니다.
S2R-Adapter 구현¶
Stage 1에서 학습된 구조적 지식을 보존하면서 물리적 보정을 수행하기 위해 S2R-Adapter를 사용합니다. 원본 레이어의 가중치는 동결하고, 2-브랜치 구조(공유 + 전송)의 전송 브랜치만 학습합니다:
공유 브랜치: 원본 가중치 동결 (Stage 1 지식 보존)
전송 브랜치:
- Transfer1 (r1=1): 전역적 도메인 이동
- Transfer2 (r2=128): 세밀한 도메인 적응
스케일링 계수 (scale1, scale2):
- 일반 모드: 고정값 또는 학습 가능 파라미터
- TTA 모드: 입력 불확실성에 따라 동적 조절 (선택적)
2-브랜치 구조로 전체 파라미터의 약 7-8%만 학습하면서도 효과적인 보정이 가능합니다.
일관성 손실¶
Stage 2 학습 중 구조가 과도하게 변형되는 것을 방지하기 위해 일관성 손실(L_consist)을 추가합니다. Stage 1 모델과 Stage 2 모델의 출력을 톤매핑한 후 LPIPS로 비교합니다.
M5: 검증 파이프라인¶
추론 워크플로우¶
학습된 모델로 원형어안 HDR 파일을 생성하는 파이프라인을 구현합니다. 전체 워크플로우는 다음과 같습니다:
- Generator가 512×1024 Equirectangular HDR 생성
- 전방 180° 영역을 512×512로 크롭
- SwinIR로 1024×1024로 업스케일
- Angular Fisheye 프로젝션으로 변환
- Radiance HDR 형식으로 저장 (VIEW 헤더 포함)
생성된 HDR 파일에는 evalglare가 인식할 수 있도록 -vta -vv 180 -vh 180 VIEW 헤더가 삽입됩니다. evalglare 실행은 사용자가 직접 수행합니다.
M6: 평가 지표¶
물리적 정합성 메트릭¶
DGP 계산의 정확도를 평가하기 위해 다음 메트릭을 구현합니다:
- ΔEv (수직 조도 오차율): 목표 <10%. 파노라마 전체에서 수직면에 입사하는 조도를 적분하여 계산합니다.
- RMSE_trans (전이 구간 RMSE): 300~1000 cd/m² 영역의 휘도 오차. DGP에 가장 큰 영향을 미치는 구간입니다.
- DGP 등급 분류 정확도: Imperceptible/Perceptible/Disturbing/Intolerable 4등급 분류의 일치율.
4. 수정 및 생성 파일 요약¶
수정 대상 파일¶
| 파일 | 수정 내용 |
|---|---|
training/dataset.py |
HDRPhysicalDataset 클래스 추가 |
training/networks.py |
ToRGBLayerHDR 클래스 추가, SynthesisBlock HDR 모드 지원 |
training/loss.py |
PhysicalLoss, ConsistencyLoss 클래스 추가 |
train.py |
HDR 물리 모드 설정 추가 |
신규 생성 파일¶
| 파일 | 내용 |
|---|---|
training/dtam.py |
DTAM 가중치 함수 |
training/pu21.py |
PU21 인코딩 |
training/s2r_adapter.py |
S2R-Adapter (2-브랜치 도메인 적응) |
train_stage1.py |
Stage 1 학습 스크립트 |
train_stage2.py |
Stage 2 학습 스크립트 |
inference/validation_pipeline.py |
검증 파이프라인 |
inference/super_resolution.py |
SwinIR 초해상도 |
metrics/physical_metrics.py |
물리적 평가 메트릭 |
data_preprocessing/prepare_datasets.py |
데이터 전처리 |
5. 구현 순서¶
Phase 1: 데이터 인프라¶
- FP32 데이터 로더 구현
- 데이터 전처리 파이프라인 구현
Phase 2: 모델 수정¶
- Softplus 활성화 함수 추가
- Generator 출력층 수정
- FP32 강제화 설정
Phase 3: 핵심 기술¶
- DTAM 가중치 함수
- PU21 인코딩
- Physical Loss 함수
- S2R-Adapter
- Consistency Loss
Phase 4: 학습 스크립트¶
- Stage 1 학습 스크립트
- Stage 2 학습 스크립트
Phase 5: 검증¶
- SwinIR 통합
- Validation Pipeline
- 평가 메트릭