☰
织物缺陷检测方法体系:打光成像、传统算法与深度学习落地
2026/9/30 8:35:31 网站建设 项目流程

验布这道工序在很多纺织厂里长期靠的是人眼加灯箱,一个熟练的验布工坐在验布机前盯着高速走动的布面,一坐就是四五个小时,眼睛酸、注意力散、漏检率随班次上升——这些都是织物缺陷检测绕不开的现实。织物缺陷检测要解决的核心问题很朴素:在布匹以几十米每分钟的速度通过产线时,把断经、破洞、色差、污渍这些会影响成衣质量和客户验收的瑕疵准确地找出来,并且标清楚它们出现在哪个位置。这件事听起来简单,做起来涉及光学、机械、算法、产线节拍的多重配合。我接触过从针织到梭织、从坯布到成品布的多个检测项目,也踩过不少坑。下面这篇文章,我按自己的实际经验,把织物缺陷检测的方法体系拆开讲透,适合想入门机器视觉检测的工程师、正在选型的设备负责人,以及做算法落地但被误报率折磨过的同行。

1. 织物缺陷的种类分布决定了检测方案的天花板

1.1 常见缺陷的形态特征与成像表现

做检测方案之前,第一步不是选相机也不是挑算法,而是把要检测的缺陷摸清楚。织物缺陷按成因大致能分成几类,每一类在图像上呈现的样子完全不同,这直接决定了后面用什么手段去抓。

经向缺陷包括断经、缺经、经缩、吊经。断经就是某根经纱断了,布面上会出现一条纵向的细缝或空档;缺经是一根或多根经纱没织进去,表现为纵向的条状稀路。这类缺陷的特点是沿经向延伸,长度可以很长,从几厘米到几十米都有可能,形态上是长条形。

纬向缺陷包括断纬、缺纬、纬缩、稀纬密纬。缺纬会在布面上形成一段横向的密度异常区域,纬缩则是纱线蜷缩造成的局部堆积。纬向缺陷的麻烦在于它的宽度可能就是几毫米,但横向会贯穿整个幅宽。

结构性缺陷里最典型的是破洞和跳纱。破洞是纱线断裂后形成的空洞,成像上是一片明显的亮斑或暗斑(取决于打光方式),检测相对容易。跳纱是经纬纱交织规律被破坏,布面组织错乱,这种缺陷在灰度上和正常区域差异不大,是真正的难点。

表面性缺陷包括色差、色斑、污渍、油污、结头、粗节。色差可能是整批布和标准样之间的整体偏移,也可能是局部的一小块;污渍的形状不规则,边界模糊。这类缺陷考验的是对颜色和亮度的敏感度,而不是几何形状的识别。

我在一个做牛仔布检测的项目里就吃过亏:前期把所有精力放在破洞和断经上,结果客户验收时反映最多的是色差和纬向的轻微色斑,因为这些缺陷在人眼看来"差不多",反而最容易被仪器漏掉。

1.2 缺陷分类为什么是方案设计的第一步

把缺陷摸清楚之后,你会发现一个残酷的事实:没有任何一种检测方法能同时把上面所有缺陷都抓好。这就像用一张网去捞不同的鱼,网眼大小决定了你能捞到什么、会漏掉什么。

我一般会先做一张缺陷优先级表,按两个维度打分:一是这个缺陷对客户的重要性(影响功能性还是只影响外观),二是这个缺陷在产线节拍下的检测难度。重要性高、难度低的,优先用成熟方案覆盖;重要性高、难度也高的,才值得投入资源做专门的算法。

举个例子,破洞属于重要性高但检测难度低,用简单的背光加阈值分割就能抓到;断经属于重要性高、难度中等,通常用投影法或者线阵扫描的纵向差分就能定位;而轻微色差属于重要性中、难度极高,因为它的灰度差异可能只有几个灰度级,甚至受到布面张力和光源不均的干扰,往往需要专门的颜色校正和多光源方案。

