axinc-ai / ailia-models

The collection of pre-trained, state-of-the-art AI models for ailia SDK
2.03k stars 319 forks source link

ADD random crop and random rotation to PaDiM implementation #468

Closed kyakuno closed 2 years ago

kyakuno commented 3 years ago

In PaDiM's paper, Real Use Case recommends Random Crop from 256x256 to 224x224 and Random Rotation from -10 to +10. In the paper, it is called as Modified version. Correspond with the option (-modified).

kyakuno commented 3 years ago

Not implemented in the original Pytorch version.

kyakuno commented 3 years ago

This operation is not necessary because the MVTECAD dataset is centered. Required when applying to real-world datasets.

mucunwuxian commented 3 years ago

@kyakuno こちら、担当させて頂けたらと思います。 issue https://github.com/axinc-ai/ailia-models/issues/401 の引き続きにて、 ailia-models/anomaly_detection/padim をカスタマイズするという理解で合っておりますでしょうか?

kyakuno commented 3 years ago

はい、論文の内容をベースに既存コードにコマンドラインオプションで追加頂ければと思います。

mucunwuxian commented 3 years ago

@kyakuno ありがとうございます! 了解致しました!

mucunwuxian commented 3 years ago

PaDiMに関する備忘📝




mucunwuxian commented 3 years ago

対応方針考察メモ📝


mucunwuxian commented 3 years ago

対応に際して行った実験について📝


課題感と、オリジナルのPaDiMの挙動

githubのPaDiMにて、mvtecのデータに対して処理を行った場合のRAMの使用量をプロットしてみると、RAM使用量が35GBを超えてしまっている瞬間がありました。 尚、この検証において、論文に記載されるようなaugmentation仕様は、まだ適用をしていません。

image


実験結果と、処理時間については、以下となります。 非常に精度が高く、素晴らしいアルゴリズムだと思いました。 尚、mvtecの全種類のデータに対して、アルゴリズムを適用するのに、25分弱の時間を要するようです。 (実行環境は、CPU:AMD Ryzen 9 5950X 16-Core Processor、GPU:RTX3090、RAM:64GB となります)

