はじめに
前回の記事では、MVTec-Anomaly-Detection をデモ通りに動かしました。
今回は、エポック数や損失関数を変化させて、その結果を確認していきます。
前提条件
前提条件は以下の通りです。
- Tensoflow == 2.9.3
- numpy == 1.23.5
- ktrain == 0.33.2
- Windows11
- Python3.10
学習条件の変更方法
エポック数は、autoencoder/autoencoder.py の 257行目付近を変更します。
# fit model using Cyclical Learning Rates
self.hist = self.learner.autofit(
lr=lr_opt,
epochs=100,
early_stopping=None,
reduce_on_plateau=self.reduce_on_plateau,
reduce_factor=2,
cycle_momentum=True,
max_momentum=0.95,
min_momentum=0.85,
monitor="val_loss",
checkpoint_folder=None,
verbose=self.verbose,
callbacks=[tensorboard_cb],
)
epochs は好きな数字を入れてください。
epochs = 100 で実施
前回と同じコマンドで実施します。
python train.py -d data/bottle -a mvtecCAE -b 12 -l ssim -c grayscale
時間はかかりますが、結果を待ちましょう。
続いて、ファインチューニングを実行します。
python .\finetune.py -p .\saved_models\data\bottle\mvtecCAE\ssim\15-02-2023_14-21-01\mvtecCAE_b12_e0.hdf5 -m ssim -t float64
最後に、テストを実行します。
python .\test.py -p .\saved_models\data\bottle\mvtecCAE\ssim\15-02-2023_14-21-01\mvtecCAE_b12_e0.hdf5
結果は、score = 0.16 程度でした…
エラーの原因
エラーの原因は、test.py にありました。しかも Windows 限定です。
test.py の 25 行目を修正してください。
def get_true_classes(filenames):
# retrieve ground truth
y_true = [1 if "good" not in filename.split("/")[0][:4] else 0 for filename in filenames]
return y_true
これで、ラベル付けが正確になります。
再度実行してみましょう。
結果は以下のようになります。
test results: {
'min_area': 10,
'threshold': 0.9700000000000008,
'TPR': 0.5079365079365079,
'TNR': 1.0,
'score': 0.753968253968254,
'method': 'ssim',
'dtype': 'float64'
}
良さそうです!
検出結果を保存
Linux であれば test.py の引数に -s を指定すれば保存されますが、Windowsではそうはいきません。
test.py の 50 行目付近を以下のように修正してください。
def save_segmented_images(resmaps, threshold, filenames, save_dir):
# threshold residual maps with the given threshold
resmaps_th = resmaps > threshold
# create directory to save segmented resmaps
seg_dir = os.path.join(save_dir, "segmentation")
print(seg_dir)
import shutil
if os.path.isdir(seg_dir):
shutil.rmtree(seg_dir)
if not os.path.isdir(seg_dir):
os.makedirs(seg_dir)
os.makedirs(seg_dir+"/defect")
os.makedirs(seg_dir+"/good")
# save segmented resmaps
for i, resmap_th in enumerate(resmaps_th):
fname = utils.generate_new_name(filenames[i], suffix="seg")
fpath = os.path.join(seg_dir, fname)
plt.imsave(fpath, resmap_th, cmap="gray")
return
また、data/bottle/test 内の good 以外のフォルダの画像を defect フォルダにまとめてください。
この状態で test.py を実行すると、results/data/bottle/mvtecCAE/ssim/日付/test/ssim_float64/segmentation に画像が保存されます。
出力画像を並べると、以下のようになります。
正確に位置を取得できていますね。
おわりに
今回はエラー修正というか、Windows 対応がメインとなりました。
次回は、カスタムデータで MVTec-Anomaly-Detection をテストする方法について説明します。
コメント