【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络
时间:2025-07-29 | 作者: | 阅读:0本文介绍基于PaddlePaddle复现的STFPM算法,该算法通过师生网络特征金字塔匹配实现异常检测。教师网络预训练,学生网络学习无异常图像分布,多尺度特征匹配增强鲁棒性。在MvTec数据集实验中,image-level AUC均值0.937,pixel-level AUC均值0.967,优于参考项目,适用于工业缺陷检测等场景。
STFPM-Paddle:基于Paddle实现用于异常检测的师生网络
1.1 简介
本项目利用?PaddlePaddle?复现了 BMVC 2021 论文: ? ? ? ?
Student-Teacher Feature Pyramid Matching for Anomaly Detection
STFPM算法由预先培训的教师网络和结构相同的学生网络组成。学生网络通过将特征与教师网络中的对应特征相匹配来学习无异常图像的分布。多尺度特征匹配用于增强鲁棒性。这种分层特征匹配使学生网络能够从特征金字塔接收多层次知识的混合,从而允许各种大小的异常检测。 在推理过程中,比较了教师网络和学生网络的特征金字塔。差异越大,异常发生的概率越高。
本项目基于PaddlePaddle框架复现了STFPM,并在MvTec数据集上进行了实验。
论文:
- [1] Wang, G. and Han, S. and Ding, E. and Huang, D.?Student-Teacher Feature Pyramid Matching for Anomaly Detection
项目参考:
- anomalib
- STFPM
核心代码:很简单的思想,算teacher模型和student模型的不同尺度的特征差异。
def predict(teacher, student, img_path, transform): img = Image.open(img_path).convert('RGB') orishape = img.size img = transform(img) img = img.unsqueeze(0) teacher.eval() student.eval() with paddle.no_grad(): t_feat = teacher(img) s_feat = student(img) score_map = 1. for j in range(len(t_feat)): t_feat[j] = F.normalize(t_feat[j], axis=1) s_feat[j] = F.normalize(s_feat[j], axis=1) sm = paddle.sum((t_feat[j] - s_feat[j]) ** 2, 1, keepdim=True) # core code sm = F.interpolate(sm, size=(64, 64), mode='bilinear', align_corners=False) # aggregate score map by element-wise product score_map = score_map * sm # layer map score_map = score_map.squeeze().cpu().numpy() anomaly_map = cv2.resize(score_map, (orishape[0],orishape[1])) return anomaly_map登录后复制
? ? ? ?
1.2 复现精度
本项目在MvTec数据集的测试效果如下表。
Image-Level AUC
Pixel-Level AUC
image-level auc的Mean为0.937。 pixel-level auc的Mean为0.967。
1.3 数据集
数据集网站:MvTec数据集
AiStudio上的数据集:MVTec-AD
MVTec AD是MVtec公司提出的一个用于异常检测的数据集。与之前的异常检测数据集不同,该数据集模仿了工业实际生产场景,并且主要用于unsupervised anomaly detection。数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常的数据集
数据集包含不同领域中的五种纹理以及十种物体,且训练集中只包含正常样本,测试集中包含正常样本与缺陷样本,因此需要使用无监督方法学习正常样本的特征表示,并用其检测缺陷样本。这是符合现实的做法,因为异常情况不可预知并无法归纳。下图分别展示了几类图片的正常样本与缺陷样本,以及缺陷样本中的缺陷特写:
? ? ? ?快速开始
In [?]%cd /home/aistudio/data/!tar xvf data116034/mvtec_anomaly_detection.tar.xz登录后复制 ? ?
2.1 依赖安装
In [?]!pip install scikit-image登录后复制 ? ?
2.2 训练
一共有15个类别,这里需要对15个类别分别训练,最后取平均值作为验证指标.随机数种子42,follow?anomalib.
预训练模型在/home/aistudio/data/data138329/output.zip 可以解压到/home/aistudio/STFPM-main/output42目录下进行后续验证部分的直接验证
unzip /home/aistudio/data/data138329/output.zipmv output42 /home/aistudio/STFPM-main/登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category carpet --train_val=True --model_save_path=./output_42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category grid --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category leather --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category tile --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category wood --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category bottle --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category cable --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category capsule --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category hazelnut --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category metal_nut --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category pill --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category screw --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category toothbrush --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category transistor --epochs 100 --train_val=True --model_save_path=./output42 --seed 42登录后复制 ? ?In [?]
%cd /home/aistudio/STFPM-main/!python train.py train --mvtec_ad=/home/aistudio/data/ --category zipper --epochs 100 --train_val=True --model_save_path=./output登录后复制 ? ?
2.3 验证
In [?]!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category carpet --checkpoint=output42/carpet/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category grid --checkpoint=output42/grid/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category leather --checkpoint=output42/leather/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category tile --checkpoint=output42/tile/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category wood --checkpoint=output42/wood/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category bottle --checkpoint=output42/bottle/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category cable --checkpoint=output42/cable/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category capsule --checkpoint=output42/capsule/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category hazelnut --checkpoint=output42/hazelnut/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category metal_nut --checkpoint=output42/metal_nut/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category pill --checkpoint=output42/pill/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category screw --checkpoint=output42/screw/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category toothbrush --checkpoint=output42/toothbrush/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category transistor --checkpoint=output42/transistor/best.pdparams登录后复制 ? ?In [?]
!python val.py --depth=18 --mvtec_ad=/home/aistudio/data/ --category zipper --checkpoint=output42/zipper/best.pdparams登录后复制 ? ?
2.4 预测
In [?]!python predict.py --checkpoint=output42/carpet/best.pdparams --image_path=/home/aistudio/data/carpet/test/color/000.png --save_path=predict.png登录后复制 ? ?
可以得如下的类似结果:

