☰
基于YOLO的布匹缺陷检测:从数据到部署的工程实践
2026/10/21 3:45:20 网站建设 项目流程

做布匹缺陷检测这件事,我从一开始就没打算用传统图像处理的老路子。以我手头这个基于YOLO的布匹缺陷检测系统为例,它用Python做开发,核心是目标检测加算法模型,真正让我下决心用YOLO重做一遍的原因很简单:人工质检漏检率压不下来,传统视觉方案换一个布种就要重新调一堆参数,而YOLO这套框架从训练到部署,只用了一条流水线就把“缺陷在哪里、是什么类型、范围多大”全解决了。这篇文章我打算把整个项目的来龙去脉拆开讲清楚:从为什么非用目标检测不可,到数据怎么准备、模型怎么训、怎么调参、怎么部署到车间,再到实测里踩过的坑,给想搞工业质检落地,或者正在做相关课程设计、毕设项目的朋友一份可以照着走的技术札记。

1. 为什么布匹缺陷检测值得用YOLO重做一遍

1.1 传统质检方式的痛点

先把场景摆出来。不管是大规模坯布厂还是印染后整理车间,布面检验基本还是靠人:验布机前面坐一个人,眼睛盯着以每分钟几十米速度卷过的布面。你可以算一笔账,假设产线速度是50米每分钟,布幅1.6米,相当于每分钟有80平方米的布要从人眼底下过一遍。要求检出破洞、油污、织疵这些毫米级甚至更小的缺陷,连续盯两小时以上,疲劳导致的漏检是必然的。

传统机器视觉也试过。早年很多方案依赖灰度阈值分割、固定方向滤波、纹理周期分析。纯色布还能凑合,一旦换成斜纹、提花、印花,图案本身就会在图像上形成大量“伪缺陷”,规则算法的特征设计是跟着具体缺陷和具体布面走的,换产线等于重新写规则,维护成本奇高。所以工厂不是不想自动化,是传统方法在复杂背景下实在撑不住。

1.2 YOLO把问题变成了一个端到端的回归任务

目标检测框架改变了这个问题的性质。我们不再手工设计什么边缘算子来识别“破洞长什么样”,而是把问题交给模型:给它大量标注好的缺陷图像,让它自己学“缺陷的视觉模式”,同时输出每个目标的类别、置信度和边界框,也就是同时解决“是不是缺陷、什么缺陷、在哪里”三个问题。

在布匹检测这个场景里,定位信息不是可有可无的。工厂不仅想知道这一卷布有没有问题,更想知道缺陷在布面上的坐标位置和大概尺寸,这直接关系到后续要开剪多少米、降等还是修布。用纯图像分类模型只能给一个“有毛病”的结论,没法给坐标。而像YOLO这类anchor-based或anchor-free的目标检测算法,天然就把定位框作为学习目标,非常贴合产线需求。

1.3 项目定位与适用场景

这套系统我和团队最早就是冲着“能平移到不同布种、常见缺陷全覆盖”去做的,定位不是实验室原型,而是能放进车间的工程系统。最终实测覆盖的场景大致包括:

场景检测对象典型缺陷环境特点
坯布检验白坯、色坯破洞、断经、油污、跳花车速快、光照稳定
印染质检纯色染布色斑、色差条痕、污渍颜色多样、易与缺陷混淆
成品出厂抽检印花/提花布错花、色点、起毛背景纹理复杂

哪个场景最急迫?其实是坯布和印染段,因为缺陷越早发现,损失越小。到了成品才发现,前面染整、定型成本都搭进去了。

2. 模型选型与布匹场景适配:为什么锚定YOLO系列

2.1 不是只有YOLO,但布匹场景它确实更顺手

近几年做目标检测的框架,主流就是两路:一路是两阶段代表,先提候选区域再做分类回归;另一路是单阶段代表,直接稠密预测边界框和类别。我把它们和YOLO放在一起对比过:

方案精度倾向速度部署成本对工业检测的匹配度
两阶段系列高较慢模型大,难上边缘端离线抽检可以,实时产线吃紧
SSD系列中等较快生态一般早期选择,更新乏力
YOLO系列高非常快生态完整,ONNX/INT8好量化实时产线和弱硬件都合适

