LoginSignup
9
5

More than 3 years have passed since last update.

Deep Metric Learning を使った MVTecAD データセットの異常検知に挑戦(Capsule編)

Last updated at Posted at 2020-08-05

はじめに

前回の記事に続いて、今回は、MVTec AD の Capsule に挑戦します。
https://qiita.com/tetz1/items/6f92928d482534f7d2c4

※コードは準備中です。

データセット(MVTec AD)について(前回の繰り返し)

様々な製品(物体)について、正常な個体の画像と異常な個体の画像が含まれています。
また、異常な個体の画像には、多様な異常の種類が、きちんと分類されて含まれています。
さらに、素晴らしいのは、異常な部分を特定できるようなマスクがはじめから含まれていることです。(これは、本当に有り難いです。)
ただ、実際の現場で、このようなマスクを作るのは極めて手間がかかると思われるので、これに頼ると、その手法が実際の現場で使えない、ということが発生するかも知れません。
製品(物体)の種類は、bottle、cable、capsule、carpet、grid、hazelnut、leather、metal_nut、pill、screw、tile、toothbrush、transistor、wood、zipper の15種類です。
下記にて、入手できます。
https://www.mvtec.com/company/research/datasets/mvtec-ad/

データのサンプル

正常データ

000.png 001.png 002.png 003.png 004.png

異常(crack)

000 (1).png 001 (1).png 002 (1).png 003 (1).png 004 (1).png

異常(faulty_imprint)

000 (2).png 001 (2).png 002 (2).png 003 (2).png 004 (2).png

異常(poke)

000 (3).jpg 001 (3).jpg 002 (3).jpg 004 (3).jpg 003 (3).jpg

異常(scratch)

000 (4).jpg 001 (4).jpg 002 (4).jpg 003 (4).jpg 004 (4).jpg

異常(squeeze)

000 (5).jpg 001 (5).jpg 002 (5).jpg 003 (5).jpg 004 (5).jpg

検証概要

今回の検証の概要は下記の通りです。

  • 今回は、MVTecAD の Capsuleデータセットを使用
  • MVTecAD のフォルダ構成
      MVTecAD
        |--- capsule
            |--- train
            |   |--- good
            |--- Test
               |--- good
               |--- crack
               |--- faulty_print
               |--- poke
               |--- scratch
               |--- squeeze

  • 下記のパターンを実施

    • 1000x1000の元画像を、512x512に resize して、正常と異常の二値分類問題として実施
    • 1000x1000の元画像を、512x512に resize して、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、正常と異常との二値分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)に、人工的に異常(複数色の直線)を加え、異常画像を増やして、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)に、人工的に異常(白色のみの直線)を加え、異常画像を増やして、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、画像のシャープネスを加工し、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、画像の値を逆転させて(0〜1)の値を1-元の値(0〜1)に変換)し、各異常モードごとの多クラス分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)の画像を部分的に入れ替えることで、異常画像を増やして、正常と異常の二値分類として実施
    • 1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)の画像を部分的に入れ替えることで、異常画像を増やして、各異常モードごとの多クラス分類として実施
  • 学習には、正常だけで構成される trainフォルダのデータだけでなく、testフォルダの異常データも使用

  • 学習、予測に使用した TrainデータとTestデータは、 trainフォルダ、testフォルダの正常データと異常データを、各サブフォルダごとに8:2に分割して、作成、使用

  • NNには、ResNet18を使用

  • 学習には、Metric Learning/AdaCos を使用

  • Epoch数は100〜700/900 (学習が遅いもの、学習を進めて見たら変化がありそうなもの(無根拠)は900です。)

  • lr はすべて 0.1 で実施

検証結果

モデルの学習と特徴空間へのプロット

エポック数100〜700で学習したモデルから、Metric Learningの特徴(512次元)を抽出し、UMAPで2次元に可視化したものが下記のとおり。

1000x1000の元画像を、512x512に resize して、正常と異常の二値分類問題として実施

データ

使用したデータは、オリジナルデータ(1000*1000)を512*512にresizeしたもので、見た目は上記のオリジナルデータと同じ(正方形)

結果

