SSIM을 Pytorch로 작성했습니다.
개요
Stereo Matching에서 Disparity의 정밀도를 확인하기 위해 SSIM이 잘 사용되고 있지만, git에서 찾은 코드가 SSIM의 값이 0 ~ 1에 맞지 않았기 때문에 스스로 쓰려고했다.
SSMI 계산
padding하면 SSIM의 결과가 나빠질 것 같았기 때문에 끝을 clipping했다
입력의 x와 y는 비교 대상으로 쪽은 Torch Tensor.
def SSIM(self, x, y,window_size=3):
C1 = 0.01 ** 2
C2 = 0.03 ** 2
clip_size = (window_size -1)/2
mu_x = nn.functional.avg_pool2d(x, window_size, 1, padding=0)
mu_y = nn.functional.avg_pool2d(y, window_size, 1, padding=0)
x = x[:,:,clip_size:-clip_size,clip_size:-clip_size]
y = y[:,:,clip_size:-clip_size,clip_size:-clip_size]
sigma_x = nn.functional.avg_pool2d((x - mu_x)**2, window_size, 1, padding=0)
sigma_y = nn.functional.avg_pool2d((y - mu_y)** 2, window_size, 1, padding=0)
sigma_xy = (
nn.functional.avg_pool2d((x- mu_x) * (y-mu_y), window_size, 1, padding=0)
)
mu_x = mu_x[:,:,clip_size:-clip_size,clip_size:-clip_size]
mu_y = mu_y[:,:,clip_size:-clip_size,clip_size:-clip_size]
SSIM_n = (2 * mu_x * mu_y + C1) * (2 * sigma_xy + C2)
SSIM_d = (mu_x ** 2 + mu_y ** 2 + C1) * (sigma_x + sigma_y + C2)
SSIM = SSIM_n / SSIM_d
loss = torch.clamp((1 - SSIM) , 0, 2)
save_image(loss, 'SSIM_GRAY.png')
return torch.mean(loss)
Stereo Matching의 정확도를 계산할 때
입력의 왼쪽 이미지
오른쪽 이미지를 추정한 Disparity를 사용하여 워프한 이미지
내 눈에는 똑같이 보이지만 SSIM은 어떻게 될까
SSIM의 loss
texture가 없는 영역이 하얗게 되어 있다. 분명 disparity의 추정 정밀도가 낮았을 것이다.
* 하얀 곳이 loss가 높다. 검은 곳이 loss가 0
입력을 같은 이미지로 만들면
물론 loss는 0!
왼쪽 이미지와 오른쪽 이미지를 입력하면
물체가 있는 장소는 제대로 loss가 나오네요.
자동차의 앞유리는 일부 검게되어 있기 때문에 좌우의 이미지에서 같은 휘도라는 것을 알 수 있다.
window size를 5로 설정하면
window size를 7로 설정하면
window size를 9로 하면
결론
분명 맞다고 생각합니다만, 잘못되면 지적해 주세요!
참고문헌
htps : // 기주 b. m / mr riko t / 물로 pth / bb / b76 bee 4bd12610b482163871b7 ~ f93 931cb5331 / 물로 pth_도 l. py#L98
Structural similarity
htps // 엔.ぃきぺぢ아. 오 rg / うぃき / St ru c
Reference
이 문제에 관하여(SSIM을 Pytorch로 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/minh33/items/edbf6d5e7e01e91a0d81
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def SSIM(self, x, y,window_size=3):
C1 = 0.01 ** 2
C2 = 0.03 ** 2
clip_size = (window_size -1)/2
mu_x = nn.functional.avg_pool2d(x, window_size, 1, padding=0)
mu_y = nn.functional.avg_pool2d(y, window_size, 1, padding=0)
x = x[:,:,clip_size:-clip_size,clip_size:-clip_size]
y = y[:,:,clip_size:-clip_size,clip_size:-clip_size]
sigma_x = nn.functional.avg_pool2d((x - mu_x)**2, window_size, 1, padding=0)
sigma_y = nn.functional.avg_pool2d((y - mu_y)** 2, window_size, 1, padding=0)
sigma_xy = (
nn.functional.avg_pool2d((x- mu_x) * (y-mu_y), window_size, 1, padding=0)
)
mu_x = mu_x[:,:,clip_size:-clip_size,clip_size:-clip_size]
mu_y = mu_y[:,:,clip_size:-clip_size,clip_size:-clip_size]
SSIM_n = (2 * mu_x * mu_y + C1) * (2 * sigma_xy + C2)
SSIM_d = (mu_x ** 2 + mu_y ** 2 + C1) * (sigma_x + sigma_y + C2)
SSIM = SSIM_n / SSIM_d
loss = torch.clamp((1 - SSIM) , 0, 2)
save_image(loss, 'SSIM_GRAY.png')
return torch.mean(loss)
분명 맞다고 생각합니다만, 잘못되면 지적해 주세요!
참고문헌
htps : // 기주 b. m / mr riko t / 물로 pth / bb / b76 bee 4bd12610b482163871b7 ~ f93 931cb5331 / 물로 pth_도 l. py#L98
Structural similarity
htps // 엔.ぃきぺぢ아. 오 rg / うぃき / St ru c
Reference
이 문제에 관하여(SSIM을 Pytorch로 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/minh33/items/edbf6d5e7e01e91a0d81
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(SSIM을 Pytorch로 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/minh33/items/edbf6d5e7e01e91a0d81텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)