资讯动态

基于YOLOv12的轴承缺陷检测系统实战:从数据集构建到UI部署

发布时间:2026/10/18 21:27:23 来源:尧图企业网站定制
我捣鼓了大半个月的轴承缺陷检测小系统终于跑通了。这活儿说难不算难但坑确实不少。项目用的是当下目标检测里比较新的 YOLOv12配合我自己标的一套轴承数据集外加一个带登录功能的本地 Web UI。从数据准备到模型部署全流程走了一遍我踩过的坑、琢磨出来的经验都整理在下面这篇文章里了希望能给想玩工业视觉或者正在做类似项目的朋友省点时间。先说说这个项目到底是干嘛的。轴承是工业设备里的核心零件表面如果有划痕、锈蚀、缺块轻则影响设备运行精度重则可能导致整台机器报废。靠人眼一个个看效率太低而且时间一长眼睛就花了漏检率根本压不住。所以搞一个自动检测的系统用摄像头或者工业相机拍下轴承图片让算法自己判断有没有缺陷在产线上非常实用。我做的这套系统用的就是 YOLOv12 这个深度学习模型配合一套自己整理的图片数据集再包了一个图形界面能登录、能选图片、能看检测结果。适合谁看这篇文章如果你是做工业视觉、设备质检或者正在学目标检测、准备毕业设计、想搞一套能演示的完整项目这里面的内容应该挺对口。即便你只是刚开始接触深度学习只要你肯花点时间把环境配好照着撸一遍代码也能把它跑起来。1. 项目概述与技术选型1.1 核心需求解析上线一套视觉检测系统核心需求大概就三块第一模型得能准确识别出轴承表面的各种缺陷不能漏了也不能瞎报第二人和系统之间的交互得顺畅操作工人不用懂算法打开界面点几下就能用第三得有一个基本的账号体系不然谁都能改配置、看记录现场管理就乱了。我这次处理的是轴承外圈和内圈的表面缺陷缺陷类型分了几种比如划痕、麻点、锈斑、缺角。实际拍的图背景不算太复杂但缺陷的大小差异很大有的划痕细细一条有的锈斑一大片这就对模型的鲁棒性有要求了。用 YOLOv12 来处理这种场景我个人觉得挺合适它在检测小目标这块比前几代做得更稳。1.2 为什么选 YOLOv12 而不是其他模型可能有人会问现在检测模型那么多Faster R-CNN、SSD、YOLO 系列好几个版本凭啥选 YOLOv12先说 Faster R-CNN它是两阶段检测器先找出候选区域再分类回归精度确实高但速度偏慢一张图推一次要几百毫秒产线质检如果一分钟要过几十张图它就吃不消了。再看 SSD速度倒是上去了但对小目标的检测效果一般般而且那时候的 backbone 放在现在来看有点老了特征提取能力不够强。YOLO 系列一直是速度和精度的平衡点。从 v5 开始工程化做得就特别好训练、导出、部署都有成熟的工具链。到了 v12架构上又改了检测头和解耦策略都有优化在 COCO 这种通用数据集上精度和速度都有提升。用在轴承检测这个具体场景里我用它训练出来的效果比之前用 v8 跑同一批数据要干净误检明显少。而且 YOLOv12 延续了端到端的思路训练和推理流程简单不需要太复杂的后处理这对新手来说很友好。加上 Python 生态里现成的轮子一堆搞 UI、搞数据集标注、搞模型推理都不用从零造。1.3 项目整体结构框架整个项目拆开来看大概是这么几个模块数据处理与标注模块负责图片收集、清洗、标注格式转换最后生成 YOLO 格式的数据集。模型训练模块写训练脚本、配置超参数、跑训练、看指标、导出权重。后端推理服务模块加载模型、预处理图片、执行推理、解析结果。UI 交互模块登录注册界面、主页、图片选择、检测结果可视化、历史记录展示。用户管理模块简单的账号密码校验session 记录登录状态。这种前后端分离、模型单独成模块的做法好处是每一块都能单独替换。比如以后不想用 YOLOv12 了换成其他检测模型训练和推理部分改一下就行UI 不用动。2. 核心技术与实现细节2.1 每个关键技术的“为什么”与“怎么做”YOLOv12 模型的推理流程简单理解就是图片进、结果出。图片输入后模型把图片划分成网格每个网格负责预测中心点落在自己区域内的目标输出包含目标的类别、置信度和边界框坐标。置信度表示模型有多大把握认为这个框里确实有目标深度学习模型不是规则匹配它学到的是特征和模式的统计规律。光知道这些还不够我实际调试的时候还踩了这些细节图像前处理输入图片的比例不一定等于模型要求的尺寸默认通常是 640×640所以要先做 letterbox把图片等比缩放后填充到固定尺寸避免变形影响检测效果。置信度阈值设置太低会出很多误检框太高又会漏检。我调的时候先用默认值 0.25 跑一遍再根据验证集上的表现微调。NMS 非极大值抑制模型对一个目标可能输出好几个互相重叠的框NMS 的作用就是只保留得分最高的那个去掉冗余的框。这个步骤 YOLO 的库里已经封装好了直接用就行。2.2 数据集构建与标注的实操要点数据集是检测系统里最费功夫的一部分。我手里图片不算少但原始的图不能直接用因为光照不均、角度各异、背景杂乱。我的处理流程大概是这样的第一步清洗图片。把所有模糊的、过暗的、有重复的图片挑出来扔掉。工业场景拍的图经常会因为运动模糊或者对焦不准这些图留着只会增加训练难度。第二步统一预处理。把图片分辨率调到统一尺寸避免模型在训练时频繁调整导致不稳定。第三步人工标注。我用的是常见的标注工具在某开源项目中常用跨平台、支持矩形框标注保存为 XML 格式在图上框出缺陷区域标上对应的类别标签。这个过程需要细致标注框要贴边留白太多会导致模型把背景特征也学进去。第四步格式转换。把标注结果从 XML 格式转成 YOLO 训练需要的 TXT 格式。YOLO 格式里每个目标一行内容是类别序号、目标中心点的 x 坐标归一化、y 坐标归一化、宽度 w归一化、高度 h归一化。这一步一定要检查生成的 txt 文件看坐标有没有算错、类别有没有对错一旦数据错了训练出来的模型基本就是废的。第五步划分数据集。按比例划分训练集、验证集和测试集。我的习惯是训练集占 80%验证集和测试集各占 10%。划分的时候注意类别均衡每个类别在训练集里的样本数量不能差太多。这中间还有个小技巧数据增强。YOLO 系列训练时会自动做随机翻转、色彩抖动、马赛克增强所以训练的图片每轮看到的都不太一样模型泛化能力会好很多。如果你发现验证集和训练集指标差得很大那就是过拟合了可以调大增强力度、加正则项或者减小模型复杂度。2.3 模型训练的关键配置和参数解析训练配置文件是怎么写出来的我用了 YOLOv12 的官方基础配置做模板再根据自己的数据集大小做了调整。核心参数就那几个epochs训练轮数我设了 200 轮。数据量大的话可以少一点数据量小就需要更多轮数。看训练曲线的 loss 值通常在后面几十轮已经收敛了继续训练也不会更好。batch-size批大小显卡显存够就设大点样本多梯度更新更稳定设小了训练慢不说还容易震荡。我用的卡是普通的消费级显卡32G 显存带 batch-size 32 没压力。learning rate学习率初始化设的 0.01用了余弦衰减策略。学习率太大会导致训练不稳定太小又收敛太慢。YOLO 的代码默认会做 warm up刚开始训练时慢慢加大学习率防止一开始就跑偏了。optimizer优化器SGD 是老朋友了稳定可靠。新的优化器能自动调整参数收敛通常更快但对有些场景不一定更稳。我用 SGD加上动量和 weight decay效果比较稳。imgsz输入图像尺寸我设的 640这是 YOLO 系列的默认训练尺寸。轴承缺陷里有不少是小目标太小的输入尺寸会丢失细节。重点说一下怎么看训练日志。训练时每条日志会输出当前的 loss 和指标但你主要关注的是验证集上的指标而不是训练集的。如果训练集上的指标很好看、loss 很低但验证集上表现一般大概率是过拟合了模型其实只是记住了训练数据并没有学到通用的缺陷特征。产线实际运行时用的模型我是选验证集指标最优的那一档权重来做的推理而不是用最后一轮权重。验证集的 mAP 达到 0.93 左右已经满足使用需求了。3. 系统模块与实操步骤3.1 数据集准备与格式转换实战拿一张真实的轴承图片举例。原图是一张 1280×720 的彩色图上面有两处明显的划痕和一处锈斑。我用标注工具给它们各画了一个矩形框导出 XML 文件。XML 里记录的是绝对坐标格式大概是这样的annotation filenamebearing_001.jpg/filename object namescratch/name bndbox xmin245/xmin ymin180/ymin xmax360/xmax ymax290/ymax /bndbox /object /annotation转换成 YOLO 的训练格式时要把这些坐标换算成归一化的中心坐标和宽高。换算公式很简单x_center (xmin xmax) / 2 / 图片宽度y_center (ymin ymax) / 2 / 图片高度width (xmax - xmin) / 图片宽度height (ymax - ymin) / 图片高度算出来的结果就是 TXT 文件里的内容。这个转换自己写脚本也不难几十行代码就搞定了。但要注意浮点数的精度问题保留 6 位小数足够了太多了反而没什么意义。提示数据集的目录结构最好按 YOLO 的习惯来组织图片和标签各放一个文件夹。类别列表也要单独写在文件里每行一个类别名称顺序不能随意改动不然后面推理和训练对不上号。3.2 训练脚本与超参数调整准备好数据集之后训练就简单很多了因为 YOLO 的训练入口已经封装好了。我的做法是先用官方默认参数跑一个短训练比如 50 轮试跑确认 GPU 能正常跑、数据加载没问题、loss 在下降再启动完整训练。训练过程的命令行日志密密麻麻的每一轮都能看到当前轮的 loss 和在验证集上的指标变化。我盯着指标看的时候心里会默默判断前几十轮 loss 快速下降是正常的那时候模型在学最显眼的特征后面几十轮 loss 下降变慢也是正常的模型在精修一些边界模糊的样本。再补充一个调参心得如果训练到一半发现验证集指标很差先别急着改超参数优先检查数据集有没有标注错误、类别编号对不对、图片和标签对不对得上。这些低级错误造成的性能下降再怎么调参都没用纯耗时间。我训练时遇到过这么一种情况某一类缺陷的样本特别少只有几十张图结果训练出来的模型对这个类别的检测基本等于瞎蒙。解决办法是给这个类别多收集些图片实在收不到就靠数据增强硬扩比如旋转、平移、调亮度把一张变成多张。3.3 模型推理与前后处理流程模型训练好了接下来就是推理阶段。推理时不能直接把图片丢给模型还是要走一遍预处理流程。我自己写了一个推理函数大概逻辑如下import cv2 import torch from ultralytics import YOLO model YOLO(best.pt) def detect(image_path): img cv2.imread(image_path) results model.predict(sourceimg, conf0.35, iou0.45) boxes results[0].boxes for box in boxes: x1, y1, x2, y2 box.xyxy[0].tolist() conf float(box.conf[0]) cls int(box.cls[0]) label f{model.names[cls]} {conf:.2f} print(label, (x1, y1, x2, y2)) return results有人会问conf 参数 0.35 是怎么来的这个是我跑验证集测出来的。先说结论如果置信度阈值设成 0.1确实能多检出一些目标但误报也会增加经常把轴承上的倒角当缺陷。设成 0.7误报少了但有些其实很明显的轻微划痕又被漏掉了。折中之下 0.35 最香漏检和误报都比较少。阈值这东西没有标准答案必须用自己的数据实测调出来。3.4 UI 界面设计与登录注册模块实现UI 界面我选了 PySide6Qt for Python来写。为什么不用 Flask、HTML 那套因为本地工具场景下桌面应用打开即用不依赖浏览器和网络用户感受更直接。PySide6 的布局和控件写起来也很顺手文件选择框、列表、图片显示区拖拖拽拽就能拼出来。界面大体是这样的左边是功能导航包括“选择图片”、“开始检测”、“历史记录”中间大块区域是图片显示区检测完的图片会画上带类别标签的框右边是结果信息板显示检测到的缺陷类别、置信度、耗时。登录注册模块用 SQLite 本地数据库存账号信息。用户注册时输入用户名和密码密码不能明文存我用哈希处理后再存数据库。登录成功后界面跳转到主页面。会话状态就用一个全局变量记录当前登录用户逻辑简单清晰。UI 模块和模型推理模块是分离的。UI 只管接收用户指令、展示结果真正干活的是后台一个单独的推理类。这样做的好处是如果将来想把 UI 换成一个 Web 页面或者直接把模型放到服务器上推理类可以原封不动地拿过去用。4. 常见问题与排查经验4.1 训练中经常踩坑的点和解决方案数据集不平衡这个前面提到过属于最坑的问题之一。我当时有一类缺陷样本严重偏少怎么解决的呢靠两招一是去现场多拍图、多找历史故障图来补充二是对已有样本做增强处理。注意增强要在合理范围内做不能把图片增强得完全失真不然模型学到的就是假特征了。训练loss不下降这个问题排查起来最费时间。我的排查顺序是先看数据标注文件里有没有空的、坐标有没有超出图片边界的再看配置学习率是不是设得太大了batch-size 是不是设得太小了最后看环境CUDA 和 PyTorch 版本是否匹配GPU 显存够不够。如果以上都正常就把 epochs 调大接着训有时候就是单纯地“还没训够”。显卡显存不足报错信息直接提示 CUDA out of memory。这种时候把 batch-size 调小是最直接的或者把输入图片尺寸从 640 降到 512。再不行就放弃图形界面训练在终端里关掉会占用显存的操作。4.2 推理时的延迟和准确率问题排查推理延迟高核心瓶颈通常有三个方向第一模型部署的设备本身太弱换台带 GPU 的电脑会好很多第二图片预处理太耗时比如原图太大可以先压缩再送进模型第三没开半精度推理我实测下来开启半精度后速度提升明显准确率几乎没有肉眼可见的下降。准确率不行要看具体是什么“不行”漏检多说明模型对某些特征学得不到位。误检多说明模型分辨能力不够或者阈值太低。某个类别特别差说明这个类别的标注数据太少或者标注质量不高。4.3 常见问题快查表常见问题可能原因解决办法训练 loss 不降学习率太大、数据有问题降低学习率检查标注和图片tensorRT 推理报错节点不兼容先校验模型再转换注意版本匹配UI 界面卡顿单线程推理阻塞主线程把推理放到独立线程登录注册提示数据库表不存在数据库文件未初始化启动时自动建表路径写对每次检测结果不稳定未关闭测试模式下的随机因素关闭增强、固定随机种子、统一输入尺寸GPU 显存不足单卡显存太小调低 imgsz 和 batch检查是否有其他进程占用也许有人在群里问过一个比较冷门的问题为什么同样一张图推理两次结果却不一样我当时排查了很久最后发现是测试模式下数据增强没关掉。推理阶段一定要把增强关掉不然随机性会引入额外的抖动。细节全是细节。5. 实测效果与我的一点心得最后说说实测效果。我在一批从未参与训练的图片上测试了模型我人为地统计了一下各种真实缺陷的检出情况顺手记了下来划痕的检测效果最好全部检出置信度普遍在 0.8 以上麻点和锈斑略差一些部分置信度在 0.5~0.7 之间缺角某种角度下弱一些可能和样本数量有关。整体平均精度在 0.93 左右单张图片推理时间在 20 毫秒内完全满足产线实时检测的需求。在 UI 里实际跑了一遍完整流程从注册登录、选图、检测、到结果显示整个过程体验很顺畅。第一次接触这个系统的人也能看懂结果界面圈出来的框、类别名、置信度一眼就能明白。做这个项目给我最大的体会就是深度学习项目真正的难点并不只在模型本身而是数据质量和工程细节。模型结构选好之后训练流程已经高度工程化了花大量时间在调参上不如把数据做干净、把流程串顺。另外别小看登录注册和 UI 这些“非核心”模块缺少了它们整套系统拿到现场根本用不起来。模型再好也要有人能用它、会用它是吧。最后再分享一个小技巧训练完成的模型导出成其他格式后在部署端的推理速度还有提升空间。我的项目里用的还是普通的训练权重后续如果上产线你可以考虑做一步模型加速转换尺寸、精度几乎不变但速度快不少。动手试一试你也会发现这其中的乐趣。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