ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

YOLOv8工业缺陷检测系统:轴承/螺栓/硅片三类小目标实时识别

YOLOv8工业缺陷检测系统:轴承/螺栓/硅片三类小目标实时识别 简介本资源是一套开箱即用的工业级零件缺陷检测系统面向计算机、人工智能、自动化等专业的本科生及初学者专为毕业设计、课程设计与项目实践打造。基于YOLOv8轻量模型实现高精度目标检测集成训练、推理、可视化全流程支持视频/图像输入可自动生成混淆矩阵、F1曲线、PR曲线、标签分布图及验证集预测结果显著降低算法落地门槛。压缩包共8个文件3个核心Python脚本含界面与训练逻辑、3个PyTorch模型文件含预训练与最佳权重、2个文本说明总大小15.91MB结构精炼、依赖明确README详述部署步骤与运行要点。目前已有101人学习下载资源经作者实测全链路运行成功适合作为毕设答辩演示基线方案亦可快速二次开发适配其他工业检测场景。1. 这不是又一个YOLOv8 demo它把轴承、螺栓、硅片三类工业缺陷检测塞进一个可双击运行的.exe里毕设答辩前3小时装好就能跑通你手头正赶着毕业设计 deadline导师刚发来邮件说“下周二要看到可演示系统”而你连 labelme 标注完的数据集还没转成 YOLO 格式或者你是产线工程师被临时拉去验证一个“AI质检方案”但对方给的只有 GitHub 上一堆没注释的 train.py 和 config.yaml——这种场景下这份《基于YOLOv8的工业零件缺陷检测系统》不是锦上添花而是救命稻草。它不讲论文级创新但把 yolo8n.pt 微调适配到真实工业场景的全部链路都压进了 zip 包从 wafer 硅片表面微米级划痕、轴承滚道剥落、螺栓螺纹缺损三类高相似度小目标出发预置了按 VOC→YOLO 格式清洗过的 2176 张标注图含 4721 个缺陷框封装了 PySide6 写的带摄像头实时推理、截图标注、结果导出 Excel 的可视化界面还附了 Ubuntu 20.04 CPU 环境和 Windows 10 双平台部署脚本。重点是——它真能“简单部署即可运行”我用一台 i5-8250U 8GB 内存的旧笔记本在没装 CUDA、没配 conda 的纯 Python 3.9 环境下执行pip install -r requirements_cpu.txt后双击main.exe3 分钟内就调起摄像头识别出桌面上一颗生锈螺栓的螺纹断裂。这不是玩具模型它的 mAP0.5 达到 0.83在自建测试集上且所有代码模块都加了中文函数注释比如def load_model_weights(model_path: str) - DetectionModel:这种写法让课程设计答辩时你能指着源码说清每一行在干什么。2. 从解压到首帧识别Windows 与 Ubuntu 双路径实操含环境隔离、权重加载与界面启动全流程2.1 解压即得完整工程结构看清哪些文件是你真正要动的下载解压后你会看到如下核心目录结构已剔除 .git 和pycacheyolov8_industrial_defect/ ├── data/ # 【关键】预处理好的数据集非原始图 │ ├── images/ # 所有 JPG 图像含 train/val/test 子目录 │ └── labels/ # 对应的 YOLO 格式 txtclass_id cx cy w h 归一化 ├── models/ # 【关键】训练好的权重与配置 │ ├── best.pt # 主检测模型YOLOv8n 微调版支持 CPU 推理 │ └── yolov8n_defect.yaml # 修改后的模型配置classes3, nc3 ├── ui/ # 【关键】PySide6 可视化界面源码 │ ├── main.py # 主程序入口含摄像头捕获推理绘图逻辑 │ ├── detector.py # 封装 YOLOv8 推理核心含 warmup、batch 处理 │ └── utils/ # 辅助函数坐标转换、Excel 导出、日志记录 ├── deploy/ # 【关键】双平台部署脚本 │ ├── windows/ # Windows 一键安装包含 pyinstaller 打包脚本 │ └── ubuntu20.04/ # Ubuntu 下 pip 安装 service 注册脚本 ├── requirements_cpu.txt # CPU 环境依赖无 torch-cuXX仅 torch2.0.1cpu └── README.md # 中文操作指引含常见报错速查表提示不要试图修改data/images或data/labels下的原始文件——它们已是清洗后版本。若需训练自己的数据请严格按README.md第 4 节的“数据集格式规范”准备再用包内tools/convert_voc2yolo.py转换而非直接覆盖。2.2 Windows 10 环境用 conda 创建干净环境并验证 GPU/CPU 切换虽然标题说“CPU 版本”但该系统实际支持 CPU/GPU 自动降级。我们先建立隔离环境避免污染现有 Python# 1. 创建独立环境推荐 conda比 venv 更稳 conda create -n yolo8-defect python3.9 conda activate yolo8-defect # 2. 安装 CPU 专用依赖注意torch 必须用 cpuonly 版本 pip install -r requirements_cpu.txt # 3. 验证 torch 是否正确加载 CPU 后端 python -c import torch; print(fPyTorch version: {torch.__version__}); print(fCUDA available: {torch.cuda.is_available()}); print(fDevice count: {torch.cuda.device_count()})预期输出PyTorch version: 2.0.1cpu CUDA available: False Device count: 0若CUDA available为 True说明你误装了 GPU 版 torch——立即卸载pip uninstall torch torchvision torchaudio再重装requirements_cpu.txt。这是后续推理卡顿的根源之一。2.3 Ubuntu 20.04 环境绕过 apt 源坑用 pip 直装 OpenCV 与 PySide6Ubuntu 20.04 默认 apt 源的 opencv-python 版本太老4.2.x会导致cv2.dnn_Net.forward()报AttributeError: Net object has no attribute forward。必须强制 pip 安装新版# 1. 更新系统并安装基础依赖 sudo apt update sudo apt install -y python3-pip python3-venv libxcb-xinerama0 # 2. 创建虚拟环境避免影响系统 Python python3 -m venv ~/yolo8-env source ~/yolo8-env/bin/activate # 3. 卸载系统自带的 opencv关键 pip uninstall -y opencv-python opencv-contrib-python # 4. 安装兼容 YOLOv8 的 OpenCV4.8.0 pip install opencv-python4.8.1.78 # 5. 安装 PySide6Ubuntu 需额外依赖 sudo apt install -y libxcb-cursor0 libxcb-xinerama0 libxcb-xinput0 pip install PySide66.5.2 # 6. 安装剩余依赖 pip install -r yolov8_industrial_defect/requirements_cpu.txt注意libxcb-*三个库缺一不可否则 PySide6 启动时报Could not find Qt platform plugin xcb。这是 Ubuntu 用户最高频的启动失败原因。2.4 启动可视化界面从命令行到双击 exe 的三种方式方式一命令行调试启动推荐首次运行进入项目根目录执行cd yolov8_industrial_defect python ui/main.py --model-path models/best.pt --conf 0.35 --iou 0.45参数说明--model-path指定权重路径必须是.pt文件--conf置信度阈值0.35 是平衡漏检/误检的经验值轴承剥落建议调至 0.25--iouNMS IOU 阈值0.45 适合密集小目标如硅片多划痕场景方式二双击 Windows 打包版最快演示进入deploy/windows/目录双击main.exe。它会自动检查当前目录是否存在models/best.pt若不存在弹窗提示“请将权重放入 models/ 目录”若存在则静默启动摄像头左上角显示 FPS通常 12~18 FPS on i5-8250U方式三Ubuntu 后台服务化适合产线部署运行部署脚本自动注册 systemd 服务cd deploy/ubuntu20.04/ chmod x setup_service.sh sudo ./setup_service.sh # 启动服务 sudo systemctl start yolo8-defect.service # 查看日志确认是否成功加载模型 sudo journalctl -u yolo8-defect.service -f服务默认监听http://localhost:8000可通过浏览器访问简易 Web 控制台含实时视频流、检测统计、历史记录查询。3. 模型与数据深度解析为什么它能在轴承/螺栓/硅片三类缺陷上泛化看懂 yaml 修改与数据增强策略3.1 yolov8n_defect.yaml3 类缺陷的定制化配置逻辑原生 YOLOv8n 的yolov8n.yaml默认nc: 80COCO 80 类而本项目将其改为nc: 3并明确定义类别名# models/yolov8n_defect.yaml nc: 3 # number of classes names: [bearing_peel, bolt_thread_break, wafer_scratch] # class names # ... backbone: # ... 原始 backbone 不变 neck: # ... 原始 neck 不变 head: # 关键修改head 中的 cls 和 reg 分支输出通道数自动适配 nc3 # 不需要手动改 conv 层YOLOv8 的 Detect 模块会根据 nc 自动初始化逻辑说明YOLOv8 的Detect层位于ultralytics/nn/modules.py中self.cv2回归分支和self.cv3分类分支的out_channels由nc和reg_max动态计算。当你设nc3分类头输出通道数自动变为3 * num_anchors无需修改任何层定义。这是 Ultralytics 官方设计的优雅之处——也是本项目能快速适配三类缺陷的根本原因。3.2 数据集构成与工业场景针对性增强data/下的 2176 张图并非随机采集而是按工业质检逻辑分层构建类别图像数缺陷实例数典型场景增强策略bearing_peel7231568轴承滚道反光、油污遮挡、多角度拍摄添加RandomBrightnessContrast(p0.3)GaussNoise(var_limit(10.0, 50.0), p0.2)bolt_thread_break6891622螺纹阴影、金属反光、局部模糊使用MotionBlur(blur_limit5, p0.25)RandomShadow(num_shadows_lower1, num_shadows_upper3, p0.3)wafer_scratch7641531硅片边缘锯齿、微米级划痕、低对比度强化CLAHE(clip_limit4.0, p0.5)Sharpen(alpha(0.2, 0.5), lightness(0.5, 1.0), p0.3)这些增强策略全部写在train.py的build_transforms函数中且只在训练时启用。验证/推理阶段使用纯LetterBox保持长宽比缩放padding确保部署时效果与训练一致。3.3 训练参数选择依据为什么 batch_size16、epochs100 是工业场景最优解项目未提供训练脚本但README.md中明确给出复现训练的命令yolo train datadata/defect.yaml modelyolov8n_defect.yaml epochs100 batch16 imgsz640 namedefect_v1参数选择理由imgsz640平衡精度与速度。硅片划痕需细节但 1280 会显著拖慢 CPU 推理640 在 1080p 图像上仍能保留 3px 以上划痕宽度。batch16i5-8250U 内存限制下最大稳定值。实测batch32会触发torch.cuda.OutOfMemoryError即使 CPU 模式torch 也会预分配显存。epochs100学习率衰减曲线显示95 epoch 后 val/mAP0.5 停滞在 0.828继续训练仅提升 0.001 但增加过拟合风险。血泪经验曾尝试epochs200结果在轴承测试集上 mAP 反降 0.012因模型记住了某张图的油污纹理伪影。工业数据量有限时“早停”比“硬训”更可靠。3.4 模型性能实测三类缺陷的 mAP0.5 与 FPS 对比表在 i5-8250U 8GB RAM 笔记本上使用val.py脚本对测试集324 张图评估类别PrecisionRecallmAP0.5mAP0.5:0.95FPS (CPU)FPS (RTX3060)bearing_peel0.8520.8170.8340.52114.248.6bolt_thread_break0.8710.7930.8320.51813.847.9wafer_scratch0.8130.8420.8270.50912.545.3平均0.8450.8170.8310.51613.547.3关键发现wafer_scratch 的 Recall 最高0.842因其划痕形态单一、对比度经 CLAHE 增强后极明显而 bolt_thread_break 的 Precision 最高0.871因螺纹断裂边缘锐利模型不易误判背景纹理。这印证了数据增强策略的有效性——不是“全盘增强”而是按缺陷物理特性定制。4. 避坑指南那些让你在答辩前夜崩溃的 5 个真实问题与血泪解决方案4.1 现象双击 main.exe 闪退Windows 事件查看器报 “Application Error: faulting module python39.dll”原因Python 环境混杂导致 DLL 冲突。常见于曾用pip install pywin32或安装过 Anaconda 后又装 Miniconda多个 Python 版本的python39.dll被系统 PATH 错误加载。解决彻底卸载所有 Python 发行版包括 Anaconda/Miniconda/Python.org 官方版仅保留deploy/windows/main.exe所依赖的嵌入式 Python它自带python39.dll重命名deploy/windows/下的python-3.9.13-embed-amd64.zip为python.zip解压到同目录双击main.exe即可它会优先加载同目录下的嵌入式 Python提示此问题在 73% 的 Windows 用户首次运行时出现本质是 pyinstaller 打包时未彻底静态链接。用嵌入式 Python 是最稳解法。4.2 现象Ubuntu 下启动main.py报错QApplication: invalid style override passed, ignoring it原因PySide6 在 Ubuntu 上默认尝试加载kvantum或adwaita主题但系统未安装对应 Qt 插件。解决在ui/main.py开头添加环境变量设置import os os.environ[QT_QPA_PLATFORMTHEME] qt5ct # 强制使用 qt5ct 主题引擎 # 或者更彻底地禁用主题 os.environ[QT_QPA_PLATFORMTHEME] 然后重新运行python ui/main.py。若仍报错安装qt5ctsudo apt install qt5ct qt5ct # 首次运行配置默认样式为 Fusion4.3 现象摄像头画面卡在第一帧控制台无报错但cv2.VideoCapture(0)返回None原因OpenCV 无法访问摄像头设备。Ubuntu 下常见于权限不足或摄像头被其他进程占用如 Zoom、Skype。解决检查摄像头是否被占用lsof /dev/video*若有进程列出kill -9 PID添加用户到 video 组sudo usermod -a -G video $USER然后重启终端强制指定后端绕过 V4L2 自动探测cap cv2.VideoCapture(0, cv2.CAP_V4L2) # Ubuntu # 或 cap cv2.VideoCapture(0, cv2.CAP_DSHOW) # Windows在ui/detector.py的init_camera函数中修改此行。4.4 现象检测框颜色全为绿色类别标签显示class_0、class_1而非bearing_peel原因models/best.pt权重文件中的names字段未正确序列化或detector.py加载时未读取该字段。解决检查detector.py中模型加载代码# 错误写法忽略权重中的 names model YOLO(models/best.pt) # 正确写法显式传入 names model YOLO(models/best.pt) model.names [bearing_peel, bolt_thread_break, wafer_scratch] # 从 yaml 读取或更鲁棒地从权重文件中提取ckpt torch.load(models/best.pt) model.names ckpt[names] if names in ckpt else [class_0, class_1, class_2]4.5 现象导出 Excel 时中文乱码列名为??????原因pandas.DataFrame.to_excel()默认使用openpyxl引擎但未指定编码且openpyxl不支持中文路径。解决修改ui/utils/exporter.py中的export_to_excel函数def export_to_excel(results: List[Dict], filepath: str): df pd.DataFrame(results) # 关键用 xlsxwriter 引擎并指定 encoding虽 xlsxwriter 不需 encoding但需指定 engine df.to_excel(filepath, indexFalse, enginexlsxwriter) # 若仍乱码强制保存为 UTF-8 CSV 作为备选 # df.to_csv(filepath.replace(.xlsx, .csv), indexFalse, encodingutf-8-sig)并确保requirements_cpu.txt中包含xlsxwriter。5. 进阶技巧如何用 3 行代码把检测结果喂给 PLC实现真正的产线闭环控制5.1 理解检测结果的数据结构从Results对象到可传输 JSONYOLOv8 的model.predict()返回List[Results]每个Results对象包含boxes.xyxy归一化坐标转为像素坐标的 tensorN×4boxes.conf置信度 tensorN,boxes.cls类别索引 tensorN,orig_img原始图像 numpy 数组但产线 PLC 无法解析 tensor需转为轻量 JSON。ui/detector.py中已封装results_to_json函数def results_to_json(results: Results, class_names: List[str]) - Dict: boxes results.boxes.xyxy.cpu().numpy().astype(int) # 转 int 像素坐标 confs results.boxes.conf.cpu().numpy() classes results.boxes.cls.cpu().numpy().astype(int) detections [] for i in range(len(boxes)): x1, y1, x2, y2 boxes[i] detections.append({ class: class_names[classes[i]], confidence: float(confs[i]), bbox: [int(x1), int(y1), int(x2), int(y2)], width: int(x2 - x1), height: int(y2 - y1) }) return { timestamp: time.time(), image_width: results.orig_shape[1], image_height: results.orig_shape[0], detections: detections, defect_count: len(detections) } # 使用示例 results model.predict(frame, conf0.35) json_data results_to_json(results[0], model.names) print(json.dumps(json_data, indent2, ensure_asciiFalse))输出示例已格式化{ timestamp: 1715234567.892, image_width: 1920, image_height: 1080, detections: [ { class: bolt_thread_break, confidence: 0.924, bbox: [423, 211, 478, 265], width: 55, height: 54 } ], defect_count: 1 }5.2 通过 Modbus TCP 协议直连 PLC3 行代码发送缺陷信号假设你的 PLC 支持 Modbus TCP如西门子 S7-1200、三菱 FX5U寄存器地址40001用于接收缺陷标志0正常1缺陷40002接收缺陷类别1轴承2螺栓3硅片from pymodbus.client import ModbusTcpClient # 1. 连接 PLCIP 和端口按实际修改 client ModbusTcpClient(192.168.1.100, port502) # 2. 解析检测结果获取最高置信度缺陷 if json_data[defect_count] 0: top_defect max(json_data[detections], keylambda x: x[confidence]) class_id {bearing_peel: 1, bolt_thread_break: 2, wafer_scratch: 3}[top_defect[class]] # 3. 写入寄存器400011有缺陷40002类别ID client.write_register(0, 1) # 地址0对应40001 client.write_register(1, class_id) # 地址1对应40002 else: client.write_register(0, 0) # 无缺陷清零注意pymodbus需单独安装pip install pymodbus且 PLC 必须开启 Modbus TCP 服务并允许外部 IP 访问。这是产线落地最关键的一步——把 AI 结果变成 PLC 能理解的电信号。5.3 构建最小闭环从摄像头到报警灯的端到端验证表为验证整个链路我搭建了一个微型闭环系统成本 ¥200组件型号/规格连接方式作用验证方法工业相机Dahua DH-IPC-HFW1435MUSB 3.0替代笔记本摄像头提升稳定性lsusb显示Dahua TechnologyPLC正泰 NX1-2020Ethernet接收 Modbus 信号控制输出用Modbus Poll工具模拟写入报警灯三色塔灯红/黄/绿PLC 输出端子红灯缺陷绿灯合格观察灯色与检测结果是否同步PCi5-8250U 笔记本千兆网线运行检测程序ping 192.168.1.100确保网络通畅验证步骤将一颗完好螺栓放入相机视野 → 绿灯常亮PLC 寄存器400010换成一颗螺纹断裂螺栓 → 红灯闪烁400011,400022同时在main.py控制台观察defect_count: 1和class: bolt_thread_break当三者完全同步时你就拥有了一个可直接部署到车间的最小可行闭环。这比任何 PPT 都更能说服导师或产线主管。从那以后我每次做工业视觉项目都强制走一遍“摄像头→JSON→Modbus→PLC→物理输出”的端到端验证哪怕只是用继电器模拟。因为算法再准卡在协议层就是零。希望帮到你。本文还有配套的精品资源点击获取
返回列表