2.5 导出
In [?]!python export_model.py --depth 18 --img_size=256 --model_path=output/carpet/best.pdparams --save_dir=./output登录后复制 ? ?
2.6 推理
In [?]!python infer.py --use_gpu=True --model_file=output/model.pdmodel --input_file=/home/aistudio/data/carpet/test/color/000.png --params_file=output/model.pdiparams登录后复制 ? ?
2.7 TIPC
注意:本部分为论文复现赛内容,只是为了验证整个项目的训练推理的正确性。学习目的可以不进行这部分的运行,即这部分非项目必要部分。
首先安装auto_log,需要进行安装,安装方式如下: auto_log的详细介绍参考https://github.com/LDOUBLEV/AutoLog。
git clone https://github.com/LDOUBLEV/AutoLogcd AutoLog/pip3 install -r requirements.txtpython3 setup.py bdist_wheelpip3 install ./dist/auto_log-1.2.0-py3-none-any.whl登录后复制 ? ? ? ?
进行TIPC:
bash test_tipc/prepare.sh test_tipc/configs/STFPM/train_infer_python.txt 'lite_train_lite_infer'bash test_tipc/test_train_inference_python.sh test_tipc/configs/STFPM/train_infer_python.txt 'lite_train_lite_infer'登录后复制 ? ?
复现心得和相关信息
复现心得
工业缺陷检测是本次论文复现赛新加入的赛道,我也是第一次复现相关论文。感觉很有意思,不像其他领域的算法需要长时间的训练,这个领域基本上都是无监督的方法。对GPU的需求也很友好,也很实用。这篇论文用教师网络和学生网络的特征金字塔的特征差异为基本思路(代码也就几行),差异越大,异常发生的概率越高,很朴实有效。
相关信息
本项目为第六届论文复现赛项目,为新加入的异常检测赛道相关算法。
福利游戏
相关文章
更多-
- nef 格式图片降噪处理用什么工具 效果如何
- 时间:2025-07-29
-
- 邮箱长时间未登录被注销了能恢复吗?
- 时间:2025-07-29
-
- Outlook收件箱邮件不同步怎么办?
- 时间:2025-07-29
-
- 为什么客户端收邮件总是延迟?
- 时间:2025-07-29
-
- 一英寸在磁带宽度中是多少 老式设备规格
- 时间:2025-07-29
-
- 大卡和年龄的关系 不同年龄段热量需求
- 时间:2025-07-29
-
- jif 格式是 gif 的变体吗 现在还常用吗
- 时间:2025-07-29
-
- hdr 格式图片在显示器上能完全显示吗 普通显示器有局限吗
- 时间:2025-07-29
大家都在玩
大家都在看
更多-
- 华为电脑管家怎么优化启动项
- 时间:2025-08-14
-
- intellij idea怎么安装
- 时间:2025-08-14
-
- 剪映电脑版如何给视频添加转场特效
- 时间:2025-08-14
-
- 以太坊价格升至 4670 美元,背后推手是谁
- 时间:2025-08-14
-
- 欧易官方网站入口 欧易OKE交易所app官网登陆最新入口
- 时间:2025-08-14
-
- Lixte Biotechnology周三收盘下跌16%,此前计划将财库25%资金投资加密货币
- 时间:2025-08-14
-
- 全链网:Overlay Protocol (OVL)空投门槛为200分
- 时间:2025-08-14
-
- 全链网:10月市场或见顶,比特币可达到142,690美元,以太坊可达6900美元
- 时间:2025-08-14