エポック数 trainデータ testデータ train+testデータ
100 1000_1000_UMAP_multi_100_t.jpg 1000_1000_UMAP_multi_100_v.jpg 1000_1000_UMAP_multi_100_a.jpg
200 1000_1000_UMAP_multi_200_t.jpg 1000_1000_UMAP_multi_200_v.jpg 1000_1000_UMAP_multi_200_a.jpg
300 1000_1000_UMAP_multi_300_t.jpg 1000_1000_UMAP_multi_300_v.jpg 1000_1000_UMAP_multi_300_a.jpg
400 1000_1000_UMAP_multi_400_t.jpg 1000_1000_UMAP_multi_400_v.jpg 1000_1000_UMAP_multi_400_a.jpg
500 1000_1000_UMAP_multi_500_t.jpg 1000_1000_UMAP_multi_500_v.jpg 1000_1000_UMAP_multi_500_a.jpg
600 1000_1000_UMAP_multi_600_t.jpg 1000_1000_UMAP_multi_600_v.jpg 1000_1000_UMAP_multi_600_a.jpg
700 1000_1000_UMAP_multi_700_t.jpg 1000_1000_UMAP_multi_700_v.jpg 1000_1000_UMAP_multi_700_a.jpg
800 1000_1000_binary_800_t.jpg 1000_1000_binary_800_v.jpg 1000_1000_binary_800_a.jpg
900 1000_1000_binary_900_t.jpg 1000_1000_binary_900_v.jpg 1000_1000_binary_900_a.jpg

※ 学習は二値分類問題として実施しましたが、各異常モードごとの差異がわかるように、推論とプロットは多クラスで行っています。

考察

学習には結構時間がかかっています。
エポック500あたりで落ち着いて来てますが、エポック500ではかなりきれいに分離・予測できています。
何も手を加えていないのに、ここまで分離・予測できるのは驚きです。

1000x1000の元画像を、512x512に resize して、各異常モードごとの多クラス分類として実施

データ

使用したデータは、オリジナルデータ(1000*1000)を512*512にresizeしたもので、見た目は上記のオリジナルデータと同じ(正方形)

結果

エポック数 trainデータ testデータ train+testデータ
100 1000_1000_UMAP_binary_100_t.jpg 1000_1000_UMAP_binary_100_v.jpg 1000_1000_UMAP_binary_100_a.jpg
200 1000_1000_UMAP_binary_200_t.jpg 1000_1000_UMAP_binary_200_v.jpg 1000_1000_UMAP_binary_200_a.jpg
300 1000_1000_UMAP_binary_300_t.jpg 1000_1000_UMAP_binary_300_v.jpg 1000_1000_UMAP_binary_300_a.jpg
400 1000_1000_UMAP_binary_400_t.jpg 1000_1000_UMAP_binary_400_v.jpg 1000_1000_UMAP_binary_400_a.jpg
500 1000_1000_UMAP_binary_500_t.jpg 1000_1000_UMAP_binary_500_v.jpg 1000_1000_UMAP_binary_500_a.jpg
600 1000_1000_UMAP_binary_600_t.jpg 1000_1000_UMAP_binary_600_v.jpg 1000_1000_UMAP_binary_600_a.jpg
700 1000_1000_UMAP_binary_700_t.jpg 1000_1000_UMAP_binary_700_v.jpg 1000_1000_UMAP_binary_700_a.jpg
800 1000_1000_multi_800_t.jpg 1000_1000_multi_800_v.jpg 1000_1000_multi_800_a.jpg
900 1000_1000_multi_900_t.jpg 1000_1000_multi_900_v.jpg 1000_1000_multi_900_a.jpg

考察

二値分類に比べ、早く学習が進んでいます。(エポック200あたりで落ち着いて来ています。)
エポック500が最もよさそうです。
多クラス分類にした方が、それぞれの異常モードの特徴を分けて捉えることができるかと思ったのですが、課題が複雑になってしまったのか、サンプル数が足りなかったのか、二値分類より精度が低下してしまいました。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、正常と異常との二値分類として実施

データ

正常 crack imprint
400_900_ori_0.png 400_900_ori_2.png 400_900_ori_3.png
poke scratch squeeze
400_900_ori_4.png 400_900_ori_5.png 400_900_ori_6.png

結果

