はじめに
今までは、画像認識や物体認識、領域検出の方法について説明していきました。
これらはどれも、教師あり学習です。
そのため、学習データの準備や学習自体に非常に時間がかかっていました。
今回は、教師なし学習で画像の異常を検知する方法について説明していきます。
まずは、デモデータセットで結果を確認していきます。
前提条件
前提条件は以下の通りです。
- Tensoflow == 2.9.3
- numpy == 1.23.5
- ktrain == 0.33.2
- Windows11
- Python3.10
データの準備
まずは github から MVTec-Anomaly-Detection をダウンロードします。
git clone https://github.com/AdneneBoumessouer/MVTec-Anomaly-Detection.git
cd MVTec-Anomaly-Detection
mkdir data
次に、ここからデータをダウンロードします。※会員登録が必要です。
今回は screw と bottle をダウンロードしました。
ダウンロードしたファイルを先ほど作成した data フォルダに移動させてください。
Windowsでは、7zip で二度解凍するとファイルが取得できます。
Linux の場合は、
cd MVTec-Anomaly-Detection/data
tar -xvf screw.tar.xz
で解凍できます。
学習
学習するには、以下を実行してください。
python train.py -d data/bottle -a mvtecCAE -b 8 -l ssim -c grayscale
このまま動かすと、
KeyError: 'ssim'
というエラーが出ますので、修正していきます。
autoencoder/autoencoder.py の 153 行目付近を変更します。
# set metrics to monitor training
if color_mode == "grayscale":
self.metrics = [metrics.ssim_metric(self.dynamic_range)]
# self.hist_keys = ("loss", "val_loss", "ssim", "val_ssim")
self.hist_keys = ("loss", "val_loss")
elif color_mode == "rgb":
self.metrics = [metrics.mssim_metric(self.dynamic_range)]
# self.hist_keys = ("loss", "val_loss", "mssim", "val_mssim")
self.hist_keys = ("loss", "val_loss")
修正が完了したら、再度実行します。
python train.py -d data/bottle -a mvtecCAE -b 8 -l ssim -c grayscale
学習が始まって少し経過すると、以下のような画像が表示されます。
これは学習率と損失のグラフで、初期の学習率を決定する経過を表示しています。
学習が完了すると
saved_models/data/bottle/mvtecCAE/ssim/日付 フォルダに hdf5 ファイルが保存されます。
これを使用して、次はファインチューニングを実行します。
ファインチューニング
このファインチューニングでは、良品 / 不良品のしきい値を決定します。
python .\finetune.py -p .\saved_models\data\bottle\mvtecCAE\ssim\14-02-2023_21-16-56\mvtecCAE_b36_e6.hdf5 -m ssim -t float64
これも実行すると、以下のような画像が表示されます。
best threshold = 0.9840 は、しきい値となります。
もう一枚、画像が表示されます。
これは、スコアとなります。今回は、0.78 がベストスコアとなりました。
テスト
学習結果を使用してテストします。
python test.py -p .\saved_models\data\bottle\mvtecCAE\ssim\14-02-2023_21-16-56\mvtecCAE_b36_e6.hdf5
実行が完了すると、最下行に
test results: {
'min_area': 25,
'threshold': 0.9840000000000008,
'TPR': 0.27710843373493976,
'TNR': 0.0,
'score': 0.13855421686746988,
'method': 'ssim',
'dtype': 'float64'
}
と表示されます。score が全然良くないですね…。
※原因が判明しました。次回改善方法を説明します。
おわりに
今回は画像の異常検知を行う MVTec-Anomaly-Detection をテストしました。
score が良くない原因は autoencoder の学習に autofit を用いていることが原因かもしれないので、
次回はエポックを増やして結果がどうなるか確認できればと思います。
バッチサイズも関わっているかもしれません。
コメント