| feature extraction | train | bottle |: 100%|████| 7/7 [00:05<00:00,  1.23it/s]
| feature extraction | test | bottle |: 100%|█████| 3/3 [00:02<00:00,  1.25it/s]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 7/7 [00:09<00:00,  1.35s/it]
| feature extraction | test | cable |: 100%|██████| 5/5 [00:06<00:00,  1.29s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 7/7 [00:08<00:00,  1.26s/it]
| feature extraction | test | capsule |: 100%|████| 5/5 [00:05<00:00,  1.11s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 9/9 [00:11<00:00,  1.33s/it]
| feature extraction | test | carpet |: 100%|█████| 4/4 [00:05<00:00,  1.30s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 9/9 [00:05<00:00,  1.51it/s]
| feature extraction | test | grid |: 100%|███████| 3/3 [00:01<00:00,  1.61it/s]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|█| 13/13 [00:15<00:00,  1.21s/it
| feature extraction | test | hazelnut |: 100%|███| 4/4 [00:04<00:00,  1.13s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 8/8 [00:09<00:00,  1.13s/it]
| feature extraction | test | leather |: 100%|████| 4/4 [00:04<00:00,  1.24s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 7/7 [00:04<00:00,  1.56it/s]
| feature extraction | test | metal_nut |: 100%|██| 4/4 [00:02<00:00,  1.64it/s]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 9/9 [00:07<00:00,  1.28it/s]
| feature extraction | test | pill |: 100%|███████| 6/6 [00:04<00:00,  1.30it/s]
image ROCAUC: 0.944
pixel ROCAUC: 0.961
| feature extraction | train | screw |: 100%|███| 10/10 [00:07<00:00,  1.41it/s]
| feature extraction | test | screw |: 100%|██████| 5/5 [00:03<00:00,  1.29it/s]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 8/8 [00:07<00:00,  1.12it/s]
| feature extraction | test | tile |: 100%|███████| 4/4 [00:03<00:00,  1.05it/s]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 2/2 [00:02<00:00,  1.20s/it
| feature extraction | test | toothbrush |: 100%|█| 2/2 [00:01<00:00,  1.12it/s]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 7/7 [00:08<00:00,  1.28s/it
| feature extraction | test | transistor |: 100%|█| 4/4 [00:04<00:00,  1.07s/it]
image ROCAUC: 0.978
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 8/8 [00:11<00:00,  1.39s/it]
| feature extraction | test | wood |: 100%|███████| 3/3 [00:03<00:00,  1.31s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 8/8 [00:05<00:00,  1.51it/s]
| feature extraction | test | zipper |: 100%|█████| 5/5 [00:03<00:00,  1.35it/s]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 1421.11510 (sec)


mvtecデータセットは、識別対象データ種別にデータ数が異なりますが、その特定の種別にて、RAMの使用量が瞬間的に35GBを超えてしまっています。 尚、debugしてみたところ、主要な変数の精度は float32 であるようでした。 特に、マハラノビス距離を計算するための分散共分散行列の計算 np.cov の実施時について、RAM使用量が膨らみやすい形となっています。 このことから、PaDiMリポジトリの main.py は、RAMが潤沢なPC上でのみ動作確認をすることが可能となります。 例えば、Google Colabなどですと、mvtecによるサンプルプログラム実行は、現状できません。


RAM消費量を抑える対応の実施結果

このRAM大量使用問題に対して、分散共分散行列の計算方法を、ミニバッチ実施するという解決方法を考えました。 ソースは、以下リンクのものとなります。 客野さんが用意して下さったPaDiMのforkリポジトリに、memory_saving というブランチでpushさせて頂いています。 https://github.com/axinc-ai/PaDiM-Anomaly-Detection-Localization-master/tree/memory_saving

分散共分散行列 Σ の計算における、X.T @ X という行列計算をミニバッチ毎に行っておき、最後に N-1 で割るという計算順序で近似させる形です。 こうすることで、これまで全データ分の特徴にて、分散共分散行列を求める際に膨らんでいたRAM使用量を、ミニバッチサイズ単位にまで、抑えることができるようになります。

尚、分散共分散行列の計算の際に使用する X の平均ベクトルについては、事前に全ての X から求めることが難しい為、マハラノビス距離を計算用に別途集計されている平均ベクトル μ を用いて (X - μ).T @ (X - μ) という形で計算を行います。 μ はミニバッチループを減る度に熟成されていく為、ミニバッチごとの X から平均ベクトルを求めるよりも、分散共分散行列の近似精度が向上されると考えます。 尚、この計算は、PaDiMのアルゴリズムに基づき、pixel別に行われることとなります。

このコードにて実験した結果、RAMの使用量推移は以下プロットのようになり、最大使用量を12GB程に抑えることができました。

image


精度評価結果と処理時間については、以下ログとなります。 評価精度は下3桁までの表示上にて、オリジナルと同値となりました。 mvtecの全種類のデータに対して、アルゴリズムを適用するのにかかった時間は、48分と、およそオリジナルプログラムの2倍の時間を要しました。

| feature extraction | train | bottle |: 100%|████| 7/7 [01:03<00:00,  9.12s/it]
| feature extraction | test | bottle |: 100%|█████| 3/3 [01:03<00:00, 21.28s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 7/7 [01:08<00:00,  9.78s/it]
| feature extraction | test | cable |: 100%|██████| 5/5 [01:49<00:00, 21.89s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 7/7 [01:07<00:00,  9.66s/it]
| feature extraction | test | capsule |: 100%|████| 5/5 [01:46<00:00, 21.21s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 9/9 [01:27<00:00,  9.72s/it]
| feature extraction | test | carpet |: 100%|█████| 4/4 [01:26<00:00, 21.65s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 9/9 [01:19<00:00,  8.84s/it]
| feature extraction | test | grid |: 100%|███████| 3/3 [01:01<00:00, 20.62s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|█| 13/13 [02:04<00:00,  9.60s/it
| feature extraction | test | hazelnut |: 100%|███| 4/4 [01:26<00:00, 21.54s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 8/8 [01:15<00:00,  9.45s/it]
| feature extraction | test | leather |: 100%|████| 4/4 [01:28<00:00, 22.08s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 7/7 [01:03<00:00,  9.03s/it]
| feature extraction | test | metal_nut |: 100%|██| 4/4 [01:23<00:00, 20.77s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 9/9 [01:22<00:00,  9.16s/it]
| feature extraction | test | pill |: 100%|███████| 6/6 [02:06<00:00, 21.07s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.961
| feature extraction | train | screw |: 100%|███| 10/10 [01:32<00:00,  9.21s/it]
| feature extraction | test | screw |: 100%|██████| 5/5 [01:49<00:00, 21.85s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 8/8 [01:13<00:00,  9.25s/it]
| feature extraction | test | tile |: 100%|███████| 4/4 [01:27<00:00, 21.78s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 2/2 [00:19<00:00,  9.76s/it
| feature extraction | test | toothbrush |: 100%|█| 2/2 [00:41<00:00, 20.71s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 7/7 [01:08<00:00,  9.80s/it
| feature extraction | test | transistor |: 100%|█| 4/4 [01:25<00:00, 21.43s/it]
image ROCAUC: 0.977
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 8/8 [01:19<00:00,  9.95s/it]
| feature extraction | test | wood |: 100%|███████| 3/3 [01:07<00:00, 22.38s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 8/8 [01:12<00:00,  9.09s/it]
| feature extraction | test | zipper |: 100%|█████| 5/5 [01:48<00:00, 21.80s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 2938.66367 (sec)


尚、予めPaDiMの学習を行っておいた場合、即ち、分散共分散行列 Σ と平均ベクトル μ とを .pkl に保存をしておいた場合、メモリ使用量は以下プロットの通りとなりました。 メモリ使用量の最大は、11.2GB程です。 処理にかかった時間は、28分でした。

image


mvtecは、trainデータの量に対して、testデータの量が半分程であるようなので、頷ける処理時間となります。

$ ls */train/good/ | wc -l
3658
$ ls */test/*/ | wc -l
1900


尚、上記結果を導出する際のミニバッチサイズは、オリジナルのPaDiMにて定義されている batchsize=32 としています。

train_dataset = mvtec.MVTecDataset(args.data_path, class_name=class_name, is_train=True)
train_dataloader = DataLoader(train_dataset, batch_size=32, pin_memory=True)
test_dataset = mvtec.MVTecDataset(args.data_path, class_name=class_name, is_train=False)
test_dataloader = DataLoader(test_dataset, batch_size=32, pin_memory=True)

このミニバッチサイズですが、その大小によって、以下の傾向が予測されます。

  - ミニバッチサイズが、32よりも小さい場合(例えば、16等)
      - RAM使用量を、より抑えることができる
      - 処理時間が、相対的に長くなってしまう
      - 分散共分散行列の近似精度に対する、心配が増える

  - ミニバッチサイズが、32より大きい場合(例えば、64等)
      - RAM使用量が、膨らんでしまう
      - 処理時間が、相対的に短くなる(オリジナルのアルゴリズムよりは遅い)
      - 分散共分散行列の近似精度に対する、心配が減る

これについても、実験を行ってみようと思います。


RAM消費量を抑える対応の実施結果(ミニバッチサイズ:16の場合)

先ず、ミニバッチサイズを16にした場合です。 RAMの使用量推移は以下プロットのようになり、最大12GB程でした。 こちらはまだ詳細を追えていないのですが、ミニバッチサイズが32の場合と、RAM消費量はあまり変わりませんでした。

image


実験結果と、処理時間については、以下となります。 評価精度は、オリジナルとほぼ同値となりました。 mvtecの全種類のデータに対して、かかった処理時間は79分で、ミニバッチサイズが32の場合と比べ、およそ1.5倍の時間を要しました。

| feature extraction | train | bottle |: 100%|██| 14/14 [01:59<00:00,  8.55s/it]
| feature extraction | test | bottle |: 100%|█████| 6/6 [01:54<00:00, 19.08s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|███| 14/14 [02:03<00:00,  8.84s/it]
| feature extraction | test | cable |: 100%|████| 10/10 [03:13<00:00, 19.31s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|█| 14/14 [02:02<00:00,  8.76s/it]
| feature extraction | test | capsule |: 100%|████| 9/9 [02:56<00:00, 19.56s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|██| 18/18 [02:38<00:00,  8.79s/it]
| feature extraction | test | carpet |: 100%|█████| 8/8 [02:33<00:00, 19.20s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|████| 17/17 [02:22<00:00,  8.37s/it]
| feature extraction | test | grid |: 100%|███████| 5/5 [01:33<00:00, 18.68s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|█| 25/25 [03:37<00:00,  8.69s/it
| feature extraction | test | hazelnut |: 100%|███| 7/7 [02:13<00:00, 19.12s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|█| 16/16 [02:15<00:00,  8.46s/it]
| feature extraction | test | leather |: 100%|████| 8/8 [02:35<00:00, 19.41s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 14/14 [01:56<00:00,  8.34s/i
| feature extraction | test | metal_nut |: 100%|██| 8/8 [02:32<00:00, 19.11s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|████| 17/17 [02:25<00:00,  8.56s/it]
| feature extraction | test | pill |: 100%|█████| 11/11 [03:30<00:00, 19.18s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.961
| feature extraction | train | screw |: 100%|███| 20/20 [02:50<00:00,  8.54s/it]
| feature extraction | test | screw |: 100%|████| 10/10 [03:11<00:00, 19.19s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|████| 15/15 [02:07<00:00,  8.53s/it]
| feature extraction | test | tile |: 100%|███████| 8/8 [02:37<00:00, 19.65s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.938  (←オリジナル、及び、バッチサイズ32の場合、0.939)
| feature extraction | train | toothbrush |: 100%|█| 4/4 [00:35<00:00,  8.78s/it
| feature extraction | test | toothbrush |: 100%|█| 3/3 [00:56<00:00, 18.67s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 14/14 [02:00<00:00,  8.62s/
| feature extraction | test | transistor |: 100%|█| 7/7 [02:14<00:00, 19.28s/it]
image ROCAUC: 0.977
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|████| 16/16 [02:21<00:00,  8.82s/it]
| feature extraction | test | wood |: 100%|███████| 5/5 [01:38<00:00, 19.64s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|██| 15/15 [02:06<00:00,  8.40s/it]
| feature extraction | test | zipper |: 100%|███| 10/10 [03:13<00:00, 19.31s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 4731.19149 (sec)


RAM消費量を抑える対応の実施結果(ミニバッチサイズ:64の場合)

次に、ミニバッチサイズを64にした場合です。 RAMの使用量推移は以下プロットのようになり、最大13.5GB程でした。 こちらも詳細を追えていないのですが、バッチサイズが倍になってもRAMが倍になる訳ではありませんでした。

image


実験結果と、処理時間については、以下となります。 評価精度は、オリジナルとほぼ同値となりました。 mvtecの全種類のデータに対して、かかった処理時間は36分で、ミニバッチサイズが32の場合と比べ、およそ0.75倍の時間を要しました。

| feature extraction | train | bottle |: 100%|████| 4/4 [00:45<00:00, 11.47s/it]
| feature extraction | test | bottle |: 100%|█████| 2/2 [00:47<00:00, 23.97s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 4/4 [00:50<00:00, 12.56s/it]
| feature extraction | test | cable |: 100%|██████| 3/3 [01:19<00:00, 26.35s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 4/4 [00:49<00:00, 12.28s/it]
| feature extraction | test | capsule |: 100%|████| 3/3 [01:16<00:00, 25.35s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 5/5 [01:02<00:00, 12.58s/it]
| feature extraction | test | carpet |: 100%|█████| 2/2 [00:57<00:00, 28.71s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 5/5 [00:55<00:00, 11.15s/it]
| feature extraction | test | grid |: 100%|███████| 2/2 [00:47<00:00, 23.83s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|██| 7/7 [01:26<00:00, 12.32s/it]
| feature extraction | test | hazelnut |: 100%|███| 2/2 [00:55<00:00, 27.87s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 4/4 [00:51<00:00, 12.88s/it]
| feature extraction | test | leather |: 100%|████| 2/2 [00:57<00:00, 28.96s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 4/4 [00:45<00:00, 11.25s/it]
| feature extraction | test | metal_nut |: 100%|██| 2/2 [00:54<00:00, 27.02s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 5/5 [00:57<00:00, 11.41s/it]
| feature extraction | test | pill |: 100%|███████| 3/3 [01:21<00:00, 27.26s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.962  (←オリジナル、及び、ミニバッチサイズ32の場合、0.961)
| feature extraction | train | screw |: 100%|█████| 5/5 [01:00<00:00, 12.03s/it]
| feature extraction | test | screw |: 100%|██████| 3/3 [01:19<00:00, 26.50s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 4/4 [00:48<00:00, 12.01s/it]
| feature extraction | test | tile |: 100%|███████| 2/2 [00:54<00:00, 27.42s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 1/1 [00:12<00:00, 12.95s/it
| feature extraction | test | toothbrush |: 100%|█| 1/1 [00:25<00:00, 25.13s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 4/4 [00:48<00:00, 12.19s/it
| feature extraction | test | transistor |: 100%|█| 2/2 [00:52<00:00, 26.44s/it]
image ROCAUC: 0.977
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 4/4 [00:53<00:00, 13.37s/it]
| feature extraction | test | wood |: 100%|███████| 2/2 [00:48<00:00, 24.22s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 4/4 [00:46<00:00, 11.68s/it]
| feature extraction | test | zipper |: 100%|█████| 3/3 [01:16<00:00, 25.42s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 2184.43271 (sec)


RAM消費量を抑える対応の別アイデア

尚、RAM消費量抑制、及び、高速化を目指すには、例えば以下のようなアイデアもあろうかと思います。

  - 予め計算しておく分散共分散行列の逆行列を、テストの都度、計算しているので、予め逆行列を求めておくようにする
      - 上記以外の処理についても、プロファイルも取る
  - マハラノビス距離の計算部分を、scipyで求めるのではなく、numpyの行列計算にて求める
  - GPUで行った方が早そうな計算を、CPUで行ってる部分がある為、そこをGPU上で行うようにする
  - (変数の型を、float16とする)


現状行った対応については、元コードを極力変更しない様な方針で行った次第となっています。


mucunwuxian commented 3 years ago

対応に際して行った実験について(続き)📝


事前に分散共分散行列の逆行列を求めておく、かつ、マハラノビス距離の計算処理をnumpyの行列計算にて求める

掲題のアイデアについて、実装をしてみました。 コードは、下記のリンクとなります。 https://github.com/axinc-ai/PaDiM-Anomaly-Detection-Localization-master/tree/speeding_up


ミニバッチサイズ32にて実験をしてみたところ、メモリの使用量推移は以下となりました。

image


精度評価結果、表示桁数下3桁までで、オリジナルとほぼ同値となりました。 処理時間は少し改善し、48分→42分程となりました。

| feature extraction | train | bottle |: 100%|████| 7/7 [01:06<00:00,  9.51s/it]
| feature extraction | test | bottle |: 100%|█████| 3/3 [00:22<00:00,  7.39s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 7/7 [01:10<00:00, 10.11s/it]
| feature extraction | test | cable |: 100%|██████| 5/5 [00:39<00:00,  7.89s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 7/7 [01:10<00:00, 10.01s/it]
| feature extraction | test | capsule |: 100%|████| 5/5 [00:37<00:00,  7.55s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 9/9 [01:30<00:00, 10.05s/it]
| feature extraction | test | carpet |: 100%|█████| 4/4 [00:31<00:00,  7.97s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 9/9 [01:23<00:00,  9.29s/it]
| feature extraction | test | grid |: 100%|███████| 3/3 [00:21<00:00,  7.08s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|█| 13/13 [02:08<00:00,  9.87s/it
| feature extraction | test | hazelnut |: 100%|███| 4/4 [00:39<00:00,  9.76s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 8/8 [01:19<00:00,  9.88s/it]
| feature extraction | test | leather |: 100%|████| 4/4 [00:32<00:00,  8.22s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 7/7 [01:05<00:00,  9.42s/it]
| feature extraction | test | metal_nut |: 100%|██| 4/4 [00:29<00:00,  7.32s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 9/9 [01:24<00:00,  9.40s/it]
| feature extraction | test | pill |: 100%|███████| 6/6 [00:43<00:00,  7.29s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.961
| feature extraction | train | screw |: 100%|███| 10/10 [01:34<00:00,  9.46s/it]
| feature extraction | test | screw |: 100%|██████| 5/5 [00:37<00:00,  7.42s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 8/8 [01:15<00:00,  9.45s/it]
| feature extraction | test | tile |: 100%|███████| 4/4 [00:30<00:00,  7.74s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 2/2 [00:20<00:00, 10.18s/it
| feature extraction | test | toothbrush |: 100%|█| 2/2 [00:14<00:00,  7.29s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 7/7 [01:09<00:00,  9.99s/it
| feature extraction | test | transistor |: 100%|█| 4/4 [00:31<00:00,  7.88s/it]
image ROCAUC: 0.977  (←オリジナルの場合、0.978)
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 8/8 [01:21<00:00, 10.24s/it]
| feature extraction | test | wood |: 100%|███████| 3/3 [00:24<00:00,  8.06s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 8/8 [01:13<00:00,  9.21s/it]
| feature extraction | test | zipper |: 100%|█████| 5/5 [00:37<00:00,  7.51s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 2507.48480 (sec)


ミニバッチサイズ64にて実験をしてみたところ、メモリの使用量推移は以下となりました。

image


精度評価結果、表示桁数下3桁までで、ほぼ同値となりました。 処理時間は更に少し改善し、36分→34分程となりました。

| feature extraction | train | bottle |: 100%|████| 4/4 [00:45<00:00, 11.48s/it]
| feature extraction | test | bottle |: 100%|█████| 2/2 [00:17<00:00,  8.96s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 4/4 [00:50<00:00, 12.59s/it]
| feature extraction | test | cable |: 100%|██████| 3/3 [00:30<00:00, 10.19s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 4/4 [00:49<00:00, 12.45s/it]
| feature extraction | test | capsule |: 100%|████| 3/3 [00:28<00:00,  9.41s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 5/5 [01:02<00:00, 12.41s/it]
| feature extraction | test | carpet |: 100%|█████| 2/2 [00:22<00:00, 11.05s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 5/5 [00:55<00:00, 11.13s/it]
| feature extraction | test | grid |: 100%|███████| 2/2 [00:16<00:00,  8.45s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|██| 7/7 [01:26<00:00, 12.42s/it]
| feature extraction | test | hazelnut |: 100%|███| 2/2 [00:21<00:00, 10.79s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 4/4 [00:51<00:00, 12.81s/it]
| feature extraction | test | leather |: 100%|████| 2/2 [00:22<00:00, 11.39s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 4/4 [00:44<00:00, 11.20s/it]
| feature extraction | test | metal_nut |: 100%|██| 2/2 [00:19<00:00,  9.85s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 5/5 [00:57<00:00, 11.52s/it]
| feature extraction | test | pill |: 100%|███████| 3/3 [00:29<00:00,  9.87s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.962  (←オリジナルの場合、0.961)
| feature extraction | train | screw |: 100%|█████| 5/5 [00:59<00:00, 11.97s/it]
| feature extraction | test | screw |: 100%|██████| 3/3 [00:47<00:00, 15.75s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 4/4 [00:48<00:00, 12.05s/it]
| feature extraction | test | tile |: 100%|███████| 2/2 [00:21<00:00, 10.51s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 1/1 [00:13<00:00, 13.22s/it
| feature extraction | test | toothbrush |: 100%|█| 1/1 [00:09<00:00,  9.78s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 4/4 [00:49<00:00, 12.31s/it
| feature extraction | test | transistor |: 100%|█| 2/2 [00:20<00:00, 10.23s/it]
image ROCAUC: 0.977  (←オリジナルの場合、0.978)
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 4/4 [00:53<00:00, 13.36s/it]
| feature extraction | test | wood |: 100%|███████| 2/2 [00:18<00:00,  9.43s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 4/4 [00:47<00:00, 11.77s/it]
| feature extraction | test | zipper |: 100%|█████| 3/3 [00:29<00:00,  9.79s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 2012.22383 (sec)


ミニバッチサイズ128にて実験をしてみたところ、メモリの使用量推移は以下となりました。 メモリ使用量の最大値は、22GB程となりました。

image


精度評価結果、表示桁数下3桁までで、同値となりました。 処理時間は、29分程と、オリジナルの25分にかなり近くなりました。

| feature extraction | train | bottle |: 100%|████| 2/2 [00:31<00:00, 15.97s/it]
| feature extraction | test | bottle |: 100%|█████| 1/1 [00:12<00:00, 12.84s/it]
image ROCAUC: 0.998
pixel ROCAUC: 0.982
| feature extraction | train | cable |: 100%|█████| 2/2 [00:36<00:00, 18.44s/it]
| feature extraction | test | cable |: 100%|██████| 2/2 [00:25<00:00, 12.97s/it]
image ROCAUC: 0.922
pixel ROCAUC: 0.968
| feature extraction | train | capsule |: 100%|███| 2/2 [00:35<00:00, 17.87s/it]
| feature extraction | test | capsule |: 100%|████| 2/2 [00:23<00:00, 11.88s/it]
image ROCAUC: 0.915
pixel ROCAUC: 0.986
| feature extraction | train | carpet |: 100%|████| 3/3 [00:49<00:00, 16.60s/it]
| feature extraction | test | carpet |: 100%|█████| 1/1 [00:17<00:00, 17.88s/it]
image ROCAUC: 0.999
pixel ROCAUC: 0.990
| feature extraction | train | grid |: 100%|██████| 3/3 [00:43<00:00, 14.38s/it]
| feature extraction | test | grid |: 100%|███████| 1/1 [00:12<00:00, 12.02s/it]
image ROCAUC: 0.957
pixel ROCAUC: 0.965
| feature extraction | train | hazelnut |: 100%|██| 4/4 [01:06<00:00, 16.67s/it]
| feature extraction | test | hazelnut |: 100%|███| 1/1 [00:16<00:00, 16.59s/it]
image ROCAUC: 0.933
pixel ROCAUC: 0.979
| feature extraction | train | leather |: 100%|███| 2/2 [00:37<00:00, 18.93s/it]
| feature extraction | test | leather |: 100%|████| 1/1 [00:17<00:00, 17.85s/it]
image ROCAUC: 1.000
pixel ROCAUC: 0.989
| feature extraction | train | metal_nut |: 100%|█| 2/2 [00:31<00:00, 15.79s/it]
| feature extraction | test | metal_nut |: 100%|██| 1/1 [00:14<00:00, 14.78s/it]
image ROCAUC: 0.992
pixel ROCAUC: 0.971
| feature extraction | train | pill |: 100%|██████| 3/3 [00:43<00:00, 14.61s/it]
| feature extraction | test | pill |: 100%|███████| 2/2 [00:25<00:00, 12.53s/it]
image ROCAUC: 0.944
pixel ROCAUC: 0.961
| feature extraction | train | screw |: 100%|█████| 3/3 [00:47<00:00, 15.82s/it]
| feature extraction | test | screw |: 100%|██████| 2/2 [00:23<00:00, 11.80s/it]
image ROCAUC: 0.844
pixel ROCAUC: 0.983
| feature extraction | train | tile |: 100%|██████| 2/2 [00:34<00:00, 17.41s/it]
| feature extraction | test | tile |: 100%|███████| 1/1 [00:16<00:00, 16.39s/it]
image ROCAUC: 0.974
pixel ROCAUC: 0.939
| feature extraction | train | toothbrush |: 100%|█| 1/1 [00:13<00:00, 13.29s/it
| feature extraction | test | toothbrush |: 100%|█| 1/1 [00:09<00:00,  9.63s/it]
image ROCAUC: 0.972
pixel ROCAUC: 0.987
| feature extraction | train | transistor |: 100%|█| 2/2 [00:35<00:00, 17.72s/it
| feature extraction | test | transistor |: 100%|█| 1/1 [00:15<00:00, 15.96s/it]
image ROCAUC: 0.978
pixel ROCAUC: 0.975
| feature extraction | train | wood |: 100%|██████| 2/2 [00:39<00:00, 19.88s/it]
| feature extraction | test | wood |: 100%|███████| 1/1 [00:13<00:00, 13.97s/it]
image ROCAUC: 0.988
pixel ROCAUC: 0.941
| feature extraction | train | zipper |: 100%|████| 2/2 [00:33<00:00, 16.64s/it]
| feature extraction | test | zipper |: 100%|█████| 2/2 [00:22<00:00, 11.24s/it]
image ROCAUC: 0.909
pixel ROCAUC: 0.984
Average ROCAUC: 0.955
Average pixel ROCUAC: 0.973
elapsed time: 1730.09983 (sec)