エポック数 trainデータ testデータ train+testデータ
100 t_400_900_binary_UMAP_100.jpg v_400_900_binary_UMAP_100.jpg a_400_900_binary_UMAP_100.jpg
200 t_400_900_binary_UMAP_200.jpg v_400_900_binary_UMAP_200.jpg a_400_900_binary_UMAP_200.jpg
300 t_400_900_binary_UMAP_300.jpg v_400_900_binary_UMAP_300.jpg a_400_900_binary_UMAP_300.jpg
400 t_400_900_binary_UMAP_400.jpg v_400_900_binary_UMAP_400.png a_400_900_binary_UMAP_400.png
500 t_400_900_binary_UMAP_500.png v_400_900_binary_UMAP_500.jpg a_400_900_binary_UMAP_500.jpg
600 t_400_900_binary_UMAP_600.jpg v_400_900_binary_UMAP_600.jpg a_400_900_binary_UMAP_600.jpg
700 t_400_900_binary_UMAP_700.jpg v_400_900_binary_UMAP_700.jpg a_400_900_binary_UMAP_700.jpg

※ 学習は二値分類問題として実施しましたが、各異常モードごとの差異がわかるように、推論とプロットは多クラスで行っています。

考察

かなり早く学習が進んでいます。(エポック100ですでに落ち着いて来ています。)
また、サイズを落としたことで、各エポックの学習にかかる時間も大幅に短縮されています。
エポック500では、異常データが一点だけ正常のエリアにプロットされている以外は、非常にきれいに分離・予測できています。
このモデルが、今回のすべてのモデル中で最も精度がいいという結果になりました。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、各異常モードごとの多クラス分類として実施

データ

正常 crack imprint
400_900_ori_0.png 400_900_ori_2.png 400_900_ori_3.png
poke scratch squeeze
400_900_ori_4.png 400_900_ori_5.png 400_900_ori_6.png

※ ラベル以外は、上記の二値分類と同じデータです。

結果

エポック数 trainデータ testデータ train+testデータ
100 train_400_900_multi_UMAP_100.jpg test_400_900_multi_UMAP_100.jpg all_400_900_multi_UMAP_100.jpg
200 train_400_900_multi_UMAP_200.jpg test_400_900_multi_UMAP_200.jpg all_400_900_multi_UMAP_200.jpg
300 train_400_900_multi_UMAP_300.jpg test_400_900_multi_UMAP_300.jpg all_400_900_multi_UMAP_300.jpg
400 train_400_900_multi_UMAP_400.jpg test_400_900_multi_UMAP_400.jpg all_400_900_multi_UMAP_400.jpg
500 train_400_900_multi_UMAP_500.jpg test_400_900_multi_UMAP_500.jpg all_400_900_multi_UMAP_500.jpg
600 train_400_900_multi_UMAP_600.jpg test_400_900_multi_UMAP_600.jpg all_400_900_multi_UMAP_600.jpg
700 train_400_900_multi_UMAP_700.jpg test_400_900_multi_UMAP_700.jpg all_400_900_multi_UMAP_700.jpg

考察

こちらも学習は早く進んでいます。
こちらも、エポック500が最も優れているようです。
ただし、二値分類と比較して、わずかに劣化しているようです。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)に、人工的に異常(複数色の直線)を加え、異常画像を増やして、各異常モードごとの多クラス分類として実施

データ

生成異常① 生成異常② 生成異常③ 生成異常④
400_900_defect_0.png 400_900_defect_1.png 400_900_defect_2.png 400_900_defect_3.png

結果

エポック数 trainデータ testデータ train+testデータ
100 t_400_900_w_defect_100.jpg v_400_900_w_defect_100.jpg a_400_900_w_defect_100.jpg
200 t_400_900_w_defect_200.jpg v_400_900_w_defect_200.jpg a_400_900_w_defect_200.jpg
300 t_400_900_w_defect_300.jpg v_400_900_w_defect_300.jpg a_400_900_w_defect_300.jpg
400 t_400_900_w_defect_400.jpg v_400_900_w_defect_400.jpg a_400_900_w_defect_400.jpg
500 t_400_900_w_defect_500.jpg v_400_900_w_defect_500.jpg a_400_900_w_defect_500.jpg
600 t_400_900_w_defect_600.jpg v_400_900_w_defect_600.jpg a_400_900_w_defect_600.jpg
700 t_400_900_w_defect_700.jpg v_400_900_w_defect_700.jpg a_400_900_w_defect_700.jpg

