队伍名:CS-破空舰
cutpaste是一种简单有效的自监督学习方法,其目标是构建一个高性能的两阶段缺陷检测模型,在没有异常数据的情况下检测图像的未知异常模式。首先通过cutpaste数据增强方法学习自监督深度表示,然后在学习的表示上构建生成的单类分类器,从而实现自监督的异常检测。
论文: CutPaste: Self-Supervised Learning for Anomaly Detection and Localization
参考repo: pytorch-cutpaste
在此非常感谢Runinho
等人贡献的pytorch-cutpaste ,提高了本repo复现论文的效率。
- 数据集大小:共包含15个物品类别,解压后总大小在4.92G左右
- 数据集下载链接:mvtec 提取码:0722 解压到images文件夹
- 训练权重下载链接:pdparams & pkl 提取码:0722 解压到models_param文件夹
defect_type | Runinho. CutPaste (3-way) | Li et al. CutPaste (3-way) | CutPaste (3-way) 复现 |
---|---|---|---|
bottle | 99.6 | 98.3 | 100.0 |
cable | 77.2 | 80.6 | 92.4 |
capsule | 92.4 | 96.2 | 92.9 |
carpet | 60.1 | 93.1 | 89.8 |
grid | 100.0 | 99.9 | 99.9 |
hazelnut | 86.8 | 97.3 | 96.6 |
leather | 100.0 | 100.0 | 100.0 |
metal_nut | 87.8 | 99.3 | 96.0 |
pill | 91.7 | 92.4 | 95.5 |
screw | 86.8 | 86.3 | 86.3 |
tile | 97.2 | 93.4 | 99.0 |
toothbrush | 94.7 | 98.3 | 99.2 |
transistor | 93.0 | 95.5 | 95.6 |
wood | 99.4 | 98.6 | 98.8 |
zipper | 98.8 | 99.4 | 100.0 |
average | 91.0 | 95.2 | 96.1 |
paddle_mvtrec01
|--demo # 测试使用的样例图片,两张
|--deploy # 预测部署相关
|--export_model.py # 导出模型
|--infer.py # 部署预测
|--images # 训练和测试数据集
|--lite_data # 自建立的小数据集,只有bottle和grid两个
|--logs # 训练train和测试eval打印的日志信息
|--models_param # 训练的模型权值
|--test_tipc # tipc代码
|--tools # 工具类文件
|--cutpaste.py # 论文代码
|--dataset.py # 数据加载
|--density.py # 高斯聚类代码
|--eval.py # 评估代码
|--model.py # 论文模型
|--predict.py # 预测代码
|--train.py # 训练代码
|----README.md # 用户手册
|----requirements.txt # 依赖包
首先介绍下支持的硬件和框架版本等环境的要求:
- 硬件:GPU显存建议在6G以上
- 框架:
- PaddlePaddle >= 2.3.1
- 环境配置:直接使用
pip install -r requirements.txt
安装依赖即可。
- 全量数据训练:
- 下载好 metec 提取码:0722 数据集
- 将其解压到 images 文件夹下
- 少量数据训练:
- 无需下载数据集,使用lite_data里的数据即可
- 默认使用resnet18预训练模型进行训练,如想关闭,需要传入参数:
python train.py --no_pretrained
- 全量数据训练:
- 下载好 metec-ad 数据集后,将其解压到 ./images 文件夹下
- 运行指令
python tools/train.py --epochs 256 --batch_size 96 --cuda True
- 少量数据训练:
- 运行指令
python tools/train.py --data_dir lite_data --type bottle --epochs 5 --test_epochs 5 --batch_size 4 --cuda False
- 部分训练日志如下所示:
############################
training bottle
############################
Type : bottle Train [ Epoch 1/256 iter 1 ] lr: 0.03000, loss: 1.34867, avg_reader_cost: 2.85896 sec, avg_batch_cost: 5.08064 sec, avg_samples: 96.0, avg_ips: 18.89526 images/sec.
Type : bottle Train [ Epoch 1/256 iter 2 ] lr: 0.03000, loss: 0.71292, avg_reader_cost: 0.00015 sec, avg_batch_cost: 0.10269 sec, avg_samples: 96.0, avg_ips: 934.85698 images/sec.
Type : bottle Train [ Epoch 1/256 iter 3 ] lr: 0.03000, loss: 0.65832, avg_reader_cost: 0.00009 sec, avg_batch_cost: 0.03219 sec, avg_samples: 17.0, avg_ips: 528.06209 images/sec.
Type : bottle Train [ Epoch 2/256 iter 1 ] lr: 0.03000, loss: 0.55255, avg_reader_cost: 2.56750 sec, avg_batch_cost: 2.67233 sec, avg_samples: 96.0, avg_ips: 35.92374 images/sec.
Type : bottle Train [ Epoch 2/256 iter 2 ] lr: 0.03000, loss: 0.36559, avg_reader_cost: 0.00013 sec, avg_batch_cost: 0.10577 sec, avg_samples: 96.0, avg_ips: 907.63495 images/sec.
Type : bottle Train [ Epoch 2/256 iter 3 ] lr: 0.03000, loss: 0.37505, avg_reader_cost: 0.00012 sec, avg_batch_cost: 0.03266 sec, avg_samples: 17.0, avg_ips: 520.54467 images/sec.
Type : bottle Train [ Epoch 3/256 iter 1 ] lr: 0.02998, loss: 0.37115, avg_reader_cost: 1.98013 sec, avg_batch_cost: 2.08481 sec, avg_samples: 96.0, avg_ips: 46.04729 images/sec.
Type : bottle Train [ Epoch 3/256 iter 2 ] lr: 0.02998, loss: 0.25799, avg_reader_cost: 0.14576 sec, avg_batch_cost: 0.24890 sec, avg_samples: 96.0, avg_ips: 385.70197 images/sec.
...
- 全量数据模型评估:
python tools/eval.py --data_dir images --type all --cuda True
- 少量数据模型评估:
python tools/eval.py --data_dir lite_data --type bottle --cuda False
Namespace(cuda=True, density='paddle', head_layer=1, model_dir='../models_param2/mvtec', save_plots=True, type='all')
evaluating bottle
loading model models_param2/mvtec/model_bottle
[512, 128]
bottle AUC: 1.0
evaluating cable
loading model models_param2/mvtec/model_cable
[512, 128]
cable AUC: 0.9246626686656673
evaluating capsule
loading model models_param2/mvtec/model_capsule
[512, 128]
capsule AUC: 0.9285999202233746
evaluating carpet
loading model models_param2/mvtec/model_carpet
[512, 128]
carpet AUC: 0.8976725521669342
evaluating grid
loading model models_param2/mvtec/model_grid
[512, 128]
grid AUC: 0.9991645781119465
- 基于原始代码的模型预测:
python tools/predict.py --data_type bottle --img_file demo/bottle_good.png
部分结果如下:
预测分数:12.288496017456055 < 最佳阈值: 53.726806640625
预测结果:正常数据
- 基于推理引擎的模型预测:
python deploy/export_model.py
python deploy/infer.py --data_type bottle --img_path demo/bottle_good.png
部分结果如下:
> python deploy/export_model.py
inference model has been saved into deploy
> python deploy/infer.py --data_type bottle --img_path demo/bottle_good.png
image_name: demo/bottle_good.png, data is normal, score is 12.283802032470703, threshold is 53.726806640625
模型推理部署详见4.3节-基于推理引擎的模型预测。
-tipc 所有代码一键测试命令(少量数据集)
bash test_tipc/test_train_inference_python.sh test_tipc/configs/resnet18/train_infer_python.txt lite_train_lite_infer
结果日志如下
�[33m Run successfully with command - resnet18 - python tools/train.py --test_epochs=3 --data_dir=lite_data --type=bottle,grid --model_dir=log/resnet18/lite_train_lite_infer/norm_train_gpus_0 --model_dir=log/resnet18/lite_train_lite_infer/norm_train_gpus_0 --epochs=3 --batch_size=5! �[0m
�[33m Run successfully with command - resnet18 - python tools/eval.py --type=bottle,grid --pretrained=log/resnet18/lite_train_lite_infer/norm_train_gpus_0! �[0m
�[33m Run successfully with command - resnet18 - python deploy/export_model.py --pretrained=log/resnet18/lite_train_lite_infer/norm_train_gpus_0/ --save_inference_dir=log/resnet18/lite_train_lite_infer/norm_train_gpus_0! �[0m
�[33m Run successfully with command - resnet18 - python deploy/infer.py --use_gpu=True --model_dir=log/resnet18/lite_train_lite_infer/norm_train_gpus_0 --batch_size=1 --data_type=bottle > log/resnet18/lite_train_lite_infer/python_infer_gpu_batchsize_1.log 2>&1 ! �[0m
�[33m Run successfully with command - resnet18 - python deploy/infer.py --use_gpu=False --model_dir=log/resnet18/lite_train_lite_infer/norm_train_gpus_0 --batch_size=1 --data_type=bottle > log/resnet18/lite_train_lite_infer/python_infer_cpu_batchsize_1.log 2>&1 ! �[0m
本项目的发布受Apache 2.0 license许可认证。
参考论文: CutPaste: Self-Supervised Learning for Anomaly Detection and Localization
参考repo: pytorch-cutpaste