0

0

【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络

P粉084495128

P粉084495128

发布时间:2025-07-29 10:54:03

|

353人浏览过

|

来源于php中文网

原创

本文介绍基于PaddlePaddle复现的STFPM算法,该算法通过师生网络特征金字塔匹配实现异常检测。教师网络预训练,学生网络学习无异常图像分布,多尺度特征匹配增强鲁棒性。在MvTec数据集实验中,image-level AUC均值0.937,pixel-level AUC均值0.967,优于参考项目,适用于工业缺陷检测等场景。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【论文复现】stfpm-paddle:基于paddle实现用于异常检测的师生网络 - php中文网

STFPM-Paddle:基于Paddle实现用于异常检测的师生网络

1.1 简介

本项目利用 PaddlePaddle 复现了 BMVC 2021 论文:
       

Student-Teacher Feature Pyramid Matching for Anomaly Detection

【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络 - php中文网        

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


Avg Carpet Grid Leather Tile Wood Bottle Cable Capsule Hazelnut Metal Nut Pill Screw Toothbrush Transistor Zipper
论文参考项目anomalib(Pytorch) 0.893 0.954 0.982 0.989 0.949 0.961 0.979 0.838 0.759 0.999 0.956 0.705 0.835 0.997 0.853 0.645
本项目Paddle 0.937 0.972 0.988 0.999 0.992 0.993 1.000 0.933 0.817 1.000 0.984 0.933 0.856 0.772 0.946 0.866

Pixel-Level AUC


Avg Carpet Grid Leather Tile Wood Bottle Cable Capsule Hazelnut Metal Nut Pill Screw Toothbrush Transistor Zipper
论文参考项目anomalib(Pytorch) 0.951 0.986 0.988 0.991 0.946 0.949 0.971 0.898 0.962 0.981 0.942 0.878 0.983 0.983 0.838 0.972
本项目Paddle 0.967 0.992 0.988 0.994 0.959 0.954 0.988 0.954 0.979 0.987 0.974 0.970 0.982 0.989 0.817 0.982

image-level auc的Mean为0.937。 pixel-level auc的Mean为0.967。

1.3 数据集

数据集网站:MvTec数据集

AiStudio上的数据集:MVTec-AD

MVTec AD是MVtec公司提出的一个用于异常检测的数据集。与之前的异常检测数据集不同,该数据集模仿了工业实际生产场景,并且主要用于unsupervised anomaly detection。数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常的数据集

Avatar AI
Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

下载

数据集包含不同领域中的五种纹理以及十种物体,且训练集中只包含正常样本,测试集中包含正常样本与缺陷样本,因此需要使用无监督方法学习正常样本的特征表示,并用其检测缺陷样本。这是符合现实的做法,因为异常情况不可预知并无法归纳。下图分别展示了几类图片的正常样本与缺陷样本,以及缺陷样本中的缺陷特写:

【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络 - php中文网        

快速开始

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.zip
mv 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
   

可以得如下的类似结果:

【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络 - php中文网    

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/AutoLog
cd AutoLog/
pip3 install -r requirements.txt
python3 setup.py bdist_wheel
pip3 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的需求也很友好,也很实用。这篇论文用教师网络和学生网络的特征金字塔的特征差异为基本思路(代码也就几行),差异越大,异常发生的概率越高,很朴实有效。

相关信息

信息 描述
作者 xbchen
日期 2022年4月
框架版本 PaddlePaddle==2.2.1
应用场景 异常检测
硬件支持 GPU、CPU

本项目为第六届论文复现赛项目,为新加入的异常检测赛道相关算法。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

378

2023.08.14

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

426

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

5

2025.12.22

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

426

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

5

2025.12.22

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1497

2024.08.16

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

0

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号