考察

生成した異常データは、正常データに加工をしたもののみ(異常データを加工したものはない)です。
異常データを生成してデータ数を増やしているので、エポックあたりの学習時間が増加し、学習の進む速度も遅くなっています。(エポック400あたりで落ち着いて来ています。)
エポック400が最も精度が良さそうです。
ただし、他の手法に比べて、特に優れているとは言えないようです。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)に、人工的に異常(白色のみの直線)を加え、異常画像を増やして、各異常モードごとの多クラス分類として実施

データ

生成異常① 生成異常② 生成異常③ 生成異常④
400_900_defect_white_0.png 400_900_defect_white_1.png 400_900_defect_white_2.png 400_900_defect_white_3.png

結果

エポック数 trainデータ testデータ train+testデータ
100 400_900_UMAP_defect_white_multi_100_t .jpg 400_900_UMAP_defect_white_multi_100_v .jpg 400_900_UMAP_defect_white_multi_100_a .jpg
200 400_900_UMAP_defect_white_multi_200_t .jpg 400_900_UMAP_defect_white_multi_200_v .jpg 400_900_UMAP_defect_white_multi_200_a .jpg
300 400_900_UMAP_defect_white_multi_300_ t.jpg 400_900_UMAP_defect_white_multi_300_v .jpg 400_900_UMAP_defect_white_multi_300_a .jpg
400 400_900_UMAP_defect_white_multi_400_t .jpg 400_900_UMAP_defect_white_multi_400_v .jpg 400_900_UMAP_defect_white_multi_400_a .jpg
500 400_900_UMAP_defect_white_multi_500_t .jpg 400_900_UMAP_defect_white_multi_500_v.jpg 400_900_UMAP_defect_white_multi_500_a .jpg
600 400_900_UMAP_defect_white_multi_600_t .jpg 400_900_UMAP_defect_white_multi_600_v .jpg 400_900_UMAP_defect_white_multi_600_a .jpg
700 400_900_UMAP_defect_white_multi_700_t .jpg 400_900_UMAP_defect_white_multi_700_v.jpg 400_900_UMAP_defect_white_multi_700_a .jpg
800 400_900_UMAP_defect_white_multi_800_t .jpg 400_900_UMAP_defect_white_multi_800_v .jpg 400_900_UMAP_defect_white_multi_800_a .jpg
900 400_900_UMAP_defect_white_multi_900_t .jpg 400_900_defect_white_multi_900_v_change.jpg 400_900_UMAP_defect_white_multi_900_a .jpg

考察

上と同じく、生成した異常データは、正常データに加工をしたもののみ(異常データを加工したものはない)です。
今回は、追加する異常は、白い線のみとしました。(実際の異常でも、異常個所はほとんどが白い(中身の白い粉末の色)ため)。また、少し、線を細くしました。
上と同じく、異常データを生成してデータ数を増やしているので、エポックあたりの学習時間が増加し、学習の進む速度も遅くなっています。(エポック300あたりで落ち着いて来ています。)
エポック700あたりが最も良さそうです。
上の複数の色で異常を生成したものよりはよさそうですが、他の手法に比べて、特に優れているとは言えないようです。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、画像のシャープネスを加工し、各異常モードごとの多クラス分類として実施

正常 crack imprint
400_900_iaa_0.png 400_900_iaa_2.png 400_900_iaa_3.png
poke scratch squeeze
400_900_iaa_4.png 400_900_iaa_5.png 400_900_iaa_6.png

結果

