YOLO11布料缺陷检测实战:从数据增强到PyQt5界面落地
2026/9/8 20:00:51 网站建设 项目流程

简介:基于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-300
batch16RTX 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, imgsz=640, conf=0.3, device=0) 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, half=True),对速度提升很明显,但精度几乎无损。
  • 导出为ONNX格式,用ONNX Runtime推理,尤其在Windows CPU环境下降延迟明显。ultralytics自带导出接口,执行model.export(format="onnx", half=True)就能生成onnx模型。
  • 如果能上TensorRT,把模型转成engine格式,在NVIDIA显卡上的帧率还能进一步提高,但工程复杂度也相应增加,适合有明确实时性要求的生产线场景。

还有一个我在实际使用中总结的经验:界面上的置信度阈值不要调得太低。很多人为了不漏检把置信度调到0.1,结果误检框满屏飞。布料缺陷检测的漏检和误检是一对矛盾,0.25到0.35之间通常是兼顾两者的合理区间。系统界面里我默认给的是0.3,用户可以根据实际面料和现场环境微调。

这套系统我后续还在持续迭代,比如把视频检测结果的逐帧输出做成可直接回放的文件,以及针对特定面料重新微调模型权重。项目的核心流程已经完整跑通,从数据标注、模型训练到PyQt5界面封装,每一步都有详细的文档可查,拿到手之后按步骤操作就能复现整个流程,这也是我认为这个系统最值得参考的地方。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询