YOLO在工业落地里几乎是默认选项了。从YOLOv5开始,工程生态一下就成熟了,到YOLOv8/YOLO11这一代,anchor-free的设计让后处理简单了不少,训练工具链(Ultralytics)跨平台、导出部署一条龙,Python调用尤其方便,这点对我们这种要快速迭代试错的项目太重要了。

2.2 布匹场景的硬件约束和实时性要求

说个现实情况。车间里很少给你配深度学习工作站,常见的是工控机带一块中低端显卡,或者干脆用无GPU的边缘盒子。产线要求30FPS以上实时检测,不然跟不上验布机速度。选型上就必须抛弃“唯精度论”。我们最终以YOLOv8n和YOLOv8s作为主力,原因很简单:

  • YOLOv8n做预筛,在低算力设备上依然能稳定跑到实时帧率;
  • YOLOv8s在精度上高一截,如果工控机显卡性能允许,就换s模型,一般也就损失十几帧,换来几个点的mAP提升;
  • 两者的训练代码、数据集配置、部署流程完全一致,切换成本极低。

2.3 检测方案设计的几个具体决策

布面缺陷检测和通用COCO检测有个很大的不同:缺陷长宽比极其悬殊。比如“破洞”可能是接近圆形的小块,但“断经”“擦伤”是细长条,“纬档”是横贯布面的线状异常。如果只用一个方形检测框去框长条缺陷,框内背景占比极大,模型学起来会很痛苦。

所以我做了三方面调整。第一,允许模型使用多尺度的anchor,尽管是anchor-free,但输出特征层的感受野覆盖从几像素的小缺陷到长条缺陷;第二,加大输入图像分辨率,用640×640作为默认,个别小目标场景上到960;第三,长条形缺陷如果实在无法用矩形框贴合,就拆成连续多段短框分别标注,检测后处理再按相邻关系合并——这个技巧很野,但实测在“纬档”这类细长缺陷上能显著降低漏检。

3. 数据是这类项目的命门,比模型本身更决定成败

3.1 布匹缺陷数据为什么难搞

做缺陷检测的人都知道,数据集的瓶颈远比模型结构更致命。布匹缺陷有几个天然麻烦:

  • 样本稀少且不均衡:工厂正常生产的良品率并不低,真正种类全、数量足的缺陷图像很难一次收集齐。尤其“破洞”“油污”常见,“错花”“稀纬”这类则偶尔才有,长尾分布极其明显。
  • 背景干扰强烈:织物纹理本身就是周期性结构,在频域或空域上很容易干扰模型,让模型误把纹理或阴影当缺陷。
  • 小目标占比高:很多缺陷在整幅布面图像里只占不到千分之一的像素,检测这类目标需要模型对细节敏感,而数据必须保证这些目标被完整标注。

3.2 采集设备和光源怎么搭

图像采集这块,主要用的是工业面阵相机加近景镜头,配合低角度环形光源,或者对透光缺陷用背光。破洞、稀薄这类缺陷,背光下特别清楚,因为透光率差异被放大了;而油污、色斑这类反射型缺陷,用低角度光打过来,会在表面形成明显反射差异。

我的建议排序是:如果有条件,同一缺陷至少采集3种光照条件下的图像,让模型不要过拟合某一种光源。不然就会发生在实验室精度97%,上产线换了根灯管精度掉到80%的惨剧。

3.3 标注规范和数据增强策略

标注是纯体力活,但规范不统一等于白做。我们内部定了几条规则:

  1. 缺陷面积占框面积比例极低时,框紧紧贴合缺陷边缘,不多留背景。
  2. 一个框里同时包含多个相距很远的同类型缺陷时,要拆成多个框,不要糊在一起。
  3. 模糊不清、连人都无法确认的像素级疑似点,不标,宁可少标也不给模型投喂噪声。

数据增强在布匹检测里的重要性,我往大了说不夸张。布面是重复纹理,模型很容易学成“看局部纹理异常”,一旦增强不到位换一批布就失效。我们的增强组合包括马赛克、随机水平/垂直翻转、随机亮度对比度、轻微透视变换、随机擦除,还有按缺陷类别加权的在线采样器,专门解决长尾类别学不充分的问题。

