#はじめに
オートエンコーダーのSSIMの実装方法を整理します。
#SSIMとは
SSIM(Structural Similarity Index Measure)とは、2004年に発表された画像の類似度を測定する指標です。
オートエンコーダーの課題の中で、オリジナル画像から作られる生成画像が鮮明ではない特徴があります。英語ではBlurred Generated Imageといいます。この場合、小さい異常の検知が難しい問題があります。
既存のオートエンコーダーには**mse(mean squared error)**を損失関数として使い、どうしても鮮明ではない画像しか作られませんでした。ところで、SSIMを損失関数として使ったら、**より鮮明な生成画像が得られ、**結果的に異常検知のOK/NGの判別性能が向上する結果となりました。めでたしめでたし。
#2.実装の手順
学習フェーズと推論フェーズに分けて説明します。
##2.1.学習フェーズ
SSIMのカスタマイズ損失関数の定義
Tensorflowのtf.image.ssim
関数を利用し、ssim_loss()
のカスタム損失関数を定義します。
パラメータ設定には、float32
とuint8
によって異なりますので、それに関してはTensorflowのドキュメントを参照してください。
import tensorflow as tf
def ssim_loss(y_true, y_pred):
return 1-tf.reduce_mean(tf.image.ssim(y_true, y_pred,
max_val = 1.0,filter_size=11,
filter_sigma=1.5, k1=0.01, k2=0.03 ))
###Compileにlossとして指定
autoencoderというmodelを用意します。
mse
と使うcompile文と、ssim_loss
を使うcompile文を併記しますので、参考にしてください。
SSIMは、このコードを使えば、問題なく学習ができます。
#損失関数 mse
autoencoder.compile(optimizer = 'adam', loss = 'mse')
#損失関数 SSIM
autoencoder.compile(optimizer = 'adam', loss = ssim_loss)
##2.2.推論フェーズ
学習したモデル(h5ファイル)を読み込む時、「このモデルはSSIMというカスタム損失関数を使ってるよ」とプログラムに教える必要があります。
例えば、autoencoder-ssim.h5
とうモデルを読み込む場合は、下記のようにコードを書きます。
###load_modelの追記
from tensorflow.keras.models import load_model
loaded_model = load_model('autoencoder-ssim.h5', custom_objects={'ssim_loss':ssim_loss}
custom_objects
部分を見てみましょう。
custom_objects={'ssim_loss':ssim_loss}
最初の'ssim_loss'は、autoencoder.compile(optimizer = 'adam', loss = ssim_loss)のloss='ssim_loss'
のことです。
2番目のssim_lossはカスタム損失関数名
になります。
###SSIM関数の記述
上記の理由で、推論のコードにもカスタム損失関数
を記述します。学習用のコードに書いた同じカスタム損失関数を書けばOKです。
def ssim_loss(y_true, y_pred):
return 1-tf.reduce_mean(tf.image.ssim(y_true, y_pred,
max_val = 1.0,filter_size=11,
filter_sigma=1.5, k1=0.01, k2=0.03 ))
これで問題なく、SSIMの学習モデルを読み込み、新しいデータでの推論が可能です。
#まとめ
SSIMのカスタム関数を用いた、オートエンコーダーの学習・推論のコードの実装方法について解説しました。
#参考資料
1.Improving Unsupervised Defect Segmentation by Applying Structural Similarity to Autoencoders
https://arxiv.org/abs/1807.02011
2.【論文読み】新・オートエンコーダで異常検知
https://qiita.com/shinmura0/items/ee074172ec3c818b614e