エポック数 trainデータ testデータ train+testデータ
100 t_400_900_UMAP_iaa_multi_100.jpg v_400_900_UMAP_iaa_multi_100.jpg a_400_900_UMAP_iaa_multi_100.jpg
200 t_400_900_UMAP_iaa_multi_200.jpg v_400_900_UMAP_iaa_multi_200.jpg a_400_900_UMAP_iaa_multi_200.jpg
300 t_400_900_UMAP_iaa_multi_300.jpg v_400_900_UMAP_iaa_multi_300.jpg a_400_900_UMAP_iaa_multi_300.jpg
400 t_400_900_UMAP_iaa_multi_400.jpg v_400_900_UMAP_iaa_multi_400.jpg a_400_900_UMAP_iaa_multi_400.jpg
500 400_900_UMAP_iaa_multi_500_t.jpg 400_900_UMAP_iaa_multi_500_v.jpg 400_900_UMAP_iaa_multi_500_a.jpg
600 400_900_UMAP_iaa_multi_600_t.jpg 400_900_UMAP_iaa_multi_600_v.jpg 400_900_UMAP_iaa_multi_600_a.jpg
700 400_900_UMAP_iaa_multi_700_t.jpg 400_900_UMAP_iaa_multi_700_v.jpg 400_900_UMAP_iaa_multi_700_a.jpg

考察

画像を加工して、異常が(人間の目で見て)目立つようにしてみたのですが、ほとんど効果はありませんでした。
(この手の加工(処理)は、基本的にはニューーラルネットワークの中で行う処理と重複しているらしくです。)

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、画像の値を逆転させて(0〜1の値を1-元の値(0〜1)に変換)し、各異常モードごとの多クラス分類として実施

正常 crack imprint
400_900_reverse_0.png 400_900_reverse_2.png 400_900_reverse_3.png
poke scratch squeeze
400_900_reverse_4.png 400_900_reverse_5.png 400_900_reverse_6.png

結果

エポック数 trainデータ testデータ train+testデータ
100 400_900_UMAP_reverse_multi_100_t.jpg 400_900_UMAP_reverse_multi_100_v.jpg 400_900_UMAP_reverse_multi_100_a.jpg
200 400_900_UMAP_reverse_multi_200_t.jpg 400_900_UMAP_reverse_multi_200_v.jpg 400_900_UMAP_reverse_multi_200_a.jpg
300 400_900_UMAP_reverse_multi_300_t.jpg 400_900_UMAP_reverse_multi_300_v.jpg 400_900_UMAP_reverse_multi_300_a.jpg
4400 400_900_UMAP_reverse_multi_400_t.jpg 400_900_UMAP_reverse_multi_400_v.jpg 400_900_UMAP_reverse_multi_400_a.jpg
500 400_900_UMAP_reverse_multi_500_t.jpg 400_900_UMAP_reverse_multi_500_v.jpg 400_900_UMAP_reverse_multi_500_a.jpg
600 400_900_UMAP_reverse_multi_600_t.jpg 400_900_UMAP_reverse_multi_600_v.jpg 400_900_UMAP_reverse_multi_600_a.jpg
700 400_900_UMAP_reverse_multi_700_t.jpg 400_900_UMAP_reverse_multi_700_v.jpg 400_900_UMAP_reverse_multi_700_a.jpg
800 400_900_UMAP_reverse_multi_800_t.jpg 400_900_UMAP_reverse_multi_800_v.jpg 400_900_UMAP_reverse_multi_800_a.jpg
900 400_900_UMAP_reverse_multi_900_t.jpg 400_900_UMAP_reverse_multi_900_v.jpg 400_900_UMAP_reverse_multi_900_a.jpg

考察

学習・推論には不要な背景が白く、カプセルの一部が黒いので、学習に必要のない背景を0にして、学習に必要なカプセル本体を1に近づけることで何かが変わるかもと思ったのですが、何の効果もないどころか、精度が低下してしまいました。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)の画像を部分的に入れ替えることで、異常画像を増やして、正常と異常の二値分類として実施

データ

元画像 加工後
図4.png 図2.png
図3.png 図5.png

緑の枠線で囲った部分を左右入れ替えて、異常データを水増ししています。

crack imprint poke
400_900_switch1_1.png 400_900_switch1_2.png 400_900_switch1_3.png
scratch squeeze
400_900_switch1_4.png 400_900_switch1_5.png

※コードの一部に間違いがあったので、下記のプロット図は間もなく修正します。申し訳ありません。

結果

