深層学習に使うデータセットを準備しているとき、解像度の高い画像からランダムクロップでデータ数を増やしたりするんですが、たまたま真っ黒な背景の部分だけ切り取ってきたりした場合は、あまり学習データとして良くない気がします(実は必要なのかもしれませんが…)。
また、ノイズ除去とかで、劣化画像と原画像のペアを用意する場合、平坦な部分などほとんど違いが感じられない場合もあるので、2枚の画像を比べてどれくらい違っているかの指標も必要かと思います。
前者は画素値の分散を計算して閾値以下のものをはじくといったのでも良いかと思いますが、画像の複雑さとしてはエントロピーを計算するのもいいかなと思いますので、その辺を計算してみます。
後者はMAE(Mean Absolute Error)、MSE(Mean Squared Error)、PSNR(Peak Signal-to-Noise Ratio)などが有名かと思いますが、SSIM(Structural Similarity)というものが最近?はよく使われているようですので、それも試してみることにしました。
1. エントロピー[1]~[4]
画像のエントロピーというと、その画素値がどれくらいの頻度で発生しているかを確率としてみて、単色なら0、全色均等に使われている場合は最大値になるような指標です。ヒストグラムを計算して、合計1になるように正規化して後はlogとって掛け算するだけですね。RGBだけではなく、例えばグレースケール画像は除きたい場合などもあると思うので、HSVでも計算してみました。
2. SSIM[5]~[7]
ガウスでぼかして近傍との分散を計算しないといけないみたいで、計算量が多そうです。OpenCVで実装サンプル[8]がそのままありましたので、使わせていただきました。こちらもRGBとHSVで計算してみました。
実行結果
pix2pix用にDIV2K dataset[9]からランダム切り出しして原画像(左)/JPEG圧縮画像(右)のペアを作っています。JPEGで劣化させた場合はブロックノイズのせいでエントロピーは下がるかな、と思いましたが、画像によるみたいですね。
論文等でよく見る蝶々の一部ですね。拡大しないとあまり違いが分かりませんが、類似度は高くないようです。
空の一部?です。割と違っているように見えますが、PSNRもSSIMも高いですね。こちらはJPEG圧縮で減色状態になったのか分散はほぼ一緒ですがエントロピーが結構下がっています。類似度が高くてもエントロピーに差があるので学習に使う、というのもありかもしれません。
深層学習ではロスの計算にL1LossやMSEが良く使われていますが、SSIM使うとどうなるのか試してみようかなと思います。
[1] 平均情報量 Entropy
[2] 平均情報量の性質(3章)(pdf)
[3] 画像のエントロピーをpythonで求めてみた
[4] 医用画像工学実験 -画像の情報量 編- (pdf)
[5] SSIMとは何か?その3
[6] 画質評価アラカルト
[7] Googleが薦める「Jpegの品質は85」を検証する
[8] OpenCV Tutorial Video Input PSNR SSIM
[9] DIV2K dataset