4. 训练、评估与调参实录

4.1 搭建训练环境的实际操作

环境不算复杂,但版本要对齐。我用的是Python 3.10,PyTorch带CUDA版本,训练库用Ultralytics全家桶,它把模型定义、训练入口、数据增强、导出功能都收进去了,适合快速实验。

数据集目录按YOLO格式组织,大概这样:

dataset/ images/train/ images/val/ labels/train/ labels/val/ data.yaml

data.yaml里写明类别名和路径,然后一行命令就能开训:

yolo detect train model=yolov8s.pt data=布匹数据.yaml epochs=200 imgsz=640 batch=16 device=0

4.2 超参数调整的几次关键变化

训练过程中,最值得关注的是loss曲线和验证集指标。下面几个参数是反复实验后的相对最优值:

参数初值调优后调整理由
imgsz640640(小目标/长条场景960)分辨率提高对小缺陷友好,但显存上涨
batch1616或32看显存,batch太小会导致BN统计不稳定
lr00.010.005布匹数据量不大,初始学习率小一点更稳
epochs200200-300用早停法兜底,防止过拟合
mosaic1.00.8全程马赛克有时会干扰纹理学习,后期关掉

这里要特别提一下对长条形缺陷的处理。头几次训练,纬档、断经这类细长缺陷的召回率几乎为零。原因是下采样倍数太高,细长目标经过几次池化直接消失。我的解法是让训练输入端支持矩形推理,配合960分辨率,相当于把纵向分辨率保留得更完整,召回率一下就上来了。

4.3 评估指标不能只盯mAP

很多非工业场景的团队给我说“mAP到90%了”,但到了产线上还是不行。因为mAP是各类别平均数,可能某一类特别高,另一类特别低。我强烈建议按缺陷类别单独看precision和recall,并且单独算小目标类的AP。

我们最终的目标是:破洞、油污这类严重缺陷召回率必须超过95%,因为漏掉一个就是客户投诉级别的质量事故;而一些轻微织疵,精度低一点没关系,后续还有人工复核。按缺陷等级分配精度容差,比盲目追求整体指标有用得多。

4.4 模型结构的轻量优化

直接用YOLOv8s不是终点。为了让它在更差一点的硬件上也跑得动,我试过在C2f模块后面加轻量注意力机制,比如SE或CBAM。布面检测有个特性:缺陷在全局背景下占比极小,局部注意力有助模型聚焦异常区域,但对弱纹理型缺陷增益一般。所以“加不加注意力”不是拍脑袋,我会先在验证集上分缺陷类别看AP变化,哪个类涨了才保留。

另外,切换硬件时必然要做模型剪枝和量化。我的经验是INT8量化在布面检测这种强纹理场景下精度掉得比通用检测更明显,掉3到5个点都有可能,所以如果是小目标缺陷,优先用FP16,谨慎用INT8,除非硬件实在跑不动FP16。

5. 把模型搬进车间:部署与可视化界面

5.1 模型导出环节的坑

训练好的YOLO模型是PyTorch格式,但产线工控机未必装了相同版本的PyTorch,所以导出这一步必须处理干净。我们一般导出为ONNX中间格式,再根据推理后端选择用ONNXRuntime还是转成特定加速格式。

导出命令很简单:

yolo export model=best.pt format=onnx opset=12 dynamic=False

但注意几个点:动态batch如果产线不需要就关掉,固定尺寸能换来更好优化;opset版本太旧可能不支持某些算子,12以上比较稳。如果要用特定加速硬件,再基于ONNX转对应格式,这一步如果遇到算子不支持,大概率是某些模块用了不常用算子,我会把模型里的重参数化层预先融合掉再导出。

5.2 推理流程怎么和产线信号联动

模型只是核心,产线上要的是一个完整的检测流程:硬触发信号进、图像采集、送入算法、输出结果、联动报警或踢料。

我的流水线大致是:

  1. 相机通过硬触发采集布面图像;
  2. 图像传入线程池缓冲,避免推理速度和产线速度不匹配导致丢帧;
  3. ONNXRuntime加载模型做推理,得到检测框;
  4. 按类别映射到对应的缺陷等级,超过阈值的框触发IO信号,控制报警器或者喷标器在布边打记号;
  5. 同时把当前帧的检测结果写入本地数据库,方便后续追溯。

