这次我们来看一个工业视觉方向非常典型的落地项目:基于深度学习 YOLOv8/YOLOv5 结合 PySide6 开发的金属表面缺陷检测系统。
这类系统在制造业里需求很大。很多工厂到现在还靠人工目检来做金属表面缺陷筛查,效率低、漏检率不稳定,而且质检员的培养周期很长。用深度学习目标检测模型替代一部分人工目检,已经是目前工业质检里比较成熟的技术路线。YOLO 系列模型在缺陷检测里普及度很高,YOLOv5 和 YOLOv8 又是其中用得最多的两个版本;PySide6 则是 Qt for Python 的官方绑定库,用来做桌面客户端界面非常方便。把这两个东西组合起来,就可以形成一个“模型推理 + 可视化操作 + 批量检测”的本地系统。
这个项目的核心能力可以概括成几点:基于 YOLOv8/YOLOv5 训练自己的缺陷检测模型;通过 PySide6 构建可视化桌面界面;支持对图片、视频流、摄像头实时画面进行检测;检测结果可以直接在界面上标注显示;可以扩展批量检测任务和接口调用。对于想入门深度学习视觉落地、或者需要在本地搭建一套缺陷检测原型系统的开发者来说,这套技术组合是很有参考价值的。
要说清楚的是,这不是一个“双击运行就能检测出所有缺陷”的成品商业软件,而是一个技术方案。你需要自己准备数据集、训练模型、配置界面逻辑,最后才能形成一套可用的检测系统。本文会按照实际项目开发的顺序,从核心能力、适用场景、环境准备、部署启动、功能测试、接口批量任务、性能观察、排错、最佳实践这几个方向展开,帮助你理清从 YOLO 模型到 PySide6 桌面系统的完整链路。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 工业视觉缺陷检测系统(桌面端) |
| 技术栈 | 深度学习目标检测 YOLOv5 / YOLOv8 + PySide6 |
| 核心功能 | 金属表面缺陷检测、可视化标注、检测结果管理 |
| 检测目标 | 金属表面的划痕、点蚀、麻点、裂纹、氧化、污渍等可见缺陷 |
| 模型支持 | YOLOv5 / YOLOv8 系列,可根据项目需求选择版本 |
| 界面框架 | PySide6(Qt for Python),支持桌面窗口、按钮、表格、图片显示 |
| 推理方式 | 本地 GPU / CPU 推理,具体是否支持当前显卡以实际环境为准 |
| 训练方式 | 本地训练或云端训练,数据格式推荐 YOLO 标注格式 |
| 启动方式 | 命令行启动或脚本启动,可按项目封装为一键启动脚本 |
| 接口能力 | 可扩展 HTTP API 接口,材料未提供具体路径,需按实际项目设计 |
| 批量任务 | 可扩展批量图片文件夹检测,需自行实现任务队列 |
| 适合读者 | 想落地工业质检原型系统、学习 YOLO + Qt 桌面开发的工程师 |
从各平台热词来看,深度学习缺陷检测、YOLO 目标检测、PySide6 是大家近期搜索比较多的方向。这个项目正好把这三个点串在了一起。不过要注意,具体到“训练轮数设多少”“精度如何”“显存占用多少”,这些参数和实际数据集、模型大小、硬件配置强相关,不能一概而论。后面章节我会给出一个通用的开发流程和验证路径。
2. 适用场景与使用边界
2.1 适合什么场景
金属表面缺陷检测系统最典型的应用场景是产线质检环节的辅助判定。比如金属板材、型材、五金件、汽车零部件在加工完成后的表面质量检查。传统方式是一个质检员拿强光手电筒照着一个一个看,或者依靠人工经验进行分类。这个系统的作用是:通过摄像头采集或图片导入,由 YOLO 模型自动框出疑似缺陷区域,给出类别和置信度,再由质检员确认是否报废或返工。
适合使用这个方案的情况包括:
- 缺陷类型相对固定,比如划痕、凹坑、锈斑等,目标特征清晰。
- 检测对象是规范化生产的金属表面,环境光照相对稳定。
- 需要保留检测记录,比如缺陷图片、坐标、类别、置信度,方便后续追溯。
- 有 Python 开发能力,能自己完成数据标注、训练和桌面端封装。
2.2 不适合什么场景
这个方案也有明显边界。如果缺陷类型非常多且形态复杂,比如微小裂纹、颜色差异极低的表面失真,单靠 YOLO 检测效果可能不够;如果产线上节拍非常快,要求每秒钟处理几十张图,那还需要考虑高帧率工业相机和更高性能的推理引擎;如果完全没有标注数据,需要从零开始采集和标注,那么项目周期会长很多。
另外要注意一点:任何深度学习缺陷检测系统都不适合直接完全替代人工判定。更稳妥的落地方式是把模型检测结果作为“预筛”或“辅助提示”,由人工最终确认。这样既降低漏检风险,也方便积累数据持续迭代模型。
2.3 数据合规与安全边界
金属表面检测系统必然涉及实际产线数据。如果你要采集真实产品图片做训练,需要先确认数据来源合法,并且获得企业和相关人员的授权。产线数据可能涉及工厂内部工艺、产品外观设计、客户订单信息,不能未经许可随意发布或用于商用。
如果项目中涉及人脸、声音等敏感生物信息,必须严格限制数据访问范围。不过在金属缺陷检测这种场景中,一般不涉及人脸和声音,因此主要风险集中在产品数据和产线数据上。建议在项目文档中明确数据使用范围,测试阶段优先使用公开数据集或自己实验室拍摄的样品数据。
3. 环境准备与前置条件
在没有具体项目脚本的情况下,先按一套通用的本地深度学习 + Qt 桌面项目环境来准备。下面的检查清单可以作为部署前的确认项。
3.1 操作系统
Windows 10/11 和 Ubuntu 20.04/22.04 是比较常见的选择。PySide6 在 Windows 和 Linux 下都有官方支持。由于工业现场的操控电脑大多是 Windows 系统,很多项目会以 Windows 作为首选目标平台。
3.2 Python 版本
PySide6 和 YOLO 官方训练组件在这些年的版本更迭中,普遍要求 Python 3.8 以上。更稳妥的选择是 Python 3.9 或 3.10。如果你的项目代码较新,且依赖库版本较新,也可能需要 Python 3.11 以上。建议先根据项目要求确认 Python 版本,再创建虚拟环境,避免系统 Python 环境被污染。
3.3 深度学习推理环境
YOLOv5 和 YOLOv8 都依赖 PyTorch。训练和 GPU 推理时需要安装对应版本的 CUDA、cuDNN 和 PyTorch。如果你使用的是 NVIDIA 显卡,先通过nvidia-smi查看当前驱动支持的 CUDA 版本,再安装匹配的 PyTorch 版本。如果只是 CPU 推理,可以不安装 CUDA 版本,但推理速度会明显下降。
一个常见的坑是:PyTorch 版本和 CUDA 驱动版本不匹配,安装后模型能加载,但推理时提示 CUDA 初始化失败。遇到这种情况,优先查驱动版本和 PyTorch 官方安装命令。
3.4 界面开发环境
PySide6 可以用 pip 直接安装。它自带 Qt Designer 等工具也可以单独安装。如果你之前用的是 PyQt5,迁移到 PySide6 时要注意一些 API 变化,比如信号槽写法、枚举类型访问方式等。
3.5 磁盘空间
数据集、模型权重文件和训练缓存都会占磁盘空间。一般情况下,建议预留至少 20GB 空间,如果训练数据量大,预留 50GB 以上更安心。另外,模型训练过程中会生成 runs 目录下的实验记录,包括权重、日志、验证图片,这个目录会随着训练次数增长变大。
3.6 端口占用
如果系统要提供 Web API 服务,比如用 Flask/FastAPI 封装 YOLO 推理接口,要提前确认端口是否被占用。常见的 8000、8080、5000、7860 端口经常被其他服务占用,启动前可用命令检查。
4. 安装部署与启动方式
根据项目实际情况,这里给出通用安装部署流程。如果你拿到的项目已经提供了一键启动脚本,那么可以省略大部分手动安装步骤,直接双击运行脚本。但即使有一键包,了解底层依赖关系也有助于排查问题。
4.1 创建虚拟环境
推荐使用 pip 或 conda 创建独立虚拟环境。这样可以避免多个项目依赖冲突。
# 创建 Python 3.9 虚拟环境 python -m venv venv # Windows 激活环境 venv\Scripts\activate # Linux/macOS 激活环境 source venv/bin/activate4.2 安装 PyTorch
PyTorch 安装命令需要根据你的 CUDA 版本调整。以官方常见安装方式为例:
# CPU 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # CUDA 12.1 版本示例,实际根据本机 CUDA 环境选择 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121安装完成后,可以用一行 Python 代码验证显卡是否可用:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU")如果torch.cuda.is_available()返回 False,说明 PyTorch 和 CUDA 环境没有匹配好,需要检查驱动和 PyTorch 版本。
4.3 安装 YOLO 训练推理组件
YOLOv8 通常通过 ultralytics 包使用,YOLOv5 则可以直接 clone 官方仓库或安装对应依赖。以下命令以 YOLOv8 为例:
pip install ultralyticsYOLOv5 的仓库方式安装示例:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt实际项目中,如果代码已经集成了模型加载逻辑,不一定要单独拉取仓库,只需要安装好推理所需的依赖库,然后使用本地权重文件即可。
4.4 安装 PySide6
pip install PySide6安装完成后可以快速验证:
import PySide6 from PySide6.QtWidgets import QApplication print(PySide6.__version__)如果导入没有报错,说明 PySide6 环境正常。
4.5 项目目录结构建议
一个典型的 YOLOv8 + PySide6 项目目录结构如下:
metal_defect_detection/ ├── main.py # PySide6 主程序入口 ├── config.yaml # 配置文件:模型路径、类别、参数 ├── models/ # 模型权重文件目录 │ ├── defect_yolov8.pt │ └── defect_yolov5.pt ├── datasets/ # 数据集目录(训练用) ├── images/ # 测试图片目录 ├── videos/ # 测试视频目录 ├── results/ # 检测结果输出目录 ├── api_server.py # API 服务脚本(可选) ├── batch_detect.py # 批量检测脚本(可选) └── requirements.txt # 依赖清单这个结构的好处是模型、数据、输出分开,不容易混乱。
4.6 启动桌面系统
如果项目提供了main.py,通常可以直接启动:
python main.py如果没有提供具体参数,可能需要在启动前修改配置文件中模型路径、类别名称等。下面是一个config.yaml示例,实际字段需要按项目代码调整:
model_path: "models/defect_yolov8.pt" device: "cuda" # 可选 cuda / cpu conf_thres: 0.4 # 置信度阈值 iou_thres: 0.5 # NMS IoU 阈值 class_names: 0: "scratch" 1: "pit" 2: "crack"启动后,PySide6 窗口会弹出,界面内通常包含图片选择按钮、检测按钮、结果图像显示区域、类别和置信度显示区域。如果是摄像头检测模式,还会有视频画面显示区域和检测状态栏。
5. 功能测试与效果验证
系统跑起来之后,不能只看“能打开窗口”就结束。要一步步验证不同检测功能是否正常。下面按功能模块给出测试方案。
5.1 模型加载测试
测试目的:确认模型权重文件能被正确加载,并且模型能够正常初始化。
操作步骤:
- 启动程序。
- 观察启动日志或终端输出,确认模型名称和模型路径。
- 查看是否出现模型加载成功提示。
判断标准:
- 程序没有崩溃。
- 日志中能打印出模型类别数量、类别名称,或者至少不报
FileNotFoundError、ModelNotFoundError之类的错误。
常见失败原因:
- 模型路径写错。
- 模型权重文件和库版本不匹配,例如用 YOLOv8 的代码加载 YOLOv5 权重。
- 显存不足,导致模型初始化失败。
5.2 单张图片检测测试
这是最核心的验证环节。用一张包含金属表面缺陷的测试图,检查模型能否正确框出缺陷位置。
操作步骤:
- 在界面中点击“选择图片”按钮。
- 选择一张测试图片。
- 点击“开始检测”按钮。
- 观察结果区域是否绘制了检测框、类别标签和置信度。
输入示例:一张带有划痕的金属板照片,建议用真实产线拍摄的图片,或者用公开缺陷数据集中的图片。
预期结果:图像显示区域出现边界框和标签。如果模型是 YOLOv8,框上会显示类似scratch 0.86的类别和置信度。
判断标准:
- 检测框数量、位置和人工标注的基本一致。
- 置信度数值正常,比如在 0.5 到 0.95 之间。
- 没有大面积误报,比如整块背景都被框出来。
常见失败原因:
- 测试图片和训练数据差异太大,出现漏检。
- 置信度阈值设置太高,导致低分缺陷被过滤。
- 图片分辨率太高,输入时被缩放后小缺陷丢失。
5.3 摄像头实时检测测试
如果是产线现场使用,通常要连接工业相机或 USB 摄像头。PySide6 界面中一般会有一个视频画面区域,通过 OpenCV 读取摄像头帧,再送入 YOLO 模型推理。
操作步骤:
- 准备一个 USB 摄像头,或接入测试视频流。
- 在界面中点击“打开摄像头”按钮。
- 将带有缺陷的样品放到摄像头视野内。
- 观察画面中是否存在实时目标框。
预期结果:视频画面流畅更新,缺陷出现时能实时打框。如果缺陷移动,检测框能跟随移动。
常见失败原因:
- 摄像头索引错误,OpenCV 打开的是错误设备。
- 帧处理速度太慢,画面卡顿。
- 光线变化大,导致检测效果波动。
这时需要重点关注的是检测帧率,也就是 FPS。如果 FPS 太低,说明推理性能不足,可以考虑降低输入分辨率、换更小的 YOLO 模型,或者更换更高性能显卡。
5.4 视频文件检测测试
如果生产环境不方便直接接摄像头,也可以用视频文件来模拟产线流。选择一段拍摄好的金属表面运动视频,在界面中导入,逐帧检测。
判断标准:视频能正常逐帧处理,检测框能稳定输出,最终能保存检测后的视频文件。如果项目支持导出检测视频,检查导出文件是否能正常播放。
常见问题:视频解码格式不支持、帧读取失败导致中断、CPU 推理太慢导致视频播放不流畅。
5.5 批量图片检测测试
批量图片检测是工业场景中很实用的功能。用户可以一次性选择一个文件夹,系统自动识别文件夹内所有图片并分别检测,最后输出一份汇总结果。
操作步骤:
- 点击“选择文件夹”按钮。
- 选择包含多张测试图片的目录。
- 点击“批量检测”按钮。
- 查看结果表格,确认每张图片的检测结果都被记录下来。
预期结果:结果表格中列出文件名、检测到的缺陷类别、置信度、坐标信息。输出目录中生成对应的标注后图片。
注意点:批量检测任务耗时较长,界面需要有进度条或日志输出,避免用户误以为程序卡死。
6. 接口 API 与批量任务
除了桌面界面,很多项目还需要把检测能力开放给其他系统调用。比如产线 MES 系统、质检数据管理系统,通过 HTTP 接口上传图片,返回检测结果 JSON。这样做的好处是:界面、检测逻辑、数据管理可以分离,后续也方便部署成局域网服务。
6.1 接口设计思路
如果项目里没有现成接口,你可以自己在现有代码基础上加一个轻量级 API 服务。常见方案是 Flask 或 FastAPI。接口大致包含三个部分:
- 请求入口:接收 POST 请求,接收图片文件或图片路径。
- 模型推理:调用已经训练好的 YOLO 模型,完成目标检测。
- 结果返回:将检测框、类别、置信度、数量打包成 JSON 返回。
一个用 Flask 封装的通用检测接口示例:
# api_server.py # 这是一个通用示例,实际使用时需要结合你的项目模型加载代码调整 import io from flask import Flask, request, jsonify from PIL import Image from ultralytics import YOLO app = Flask(__name__) # 模型加载一次,避免每次请求重复加载 model = YOLO("models/defect_yolov8.pt") @app.route("/api/detect", methods=["POST"]) def detect(): if "file" not in request.files: return jsonify({"error": "no file uploaded"}), 400 file = request.files["file"] image_bytes = file.read() image = Image.open(io.BytesIO(image_bytes)) results = model.predict(image, conf=0.4, iou=0.5) result_data = [] for r in results: boxes = r.boxes.xyxy.cpu().numpy().tolist() confs = r.boxes.conf.cpu().numpy().tolist() classes = r.boxes.cls.cpu().numpy().tolist() for box, conf, cls in zip(boxes, confs, classes): result_data.append({ "bbox": box, "confidence": conf, "class_id": int(cls), "class_name": model.names[int(cls)] }) return jsonify({ "detections": result_data, "count": len(result_data) }) if __name__ == "__main__": app.run(host="127.0.0.1", port=8000)调用示例:
curl -X POST http://127.0.0.1:8000/api/detect \ -F "file=@test_defect.jpg"Python 调用示例:
import requests url = "http://127.0.0.1:8000/api/detect" files = {"file": open("test_defect.jpg", "rb")} response = requests.post(url, files=files, timeout=30) print(response.status_code) print(response.json())需要注意,如果生产环境要开放接口访问,必须限制访问范围。最简单的方式是将服务绑定在127.0.0.1,只允许本机访问;需要跨机器调用时,再通过局域网 IP 指定监听地址,同时配合防火墙规则限制来源 IP。
6.2 批量任务队列设计
批量检测如果只是简单 for 循环遍历文件夹,在小规模测试时没问题。但图片数量达到几百上千张时,需要考虑任务队列、日志记录和失败重试。
一个简单的批量检测脚本模板:
# batch_detect.py # 通用示例,需要结合项目模型加载方式调整 import os import json import time from ultralytics import YOLO model = YOLO("models/defect_yolov8.pt") input_dir = "images" output_dir = "results" os.makedirs(output_dir, exist_ok=True) # 遍历图片文件 image_exts = [".jpg", ".jpeg", ".png", ".bmp", ".webp"] task_log = [] for filename in sorted(os.listdir(input_dir)): ext = os.path.splitext(filename)[1].lower() if ext not in image_exts: continue image_path = os.path.join(input_dir, filename) start_time = time.time() try: results = model.predict(image_path, conf=0.4, iou=0.5, save=True, project=output_dir, name="batch") elapsed = time.time() - start_time task_log.append({ "file": filename, "status": "success", "time_seconds": round(elapsed, 2), "detections": len(results[0].boxes) }) print(f"[OK] {filename} 检测完成,耗时 {elapsed:.2f}s") except Exception as e: task_log.append({ "file": filename, "status": "failed", "error": str(e) }) print(f"[FAILED] {filename} 检测失败: {str(e)}") # 保存任务日志 with open(os.path.join(output_dir, "batch_log.json"), "w", encoding="utf-8") as f: json.dump(task_log, f, ensure_ascii=False, indent=2)在批量生成场景中,每次以图片为单位做 try/except 很有必要,至少能避免单张图片解码失败导致整个批量任务中断。同时建议保存一个日志文件,汇总成功失败情况,方便后续排查。
7. 资源占用与性能观察
深度学习目标检测系统的资源占用是实际部署时非常关键的问题。虽然不能给出固定的显存数字,但可以从观察方法和影响因素两方面分析。
7.1 显存占用观察
训练模型和 GPU 推理时,显存占用是最直观的性能指标。Windows 下可以用任务管理器中的 GPU 选项卡查看,也可以用 NVIDIA 官方命令实时监控:
nvidia-smi -l 1这条命令会每秒刷新一次 GPU 使用情况,包括显存占用、温度、利用率。
Linux 下同样可以用nvidia-smi查看。如果想记录到日志文件,可以用循环方式:
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv在实际项目中,你需要在“模型加载完成但未推理”和“模型持续推理”两个状态分别观察显存占用。两者的差距越大,说明推理过程本身消耗的资源越多。
7.2 CPU 推理与 GPU 推理差异
如果现场没有 NVIDIA 显卡,或者显卡驱动环境不匹配,也可以考虑用 CPU 推理。CPU 推理不需要显存,但速度会慢很多。同一个 YOLOv8s 模型,GPU 推理一张 640x640 图片可能只需要几十毫秒,而 CPU 推理可能要几百毫秒甚至更久。这个差距在批量任务和视频检测中尤其明显。
如果是在老旧办公电脑上做验证,可以先把device="cpu"跑通整个流程,再切换到 GPU 看速度变化。
7.3 影响推理速度的因素
- 输入图像分辨率:分辨率越高,模型计算量越大。虽然大图能保留更多细节,但速度明显下降。
- 模型尺寸:YOLOv8n、YOLOv8s、YOLOv8m 的速度差异很大。工业缺陷检测里,不一定非要最大的模型,先从小模型开始测试反而更合理。
- 批次大小:批量推理时 batch size 越大效率越高,但显存占用也越高。
- 置信度阈值和后处理:更低阈值会导致更多候选框进入 NMS,后处理耗时增加。
- 视频流多线程处理:如果界面 UI 和推理在同一线程,检测时界面可能卡顿;通常要拆分线程,保证界面响应。
7.4 如何降低资源占用
- 把输入图片 resize 到更合适的尺寸,比如 640x640 或 320x320。
- 优先使用 YOLOv8n 或 YOLOv5s 这类小模型。
- 推理时避免重复加载模型,模型只初始化一次。
- 对于视频检测,可以每 N 帧检测一次,减少计算量。
- 批量任务中限制并发数,避免显存溢出。
要注意,降低资源占用往往以牺牲小缺陷检测能力为代价。工业场景里“漏检”比“误检”更严重,调优时需要在速度和精度之间反复验证,不能只看速度指标。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后页面打不开 | 端口被占用或服务未启动 | 检查日志,确认进程是否运行 | 更换启动端口,或先杀掉占用端口的进程 |
| 导入 PySide6 报错 | Python 版本不兼容或安装不完整 | 检查 Python 版本,pip show PySide6确认安装状态 | 升级 Python 环境后重新安装 PySide6 |
| 模型加载失败 | 模型路径错误、权重格式不匹配 | 检查配置文件中的路径,确认.pt文件是否存在 | 修改为正确路径,或重新导出权重 |
| CUDA 不可用 | PyTorch 版本与 CUDA 驱动不匹配 | 运行torch.cuda.is_available()检查 | 安装匹配当前驱动的 PyTorch 版本 |
| 检测结果为空 | 置信度阈值过高,或测试图片与训练集差异大 | 调低置信度阈值,换测试图片 | 调整阈值,或补充训练数据 |
| 摄像头打不开 | 摄像头索引错误、驱动问题 | 用 OpenCV 单独测试摄像头索引 | 更换摄像头索引,或安装摄像头驱动 |
| 界面卡顿 | 推理和 UI 在同一线程 | 观察 CPU/GPU 占用,确认推理线程 | 将推理过程放到后台线程,主线程负责界面刷新 |
| 批量任务中断 | 单张图片损坏或异常导致程序崩溃 | 查看批量日志,定位失败文件 | 在批量循环中添加 try/except 和日志记录 |
| API 请求超时 | 模型推理耗时过长 | 检查单张图片推理耗时 | 降低输入分辨率,或换更小模型 |
| 显存溢出 | 批量数过大或分辨率过高 | 观察 nvidia-smi 显存占用 | 降低 batch size,或用小模型 |
以上都是这类系统在开发和部署过程中比较常见的问题。遇到报错时,建议先看完整报错堆栈,不要只看最后一行。很多问题是依赖版本不匹配导致的,可以在虚拟环境中重装依赖。
9. 最佳实践与使用建议
9.1 数据集决定系统上限
模型再强,没有高质量数据也不行。金属表面缺陷数据集的采集和标注要投入足够时间。标注时要注意:
- 所有边界框尽量紧贴缺陷边缘,不要一个框包含多个不相关区域。
- 类别定义要明确。比如“划痕”和“裂纹”如果边界模糊,模型很难学准。
- 同一缺陷尽可能采集不同光照、不同角度、不同表面状态下的图片。
- 训练集、验证集、测试集要按比例切分,建议验证集不要和训练集有重叠。
9.2 先小参数验证,再全量训练
第一次训练时不要一上来就追求极高精度。先把数据跑通、代码流程跑通,用一个较小的 epoch 数量验证训练链路是否正常,再根据验证集指标逐步增加训练轮数和模型尺寸。
9.3 预留最小可运行配置
把模型权重、配置文件、测试图片、启动命令写清楚,最好放在一个固定的项目目录中。这样后续重新部署、换机器时,不用从头排查依赖。
9.4 保留版本记录
模型训练过程中会输出不同 epoch 的权重文件。不要轻易删除。有些时候训练后期模型虽然整体精度高,但某些缺陷类型会退化。保留多个检查点,可以回溯对比。
9.5 边界框坐标要根据业务需求输出
如果只是看检测框,UI 里显示足够了。但工业系统往往需要把检测结果写入数据库,或者传给PLC控制系统。这时候要明确定义边界框坐标是像素坐标还是归一化坐标,是左上角+宽高还是中心点+宽高,避免下游系统对接时出现单位错误。
9.6 安全地开放接口
如果 API 服务要开放给局域网内其他设备调用,建议:
- 服务绑定特定 IP,不要绑定 0.0.0.0。
- 设置访问 Token 或基础认证。
- 限制单次请求文件大小。
- 记录请求日志,方便追查异常调用。
9.7 人工复核与持续迭代
系统上线后,不要完全脱离人工。缺陷检测系统的精度需要持续观察。建议把模型漏检和误检的图片定期收集起来,形成负样本集合,定期重新训练和评估。这样系统才会越来越适合现场工况。
10. 总结与下一步
基于深度学习 YOLOv8/YOLOv5 结合 PySide6 的工业金属表面缺陷检测系统,是一个很典型的“目标检测模型 + 桌面客户端”落地项目。它的价值在于把 YOLO 的模型能力封装成可视化工具,让质检员不需要了解深度学习也能操作系统,同时也方便工程师做二次开发和数据管理。
对刚接触这个方向的开发者来说,建议按这样的顺序切入:先把 YOLOv8 官方预训练权重在公开数据集上跑通单张图片检测,再切换到 YOLOv5 对比一下两者在推理速度和部署方式上的差异;然后准备一批自己的金属表面缺陷图片,用 LabelImg 或 YOLO 格式标注工具做数据标注;训练一轮模型后,再开始编写 PySide6 界面,把模型加载、图片选择、结果绘制、批量检测这些模块逐步接入。
最容易踩的坑有三个:第一是 PyTorch 和 CUDA 版本不匹配,安装后显卡不可用;第二是 PySide6 界面线程和模型推理线程没有分离,检测时界面直接卡死;第三是数据集太随意,缺陷类别混乱、标注框不准确,导致模型效果始终达不到预期。这三个坑只要提前做好规划,都能避免。
后续还可以考虑的方向包括:接入工业相机实时采集、把 YOLO 模型导出为 ONNX 或 TensorRT 格式加速推理、增加缺陷检测等级分类、把检测结果写入 MySQL 或 SQLite 形成质量追溯报表、集成到已有的 MES 系统流程中。把这些扩展逐步做出来,这套系统就能从一个 demo 变成一套真正能在现场使用的质检辅助工具。
建议把这篇的部署流程和排查清单收藏起来,实际搭建时对照着操作,能少走不少弯路。