
基于生成模型特征处理的工业异常检测系统一、项目简介本项目面向工业质检场景以DinomalyCVPR 2025为核心算法结合 DINOv2 视觉基础模型与 ViTill 线性注意力解码器实现对工业产品的无监督异常检测与亚像素级缺陷定位。系统涵盖从数据集构建、模型训练调优到 Web 可视化平台的完整工程链路。二、数据集MVTec Anomaly DetectionMVTec ADMVTec AD 是工业异常检测领域最权威的基准数据集收录了 15 种工业产品类别涵盖纹理类与物体类两大场景。训练集仅包含无缺陷的正常图像测试集同时包含正常图像与多种缺陷类型的异常图像并附带像素级缺陷掩码ground truth mask适合无监督异常检测方法的训练与评估。数据集图像均为 RGB 彩色图原始分辨率在 700×700 至 1024×1024 之间本项目统一 resize 至448×448输入模型。类别分布类别中文名训练图像测试图像bottle瓶子20983cable线缆224150capsule胶囊219132carpet地毯280117grid栅格26478hazelnut榛子391110leather皮革245124metal_nut螺母220115pill药片267167screw螺丝320160tile瓷砖230117toothbrush牙刷6042transistor晶体管213100wood木材24779zipper拉链240151合计—3 6291 725数据集构建与预处理训练阶段对正常样本施加轻量数据增强——随机水平翻转概率 0.5与颜色抖动亮度 ±0.1、对比度 ±0.1以提升模型对光照变化的鲁棒性同时避免破坏纹理结构导致语义失真。测试阶段仅做缩放不做任何增强保证评估的客观性。所有图像在归一化时采用 ImageNet 统计量mean[0.485, 0.456, 0.406]std[0.229, 0.224, 0.225]以兼容 DINOv2 预训练权重的输入分布。异常掩码以最近邻插值缩放避免引入中间灰度值而污染像素级二值标签掩码像素值大于 0 的位置统一置为 1.0与 MVTec 官方评估协议保持一致确保微小缺陷区域不被截断。本项目采用统一多类别训练策略将 15 个类别的正常样本合并为一个 Dataset让解码器在同一套参数下学习多类工业产品的正常特征分布而非分别训练 15 个独立模型。这一策略显著降低了部署复杂度同时在实验中验证了其泛化能力并不弱于单类模型。三、模型架构整体思路Dinomaly 的核心假设是当一个强大的视觉编码器提取到正常图像的特征后一个容量受限且带有噪声的解码器能够近似但不精确地重建这些特征——对正常区域重建误差小对异常区域训练中从未见过重建误差大。这个误差图即为异常分数图。DINOv2 编码器编码器采用vit_base_patch14_dinov2.lvd142mViT-Basepatch size14通过 timm 加载预训练权重约 330MB参数量约 86M。在 448×448 输入下图像被切分为 (448/14)² 1024 个 patch token每个 token 的特征维度为 768。编码器参数全程冻结不参与梯度计算。通过register_forward_hook钩子提取第 29 层共 8 层的 patch 特征CLS token 被丢弃只保留空间语义信息。将这 8 层特征分为两组第 2-5 层为低语义组第 6-9 层为高语义组组内取均值融合得到两个融合特征张量供解码器使用。ViTill 解码器解码器是唯一需要训练的部分参数量约 25M包含以下三个关键模块Noisy Bottleneck噪声瓶颈将两组编码器融合特征拼接维度翻倍经过两层线性层压缩回 768 维中间插入 Dropoutp0.2作为噪声注入。Dropout 在训练阶段随机屏蔽部分特征维度强迫解码器不能逐位复制编码器的输出从而避免退化为恒等映射。线性注意力LinearAttention采用 ELU 核函数近似将标准 Softmax 注意力的 O(N²) 复杂度降至 O(N)。公式为 φ(x) ELU(x) 1先计算 KT·V维度 D×D再计算 Q·(KT·V)规避了 token 间两两交互的显存瓶颈。线性注意力天然无法精确聚焦于局部区域这一缺陷在异常检测中反而有益解码器很难对异常区域也做到精确重建。内部强制使用 float32 计算防止 1024 个 token 累加时 fp16 溢出产生 NaN。解码层堆叠共 8 个 DecoderBlock层归一化 → 线性注意力 → 残差层归一化 → MLP → 残差输出 8 层中间特征再以相同的分组策略做均值融合得到两个解码器融合特征张量。损失函数使用松散余弦重建损失Loose Cosine Reconstruction LossLossmean overgroupsof(1- cosine_similarity(enc_fused, dec_fused))对两组融合特征分别计算余弦相似度取均值后取反。之所以称为松散是因为只对融合后的特征对齐而非逐层逐点强制匹配这给解码器更多弹性避免过拟合到噪声细节。异常分数推理推理时将解码器的 dropout 关闭eval 模式对每个 token 位置计算编码器与解码器特征的余弦距离得到 (B, 1024) 的异常分数图再双线性插值上采样到 448×448 的像素空间。每张图像取分数图的最大值作为图像级异常分数分数图本身作为像素级定位依据。四、训练过程硬件环境针对 RTX 3060 12GB 显卡进行了专项优化在官方 batch_size16 的基础上降至 8启用混合精度训练AMP fp16节省约 30% 显存线性注意力内部强制 float32 防止数值溢出最终训练峰值显存约 10GB。优化器配置优化器AdamW 学习率2e-4 权重衰减1e-5 学习率调度CosineAnnealingLRT_max200eta_min1e-6 梯度裁剪max_norm1.0混合精度GradScalerfp16True 随机种子42AdamW 的权重衰减对线性层参数起到正则化作用防止解码器过度拟合正常样本。余弦退火调度让学习率在训练末期平滑衰减至接近 0使模型在最优解附近精细收敛。梯度裁剪防止线性注意力累加运算导致的梯度突刺。断点续训每个 epoch 结束后将解码器权重与优化器状态保存为last_checkpoint.pth覆盖写不累积体积。下次启动时自动检测并从断点恢复避免意外中断导致训练进度损失。权重保存策略每 10 个 epoch 评估一次分别在图像级 AUROC 和像素级 AUROC 创新高时各保存一份最优权重best_img_auroc.pth/best_pix_auroc.pth。权重文件仅保存解码器参数编码器权重在推理时由 timm 重新加载因此单份权重文件体积约 100MB。五、训练指标记录每 10 个 epoch 完成一次全测试集评估训练过程中的指标变化如下EpochLossImg-AUROCPix-AUROC100.049597.25%96.68%500.029398.23%97.68%1000.022598.83%98.03%1500.019399.20%98.09%2000.017999.41%98.12%Loss 呈现平稳单调下降趋势AUROC 随之持续提升200 epoch 后未出现明显过拟合表明余弦松散损失 Noisy Bottleneck 的组合具有良好的泛化性。六、评估指标说明图像级 AUROCImage-level AUROC以每张图像异常分数图的最大值作为该图的异常分数与图像级标签0正常1异常计算 ROC 曲线下面积。反映模型判断一张图是否存在缺陷的能力本项目最终达到99.41%。像素级 AUROCPixel-level AUROC将所有图像的像素级异常分数图展平与 ground truth 掩码展平后计算 ROC 曲线下面积。反映模型准确定位缺陷位置的能力本项目最终达到98.12%。Per-Region OverlapPRO在 FPR ≤ 0.3 范围内对预测缺陷与真实缺陷连通域的重叠率进行积分并归一化。PRO 对大小不均匀的缺陷区域更公平避免大面积背景区域主导评估结果适合精细定位场景的补充评估。七、可视化图说明异常热力图将像素级异常分数图经 JET colormap 渲染为伪彩色图像蓝→绿→红分数由低到高再以一定透明度叠加到原图上。热力图中红色区域对应高异常分数代表模型判断该位置存在缺陷蓝色区域为正常背景。训练 AUROC 曲线系统配置页中展示每 10 个 epoch 的图像级 AUROC、像素级 AUROC 与 Loss 的变化趋势。图像 AUROC / 像素 AUROC 对应左 Y 轴单位 %Loss 对应右 Y 轴虚线帮助判断训练是否正常收敛。异常分数进度条检测结果页面中进度条以当前分数与阈值的比值表示异常程度——分数超过阈值则判为异常进度条颜色由绿色变为红色直观反映边界情况下的置信程度。近期检测趋势图结果分析页面展示最近 20 次检测的异常分数折线阈值以红色虚线标注异常点用红色散点单独标出便于识别批量检测中的异常集中段。各类别异常分布柱状图以堆叠柱状图展示 15 个类别各自的正常与异常样本数量分布帮助识别哪类产品缺陷率最高辅助工程师进行产线针对性改进。八、系统功能数据管理展示 MVTec AD 15 个类别的图标、名称、训练/测试图像数量选中类别后可快速跳转至检测页面。模型部署自动扫描dinomaly/checkpoints/目录下的可用权重文件展示文件名与大小支持通过滑块预设异常判定阈值后加载展示加载后的模型详细信息训练轮次、图像/像素 AUROC、推理设备。实时检测支持点击选择或拖拽上传图像文件JPG/PNG选择检测类别后调用后端推理接口返回异常分数、异常判定结果、异常热力图同时以进度条可视化分数与阈值的关系。结果分析汇总展示检测总量、正常/异常样本数、异常率、平均分数等统计指标提供趋势折线图、正常/异常占比饼图、各类别堆叠柱状图历史记录表支持按类别筛选、分页浏览、单条删除、批量清空、一键导出 CSV。系统配置实时调节异常判定阈值与热力图叠加透明度展示 GPU 显存用量与使用率显示训练 AUROC/Loss 曲线数据来源于train_log.txt提供快速阈值预设按钮0.30.7。登录注册内置管理员账号admin/admin123支持新用户注册账号信息持久化存储于浏览器本地已登录状态在关闭浏览器后仍保留。九、技术栈深度学习PyTorch 2.x CUDA — 模型训练与推理框架timm — DINOv2 预训练权重加载torchvision — 数据增强与预处理scikit-learn / scikit-image — AUROC、PRO 指标计算Pillow / NumPy — 图像读写与数值运算后端服务FastAPI — 高性能异步 Web 框架Uvicorn — ASGI 服务器Python 3.8前端Vue 3Composition API Vite 4 — 本地开发服务器与生产构建Element Plus 2 — UI 组件库ECharts 5 — 数据可视化图表Axios — HTTP 请求封装十、项目结构c177/ ├── mvtec_anomaly_detection/# MVTec AD 数据集需自行下载│ ├── bottle/ │ ├── cable/ │ └──...共15个类别目录 │ ├── dinomaly/# 深度学习核心模块│ ├── config.py# 训练超参与路径配置│ ├── train.py# 训练主入口断点续训、评估、保存│ ├── models/ │ │ ├── encoder.py# DINOv2 编码器hook 提取多层特征│ │ ├── decoder.py# ViTill 解码器线性注意力 噪声瓶颈│ │ └── dinomaly.py# 编解码器组合 推理接口│ ├── data/ │ │ └── mvtec.py# MVTec 数据集加载器│ ├── utils/ │ │ ├── losses.py# 余弦松散重建损失│ │ └── metrics.py# AUROC / PRO 评估指标│ ├── checkpoints/# 训练权重输出目录│ │ ├── last_checkpoint.pth# 断点续训文件每 epoch 覆盖│ │ ├── best_img_auroc.pth# 图像级 AUROC 最优权重│ │ └── best_pix_auroc.pth# 像素级 AUROC 最优权重│ └── logs/ │ └── train_log.txt# 训练指标日志每 10 epoch 追加│ └── web/# Web 系统├── backend/# FastAPI 后端│ ├── main.py# 应用入口挂载路由与静态文件│ ├── schemas.py# Pydantic 数据模型│ ├── api/ │ │ ├── detect.py# 检测接口上传图像、返回热力图│ │ ├── model.py# 模型管理接口加载、状态、阈值│ │ ├── history.py# 历史记录接口列表、统计、删除│ │ └── system.py# 系统接口GPU 状态、训练日志│ └── core/ │ ├── detector.py# 检测器单例加载模型、执行推理│ └── database.py# JSON 文件持久化历史记录├── vue-frontend/# Vue 3 前端源码│ ├── package.json │ ├── vite.config.js │ ├── index.html │ └── src/ │ ├── main.js │ ├── App.vue │ ├── api/index.js# Axios 接口封装│ ├── composables/ │ │ ├── useAuth.js# 登录注册状态管理│ │ └── useModelStore.js# 跨组件模型状态共享│ ├── constants/index.js# 类别定义 演示数据│ ├── styles/main.css# 全局样式变量│ ├── views/# 页面组件│ │ ├── LoginView.vue │ │ ├── DataView.vue │ │ ├── ModelView.vue │ │ ├── DetectView.vue │ │ ├── AnalysisView.vue │ │ └── ConfigView.vue │ └── components/ │ └── HeatmapModal.vue# 热力图预览弹窗├── frontend/# Vue 构建产物由 npm run build 生成└── data/ └── history.json# 检测历史持久化文件十一、启动教程环境要求Python 3.8 或以上推荐使用 conda 管理环境Node.js 16 或以上前端开发构建需要NVIDIA GPU推荐显存 ≥ 8GBCPU 模式也可运行但推理速度较慢第一步安装 Python 依赖pipinstalltorch torchvision --index-url https://download.pytorch.org/whl/cu118 pipinstalltimm fastapi uvicorn pillow numpy scikit-learn scikit-image tqdm第二步准备数据集从 MVTec 官网 下载 MVTec AD 数据集解压后将 15 个类别目录放置到项目根目录下的mvtec_anomaly_detection/文件夹中确保路径为mvtec_anomaly_detection/bottle/train/good/...。第三步训练模型cddinomaly python train.py首次运行会自动从 timm 下载 DINOv2 预训练权重约 330MB。训练日志实时输出到控制台每 10 个 epoch 将指标写入dinomaly/logs/train_log.txt最优权重保存至dinomaly/checkpoints/。训练意外中断后重新运行python train.py即可从断点续训。第四步构建前端cdweb/vue-frontendnpminstallnpmrun build构建产物会自动输出到web/frontend/FastAPI 会从该目录托管静态文件。第五步启动后端服务cdweb/backend python main.py服务启动后访问http://localhost:8000即可使用完整 Web 系统。开发阶段也可以单独启动前端开发服务器npm run dev端口 5173API 请求会自动代理到 8000 端口。本项目为个人原创结构清晰功能完整适合课程设计、毕业设计和个人学习使用。如需购买项目成品或定制化需求可以联系作者。个人网址https://michael-jay.pages.dev/