ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

织物缺陷检测方法体系:打光成像、传统算法与深度学习落地

织物缺陷检测方法体系:打光成像、传统算法与深度学习落地 验布这道工序在很多纺织厂里长期靠的是人眼加灯箱一个熟练的验布工坐在验布机前盯着高速走动的布面一坐就是四五个小时眼睛酸、注意力散、漏检率随班次上升——这些都是织物缺陷检测绕不开的现实。织物缺陷检测要解决的核心问题很朴素在布匹以几十米每分钟的速度通过产线时把断经、破洞、色差、污渍这些会影响成衣质量和客户验收的瑕疵准确地找出来并且标清楚它们出现在哪个位置。这件事听起来简单做起来涉及光学、机械、算法、产线节拍的多重配合。我接触过从针织到梭织、从坯布到成品布的多个检测项目也踩过不少坑。下面这篇文章我按自己的实际经验把织物缺陷检测的方法体系拆开讲透适合想入门机器视觉检测的工程师、正在选型的设备负责人以及做算法落地但被误报率折磨过的同行。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、16K16K的相机对光源和镜头的匹配要求很高价格也不便宜选型时要权衡。纵向精度的计算逻辑类似但和走布速度、相机行频绑定。假设产线速度是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, blockSize31, C10 ) # 沿经向做投影检测纵向缺陷 vertical_profile np.sum(binary, axis0) # 计算投影均值与标准差超过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、PaDiM4.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, transformNone): 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], dtypetorch.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验证新模型上线前先在部分产线或者部分时间段试跑效果确认了再全量推。还有一点心理上的准备不要指望模型越训越好、一劳永逸。织物检测的难度在于缺陷的多样性和环境的漂移模型能力的上限受制于数据质量和成像质量。与其无止境地调模型不如回头看看成像是不是还能优化、数据是不是还有盲区。很多时候换个打光方式带来的提升比调一个月模型都大。我个人在多个织物检测项目里最深的一点体会是这是一个系统工程算法只是其中一环。真正决定项目成败的往往是前期的缺陷梳理、打光成像的功夫以及上线后的闭环运营。我见过算法很漂亮但败在成像上的项目也见过算法朴素但成像扎实、上线很稳的项目。如果你正准备做织物缺陷检测我的建议是先花时间把缺陷摸清楚、把成像调到位再决定用什么算法最后一定要留出上线运营和迭代的预算。这套顺序走下来比一开始就闷头堆模型要靠谱得多。
返回列表