SSIM을 수정해 보았습니다.

부탁



stereo matching loss를 계산하기 위해 SSIM(Structure Similarity)를 사용하려고 하고, git 스스로 수정해 보았다.

이 Github는 논문의 저자의 git에서 논문도 꽤 유명하기 때문에, 잘못되었는지 의심스러워도 git의 코드가 굉장하거나, 나의 수정이 잘못되면 지적해 주시면 다행입니다!

본가의 코드



sigma의 계산이 모두 잘못되었다고 생각합니다.
    def SSIM(self, x, y):
        C1 = 0.01 ** 2
        C2 = 0.03 ** 2

        mu_x = slim.avg_pool2d(x, 3, 1, 'VALID')
        mu_y = slim.avg_pool2d(y, 3, 1, 'VALID')

        sigma_x  = slim.avg_pool2d(x ** 2, 3, 1, 'VALID') - mu_x ** 2
        sigma_y  = slim.avg_pool2d(y ** 2, 3, 1, 'VALID') - mu_y ** 2
        sigma_xy = slim.avg_pool2d(x * y , 3, 1, 'VALID') - mu_x * mu_y

        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

        return tf.clip_by_value((1 - SSIM) / 2, 0, 1)

수정 후 코드



여러가지 변경을 더해 버렸습니다만 기본적 변경은 sigma의 곳만
    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 / b / b / b76 bee 4bd12610b482163871b7 ~ f93 931cb5331 / 물로 pth_도 l. py#L98
Structural similarity
htps // 엔.ぃきぺぢ아. 오 rg / うぃき / St ru c

좋은 웹페이지 즐겨찾기