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がが出てますね。
車のフロントガラスは一部黒くなってるので左右の画像で同じ輝度だという事が分かる。
window sizeを5にした場合
window sizeを7にした場合
window sizeを9にした場合
結論
なにが正しいのか正直確認するのが難しいのですが、コメント頂けると幸いです!
参考文献
https://github.com/mrharicot/monodepth/blob/b76bee4bd12610b482163871b7ff93e931cb5331/monodepth_model.py#L98
Structural similarity
https://en.wikipedia.org/wiki/Structural_similarity
Author And Source
この問題について(SSIMを修正してみた), 我々は、より多くの情報をここで見つけました https://qiita.com/minh33/items/686ba470e1d9e383501c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .