Closed kyakuno closed 2 years ago
Not implemented in the original Pytorch version.
This operation is not necessary because the MVTECAD dataset is centered. Required when applying to real-world datasets.
@kyakuno
こちら、担当させて頂けたらと思います。
issue https://github.com/axinc-ai/ailia-models/issues/401 の引き続きにて、 ailia-models/anomaly_detection/padim
をカスタマイズするという理解で合っておりますでしょうか?
はい、論文の内容をベースに既存コードにコマンドラインオプションで追加頂ければと思います。
@kyakuno ありがとうございます! 了解致しました!
εI
を足したものを適用しており、これによりフルランクで可逆になるとのことで、あまり特徴値が大きくないpixelの影響も考慮できるようになるようです(逆行列作成時の誤差が軽減されるという意味かと思われ、特に特徴値が低いpixelにおいてはεI
の影響が大きく、相関を考慮しない形になるかと思います)εI
の ε
は、0.01に設定されています(尚、計算される分散共分散行列は、最大値が0.01〜0.1の間に収まっているものが多いですが、最大値0.3弱のものも存在します)N-1
で割ってεI
を足すようにしようと思いますgithubのPaDiMにて、mvtecのデータに対して処理を行った場合のRAMの使用量をプロットしてみると、RAM使用量が35GBを超えてしまっている瞬間がありました。 尚、この検証において、論文に記載されるようなaugmentation仕様は、まだ適用をしていません。
実験結果と、処理時間については、以下となります。
非常に精度が高く、素晴らしいアルゴリズムだと思いました。
尚、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大量使用問題に対して、分散共分散行列の計算方法を、ミニバッチ実施するという解決方法を考えました。
ソースは、以下リンクのものとなります。
客野さんが用意して下さった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程に抑えることができました。
精度評価結果と処理時間については、以下ログとなります。 評価精度は下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分でした。
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使用量が、膨らんでしまう
- 処理時間が、相対的に短くなる(オリジナルのアルゴリズムよりは遅い)
- 分散共分散行列の近似精度に対する、心配が減る
これについても、実験を行ってみようと思います。
先ず、ミニバッチサイズを16にした場合です。 RAMの使用量推移は以下プロットのようになり、最大12GB程でした。 こちらはまだ詳細を追えていないのですが、ミニバッチサイズが32の場合と、RAM消費量はあまり変わりませんでした。
実験結果と、処理時間については、以下となります。 評価精度は、オリジナルとほぼ同値となりました。 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)
次に、ミニバッチサイズを64にした場合です。 RAMの使用量推移は以下プロットのようになり、最大13.5GB程でした。 こちらも詳細を追えていないのですが、バッチサイズが倍になってもRAMが倍になる訳ではありませんでした。
実験結果と、処理時間については、以下となります。 評価精度は、オリジナルとほぼ同値となりました。 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消費量抑制、及び、高速化を目指すには、例えば以下のようなアイデアもあろうかと思います。
- 予め計算しておく分散共分散行列の逆行列を、テストの都度、計算しているので、予め逆行列を求めておくようにする
- 上記以外の処理についても、プロファイルも取る
- マハラノビス距離の計算部分を、scipyで求めるのではなく、numpyの行列計算にて求める
- GPUで行った方が早そうな計算を、CPUで行ってる部分がある為、そこをGPU上で行うようにする
- (変数の型を、float16とする)
現状行った対応については、元コードを極力変更しない様な方針で行った次第となっています。
掲題のアイデアについて、実装をしてみました。 コードは、下記のリンクとなります。 https://github.com/axinc-ai/PaDiM-Anomaly-Detection-Localization-master/tree/speeding_up
ミニバッチサイズ32にて実験をしてみたところ、メモリの使用量推移は以下となりました。
精度評価結果、表示桁数下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にて実験をしてみたところ、メモリの使用量推移は以下となりました。
精度評価結果、表示桁数下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程となりました。
精度評価結果、表示桁数下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)
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).