렌더링된 뷰(합성된 이미지)를 평가하는 데 사용된 네 가지 주요 평가 지표(PSNR, SSIM, LPIPS, MAE/L1)에 대해 수식과 개념
1. PSNR (Peak Signal-to-Noise Ratio, 피크 신호 대 잡음비)
• PSNR은 원본 이미지와 합성된 이미지 간의 오차를 역으로 나타내는 지표로, 두 이미지가 얼마나 유사한지를 측정한다.
• 신호(signal)는 원본 이미지의 정보, 잡음(noise)는 합성된 이미지의 오류로 간주된다.
• 높은 PSNR 값은 원본과 합성된 이미지가 매우 유사하다는 것을 의미한다.
• 단위: 데시벨(dB)
• PSNR 값이 30dB 이상이면 품질이 우수하다고 간주
PSNR은 영상 화질 손실양을 평가하기 위해 사용되는 지표, 이미지 저장, 전송, 압축, 영상 처리 등에서 영상 화질이 바뀌었을 때 사용된다.
수식
PSNR은 MSE (Mean Squared Error)를 기반으로 계산한다:
1. MSE (Mean Squared Error):
\(\text{MSE} = \frac{1}{MN} \sum_{i=1}^{M} \sum_{j=1}^{N} \left( I(i, j) - K(i, j) \right)^2\)
- I(i, j) : 원본 이미지의 픽셀 값
- K(i, j): 합성된 이미지의 픽셀 값
- M, N : 이미지의 width가로, height세로 크기 (픽셀 수)
2. PSNR:
\(\text{PSNR} = 10 \cdot \log_{10}\left(\frac{\text{MAX}^2}{\text{MSE}}\right)\)
- MAX: 이미지 픽셀 값의 최대값 (예: 8비트 이미지는 255)
- MAX는 1개 픽셀당 갖고 있는 정보량(흑백 : 255, RGB : 255x3, RGBA : 255x4)을 나타냅니다. -> MSE를 픽셀 정보량으로 Scale을 변경(Normalization)한다고 생각 할 수 있다.
- 픽셀간의 단순 오차를 나타내는 것이 MSE이고, MSE의 Scale을 변경(Normalization) 한 것이 PSNR라고 생각 할 수 있다.
2. SSIM (Structural Similarity Index Measure, 구조적 유사성)
• SSIM은 두 이미지의 구조적 유사성을 측정하며, 인간의 시각적 인식을 반영한다.
• 단순한 픽셀 차이뿐만 아니라, 명암, 대비, 구조적 패턴을 함께 고려한다.
• SSIM 값은 에서 사이의 값을 가지며, 에 가까울수록 유사성이 높다.
• SSIM은 구조적 품질을 평가하며, PSNR이 놓칠 수 있는 시각적 품질을 보완한다.
높을수록 좋음
수식
SSIM은 세 가지 항목(밝기, 대비, 구조)을 결합하여 계산한다:
1. SSIM:
\(\text{SSIM}(I, K) = \frac{(2\mu_I\mu_K + C_1)(2\sigma_{IK} + C_2)}{(\mu_I^2 + \mu_K^2 + C_1)(\sigma_I^2 + \sigma_K^2 + C_2)}\)
- \(\mu_I, \mu_K\) : 각각 원본 이미지 I와 합성된 이미지 K의 평균값
- \(\sigma^2_I, \sigma^2_K\) : 각각 I와 K의 분산
- \(\sigma_{IK}\) : 와 간의 공분산
- \(C_1, C_2\) : 안정성을 위한 작은 상수
- 두 이미지(x, y) 간의 상관계수를 Luminance(휘도), Contrast(대비), Structure(구조) 총 3가지 측면에서 평가합니다. (α=β=γ=1)
휘도는 빛의 밝기, 대비는 밝기 차이, 구조는 상관관계를 나타냅니다. - 이미지 내 픽셀의 평균, 표준편차, 공분산(covariance)로 위 3개값을 계산 할 수 있습니다.
- C의 경우, 아래와 같은 수식으로 계산이 되는데, K1=0.01, K2=0.03이고 L은 픽셀당 갖고 있는 정보량(흑백 : 255, RGB : 2553, RGBA : 2554)입니다. PSNR의 MAX값과 같은 역할을 합니다.
3. LPIPS (Learned Perceptual Image Patch Similarity, 학습된 지각 이미지 패치 유사성)
• LPIPS는 딥러닝 모델(예: VGG-16)로 학습된 지각적 차이를 측정한다.
• 픽셀 단위의 계산 대신, 이미지의 고수준 특징을 기반으로 두 이미지의 품질을 평가한다.
• 값이 낮을수록 두 이미지 간의 차이가 적음을 의미한다.
• LPIPS는 인간의 시각적 인식과 유사한 방식으로 이미지 품질을 평가한다.
• 고급 네트워크를 사용해 더 정교한 비교를 가능하게 한다.
계산 방식
1. 원본 이미지와 합성된 이미지를 딥러닝 모델의 중간 계층을 통과시켜 feature 추출.
2. 두 이미지의 특징 간 유클리드 거리를 계산 :
\(\text{LPIPS}(I, K) = \sum_l w_l \cdot \| \phi_l(I) - \phi_l(K) \|^2\)
- l : 딥러닝 모델 계층
- \(\Phi_l\) : 번째 계층의 특징 추출 함수
- \(w_l\) : 각 계층에 대한 가중치
✅ 1. VGG의 requires_grad = False 를 해야 하는 이유
왜 백프롭(gradient 계산)을 막아야 할까?
• VGG는 ImageNet에서 미리 학습된 Feature Extractor예요.
• 우리는 VGG를 Loss 계산용으로만 사용하지, 학습 대상으로 삼지 않아요.
• 만약 requires_grad = True로 두면?
• 불필요한 gradient 계산이 이뤄지고 → 메모리 낭비 + 연산 낭비
• 심지어 실수로 VGG까지 업데이트될 위험도 있어요 (원래 의도가 아님).
for param in self.vgg_layers.parameters():
param.requires_grad = False # VGG는 고정, 학습 안 함
✅ 2. VGG 입력은 ImageNet 정규화가 필요한 이유
• VGG는 ImageNet 데이터로 학습된 모델이기 때문에,
• 학습 당시의 입력 분포와 같은 분포로 input이 들어와야 **의미 있는 특징(feature)**을 추출해줘요.
VGG는 RGB 이미지의 각 채널에 대해 다음과 같은 평균과 표준편차로 정규화된 데이터를 학습했어요:
mean = [0.485, 0.456, 0.406] # R, G, B
std = [0.229, 0.224, 0.225]
📌 예를 들어:
• normalized = (image - mean) / std
• 정규화 안 하면 → VGG가 예상 못한 입력을 받아서 이상한 feature를 추출하게 돼요 → Loss 계산이 무의미해질 수 있음.
4. MAE (Mean Absolute Error, 평균 절대 오차)
• MAE는 두 이미지의 픽셀 값 차이의 절대값 평균을 계산한다.
• 값이 낮을수록 두 이미지가 더 유사하다.
• 계산이 간단하고 직관적이다.
• 픽셀 단위의 차이를 평가하기 위해 주로 사용된다.
수식
\(\text{MAE} = \frac{1}{MN} \sum_{i=1}^{M} \sum_{j=1}^{N} |I(i, j) - K(i, j)|\)
- I(i, j) : 원본 이미지의 픽셀 값
- K(i, j): 합성된 이미지의 픽셀 값
- M, N : 이미지의 가로, 세로 크기 (픽셀 수)
5. 평가 방식
(1) 이미지 가장자리에서 15%를 잘라내는 이유
• 이미지 가장자리는 새로운 시점에서 보이지 않던 영역(비가시 영역)이 나타날 가능성이 높다.
• 이러한 영역은 정확히 예측하기 어려워, 평가에 영향을 줄 수 있다.
• 따라서, 가장자리 15%를 잘라내고 나머지 부분만 평가에 사용한다.
(2) 빈 픽셀이 15% 이상인 경우 결과 제외
• 합성된 이미지에서 빈 픽셀(정보가 없는 영역)이 많다면, 그 결과는 신뢰할 수 없다.
• 모든 기준 방법에서 공정성을 유지하기 위해 빈 픽셀이 15%를 초과하면 해당 결과는 평가에서 제외한다.
6. 추가적인 지표
위의 네 가지 이외에도 다음과 같은 지표들이 사용될 수 있다:
1. FID (Fréchet Inception Distance):
• 이미지의 품질과 다양성을 평가.
• 합성된 이미지와 실제 데이터셋 간 분포 차이를 측정.
2. RMSE (Root Mean Squared Error):
• MSE의 제곱근을 취해 계산.
• 오차를 더 민감하게 반영.
3. Perceptual Hashing:
• 이미지를 해싱하여, 시각적 유사성을 비교.
'AI > Computer Vision' 카테고리의 다른 글
[CV] 2D 3D 그래픽스 용어 총정리! (3) | 2025.03.04 |
---|---|
[CV] Xvfb 설정 nvidia-smi랑 연결, error, OpenGL 사용법 /pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None" (0) | 2025.01.30 |
[CV] DeepLabCut 설치 / 사용법 (2) | 2024.06.26 |
[CV] Few-shot learning 이란? (1) | 2024.06.18 |
[CV] 컴퓨터 화면 원점, 좌표 설정 (1) | 2024.06.07 |