这张表还有一个作用,就是帮你和客户提前对齐预期。很多项目后期扯皮,根源就在于一开始没有明确"哪些缺陷必须检出、哪些是尽力而为"。我现在的习惯是把检出率和误报率的目标写进技术协议,并且针对每个缺陷类别分别约定,而不是笼统地说一句"检出率95%"。笼统的指标后面根本没法验收,因为不同缺陷的检出难度差着数量级。

另外,缺陷的分布还会影响算法的结构设计。如果缺陷种类少、形态固定,可以用模板匹配或者简单的分类器;如果缺陷种类多、形态千变万化,那就得走异常检测或者目标检测的路线。这个选择不是拍脑袋定的,是从缺陷清单里自然推出来的。

2. 打光与成像:决定检测下限的隐形环节

2.1 光源类型与织物材质的匹配逻辑

我见过太多团队把80%的精力砸在算法上,结果因为打光方案不对,怎么调都出不来稳定的效果。织物缺陷检测里有一句话:成像质量决定了检测能力的下限,算法只是在这个下限之上做优化。打光做不好,后面的算法再花哨也是白搭。

织物最大的特点是半透明、表面有纹理、材质差异大。同样是打光,棉布、化纤、毛呢、蕾丝的表现完全不同。光源的选择要围绕"让缺陷和背景的对比度最大化"这一个目标来做。

常用的打光方式有这么几种。背光(透射光)把光源放在布面背面,布面上有破洞、稀路、断经这类透光性变化的缺陷时,会形成高对比的亮斑,检测效果非常好,适合抓结构性和通透性缺陷。但它对色差、污渍这类表面缺陷几乎无能为力,因为透射光穿过去,表面颜色的变化被稀释了。

正面明场光(条形光或面光)从正面打,适合抓表面缺陷,比如污渍、色斑、结头。缺点是织物的经纬纹理会被强化,纹理和缺陷在灰度上容易混在一起,对算法的鲁棒性要求高。

暗场光把光源以低角度斜射,只让散射光进入相机,布面的纹理被压暗,凸起的缺陷(比如结头、粗节)会被凸显出来。这种方式对平整度敏感的缺陷很有效。

同轴光适合反光材质,比如带涂层或者金属丝混纺的布,能压掉镜面反射。

实际项目里往往是组合打光,比如正面明场加背光同时上,用两组相机分别采集,最后做结果融合。我给一个做家纺面料检测的项目配的就是这种方案:背光相机负责破洞、断经,正面相机负责色差和污渍,两条数据流分别处理再合并。这样虽然硬件成本上去了,但换来的是更全的缺陷覆盖。

打光方式擅长缺陷局限典型场景
背光透射破洞、稀路、断经表面缺陷弱坯布、薄型布
正面明场污渍、色斑、结头纹理干扰大成品布、色布
暗场低角度凸起缺陷、粗节平面缺陷弱毛呢、厚重布
同轴光反光表面缺陷成本高涂层布、功能布

2.2 相机分辨率的计算过程与实际取值

分辨率不是随便选个高像素就完事,得算。计算的核心是检测精度要求。假设客户要求能检出最小0.1mm的缺陷,布幅宽度是1.6米,那么横向需要的像素数就是:

横向像素数 = 布幅宽度 / 最小检测精度 = 1600 mm / 0.1 mm = 16000 像素

也就是说,至少需要16K像素的线阵相机才能覆盖。如果考虑到边缘留白和实际有效幅宽,还得往上加一点。很多线阵相机规格是2K、4K、8K、16K,16K的相机对光源和镜头的匹配要求很高,价格也不便宜,选型时要权衡。

纵向精度的计算逻辑类似,但和走布速度、相机行频绑定。假设产线速度是30米每分钟,也就是0.5米每秒,要求纵向精度也是0.1mm,那么:

相机行频 = 走布速度 / 纵向精度 = 500 mm/s / 0.1 mm = 5000 行/秒

行频要至少5000Hz。如果实际选的相机行频不够,要么降速,要么降低纵向精度要求。这两个参数是硬约束,方案设计初期必须核对清楚,否则后面调试时才发现相机跟不上产线速度,那就是推倒重来。

我踩过的一个坑:客户产线偶尔会提速到设计值的1.2倍,验收时按最高速度测,结果相机行频不够,图像纵向被拉伸,缺陷形态失真,算法直接失效。所以行频一定要留20%以上的余量,别卡着极限值选。