エポック数 trainデータ testデータ train+testデータ
100 t_400_900_switch1_binary_100.jpg v_400_900_switch1_binary_100.jpg a_400_900_switch1_binary_100.jpg
200 t_400_900_switch1_binary_200.jpg v_400_900_switch1_binary_200.jpg a_400_900_switch1_binary_200.jpg
300 t_400_900_switch1_binary_300.jpg v_400_900_switch1_binary_300.jpg 400_900_switch1_binary_300_a.jpg
400 t_400_900_switch1_binary_400.jpg v_400_900_switch1_binary_400.jpg a_400_900_switch1_binary_400.jpg
500 t_400_900_switch1_binary_500.jpg v_400_900_switch1_binary_500.jpg a_400_900_switch1_binary_500.jpg
600 t_400_900_switch1_binary_600.jpg v_400_900_switch1_binary_600.jpg a_400_900_switch1_binary_600.jpg
700 t_400_900_switch1_binary_700.jpg v_400_900_switch1_binary_700.jpg a_400_900_switch1_binary_700.jpg
800 400_900_switch1_binary_800_t.jpg 400_900_switch1_binary_800_v.jpg 400_900_switch1_binary_800_a.jpg
900 400_900_switch1_binary_900_t.jpg 400_900_switch1_binary_900_v.jpg 400_900_switch1_binary_900_a.jpg

※ 学習は二値分類問題として実施しましたが、各異常モードごとの差異がわかるように、推論とプロットは多クラスで行っています。

考察

異常データを生成してデータ数を増やしているので、エポックあたりの学習時間も増加し、学習の進行も遅くなっています。(エポック400あたりで落ち着いて来ています。)
エポック900が最も精度がよさそうですが、特に他の手法と比べて優れているというわけでもなさそうです。
もう少し、学習を進めてみると面白いかも知れません。

1000x1000の元画像を、400x900にクロップし、200x450に resize して、さらに、対象物(カプセル)の画像を部分的に入れ替えることで、異常画像を増やして、各異常モードごとの多クラス分類として実施

データ

元画像 加工後
図4.png 図2.png
図3.png 図5.png

緑の枠線で囲った部分を左右入れ替えて、異常データを水増ししています。

crack imprint poke
400_900_switch1_1.png 400_900_switch1_2.png 400_900_switch1_3.png
scratch squeeze
400_900_switch1_4.png 400_900_switch1_5.png

結果

エポック数 trainデータ testデータ train+testデータ
100 t_400_900_switch1_multi_100.jpg v_400_900_switch1_multi_100.jpg a_400_900_switch1_multi_100.jpg
200 t_400_900_switch1_multi_200.jpg v_400_900_switch1_multi_200 .jpg a_400_900_switch1_multi_200 .jpg
300 t_400_900_switch1_multi_300 .jpg v_400_900_switch1_multi_300 .jpg 400_900_switch1_multi_300_a.jpg
400 t_400_900_switch1_multi_400.jpg v_400_900_switch1_multi_400.jpg a_400_900_switch1_multi_400.jpg
500 t_400_900_switch1_multi_500.jpg v_400_900_switch1_multi_500.jpg a_400_900_switch1_multi_500.jpg
600 t_400_900_switch1_multi_600.jpg v_400_900_switch1_multi_600.jpg a_400_900_switch1_multi_600.jpg
700 t_400_900_switch1_multi_700.jpg v_400_900_switch1_multi_700.jpg a_400_900_switch1_multi_700.jpg

考察

異常データを生成してデータ数を増やしているので、エポックあたりの学習時間は増加していますが、学習の進行はかなり早く、エポック100ですでに落ち着きはじめています。
二値分類と多クラス分類で、どうしてこんなに差が出たのか分かりませんが、考えられるのは、二値分類としては、異常データに多様性がありすぎるが、多クラス分類としては、各異常モードごとの異常データが増えたために、異常を捉えやすくなったのかも知れません。
また、エポック500、600、700あたりでは、なかなかいい結果を出しています。

総論

capsuleは、なかなか難しいデータセットでした。(それでも、カプセルの向き等が揃っているので、MVTec ADのなかでは、まだ簡単な方だという気がしますが。)
結果として、カプセル本体のある部分だけにトリミングをするというのが、最も効果的な前処理だと言うことが分かりました。
また、エポックが進むにつれて、学習がどのように進むのかを理解する非常にいい実験になりました。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5