快速导航×

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

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

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

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

1.1 简介

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

Student-Teacher Feature Pyramid Matching for Anomaly Detection

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

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。数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常的数据集

简小派 简小派

简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。

简小派 123 查看详情 简小派

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

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

快速开始

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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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_s*e_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 --s*e_path=predict.png
   

可以得如下的类似结果:

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

2.5 导出

In [ ]
!python export_model.py --depth 18 --img_size=256 --model_path=output/carpet/best.pdparams --s*e_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
日期 2025年4月
框架版本 PaddlePaddle==2.2.1
应用场景 异常检测
硬件支持 GPU、CPU

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

以上就是【论文复现】STFPM-Paddle:基于Paddle实现用于异常检测的师生网络的详细内容,更多请关注其它相关文章!


# git  # python  # 中文网  # fig  # whee  # udio  # follow  # igs  # red  # ai  # 重庆信息化网站推广公司  # 购物网站建设课程介绍  # 网站推广玩法怎么写文案  # 正规网站建设空间  # 中铁建设集团报名网站登录  # 南沙服务业网站建设  # 海外推广营销计划书范文  # 辽宁抖音seo怎么收费  # 金华seo优化推广  # 长清网站推广工具  # 都是  # 官网  # 越高  # 越大  # 相关信息  # 均值  # 这部  # 也很  # 一言 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: PHP和OpenCV库:如何实现人脸识别  XREAL Beam 投屏盒子正式发布:支持“可悬停 AR 空间屏”  国内阅读行业首款对话式AI应用“阅爱聊”封闭内测  智能电网技术:提高能源效率和可靠性  马斯克预测:特斯拉全自动驾驶将在今年实现 对AI深度变化感到担忧  将上下文长度扩展到256k,无限上下文版本的LongLLaMA来了?  甲骨文与Cohere合作为企业提供生成式人工智能服务  金融科技行业:2025年十大人工智能趋势预测  第二届光合组织AI解决方案大赛赛果揭晓  AI大模型紫东太初已被注册商标 中科院已注册紫东太初大模型商标  构建数字文旅新高地!洛阳涧西区开启元宇宙时代  三个全球首创,青岛西海岸新区“海元宇宙”亮相世界人工智能大会  生成式AI引路产业加速来袭,微美全息探索“AIGC+虚拟人”融合应用  中国气象局预测:到 2030 年,中国人工智能气象应用将达到国际领先水平  换流站无线物联网络为新型电力系统铺设“数字之路”  小艺主导智慧交互升级,借助AI大模型增强能力  干货满满,2025昆山元宇宙国际装备展等你来打卡!  美图秀秀发布7款AI产品:支持用户创作、商业创作  东软成立魔形科技研究院,积极布局大语言模型系统工程战略,迎接AI时代  测试框架-安全和自动驾驶  抛媚眼给瞎子看?微软、谷歌的AI广告被广告主抵制  先进技术在防止全球数据丢失方面的作用  2025年的网络分区:人工智能和自动化如何改变事物  AI创作广告文案等同2.47年工作经验,且消费者无法区分|AI营销前沿  找对了风口想不火都难,乐天派机器人,安卓机器人的最终形态?  华为云盘古大模型3.0发布 AI云服务同时上线:200亿亿次性能  消息称字节机器人团队已有约50人,计划年底扩充到上百人  国内通用人形机器人将发布、产业加速突破  论文插图也能自动生成了,用到了扩散模型,还被ICLR接收  华为昇腾AI原生支持30多种基础大模型,包括GPT  赋能金融新生态,多家银行创新应用成果亮相世界人工智能大会  国内首款大尺寸仿鸵双足机器人“大圣”亮相,穿戴红色战袍  「社交达人」GPT-4!解读表情、揣测心理全都会  GPT-4成功战胜AI-Guardian审核系统:谷歌研究团队的人工智能抵抗人工智能  VR健身应用《FitXR》将取消Quest 1端会员服务  花16000元买四款扫拖机器人!科沃斯追觅石头小米谁能笑到最后?  美图秀秀“AI 扩图”功能上线,可根据图像生成更大画幅  大模型新品出现井喷,AI产业迎来新时代  马斯克:将来机器人比人类多!特斯拉机器人亮相人工智能大会  ​《流浪地球2》里机器人公司的创始人:未来10年,机器人的崛起!  微幼科技晨检机器人:幼儿园健康保障的新伙伴  全面拥抱大模型浪潮,ISC 2025打造全球首场AI数字安全峰会  华为即将推出HarmonyOS 4,再度领先行业的AI技术  AI+游戏首度大范围公布实际应用成果,AI全面来临还有多远?  “一般智力”与工艺学批判是认识AI的重要入口 | 社会科学报  京东 AI 大模型官宣 7 月 13 日发布,还有重磅合作  “无人驾驶船”将首次亮相世界人工智能大会,下半年或开进上海迪士尼  定义人工智能的十个关键术语  人工智能写作检测工具不靠谱,美国宪法竟被认为是机器人写的  创新科学家成功研发FAST激光靶标维护机器人