YOLO11布料缺陷检测实战:从数据增强到PyQt5界面落地
发布时间:2026/9/8 20:00:54 作者:尧图编辑部 阅读量:1,286

简介基于YOLO11的布料外观缺陷检测系统面向纺织印染行业的质检环节可自动识别带沙、断沙、面球、破洞、脱沙、污渍六类常见瑕疵覆盖从纱线到成布的主要外观缺陷类型。项目附带PyQt5图形界面支持图片与视频检测演示源码、训练好的模型、标注数据集均已整理妥当开箱即用。资源共2000个文件绝大多数为YOLO格式的txt标注文件另有xml标注、yaml模型配置及Python脚本压缩包约979MB目录结构清晰便于二次开发与学习。已有114人学习下载适合计算机、人工智能、自动化、电子信息等专业学生用于毕业设计、课程设计也可作为企业算法工程师的快速参考与起点。整套资源包含2100多张标注好的数据集、训练好的模型权重、评估指标曲线、安装使用教程及演示图片视频既能直接运行也能在此基础上调整检测类别、优化网络结构或迁移到其他布面材质快速搭建属于自己的布料缺陷检测方案。 把YOLO11接到布料外观缺陷检测这个场景里我从一开始就知道光有模型是远远不够的。纺织车间的工人要的不是一条训练命令而是能拿起来就用的工具。所以我做这套系统的时候主要围绕四个方向展开模型选型、数据集准备、训练评估、以及用PyQt5把推理过程封装成带界面的成品。这套东西现在能在Windows上直接跑配置好环境后运行main.py就能打开界面加载图片、视频或者摄像头画面实时框出布料上的破洞、油污、跳花等缺陷。下面把这套系统的设计思路和落地时踩过的坑详细拆开讲一遍。1. 布料外观质检场景里YOLO11到底解决了什么问题1.1 传统人工质检的痛点布料缺陷检测和一般的物体检测有个很大不同缺陷种类杂、外观差异大而且很多缺陷和布料本身的纹理高度相似。破洞、油污这类缺陷相对好认但跳花、织疵、纬停这类问题颜色对比度非常低人在强光下盯久了眼睛很快疲劳漏检率会随着连续工作时间的拉长明显上升。这也让布料质检成为制造环节里典型的“视觉疲劳型岗位”。我调研过一些工厂的实际场景坯布在验布机上以每分钟20到30米的速度通过视觉系统要在画面中捕捉的缺陷尺寸可能小到几个像素同时还要面对光照不均、布面抖动、不同底色面料带来的干扰。传统的机器视觉方案用固定阈值加形态学处理对特定一种缺陷可能有效但一旦换个面料底色或者光照条件就要重新调一遍参数维护成本很高。1.2 为什么选YOLO11而不是YOLOv8或传统图像处理传统图像处理不是不能用而是它的泛化能力在这个场景里太吃力。滤波核、边缘阈值、形态学算子这些手段适合缺陷特征非常稳定的场景但布料的纹理千变万化我测试下来发现仅靠人工设计特征去覆盖所有缺陷类型工作量几乎不可控。YOLO系列一直走的是端到端检测路线把目标定位和分类统一在一个回归框架里。YOLO11相比之前的版本主要的改进集中在backbone里的C3k2模块和C2PSA注意力结构上简单说就是让网络在保持轻量化的同时能够提取到更细粒度的局部特征。布料缺陷里很多是细长、低对比度的目标比如纱线断裂、跳花这些恰恰需要模型对局部细节敏感YOLO11这个特性正好对上。另外一点很现实ultralytics框架把训练、验证、导出整个工作流都打包好了我只需要关注数据集和超参数不需要从零写训练逻辑。2100多张图像的规模说大不大说小不小选yolo11s作为基础模型在精度和速度之间能取得一个比较均衡的点。2. 2100多张缺陷图的前期准备标注、增广、数据集划分2.1 类别定义与标注格式我的习惯是拿到一批数据后先不做任何处理把所有图片过一遍把出现的缺陷形态记录下来再和需求方确认最终的类别边界。这套系统里我最终用了五个主要类别破洞、油污、跳花、毛边、水渍。一些出现频率极低且形态过杂的类型我建议直接并入“其他”或者其他相近类别否则类别太碎会让模型很难学。标注工具用的是LabelImg导出格式是YOLO的txt格式每一行对应一个目标框内容依次是类别id、归一化后的中心点x、中心点y、框宽w、框高h。这里有三个细节我要重点提醒布料图像里不要只框大面积缺陷小目标一定要标全漏标一个对训练的影响比标错类别更严重。同一张图里如果同一个缺陷被分成多段建议按照实际形态合并成一个框不要碎成十几个小框否则模型学到的边界会很乱。每张图的标注量不一致没关系但整体上每个类别的目标框数量别差太多最好控制在3倍以内。如果某个类别只有另一类的十分之一需要人工降低其他类别的负样本权重或者补充该类图像。2.2 数据增强策略2100张原始图对于深度学习模型来说属于中小规模数据集尤其是要覆盖多种缺陷和不同光照条件时必须依赖数据增强来扩展分布空间。ultralytics框架内置了Mosaic、随机翻转、旋转、HSV扰动、随机透视等增强策略训练时默认开启这一点省了我不少事。不过这里有个容易踩的坑启用Mosaic增强会把四张图拼成一张如果布料的纹理周期很强拼出来的图很可能会出现伪缺陷边界模型在训练集上表现很好但实际推理时遇到正常纹理反而误报。所以我的做法是动态增强可以开但不要开满尤其在最后几十个epoch把Mosaic关掉让模型在更接近真实分布的图像上进行微调这样测试集表现会更稳定。2.3 数据集划分逻辑这套系统的数据集划分是train:val:test 8:1:1划分的时候有几个原则同一张原始图像的所有标注必须放在同一个集合里不能出现同一张图的一部分框在训练集一部分框在验证集的情况。实例数少的类别要人工检查分布确保该类别在验证集和测试集中都有少量样本否则评估指标对这类缺陷几乎没有参考意义。拍摄于同一批次、同一光源条件下的图像尽量分散到不同集合避免验证集和训练集图像太像导致评估结果虚高。划分完成后训练前还要再做一次检查用脚本统计训练集、验证集、测试集中每个类别的数量分布如果某个类别严重缺失优先补数据而不是改划分。3. 训练过程复盘超参数选择与评估指标曲线解读3.1 环境配置要点这一套系统的环境配置主要是Python虚拟环境加ultralytics、torch、PyQt5这几个核心库。有几个容易卡住的点我这里一并说清楚Python版本建议3.9到3.11太高或太低都可能出现某些依赖库没有对应版本的情况。torch安装时一定要先确认CUDA版本。如果你用的是NVIDIA显卡装完驱动后打开命令行执行nvidia-smi查看自己支持的CUDA版本然后去PyTorch官网选择对应命令安装。这一步错了后面跑模型时会直接跳到CPU速度慢到没法用。ultralytics需要安装的包极少pip install ultralytics会自动拉取opencv、numpy、matplotlib等依赖但opencv和PyQt5在某些Windows环境下同时运行会有DLL冲突这个问题后面专门说。3.2 训练超参数的选择我用的配置是预训练权重yolo11s.pt输入尺寸640x640训练200轮batch size 16优化器AdamW初始学习率0.01搭配余弦退火调度超参数文件里部分增强参数做了微调。下面是这套系统最终使用的核心参数表参数取值说明modelyolo11s.pt轻量版兼顾速度和精度imgsz640对布料小目标较友好兼顾显存epochs200中小数据集建议150-300batch16RTX 3060及以上可跑optimizerAdamW收敛稳定调参空间大lr00.01初始学习率过大容易炸mosaic1.0后30轮关闭避免过强拼接干扰hsv_h / hsv_s0.015 / 0.7增强不同颜色面料泛化为什么要用预训练权重而不是从零训练因为2100张图对深层网络来说规模有限预训练权重已经在海量通用数据上学到过基础纹理和形状特征在纺织图像上继续训练相当于在一个好的起点上做适配收敛速度快很多最终精度也更高。3.3 评估指标曲线怎么看训练完成后UItralytics会在runs目录下输出大量文件包括results.csv、confusion_matrix.png、P_curve、R_curve、PR_curve、F1_curve以及每个类别的标注分布图。这些曲线很多人图省事只看一张就下结论我的建议是重点看三样东西PR曲线横轴召回率纵轴精确率曲线越靠近右上角说明模型在保证准确的同时漏检也不多。如果曲线尾部被拉到很低说明提高召回会带来大量误检。mAP50和mAP50-95前者看的是IoU阈值0.5下的平均精度后者是0.5到0.95步长0.05的平均值。mAP50容易虚高mAP50-95更能反映框位置的准确性。布料缺陷检测里小目标多如果mAP50-95和mAP50差距过大说明框的位置还不够稳定。categories之间的对比如果某一类别的AP很低通常不是参数问题而是该类别样本少或者标注边界不一致我遇到过跳花类别AP明显低回去检查发现标注时框的高低差别很大重新调整了一轮再训练才改善。这套系统训练好的模型在验证集上的mAP50在0.9左右mAP50-95大约0.78这个水平已经能满足多数应用场景的预筛需求即先靠模型快速圈出疑似缺陷再由人工做最终确认。4. PyQt5界面设计让算法真正落到车间可用的成品4.1 界面布局与交互流程终端命令跑检测对开发人员很自然但车间使用人员不会愿意碰命令行。所以我用PyQt5做了图形界面整体布局是左侧控制区、右侧显示区。控制区包含模型选择下拉框、置信度阈值滑块、IoU阈值滑块、文件加载按钮、运行按钮和结果统计标签。右侧显示区是检测结果图像底部还有一个文本框用来输出每张图检测到的类别和数量。界面交互流程是这样先启动主程序加载训练好的best_yolo11s.pt权重文件用户点击“打开图片”或者“打开视频”预览区显示原始画面点击“开始检测”后推理结果实时显示并附带边界框、类别名和置信度。GUI里最重要的一个设计原则是模型只加载一次不要每次检测都重新load。我见过很多新手把YOLO(weights/best.pt)写进检测函数里每检测一张图就加载一次权重速度慢到没法用。正确做法是在程序初始化的时候加载好模型放到全局变量或单例里后面直接调用predict方法。4.2 图片、视频、摄像头三种检测模式的核心逻辑这套系统里三种模式共用同一个推理函数区别只在于图像源图片模式读取本地图像按一定尺寸缩放后送入模型推理返回结果后直接在界面上重新绘制效率最高。视频模式按帧读取视频流逐帧送入模型。这里必须注意线程问题视频推理是个耗时操作如果直接放在主线程里跑界面会直接卡死。摄像头模式通过OpenCV的VideoCapture读取摄像头帧同样放入后台推理线程。视频和摄像头模式我用了QThread来避免界面阻塞大致结构如下import numpy as np from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLO class DetectThread(QThread): frame_ready pyqtSignal(np.ndarray) result_ready pyqtSignal(object) def __init__(self, model_path, source_type, source_path): super().__init__() self.model YOLO(model_path) self.source_type source_type self.source_path source_path self.running True def run(self): if self.source_type video: cap cv2.VideoCapture(self.source_path) else: cap cv2.VideoCapture(0) while self.running: ret, frame cap.read() if not ret: break results self.model.predict(frame, imgsz640, conf0.3, device0) annotated results[0].plot() self.frame_ready.emit(annotated) cap.release()使用QThread之后界面主线程只管接收frame_ready信号并刷新画面推理占用的时间不再卡住按钮点击和窗口拖拽。要强调的是关闭窗口时必须设置一个标志位让线程循环退出再调用wait等待线程结束否则程序会直接崩溃。4.3 GUI中推理结果展示与导出检测结果除了在界面上显示还需要有记录功能。我把每一帧检测到的类别、坐标、置信度追加到一个CSV文件方便工人复盘或者作为质检报告的基础数据。结果导出这部分我特别注意了绘制信息完整度。用results[0].plot()画出来的图自带边界框和标签但这张图是把标签、置信度直接绘制在帧上的结果用于查看没问题如果要做后期数据分析我建议还是从results[0].boxes中提取原始坐标数据自己做业务逻辑处理不要依赖plot后的图像。5. 开箱即用背后的坑环境配置、下拉框闪退与推理加速5.1 项目目录结构与快速启动这套项目拿到的文件会包含源码、数据集、预训练权重、安装文档和演示文件目录大致是这样├── main.py # 程序入口启动GUI ├── detect_thread.py # 推理线程封装 ├── requirements.txt # 依赖列表 ├── weights/ │ └── best_yolo11s.pt # 训练好的模型权重 ├── datasets/ │ ├── images/train │ ├── images/val │ ├── labels/train │ └── labels/val ├── runs/ # 评估指标曲线和预测结果 └── docs/ └── 安装使用教程.md开箱即用的前提是先照着文档把环境装好。我在README里写清楚了两条启动命令先pip install -r requirements.txt然后python main.py。如果显卡驱动和CUDA版本已经正确配置模型会自动调用GPU推理没GPU的机器也能跑就是速度会慢不少。5.2 PyQt5下拉框闪退一个典型环境坑这个坑我遇到过一次当时项目的GUI打开一切正常点文件选择器也没问题但一点下拉框选择模型权重窗口闪退关闭终端里也没报错。排查了很久发现是OpenCV和PyQt5在Windows下的DLL加载冲突具体表现就是QComboBox的弹出菜单触发到冲突模块导致程序直接退出。这类问题有几个解决路径在main.py入口处设置环境变量os.environ[QT_QPA_PLATFORM] windows强制Qt使用windows平台插件。升级或降级PyQt5版本把不兼容的模块版本换掉。实测下来PyQt5的较新版本配合较新版opencv冲突概率会小很多。调整import顺序尽量先import PyQt5后import cv2有一部分DLL冲突可以通过顺序避开。如果还不行把opencv-python更换为opencv-python-headless因为GUI界面本身不需要OpenCV的highgui窗口模块这个模块才是和Qt抢DLL的根源。我最终采用的是环境变量加调整import顺序的组合方案之后下拉框闪退这个现象再没出现过。5.3 低算力机器上的推理加速建议工业环境下不是每台设备都有高端显卡甚至有些部署机器是纯CPU。这个项目在低算力设备上可以这样缓解速度问题换用yolo11n权重比yolo11s推理耗时降低一半以上精度损失在可接受范围内。推理时把imgsz从640降到480检测速度成倍提升但小目标的检出率会下降需要根据实际缺陷尺寸取舍。启用半精度推理在支持FP16的设备上直接设置model.predict(frame, halfTrue)对速度提升很明显但精度几乎无损。导出为ONNX格式用ONNX Runtime推理尤其在Windows CPU环境下降延迟明显。ultralytics自带导出接口执行model.export(formatonnx, halfTrue)就能生成onnx模型。如果能上TensorRT把模型转成engine格式在NVIDIA显卡上的帧率还能进一步提高但工程复杂度也相应增加适合有明确实时性要求的生产线场景。还有一个我在实际使用中总结的经验界面上的置信度阈值不要调得太低。很多人为了不漏检把置信度调到0.1结果误检框满屏飞。布料缺陷检测的漏检和误检是一对矛盾0.25到0.35之间通常是兼顾两者的合理区间。系统界面里我默认给的是0.3用户可以根据实际面料和现场环境微调。这套系统我后续还在持续迭代比如把视频检测结果的逐帧输出做成可直接回放的文件以及针对特定面料重新微调模型权重。项目的核心流程已经完整跑通从数据标注、模型训练到PyQt5界面封装每一步都有详细的文档可查拿到手之后按步骤操作就能复现整个流程这也是我认为这个系统最值得参考的地方。本文还有配套的精品资源点击获取