2.3 走布稳定性与同步触发

成像的稳定性不只是光源和相机的事,机械部分同样关键。布面在检测区域如果有抖动、褶皱、张力不均,成像就会忽明忽暗、形态变形,算法再好也救不回来。

张力控制是基础。布太松会起皱,皱纹在图像上表现为随机的明暗条纹,容易被误判为缺陷;布太紧会把一些轻微缺陷拉平,导致漏检。我一般会建议在检测工位前后各加一组导布辊,把布面拉平展,同时用张力传感器实时监测,张力波动超过阈值时给个报警,让系统知道这段图像不可信。

编码器同步是另一个容易被忽视的细节。线阵相机靠编码器脉冲触发采集,编码器和走布辊必须严格同步,否则采集的行间距不均匀,图像会纵向缩放。如果编码器打滑或者安装偏心,图像就会出现周期性的拉伸压缩,这种规律性的畸变会在频域分析时产生假频,干扰检测结果。安装编码器时一定要确保和走布辊同轴、无打滑、无偏心。

还有一点,相机和光源的触发要同步。如果光源是频闪的,触发时序对不上,图像会出现亮度不均的横条。这些细节在实验室里搭台子时可能测不出来,一上产线就暴露。所以我强烈建议方案定型前一定要在真实产线上跑一段时间,别只看实验室效果。

3. 传统图像处理方法:什么场景下依然值得用

3.1 阈值分割与投影法的适用条件

现在一说缺陷检测大家都往深度学习上靠,但我要泼盆冷水:在很多织物检测场景里,传统方法依然是性价比最高的选择,尤其是缺陷和背景对比度高、形态规律的情况。

阈值分割是最简单的思路,把灰度图和某个阈值比,超过阈值的就当成缺陷。它适合破洞、严重污渍这类对比度高的缺陷。但织物有纹理,单纯全局阈值会把纹理的高亮部分也判成缺陷,所以实践中往往先做平滑滤波或者局部阈值(比如自适应阈值、Otsu),把纹理的周期波动压下去再分割。

投影法特别适合周期性织物上的经向和纬向缺陷。原理很直观:把图像沿某一方向做灰度投影求和,正常布面的投影曲线是平稳的,一旦出现断经或缺纬,投影曲线上就会出现明显的尖峰或凹陷。这种方法计算量小、速度快,在嵌入式设备上都能跑。我做过一个纯棉坯布的断经检测,用投影法配合简单的峰值检测,在CPU上就能实时跑,完全不需要GPU。

import cv2 import numpy as np # 读取织物图像并转灰度 img = cv2.imread("fabric.png", cv2.IMREAD_GRAYSCALE) # 自适应阈值分割,抑制纹理干扰 binary = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, blockSize=31, C=10 ) # 沿经向做投影,检测纵向缺陷 vertical_profile = np.sum(binary, axis=0) # 计算投影均值与标准差,超过3倍标准差的位置视为异常 mean = np.mean(vertical_profile) std = np.std(vertical_profile) defect_cols = np.where(vertical_profile > mean + 3 * std)[0] print("疑似缺陷列位置:", defect_cols)

上面这段代码就是典型的投影法思路,简单、可解释、易调试。对于形态规律的缺陷,它的效果不比深度学习差,而且你完全知道它为什么这么判定,出了问题好排查。

3.2 频域与纹理分析方法处理周期性织物

织物的经纬纹理本身就是一种周期性信号,这让频域方法有了用武之地。正常布面的频谱是规律的,在特定频率上有峰值,一旦出现缺陷,频谱的规律性会被打破。傅里叶变换、Gabor滤波、小波变换都是常用的工具。

Gabor滤波我觉得是处理织物纹理的利器。它本质上是带方向和频率选择性的滤波器,可以调成专门响应某个方向的纹理。正常织物的经纬纹理在特定方向上有固定频率,用对应的Gabor核滤波后响应很规律,缺陷区域的响应会偏离这个规律。这种做法对跳纱、织疵这类纹理被破坏的缺陷效果不错。