这里最容易忽视的是“图像预处理参数的一致性”。训练时用的归一化、letterbox填充方式,部署时一行都不能差,否则CAUSE就是色差、形变导致的误检。我们的做法是写一个共享的预处理函数,训练和部署两端调用同一个函数。

5.3 简单的可视化界面

车间主任不会看命令行。我用Python的PySide做了个轻量界面,主要功能是:

  • 实时显示相机的画面和检测框;
  • 显示当前卷号、已检米数、各类缺陷统计;
  • 点击某个检测框能跳转到对应位置的截图,方便人工复核;
  • 参数面板里能调节不同缺陷类别的置信度阈值。

数据库记录用SQLite就够了,产线一天产生的数据量也不至于上重型数据库。界面不需要花哨,但“可追溯”是工厂最看重的,每一条缺陷记录都要能查到是哪个批次哪一卷布的哪个位置。

6. 实测复盘:能跑起来不代表能上线

6.1 不同布种下的实测表现

我把模型放到三条不同的模拟产线上做了一周实测。

  • 纯色涤纶布:这类背景最干净,效果最好,各类缺陷综合召回率能到95%以上,误检率控制在每百米一次以内。
  • 浅色斜纹布:斜纹纹理成了主要干扰源,有段时间模型频繁把斜纹的反光当成“擦伤”,后来通过采集更多该布种的数据和调高置信度阈值压下去了。
  • 深色牛仔布:光线本来就难打,油污和底色接近,检测效果明显下降。这里我们能做的只有增加侧向光、提高输入分辨率,最终召回率在85%左右,比预期低,但已经比人工稳定。

6.2 踩坑盘点:五个最值得说的教训

第一,光源老化导致颜色漂移。用了半年的光源亮度下降之后,整个图像的色偏变了,模型误检率直线上升。这不是模型的问题,是产线设备维护问题。后来我在界面上加了亮度直方图监控,一旦偏离基线就提醒保养光源。

第二,卷边和褶皱制造了大量假阳性。布面卷曲的边缘在图像上是一条深色区域,模型经常把它当成“油污”或“色斑”。后来在图像采集端加了铺平机构,并从训练数据里专门补充了带有卷边阴影的负样本,误检才下来。

第三,训练和部署环境不一致。最初在训练时用的预处理是BGR输入,部署时用了RGB不转换,结果整片误检。这类问题是低级错误,但也最容易在匆忙上线时发生,强烈建议把预处理统一封装,两端共用同一套代码。

第四,类别不均衡导致模型“避重就轻”。当数据集中破洞样本占60%、其余缺陷各占不到10%时,模型为了拉高整体loss表现,会倾向于把所有不确定区域都预测成破洞。办法就是按类别重采样和损失权重调整,但最终还是要靠扩充真实尾部样本。

第五,置信度阈值不是一成不变的。同一个模型,在浅色布上阈值设0.25可能刚刚好,换到深色布就得调到0.4才能压住误检。我们在界面里支持了按布种快速切换阈值配置,这在多品种车间几乎是刚需。

6.3 后续迭代方向

这个系统距离“完全无人化验布”其实还有距离,实际上线后大概率是人机协同:机器先预筛,检出可疑区域由人工快速复核。我的下一步规划包括:用半监督的方式每周收集产线新增的难例,持续微调模型;在现有基础上尝试把宽度方向用多相机拼接覆盖更宽布幅;以及把同样的训练和部署流程迁移到无纺布、印刷品甚至金属表面缺陷检测上,换的只是数据集和类别定义,骨干流程完全复用。

做一个工业视觉项目,最大的体会是:模型选型大概只占20%的工作量,数据、部署、工程稳定性才是真正吃掉时间的部分。“基于YOLO的布匹缺陷检测系统”听起来像是个算法项目,其实最后你会发现,做的是数据和工程。如果有人要复现这类项目,我的建议是先把数据规范和产线节拍摸清楚,再决定模型的轻重大小,不然模型再先进,在车间里也发挥不出价值。

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

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

立即咨询