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

좋은 웹페이지 즐겨찾기