局部二值模式(LBP)和灰度共生矩阵(GLCM)属于纹理统计方法。LBP描述局部纹理的微结构,GLCM描述灰度在空间上的共生关系。正常布面的LBP直方图和GLCM特征是比较稳定的,缺陷区域的特征会明显偏离。这类方法的计算量适中,适合做初步的异常筛选。

不过要知道,频域和纹理方法的短板在于对光照和纹理变化敏感。同一台设备,换一种布、换一个批次,特征分布就变了,需要重新调参。所以它们在单一品种、大批量生产的企业里好用,在多品种小批量、频繁换布的场景里就吃力了。

3.3 传统方法的边界在哪里

传统方法不是不行,是要认清它的适用边界。我总结了三条判断标准,供你选型时参考。

第一,缺陷和背景的对比度是否足够高。如果两者的灰度差异明显、形态清晰,传统方法大概率能搞定,没必要上深度学习。反过来,如果缺陷淹没在纹理里、对比度极低,传统方法会很吃力。

第二,缺陷的种类是否固定、形态是否规律。种类少、形态固定,可以用针对性的算法,甚至模板匹配。种类多、形态千变万化,传统方法就难以覆盖,这时候深度学习更有优势。

第三,生产品种是否稳定。单一品种大批量,参数调好一次能用很久;多品种频繁切换,传统方法的调参成本会变得很高,反而不如训练一个泛化能力强的模型。

我的经验是:不要一上来就否定传统方法,也不要迷信深度学习。先做小样本实验,用传统方法快速验证检测的可行性,如果对比度够、缺陷形态规律,就用传统方法把成本压下来;如果传统方法明显够不着,再上深度学习。这个顺序能帮你在项目初期就控制住成本预期。

4. 深度学习方案:从数据标注到模型落地

4.1 建模思路的对比与选择

当传统方法确实覆盖不了的时候,深度学习是必然选择。但深度学习做缺陷检测有好几种建模思路,选错了方向会浪费大量时间。我按自己的实践把它们分成三类,逐一说说适用场景。

第一类是有监督的目标检测,典型的就是YOLO、Faster R-CNN这类框架。你把缺陷标注成一个个边界框,模型学出来之后就能定位缺陷。它适合缺陷形态比较清晰、边界明确的场景,比如破洞、污渍、结头。优点是能直接给出缺陷位置和类别,工程上好对接。缺点是需要大量标注数据,而织物缺陷样本恰恰是稀缺的。

第二类是有监督的语义分割,比如U-Net。它把每个像素分类,能给出缺陷的精确轮廓。适合形态不规则、需要精细定位的缺陷,比如断经这种细长缺陷。标注成本比目标检测还高,因为要逐像素标。

第三类是无监督的异常检测,代表方法有自编码器、PaDiM、PatchCore这些。它的核心思路是"只学正常样本的分布,偏离正常分布的就当异常"。这个思路对织物检测特别合适,因为正常布面样本海量易得,缺陷样本却很少。你不需要标注缺陷,只需要大量正常布面的图像,模型就能学出正常模式,遇到异常时给出高异常分数。

我个人的偏好是:如果缺陷种类明确、能拿到足量标注,优先用目标检测或分割;如果缺陷样本稀缺、种类还可能变化,优先用无监督异常检测。后者虽然不能给出缺陷的具体类别(只能告诉你"这里有异常"),但在实际产线上,先把异常位置找出来交给人工复核,往往比勉强给个错误的类别更有价值。

建模思路数据需求输出适合场景代表方法
目标检测大量标注框缺陷框+类别边界清晰的缺陷YOLO、Faster R-CNN
语义分割大量像素标注像素级轮廓形态精细的缺陷U-Net、DeepLab
无监督异常检测只需正常样本异常分数图样本稀缺、种类多PatchCore、PaDiM

4.2 数据集构建与异常样本合成

模型能不能落地,七分看数据,三分看模型。织物检测的数据集构建有几个特殊的坑。

第一个坑是正常样本的多样性。正常布面不是千篇一律的,不同批次、不同光照、不同张力下,布面的灰度、纹理都有细微变化。如果你只用一个批次的正常样本训练,模型会把其他批次正常的布也当成异常,误报率飙升。所以正常样本一定要覆盖足够多的批次和工况,宁可多一些。

