教師なし異常検知で正確な位置推定ができる FastFlow を試してみる【Python】

AI
スポンサーリンク
スポンサーリンク

はじめに

前回までは、SPADE, PaDiM, PatchCore について説明しました。

今回は、最新であり、高精度かつ位置検出も可能な FastFlow についてデモを試していきます。

前提条件

前提条件は以下の通りです。

  • python3.9
  • pytorch == 1.12.1+cu113
  • pytorch-ignite == 0.2.0
  • MVTec-AD に会員登録してある (データセットの準備に必要)

下記コマンドで、FrEIA を pip install します。

python -m pip install FrEIA@git+https://github.com/VLL-HD/FrEIA@1779d1fba1e21000fda1927b59eeac0a6fcaa284

データセットの準備

まず始めに、FastFlow を git でダウンロードします。
git のページはこちらです。

mkdir FastFlow-dev
cd FastFlow-dev
git clone https://github.com/gathierry/FastFlow.git

デモを試すにあたって、データセットを準備していきます。

MVTec-AD のページはこちらです。
全部ダウンロードすると重いので、 bottle, cable のみダウンロードします。

ダウンロードしたら、FastFlow フォルダ内に以下のように配置します。

bottle と cable の一例を掲載します。

cable はかなり複雑そうな印象です。

bottle の学習と結果確認

まずは、bottle について、学習していきます。

cd FastFlow
python main.py -cfg configs/resnet18.yaml --data ./mvtec-ad -cat bottle

バックボーンは resnet18, wide-resnet-50 がありますが、今回は resnet18 を使用します。

上記コマンドを実行すると、以下のような結果が出力されます。

Model A.D. Param#: 5574912
Epoch 1 - Step 6: loss = 89249.945(152388.694)
Epoch 2 - Step 6: loss = -37762.820(13337.727)
Epoch 3 - Step 6: loss = -137952.047(-99540.391)
Epoch 4 - Step 6: loss = -203139.891(-176534.367)
Epoch 5 - Step 6: loss = -238089.500(-234274.370)
Epoch 6 - Step 6: loss = -287386.812(-265264.130)
Epoch 7 - Step 6: loss = -341697.562(-318932.260)
Epoch 8 - Step 6: loss = -384694.844(-367770.688)
Epoch 9 - Step 6: loss = -416996.531(-398341.005)
Epoch 10 - Step 6: loss = -445393.688(-437013.911)
AUROC: 0.9757971424733269
Epoch 11 - Step 6: loss = -462705.562(-454449.625)
Epoch 12 - Step 6: loss = -500546.625(-490044.609)
Epoch 13 - Step 6: loss = -535708.062(-518519.208)
Epoch 14 - Step 6: loss = -525321.125(-536286.125)
Epoch 15 - Step 6: loss = -564474.375(-552970.604)
Epoch 16 - Step 6: loss = -589126.812(-579022.219)
Epoch 17 - Step 6: loss = -605088.375(-601773.219)
Epoch 18 - Step 6: loss = -616272.812(-604209.323)
Epoch 19 - Step 6: loss = -598265.625(-620509.188)
Epoch 20 - Step 6: loss = -637072.938(-614997.927)
AUROC: 0.9755343087204891

10epoch で AUROC が 0.97 程度まで上昇します。これ以降続けても大きく上昇はしません。

Windowsの場合

Windows の場合はエラーが出ます。
その場合、dataset.py の 42行目付近を以下のように変更してください。

target = Image.open(
    image_file.replace("/test/", "/ground_truth/").replace(
    ".png", "_mask.png"
    )
)
↓
target = Image.open(
    image_file.replace("test", "ground_truth").replace(
    ".png", "_mask.png"
    )
)

結果確認

結果確認は以下のコマンドで実行します。

python main.py -cfg configs/resnet18.yaml --data ./mvtec-ad -cat bottle --eval -ckpt _fastflow_experiment_checkpoints/exp1/9.pt

結果は以下のようになります。

Model A.D. Param#: 5574912
AUROC: 0.9757971424733269

cable の学習と結果確認

次に、cable について学習していきます。

cd FastFlow
python main.py -cfg configs/resnet18.yaml --data ./mvtec-ad -cat cable

以下のような結果が出力されます。

Model A.D. Param#: 5574912
Epoch 1 - Step 7: loss = 122076.812(171060.377)
Epoch 2 - Step 7: loss = 41230.852(73232.054)
Epoch 3 - Step 7: loss = -21444.639(4057.698)
Epoch 4 - Step 7: loss = -70478.383(-50868.967)
Epoch 5 - Step 7: loss = -121073.078(-100378.506)
Epoch 6 - Step 7: loss = -158777.812(-137756.076)
Epoch 7 - Step 7: loss = -195107.672(-177773.527)
Epoch 8 - Step 7: loss = -220969.578(-208397.670)
Epoch 9 - Step 7: loss = -249262.062(-238449.540)
Epoch 10 - Step 7: loss = -271916.875(-262681.185)
AUROC: 0.954951829315373
Epoch 11 - Step 7: loss = -294207.875(-284313.496)
Epoch 12 - Step 7: loss = -307351.281(-303222.969)
Epoch 13 - Step 7: loss = -324064.219(-315675.683)
Epoch 14 - Step 7: loss = -338611.188(-331553.286)
Epoch 15 - Step 7: loss = -352611.938(-347299.223)
Epoch 16 - Step 7: loss = -365233.625(-360770.210)
Epoch 17 - Step 7: loss = -376647.281(-371820.192)
Epoch 18 - Step 7: loss = -383285.938(-382558.121)
Epoch 19 - Step 7: loss = -384286.219(-384137.750)
Epoch 20 - Step 7: loss = -402095.781(-395931.116)
AUROC: 0.966436295834251

30epoch まで続けると、0.968 程度まで上昇します。

結果確認

python main.py -cfg configs/resnet18.yaml --data ./mvtec-ad -cat cable --eval -ckpt _fastflow_experiment_checkpoints/exp2/29.pt

上記を実行すると、以下の結果が出力されます。

Model A.D. Param#: 5574912
AUROC: 0.9686505361579625

おわりに

今回は教師なし異常検知で不良位置も推定できる FastFlow について紹介しました。

次回は FastFlow の検出結果を画像で確認する方法や、カスタムデータセットで訓練する方法について説明します。

コメント

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