画像の異常検知 MVTec-Anomaly-Detection の出力画像を保存【Python】

AI
スポンサーリンク

スポンサーリンク

はじめに

前回の記事では、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 をテストする方法について説明します。

コメント

タイトルとURLをコピーしました