第二个坑是缺陷样本的稀缺和不平衡。有些缺陷很罕见,几百米布才出一个,攒够标注量很费时间。这时候数据增强就很重要。常规的旋转、翻转、亮度调整、加噪声都能用,但对织物来说,要特别小心方向性——经向和纬向的缺陷方向不能随便旋转,转错了就不符合物理规律了。

更进阶一点的做法是合成异常。用CutPaste、DRAEM这类方法,把随机的色块或纹理片段贴到正常样本上,人为制造异常样本来扩充训练集。我自己试过CutPaste,对提高无监督异常检测的鲁棒性有帮助,因为它让模型见过更多"不像正常"的形态,判别边界更稳。但合成异常不能太假,贴上去的片段在纹理上要尽量接近真实织物,否则模型学会的只是识别合成痕迹,而不是真正的缺陷。

第三个坑是标注的一致性。同一张图,不同标注员对缺陷边界的理解可能不一样,尤其是边界模糊的污渍和色差。我的做法是制定一份标注规范,明确每种缺陷的标注规则(比如污渍标注到灰度值降到多少的边界),并且让同一个人负责同一类缺陷的标注,减少主观差异。

import torch from torch.utils.data import Dataset import cv2 import numpy as np class FabricDataset(Dataset): """织物缺陷数据集,带基础的在线数据增强""" def __init__(self, image_paths, labels, transform=None): self.image_paths = image_paths self.labels = labels self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img = cv2.imread(self.image_paths[idx], cv2.IMREAD_GRAYSCALE) img = img.astype(np.float32) / 255.0 # 只做不改变缺陷物理方向的处理,亮度扰动和加噪最安全 if self.transform: img = self.transform(img) img = torch.from_numpy(img).unsqueeze(0) label = torch.tensor(self.labels[idx], dtype=torch.long) return img, label

这段代码体现的是我上面说的原则:织物图像的增强要克制,亮度扰动和加噪是安全的,几何变换要谨慎。

4.3 轻量化部署与推理速度

产线检测是实时任务,模型再准,跑不动也没用。织物检测对速度的要求很高,因为布在高速走,检测必须跟上节拍。如果产线速度是30米每分钟、幅宽1.6米、要求纵向精度0.1mm,那么每秒要处理的数据量是相当大的,模型必须做到高吞吐。

轻量化有两条路。一是选轻量骨干网络,比如MobileNet、ShuffleNet这些,参数量小、速度快,适合部署在边缘设备上。二是做模型压缩,用剪枝、量化、知识蒸馏把大模型压小。量化是最常用的,把FP32量化成FP16甚至INT8,速度能提升两三倍,精度损失通常可以接受。

部署框架上,TensorRT是英伟达平台上的首选,能把推理速度压榨到极致。如果是工业相机自带的边缘计算模块或者国产NPU,就得用对应的推理框架。部署时要注意预处理和后处理的速度,很多时候模型推理只占一小部分时间,图像解码、归一化、结果绘制的开销反而更大。我遇到过预处理没优化好,光图像格式转换就吃掉了大半时间的情况。

还有一个实际问题是多相机同步。幅面宽的布往往需要多台相机拼接,每台相机一个数据流。如果每台相机单独跑一个模型,GPU资源会很紧张。我的做法是把多相机图像拼成一张大图,或者用batch的方式送进模型,充分利用GPU的并行能力。也可以根据缺陷出现的概率分区处理,正常概率高的区域降低采样频率,把算力省给重点区域。

5. 上线之后才暴露的问题:误报、漏报与产线节奏

5.1 误报控制与复核机制

实验室里模型跑出99%的准确率,到了产线上可能被误报折磨到怀疑人生。误报的代价很直接:每一个误报都要人工去看一眼确认,误报多了,工人就会对系统失去信任,最后干脆忽略报警,系统等于白装。

误报的来源主要有几个。一是光照和纹理的波动,布面轻微的反光、张力变化引起的明暗差异,会被模型当成异常。二是正常但少见的纹理,比如接头、织机的正常停机痕,模型没见过就报警。三是模型本身的判别边界太松,把一些"边缘正常"的样本判成了异常。

