AOI 缺陷检测复现实操指南:Anomalib + MVTec AD(glass)与 YOLOv8 + NEU-DET 两条路线

发布时间:2026/10/7 8:02:41
AOI 缺陷检测复现实操指南:Anomalib + MVTec AD(glass)与 YOLOv8 + NEU-DET 两条路线 AOI 缺陷检测复现实操指南Anomalib MVTec ADglass与 YOLOv8 NEU-DET 两条路线摘要本文面向 AOI 玻璃微光学元件缺陷检测论文Du et al.,Optics Communications2023的复现需求给出两条低成本 AutoDL 实操路线。路线 A 以 Anomalib MVTec ADglass 类别复现无监督少样本异常检测路线 B 以 Ultralytics YOLOv8 NEU-DET 复现有监督两阶段检测主线并附 CCS 卷积、IQE 图像质量评价、帧融合三个创新模块的代码框架、费用预算与避坑清单两路线合计 GPU 费用可控制在 10 元以内。目录1. 路线总览与现成项目1.1 为什么是这两条路线1.2 现成项目与数据集一览2. AutoDL 环境准备两路线通用2.1 实例选型与镜像2.2 学术加速与文件上传2.3 省钱三原则3. 路线 AAnomalib MVTec ADglass3.1 方法原理与论文的对应关系3.2 环境安装GPU 实例内3.3 数据准备可在无卡模式做3.4 训练与评估GPU 实例内3.5 预期结果与费用4. 路线 BUltralytics YOLOv8 NEU-DET4.1 方法原理与论文的对应关系4.2 环境安装与数据准备4.3 训练与评估GPU 实例内4.4 进阶复现论文的四个创新模块本指南的核心4.5 预期结果与费用5. 两路线对比与建议6. 常见坑与对策7. 参考链接汇总1. 路线总览与现成项目1.1 为什么是这两条路线基准论文的核心方法可以拆成四个模块两阶段 coarse-to-fine 检测、CCS 颜色通道分离卷积、IQE 图像质量评价、多帧融合决策。由于官方未开源代码、OGD-DET 数据集需邮件申请周期不可控复现按方法可验证、数据可获取、费用可控三个原则选了两条互补路线路线 A无监督路线Anomalib MVTec AD 的 glass 类别。只用良品样本训练即可检出缺陷与论文30 个样本就能训练的少样本精神一致且 MVTec AD 的 glass 类别就是透明玻璃表面缺陷场景与论文最贴近。GPU 训练时间最短适合先跑通找感觉。路线 B有监督路线Ultralytics YOLOv8 NEU-DET。对应论文的技术主线YOLO 系列目标检测 小缺陷NEU-DET 是工业缺陷检测最常用的公开基准1800 张、6 类缺陷、VOC 标注在此基础上可以完整复现论文的两阶段框架与三个创新模块。1.2 现成项目与数据集一览两条路线都有官方现成项目开箱即用不需要从零写工程代码资源地址类型说明Anomalibhttps://github.com/open-edge-platform/anomalib官方代码库Intel 维护内置 PatchCore/PaDiM/FastFlow 等模型与 MVTec AD 数据接口pip 安装即可训练MVTec ADhttps://www.mvtec.com/company/research/datasets/mvtec-ad公开数据集15 个类别含 glass透明玻璃需注册后从邮件链接下载Ultralytics YOLOhttps://github.com/ultralytics/ultralytics官方代码库YOLOv5/v8/v11 一条命令训练工业界事实标准NEU-DET官方页http://faculty.neu.edu.cn/songkechen/zh_CN/zdylm/263270/list/公开数据集东北大学热轧带钢表面缺陷1800 张、6 类、VOC XML 标注NEU-DET YOLO 完整项目社区https://github.com/Kshitij0605/Steel-Defect-Detection-using-Yolo-models社区复现仓库内直接含数据集与 YOLOv5/v8/v9 训练代码可对照参考NEU-DET YOLOv8 完整项目中文https://github.com/us-bit/Steel_Plate_Defect_Detection社区复现中文 README覆盖数据转换、训练、评估、可视化全流程AlexeyAB/darknethttps://github.com/AlexeyAB/darknet官方代码库原味 YOLOv4/YOLOv4-tiny论文原始架构想贴近论文原版时用优先级建议先跑路线 A半小时出结果、约 1 元钱建立对缺陷检测指标的直觉再跑路线 B 主线约 2 小时最后在路线 B 基础上加论文的四个创新模块做消融这一步才是理解论文的核心。2. AutoDL 环境准备两路线通用2.1 实例选型与镜像注册 https://www.autodl.com 并充值 20 元足够全部实验。算力市场选单卡 RTX 309024 GB按量计费约 1.5~2 元/小时4090 贵一倍本指南实验完全用不满。镜像选择PyTorch 2.1.0 / Python 3.10(或 3.11) / CUDA 12.1框架镜像列表里直接选不要自己装 CUDA。创建实例后控制台点JupyterLab即可进入网页终端本地无需装任何东西。目录约定代码与数据统一放/root/autodl-tmp数据盘容量大、关机保留不要放系统盘约 30 GB 上限。2.2 学术加速与文件上传# 访问 GitHub / HuggingFace 前开启学术加速AutoDL 内置source/etc/network_turbo# 用完关闭避免影响其他下载unsethttp_proxyunsethttps_proxypip 安装包不需要开加速AutoDL 已配置国内镜像源直接pip install即可。上传数据小文件用 JupyterLab 直接拖拽大文件用 AutoDL 网盘控制台文件存储上传后实例内挂载/root/autodl-nas几十 MB 的数据集也可以开加速后直接wget。2.3 省钱三原则无卡模式做准备控制台关机后可开无卡模式开机约 0.1 元/小时纯 CPU。数据下载、格式转换、IQE 聚类这类不吃 GPU 的步骤全放这里做。训练时才开 GPU开卡 → 训练 → 看完日志立刻关机。AutoDL 关机后不收 GPU 费用数据保留。及时取回结果训练产物weights、metrics、可视化打包下载回本地再释放实例避免长期占着数据盘。3. 路线 AAnomalib MVTec ADglass3.1 方法原理与论文的对应关系PatchCore 的思路只用正常样本的特征分布建模推理时偏离分布的区域即缺陷。这与论文少量样本训练即可上线的工业诉求同源——论文用 30 个样本训练 YOLO而 PatchCore 甚至不需要缺陷标注。对透明玻璃这种缺陷形态千奇百怪、良品长得都一样的场景无监督路线往往比有监督更实用。3.2 环境安装GPU 实例内source/etc/network_turbocd/root/autodl-tmpgitclone https://github.com/open-edge-platform/anomalib.gitcdanomalib pipinstall-e.# 或直接 pip install anomalibanomalibinstall# 安装完整依赖SwAV 预训练权重等unsethttp_proxyunsethttps_proxy版本提示Anomalib 2.x 的 API 与 1.x 差异较大本指南按 2.x 写。如遇 API 报错先pip show anomalib确认版本再对照官方文档。3.3 数据准备可在无卡模式做浏览器打开 https://www.mvtec.com/company/research/datasets/mvtec-ad 填写邮箱注册免费链接发到邮箱注意查垃圾邮件。下载glass.tar.xz单类别约几百 MB不必下全量 4.9 GB 的整包。上传到实例并解压mkdir-p/root/autodl-tmp/datasets/MVTec_ADtar-xJfglass.tar.xz-C/root/autodl-tmp/datasets/MVTec_AD# 期望目录结构# MVTec_AD/glass/train/good/ ← 训练用良品# MVTec_AD/glass/test/broken_large/ ← 测试缺陷大裂# MVTec_AD/glass/test/broken_small/ ← 测试缺陷小裂# MVTec_AD/glass/test/contamination/ ← 测试缺陷污染# MVTec_AD/glass/ground_truth/... ← 像素级缺陷掩码3.4 训练与评估GPU 实例内新建train_patchcore_glass.pyfromanomalib.dataimportMVTecfromanomalib.modelsimportPatchcorefromanomalib.engineimportEngine datamoduleMVTec(rootdatasets/MVTec_AD,categoryglass)modelPatchcore()# 换成 Padim() 即可跑 PaDiM 基线engineEngine(max_epochs1)# PatchCore 本质是特征提取核心集采样1 epoch 足够engine.fit(modelmodel,datamoduledatamodule)engine.test(modelmodel,datamoduledatamodule)# 输出 image/pixel AUROCpython train_patchcore_glass.py也可用命令行等价anomalib train--modelPatchcore--dataMVTec--data.categoryglass结果输出在results/目录.ckpt权重、指标 CSV以及缺陷热力图可视化这是最直观的部分——模型把缺陷区域标红可直接截图放进汇报。3.5 预期结果与费用项目预期PatchCore glass image-AUROC≈ 0.99PaDiM glass image-AUROC≈ 0.983090 训练耗时PatchCore 约 10~15 分钟PaDiM 约 5~10 分钟GPU 费用开卡 0.5 小时 ≈1 元消融建议同一数据上对比 PatchCore / PaDiM / FastFlow各改一行模型名观察无监督三兄弟在 glass 上的差异这一步对理解异常检测范式帮助很大。4. 路线 BUltralytics YOLOv8 NEU-DET4.1 方法原理与论文的对应关系论文主线是YOLO 检测小缺陷 两阶段先找工件再找缺陷。NEU-DET 虽是钢材而非玻璃但缺陷小、类别清晰、标注齐全是验证检测方法的标准试验田。先复现单阶段基线对应论文 Table 1 的对比实验再组装两阶段框架与创新模块。4.2 环境安装与数据准备安装GPU 实例内pipinstallultralytics数据下载无卡模式即可三个来源任选其一——官方页面申请下载http://faculty.neu.edu.cn/songkechen/zh_CN/zdylm/263270/list/直接克隆含数据的社区仓库最快source/etc/network_turbogitclone https://github.com/Kshitij0605/Steel-Defect-Detection-using-Yolo-models.gitunsethttp_proxyunsethttps_proxyKaggle 搜索 “NEU-DET”注意选带 VOC/XML 标注的检测版不是分类版。VOC XML → YOLO txt 转换脚本NEU-DET 原始标注是 PASCAL VOC 格式# voc2yolo.py 用法: python voc2yolo.py images_dir annotations_dir out_dirimportos,glob,xml.etree.ElementTreeasET CLASSES[crazing,inclusion,patches,pitted_surface,rolled_in_scale,scratches]defconvert(img_dir,ann_dir,out_dir):os.makedirs(out_dir,exist_okTrue)forxml_pathinglob.glob(os.path.join(ann_dir,*.xml)):rootET.parse(xml_path).getroot()wint(root.find(size/width).text)hint(root.find(size/height).text)lines[]forobjinroot.findall(object):cCLASSES.index(obj.find(name).text)bobj.find(bndbox)x1,y1float(b.find(xmin).text),float(b.find(ymin).text)x2,y2float(b.find(xmax).text),float(b.find(ymax).text)lines.append(f{c}{(x1x2)/2/w:.6f}{(y1y2)/2/h:.6f}{(x2-x1)/w:.6f}{(y2-y1)/h:.6f})withopen(os.path.join(out_dir,os.path.basename(xml_path)[:-4].txt),w)asf:f.write(\n.join(lines))# 按 80/20 划分 train/val 后分别调用目录结构见下方 neu.yaml目标目录结构与neu.yaml# neu.yamlpath:/root/autodl-tmp/NEU-DETtrain:images/trainval:images/valnames:0:crazing1:inclusion2:patches3:pitted_surface4:rolled_in_scale5:scratchesNEU-DET/ ├── images/{train, val}/ ← 1440 / 360 张 ├── labels/{train, val}/ ← 对应 YOLO txt └── neu.yaml4.3 训练与评估GPU 实例内# 关键点复用 COCO 预训练权重 yolo8n.pt自动下载这是省时省钱的核心yolo trainmodelyolov8n.ptdataneu.yamlepochs100imgsz640batch16device0# 评估yolo valmodelruns/detect/train/weights/best.ptdataneu.yaml项目预期mAP0.50.75 左右crazing 类最难约 0.5patches 类最好约 0.953090 训练耗时约 1~1.5 小时GPU 费用≈2~3 元想复现论文 Table 1 的 Faster R-CNN / SSD 基线对比装 MMDetectionpip install mmengine mmcv mmdet用其预置配置换数据集即可约再花 1 小时 GPU。4.4 进阶复现论文的四个创新模块本指南的核心以下模块在单阶段基线跑通后逐一叠加每加一个模块重训一次、记录指标变化——这就是属于自己的消融实验。1两阶段 coarse-to-fine模拟版NEU-DET 每张图都是纯钢材表面没有从背景里找工件的问题。模拟方法把 200×200 的原图贴到 640×640 的复杂背景随机纹理/产线照片上于是——Stage 1粗在 640 图上训练一个 YOLOv8n 检测钢材区域对应论文的玻璃定位模型直接用 COCO 预训练微调 20 epoch 即可Stage 2细裁出区域并放大回原分辨率送入 4.3 训练好的缺陷检测模型。对照实验单阶段直接在 640 背景图上检测 vs 两阶段级联观察 Precision 变化——论文宣称两阶段带来约 9.8% 的 Precision 提升看能否复现出同方向的结果。2CCS 颜色通道分离卷积简化实现论文的 CCS 本质是三个颜色通道各自过一组 CBLMCBL4 再融合。PyTorch 里用分组卷积近似约 20 行importtorchimporttorch.nnasnnclassCCSConv(nn.Module):CCS 简化版每通道独立 CBL 池化卷积堆叠拼接后 1x1 融合def__init__(self,c296):super().__init__()cc2//3defbranch():layers[nn.Conv2d(1,c,3,1,1),nn.BatchNorm2d(c),nn.LeakyReLU(0.1)]for_inrange(2):# 论文为 MCBL4×4此处减半便于收敛layers[nn.MaxPool2d(2,2,ceil_modeTrue),nn.Conv2d(c,c,3,1,1),nn.BatchNorm2d(c),nn.LeakyReLU(0.1)]returnnn.Sequential(*layers)self.branchesnn.ModuleList([branch()for_inrange(3)])self.fusenn.Conv2d(c*3,c2,1)defforward(self,x):# x: [B,3,H,W]outs[b(x[:,i:i1])fori,binenumerate(self.branches)]returnself.fuse(torch.cat(outs,dim1))接入方式替换 YOLOv8 网络model.yaml里第一层卷积ultralytics 支持自定义模块注册NEU 是灰度图可将三通道填同一灰度或保留 RGB 读取——重点是验证通道分离是否带来增益这个思想。3IQE 图像质量评价无 GPU无卡模式跑论文用 HOG 特征 K-means 聚类把清晰帧与模糊帧分开纯传统机器学习# iqe.py —— 训练阶段fromskimage.featureimporthogfromsklearn.clusterimportKMeansimportjoblib,glob,cv2 feats[hog(cv2.cvtColor(cv2.imread(p),cv2.COLOR_BGR2GRAY),orientations9,pixels_per_cell(16,16)).ravel()forpinglob.glob(frames/*.png)]kmKMeans(n_clusters20,max_iter100).fit(feats)joblib.dump(km,iqe_kmeans.pkl)# 之后人工查看 20 个簇的中心图把清晰簇编号记下来例如 {2,5,7,9,11,13,15,17,19}# 测试阶段新帧 HOG 与各簇中心算 MSE最近中心若属于清晰簇 → 保留该帧验证方法把测试图人工加高斯模糊/运动模糊造一组模糊帧看 IQE 的查全率——论文用 20 簇选 9 个参考簇参数可直接沿用。4多帧融合决策对应论文视频级输出M/N 超过阈值 T 或任一帧置信度超过 Ct 即判缺陷defframe_fusion(confs,T0.1,Ct0.8):confs: 一个样本所有帧的检测置信度列表无缺陷帧为 0Nlen(confs)Msum(1forcinconfsifc0.5)return(M/NT)or(max(confs,default0)Ct)模拟方法对每个测试样本做随机裁剪/旋转/模糊生成 20 帧伪视频对比单帧判定 vs 融合判定的 Recall 与 Precision。论文结论方向是融合显著提 Recall——若复现出同样趋势就真正理解了这一模块存在的意义。4.5 预期结果与费用步骤耗时费用数据准备与转换无卡模式1~2 小时≈ 0.2 元单阶段基线训练1~1.5 小时≈ 2~3 元两阶段模拟 CCS 消融2~3 次重训2~3 小时≈ 4~6 元IQE 帧融合无卡模式1 小时≈ 0.1 元5. 两路线对比与建议维度路线 AAnomalib路线 BYOLOv8监督范式无监督只用良品有监督需缺陷标注数据场景透明玻璃与论文一致钢材表面方法同源对应论 文模块少样本精神、异常检测范式两阶段主线、CCS、IQE、帧融合GPU 时间≈ 0.5 小时≈ 3~5 小时总费用≈ 1~2 元≈ 6~10 元建议顺序先跑半天出结果后跑是复现的主体两条路线合计预算15 元以内充值 20 元留足重试余量。6. 常见坑与对策症状原因与解法git clone超时忘开学术加速source /etc/network_turbo用完记得关MVTec 下载链接打不开链接发在注册邮箱常进垃圾箱单类 glass.tar.xz 才几百 MB别下 4.9 GB 全量包anomalib API 报错1.x/2.x API 不同固定pip install anomalib最新版并对照 2.x 文档或pip install anomalib2.0.0YOLO 显存不足OOMbatch16改batch8或imgsz降到 512NEU-DET 检测 mAP 偏低属正常crazing 类边界模糊天然难检可加大imgsz到 800 或启用 mosaic 关闭mosaic0.5微调训练产物丢失关机前在 JupyterLab 把runs/、results/打包 zip 下载到本地数据盘越用越满释放实例前清掉不再用的数据集autodl-tmp 大文件用完即删7. 参考链接汇总基准论文Du Y. et al.,An automated optical inspection (AOI) platform for three-dimensional (3D) defects detection on glass micro-optical components, Optics Communications 545 (2023) 129736. https://doi.org/10.1016/j.optcom.2023.129736姊妹篇算法细节更全Zhou H. et al.,Video-Based Two-Stage Network for Optical Glass Sub-Millimeter Defect Detection, AI 3(3):571-581, 2022. https://doi.org/10.3390/ai3030033 OGD-DET 数据集申请https://pntehan.github.io/OGD-DET/ 邮件 zhouhaniict.ac.cnAnomalibhttps://github.com/open-edge-platform/anomalibMVTec ADhttps://www.mvtec.com/company/research/datasets/mvtec-adUltralyticshttps://github.com/ultralytics/ultralyticsNEU-DET 官方http://faculty.neu.edu.cn/songkechen/zh_CN/zdylm/263270/list/AutoDL 使用文档https://www.autodl.com/docs