基于 MVTec AD 真实图像子集的工业表面异常检测:Python 无监督缺陷检测实战

发布时间:2026/6/2 23:19:41

基于 MVTec AD 真实图像子集的工业表面异常检测:Python 无监督缺陷检测实战 关键词工业缺陷检测、MVTec AD、无监督异常检测、IsolationForest、SSIM、异常热力图、机器视觉质检、Python 项目实战摘要工业质检场景里正常样本通常更容易采集缺陷样本却少、杂、贵直接做目标检测或分割往往会卡在标注成本上。本文实现一个轻量级工业表面异常检测项目只用正常图像建模推理时输出异常分数、热力图、二值掩膜、CSV 报表和指标图。示例数据采用 MVTec AD transistor 类公开真实图像子集便于读者快速复现完整流程。本项目适合作为课程实验、论文基线和机器视觉质检原型的入门版本。它不依赖 PyTorch/TensorFlow也不需要大模型权重核心依赖是numpy、pandas、scikit-image、scikit-learn、matplotlib和Pillow。项目实现效果项目按“真实图像输入 - 正常样本训练 - 异常分数融合 - 热力图定位 - 报表输出”组织。示例真实子集包含 10 张正常训练图、1 张正常测试图和 2 张可见表面损伤测试图标签清单保存在data/real_transistor_subset/labels.csv。这套结构保留了完整工程闭环configs/real_transistor_config.json管理数据路径、图像尺寸和阈值src/feature_extractor.py负责特征提取src/anomaly_detector.py负责模板建模、IsolationForest 和预测src/evaluation.py负责批量评估、报表和结果可视化。算法流程如下。训练阶段只读取train/good中的正常图像先生成正常模板再提取统计特征、纹理残差、梯度、直方图、模板差异和 SSIM 差异。推理阶段将 IsolationForest 分数、MSE 差异和 SSIM 误差融合为异常分数同时输出局部热力图。单张真实表面损伤图的推理结果如下。左上角是输入图右上角是异常热力图左下角是二值掩膜右下角是叠加可视化。热力图可以辅助判断异常集中位置比单纯的正常/异常标签更适合质检复核。数据与运行方式项目默认使用真实图像子集配置python main.py--modeall--configconfigs/real_transistor_config.json单图推理命令如下python main.py--modeinfer--configconfigs/real_transistor_config.json--inputdata/real_transistor_subset/test/surface_damage/damage_005.jpg--outputimages/results/single_inference_real.png运行后会生成这些关键文件outputs/detection_report.csv outputs/metrics.json images/results/anomaly_score_chart.png images/results/confusion_matrix.png images/results/result_00_good.png images/results/result_01_surface_damage.png images/results/single_inference_real.png models/surface_anomaly_detector.joblib正常样本的可视化结果如下。模型输出为正常异常分数略低于配置阈值。与正常图相比表面损伤图在异常分数和局部热力图上会出现更明显响应。示例数据来自公开真实图片子集适合展示项目运行链路如果要做正式论文实验仍应下载完整 MVTec AD 数据集并按类别重新评估。真实子集评估结果批量评估会把每张测试图的预测结果写入outputs/detection_report.csv。示例真实子集的检测结果如下样本类型数量预测结果正常样本11 张预测正常表面损伤样本22 张预测异常指标文件outputs/metrics.json的核心结果为指标数值Accuracy1.000Precision1.000Recall1.000F11.000TP/TN/FP/FN2 / 1 / 0 / 0异常分数图如下。绿色柱表示正常样本红色柱表示异常样本虚线为当前配置阈值0.990。这个阈值是在示例小子集上校准的迁移到其他工位或完整数据集时需要重新调整。混淆矩阵适合放进项目报告或实验记录用来说明示例真实子集的图像级判断结果。核心算法说明正常模板训练阶段先把所有正常训练图统一缩放到配置尺寸默认256 x 256再求平均得到正常模板。对于固定相机、固定背景、固定产品姿态的质检任务模板差异是一个容易解释的 baseline。templatemean(normal_images)模板方法不是万能的。如果真实现场存在明显位移、旋转、尺度变化或光照漂移应先做 ROI 裁剪、图像配准、亮度归一化或进一步扩展为 PatchCore、FastFlow、Reverse Distillation 等深度异常检测方法。特征提取每张图片会提取六类信息特征类型作用灰度统计描述整体亮度和分位数分布局部残差捕捉局部纹理突变梯度统计反映边缘和划痕类变化灰度直方图表征整体灰度结构模板差异衡量与正常模板的像素偏离SSIM 差异衡量局部结构相似度下降IsolationForest负责学习正常样本的特征分布。推理时项目把特征异常分数、MSE 差异和 SSIM 误差组合成最终异常分数anomaly_score0.40*feature_score0.34*mse_score0.26*ssim_score热力图与掩膜局部热力图由模板差异和 SSIM 局部误差共同生成。项目随后对热力图进行阈值化、开闭运算和连通域过滤得到二值缺陷掩膜。这样做的好处是输出不仅有图像级判断还能给出可视化定位结果便于人工复核。目录结构industrial_surface_anomaly_detection/ ├── main.py ├── requirements.txt ├── configs/ │ ├── real_transistor_config.json │ └── demo_config.json ├── data/ │ ├── real_transistor_subset/ │ └── README_MVTEC_AD.md ├── src/ │ ├── anomaly_detector.py │ ├── evaluation.py │ ├── feature_extractor.py │ ├── visualization.py │ └── data_generator.py ├── images/ │ ├── figures/ │ └── results/ ├── outputs/ └── models/demo_config.json和src/data_generator.py可用于离线教学扩展本文展示和默认运行均使用真实图像子集。完整 MVTec AD 数据集体积较大正式实验应从官方页面下载并遵守数据集许可。扩展建议如果要把这个项目继续做成更完整的工业质检系统可以从以下方向扩展加入 ROI 自动裁剪减少背景孔位和拍摄位置变化对模板差异的影响对完整 MVTec AD 单类别重新生成labels.csv评估更多缺陷类型增加像素级指标例如 AUROC、PRO、IoU 或 Dice将infer_single()接入 Flask、FastAPI、Streamlit 或 PySide6用 PatchCore、FastFlow 等方法替换当前轻量 baseline并保留本文的报表和可视化结构。参考资料MVTec AD 官方数据集页面https://www.mvtec.com/company/research/datasets/mvtec-adMVTec AD CVPR 2019 论文页面https://openaccess.thecvf.com/content_CVPR_2019/html/Bergmann_MVTec_AD_–_A_Comprehensive_Real-World_Dataset_for_Unsupervised_Anomaly_CVPR_2019_paper.htmlDataset Ninja MVTec AD 页面https://datasetninja.com/mvtec-adscikit-image SSIM 文档https://scikit-image.org/docs/stable/api/skimage.metrics.htmlscikit-learn IsolationForest 文档https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html

相关新闻