控制误报的手段有几个层次。最直接的是调阈值:无监督异常检测输出的是异常分数,把报警阈值调高,误报减少但漏检增加,这是个权衡。我会建议在系统上线初期把阈值设得保守一点,先保证不漏检,同时收集误报样本,分析它们的共性,再逐步优化。

更根本的做法是引入复核机制。系统不追求一步到位,而是把疑似缺陷的位置标记出来,输出给人工复核。人工确认后再反馈给系统,好的样本用来更新模型。这样一来,系统的价值在于"大幅减少人工需要盯的面积",而不是"完全替代人工"。我做过的一个项目,系统上线后人工复核的工作量降到了原来的三分之一,客户已经觉得值了。你不要指望系统第一版就能无人值守,那是不现实的。

还有一种降低误报体验损失的技巧:给误报分级。把异常分数分成几档,高置信度的直接报警并停机或标记,中等置信度的只记录不报警,低置信度的直接忽略。这样工人只需要处理高置信度的报警,工作量的分配更合理。

5.2 瑕疵标记与裁布决策联动

光检测出来还不够,得让检测结果对生产产生实际价值。织物检测的最终目的是什么?是让有缺陷的布不要流到下游,或者让裁布环节能避开缺陷,减少浪费。

这就涉及瑕疵标记和裁布决策的联动。系统检测到缺陷后,要记录缺陷在布上的坐标(经向位置、纬向位置、尺寸、类别),并且把标记喷在布边上,或者存成电子档。后续裁布的时候,裁布软件读取这些标记,把缺陷区域自动避开,优化排版,减少废弃面积。

我见过做得好的案例:检测系统和裁布系统打通,检测出的缺陷坐标直接进入排版算法,裁片自动绕开缺陷区域。这样一来,同样一批有瑕疵的布,成材率能提高好几个百分点,省下来的成本很快就覆盖了检测系统的投入。这才是织物检测真正的价值闭环——不是为了检测而检测,是为了少浪费、多出货。

一个实操细节:缺陷坐标的精度要高,尤其是纬向位置。如果标记不准,裁布时可能没避开,或者避得太多浪费材料。坐标精度最终取决于相机分辨率和标定精度,选型时要把这个需求一并考虑进去,别只顾着检出率。

5.3 闭环迭代机制

检测系统上线不是终点,而是起点。产线上的布种、工艺、环境都会变,模型不迭代就会慢慢失效。建立一个数据闭环至关重要。

我建议的闭环是这样的:系统检测结果和人工复核结果自动存档,定期(比如每周)把误报和漏检的样本挑出来,分析原因,把确认的难例加入训练集,重新训练或微调模型,再灰度更新上线。这个过程不需要太频繁,但要常态化。

闭环里有几个细节要注意。一是样本的标注质量,难例的标注尤其要仔细,因为它们是模型出错的地方,标错了会让模型学得更偏。二是版本管理,每次模型更新都要记录用的是哪批数据、什么参数,出问题能回滚。三是A/B验证,新模型上线前先在部分产线或者部分时间段试跑,效果确认了再全量推。

还有一点心理上的准备:不要指望模型越训越好、一劳永逸。织物检测的难度在于缺陷的多样性和环境的漂移,模型能力的上限受制于数据质量和成像质量。与其无止境地调模型,不如回头看看成像是不是还能优化、数据是不是还有盲区。很多时候,换个打光方式带来的提升,比调一个月模型都大。


我个人在多个织物检测项目里最深的一点体会是:这是一个系统工程,算法只是其中一环。真正决定项目成败的,往往是前期的缺陷梳理、打光成像的功夫,以及上线后的闭环运营。我见过算法很漂亮但败在成像上的项目,也见过算法朴素但成像扎实、上线很稳的项目。如果你正准备做织物缺陷检测,我的建议是先花时间把缺陷摸清楚、把成像调到位,再决定用什么算法,最后一定要留出上线运营和迭代的预算。这套顺序走下来,比一开始就闷头堆模型要靠谱得多。

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

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

立即咨询