[CV] 이미지 유사성 평가 지표 SSIM 정리
최근에 학위보고서를 하나 쓰면서 이미지와 적대적 공격에 대한 작업을 진행했는데, 그 중 적대적 공격의 성능 평가지표로 많은 논문들이 사용하는 SSIM 지표에 대해 정리해보고자 한다.
https://ieeexplore.ieee.org/document/1284395
Image quality assessment: from error visibility to structural similarity
Objective methods for assessing perceptual image quality traditionally attempted to quantify the visibility of errors (differences) between a distorted image and a reference image using a variety of known properties of the human visual system. Under the as
ieeexplore.ieee.org
IEEE에 로그인해서 그 논문을 확인할 수 있다. 간혹 아이디가 없다면 이런 유명 논문들은 다른 사이트에서도 쉽게 읽을 수 있다.
SSIM의 논문을 읽어보면 이미지의 품질을 평가하기 위해 만든 지표라고 설명한다. 논문에선 Original Image와 이를 약간 조작한 이미지들을 예시로 설명을 했는데, 이로 미루어보아 이미지의 "품질"이란 해상도를 의미하는 것이 아니라 구조적, 기능적인 품질을 의미한다고 보인다. 실제로 SSIM의 약자가 Structural Similarity Index Measure 이다. 2004년 당대의 학계 흐름까지는 전혀 몰라서 이런 식으로 추측할 수밖에 없고, 당시 다른 지표들을 제치고 SOTA의 성능을 보였다고 한다.
그리고 23년에 나온 FacePosion이라는 논문에서 SSIM을 평가 지표 중 하나로 유의미하게 사용하고 있는 예시이며, 내가 논문을 작성하면서 봤던 많은 논문들이 SSIM지표를 최근까지도 채용하고 있는 모습이다.
문제는 이 SSIM의 수식이 상당히 길고 복잡하다는 것이다. (논문의 3.B에 설명되어있음) 그래서 원 논문을 잘 설명해놓은 내가 좋아하는 Medium 사이트의 글 하나를 같이 보면서 설명하고자 한다.
https://jack-roubaud.medium.com/working-with-structural-similarity-index-86ace619f408
Working with Structural Similarity Index
SSIM is a key method to compare 2 images and can be used as a Loss function when training autoencoders
jack-roubaud.medium.com
이 글은 원본 이미지와 변형 이미지의 유사도를 학습하는 과정에서 Loss Function으로 SSIM을 활용하는 것이 좋다고 설명하고 있다.
원 논문의 긴 수식 전개를 결과로 요약하자면 위와 같다. 기초적인 수식은 건너뛰고, x와 y는 비교하고자 하는 두 이미지다. c가 문젠데, 위 글에서는 각 이미지의 채널의 개수라고 설명하지만 논문에서는 안정화 상수(분모 혹은 분자가 0이 되는 것을 방지하는)의 개념에 더 가깝게 설명하고 있다.
where the constant C1 is included to avoid instability when µ 2 x + µ 2 y is very close to zero. Specifically, we choose C1 = (K1 L)^2 , (7) where L is the dynamic range of the pixel values (255 for 8-bit grayscale images), and K1 << 1 is a small constant.
논문의 설명에 의하면 L은 255, K1은 0보다 매우 작은 상수(다른 자료를 참고했을 때 0.01 혹은 0.03)라고 하니 C1은 보통 10이하(특히 1에서 5사이)인 것으로 보이지만, 아무튼 Medium의 설명처럼 채널의 개수라고 이해하는 것은 틀린 부분이 있을 수 있으므로 정정하고자 한다.
논문에서도 수식의 복잡함을 인지하여 단순화를 위해 기호 몇 개를 통일시키는 부분이 있다. 가령,
In order to simplify the expression, we set α = β = γ = 1 and C3 = C2/2 in this paper.
같은 구문을 통해서 간소화를 많이 진행했음을 알 수 있다. 여하튼 그래서 뭐가 그렇게 복잡하냐를 봐야 할텐데, 아무래도 이 글에 다 담기는 무리일 것 같고 논문의 그림 하나를 인용해서 말로 설명하고자 한다.
1. Luminance Measuremnet 및 Luminance Comparison
이는 밝기 측정 및 비교를 의미하는데, 다음 수식으로 측정된다. $l(\mathbf{x}, \mathbf{y}) = \frac{2\mu_x \mu_y + C_1}{\mu_x^2 + \mu_y^2 + C_1}$
이미지 값들의 평균을 사용하는 것을 알 수 있다.
2. Contrast Measuremnt 및 Contrast Comparison
이는 대비 측정 및 비교를 의미하는데, 다음 수식으로 측정된다. $c(\mathbf{x}, \mathbf{y}) = \frac{2\sigma_x \sigma_y + C_2}{\sigma_x^2 + \sigma_y^2 + C_2}$
여기선 표준편차를 사용하는 것을 알 수 있다.
3.Structure Comparison
이는 구조 비교를 의미하는데, 다음 수식으로 측정된다. $s(\mathbf{x}, \mathbf{y}) = \frac{\sigma_{xy} + C_3}{\sigma_x \sigma_y + C_3}.$
여기선 공분산 개념을 사용한다.
즉, SSIM은 두 이미지의 차이를 평균과 표준편차, 공분산과 같은 기초 통계적인 지식을 사용해 풀어낸 수식이라고 여겨진다.
최종 수식은 아래와 같다.
$\text{SSIM}(\mathbf{x}, \mathbf{y}) = [l(\mathbf{x}, \mathbf{y})]^\alpha \cdot [c(\mathbf{x}, \mathbf{y})]^\beta \cdot [s(\mathbf{x}, \mathbf{y})]^\gamma,$
여기서 $\alpha, \beta, \gamma$는 편의를 위해 1로 통일하고, $C_3$ 또한 $C_2$을 2로 나누어 대입한다고 저자들은 설명한다. 따라서 위에 작성된 최종 수식이 결과로 나오게 되는 것이다.
나같은 경우엔 이미지를 적대적 공격한 후 원본 이미지와 얼마나 유사한지를 측정할 때 사용했는데, 이 외에도 다양한 경우에 적용할 수 있는 지표로 생각된다.
파이썬에서는 싸이킷런의 structural_similarity로 사용할 수 있다.
from skimage.metrics import structural_similarity as ssim
ssim_value = ssim(image1, image2, data_range=255, K1=0.01, K2=0.03)
한 줄 정리 : SSIM은 두 이미지를 각 이미지의 평균과 표준편차, 그리고 두 이미지의 공분산을 통해 얻어낼 수 있다.