PatchCore代码复现

运行PatchCore代码

image-20240615201110016
1
2
3
论文地址:https://arxiv.org/abs/2106.08265
github地址:https://github.com/amazon-science/patchcore-inspection
平台:autodl云服务器

1.安装依赖

1
2
3
4
5
6
7
# 有setup.py文件,将整个项目安装成一个可导入的依赖
pip install -e .
# 安装依赖
## 注意这里的faiss用的就是cpu版,换成gpu反而会在推理时报错,而且超级影响模型性能(用faiss-gpu训练精度大概会掉30%-40%!!!)
pip install -r requirements.txt
# 运行过程中发现需要安装
pip install timm

2.训练

.sh是一个命令行脚本文件,用于存储原本会手动在命令行执行的命令。通过将命令集中在一个脚本,可以自动化运行代码的流程。

修改sample_training_copy.sh,修改后文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
datapath=/root/autodl-fs/mvtec2d
datasets=('bottle' 'cable' 'capsule' 'carpet' 'grid' 'hazelnut' 'leather' 'metal_nut' 'pill' 'screw' 'tile' 'toothbrush' 'transistor' 'wood' 'zipper')
dataset_flags=($(for dataset in "${datasets[@]}"; do echo '-d '"${dataset}"; done))

############# Detection
### IM224:
# Baseline: Backbone: WR50, Blocks: 2 & 3, Coreset Percentage: 10%, Embedding Dimensionalities: 1024 > 1024, neighbourhood aggr. size: 3, neighbours: 1, seed: 0
# Performance: Instance AUROC: 0.992, Pixelwise AUROC: 0.981, PRO: 0.944

##下述命令行代码的调整:1.将参数采样率-p的值由原来的0.1调整为了0.01,因为显存不够 2.去掉了原来的参数--faiss_on_gpu,因为用的是faiss-cpu 3.去掉参数--log_online

python bin/run_patchcore.py --gpu 0 --seed 0 --save_patchcore_model --log_group IM224_WR50_L2-3_P01_D1024-1024_PS-3_AN-1_S0 --log_project MVTecAD_Results results \
patch_core -b wideresnet50 -le layer2 -le layer3 --pretrain_embed_dimension 1024 --target_embed_dimension 1024 --anomaly_scorer_num_nn 1 --patchsize 3 sampler -p 0.01 approx_greedy_coreset dataset --resize 256 --imagesize 224 "${dataset_flags[@]}" mvtec $datapath

运行sample_training_copy.sh

1
2
3
# 在命令行执行:
chmod +x sample_training_copy.sh
./sample_training_copy.sh

3.评估

修改sample_evaluate_copy.sh,修改后文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 注意这里评估的模型是我上面自己训练的模型,如果需要评估官方预训练好的权重,注意修改loadpath和modelfolder
# Set paths
datapath="/root/autodl-fs/mvtec2d"
loadpath="results/MVTecAD_Results"
modelfolder="IM224_WR50_L2-3_P01_D1024-1024_PS-3_AN-1_S0_2"
savefolder="evaluated_results/$modelfolder"

# Define datasets
datasets=('bottle' 'cable' 'capsule' 'carpet' 'grid' 'hazelnut' 'leather' 'metal_nut' 'pill' 'screw' 'tile' 'toothbrush' 'transistor' 'wood' 'zipper')

# Generate flags
dataset_flags=($(for dataset in "${datasets[@]}"; do echo "-d $dataset"; done))
model_flags=($(for dataset in "${datasets[@]}"; do echo "-p ${loadpath}/${modelfolder}/models/mvtec_${dataset}"; done))

# Run the evaluation
# 注意去掉官方提供的代码中的--faiss_on_gpu参数
python bin/load_and_evaluate_patchcore.py --gpu 0 --seed 0 "$savefolder" \
patch_core_loader "${model_flags[@]}" --faiss_on_gpu \
dataset --resize 256 --imagesize 224 "${dataset_flags[@]}" mvtec "$datapath"

运行sample_evaluation_copy.sh

1
2
3
# 在命令行执行:
chmod +x sample_evaluation_copy.sh
./sample_evaluation_copy.sh

4.遇到的问题及解决

问题:无法下载官方训练好的模型权重,导致想要加载预训练模型直接评估时报错_pickle.UnpicklingError: invalid load key, ‘<‘

原因:模型加载不完整,需要git lfs clone + 链接下载项目