织物缺陷检测这个方向我在织造和染整车间里前后折腾了三年多从最早的工控机加采集卡那一套到后来换成嵌入式边缘盒子踩过的坑大概能写满一个笔记本。直到现在每次有朋友问这个活儿到底能不能做我的回答都是能做但先别急着上深度学习。原因很直接织物缺陷检测的难度并不在模型本身而在成像质量、缺陷定义、产线速度和误报容忍度这四件事上。任何一个环节没想清楚模型再漂亮也落不了地。这篇文章我打算把方法层面能讲的东西一次讲透。从缺陷类型怎么分类、传统图像处理和深度学习各自适合什么场景、打光方案怎么选、相机行频怎么算到部署时的速度和误报控制最后配一份常见问题速查表。内容偏向于怎么选、怎么算、怎么落地适合正在做相关项目评估的工程师、做视觉算法想切入纺织行业的朋友以及纺织厂里负责质量管控的技术人员。看完之后你至少能拿出一套能自洽的选型逻辑而不是跟风上模型。1. 织物缺陷检测整体思路拆解1.1 为什么这个场景不适合一上来就堆模型织物跟其他工业品有个本质区别它是柔性的、连续的、纹理高度重复的。金属件、玻璃、PCB板这类产品缺陷和背景在灰度或颜色上往往有明确差异一个简单的阈值分割就能切出七八成但织物本身就是由经纬纱交织形成的周期性纹理正常区域里就充满了高频的明暗变化。我见过不少团队拿着做表面缺陷那一套直接搬过来结果模型把正常的织纹起伏全当成异常报出来误报率高得没法看。还有一个更隐蔽的问题缺陷的定义在不同厂、不同订单之间会变。同样一个两毫米的纬向疵点做家纺面料可能算可接受做高档衬衫面料就是死判。有些客户甚至会把色差细分成匹差、段差、边中差每一种的判定口径都不一样。这意味着你在方法设计阶段就必须把判定规则和检测算法分开考虑算法负责找出所有可疑区域规则层负责根据订单标准给出最终判定。这个分层思路是我这几年的核心经验比纠结用哪个网络重要得多。从系统角度看一套完整的织物缺陷检测方案通常包含四层成像层相机加光源、预处理层去噪、校正、拼接、检测层算法找疑点、判定层规则给结论。很多人把注意力全压在检测层其实成像层决定了整个系统的上限判定层决定了它能不能被产线接受。检测层反而是在这两层确定之后才需要精调的部分。1.2 常见缺陷类型的分类与判定口径要把方法讲清楚先得把检测对象说清楚。织物缺陷按成因大致可以分成几大类每一类在图像上的表现差别很大直接决定了用什么方法合适。缺陷大类典型表现图像特征适合的方法方向经向疵点缺经、断经、经缩、吊经纵向细长条状灰度突变或纹理断裂方向性滤波 投影分析纬向疵点缺纬、双纬、纬缩、稀密路横向条状周期性被打破行方向投影 频谱分析破损类破洞、跳纱、蛛网局部区域纹理消失透光率突变局部方差 分割网络污渍类油污、锈渍、色渍区域灰度或色度偏移边缘模糊颜色空间分析 分类网络织纹类粗细经、错组织、纹路不匀纹理频率或方向异常傅里叶/Gabor 纹理分析色差类匹差、段差、边中差大范围缓变无明确边界均值统计 趋势分析这里我要强调一个容易被忽略的点污渍类和色差类缺陷用灰度相机基本做不好。我早期有个项目用的是单色线扫相机油污和正常区域灰度差异极小算法怎么调都分不开后来换成彩色相机在 HSV 空间的饱和度通道上做一下就清晰了。所以相机选型必须在缺陷类型确定之后立刻定下来不能等算法做不动了才回头改。另一件事是判定口径要量化。什么叫两毫米的疵点是面积两平方毫米还是长度两毫米、宽度不限我在实际项目里坚持用缺陷外接矩形的长边尺寸作为判级依据配合面积做辅助这个口径简单、可复现、跟人工检验员的目视判断吻合度最高。定口径的时候一定要拉上质检主管一起坐半天把边界案例一张张过最后形成一份带图的判定标准文档。这份文档的价值远超任何算法改进。2. 方案选型从规则到学习的三条路线2.1 传统图像处理路线还能不能用每次有人问我现在还有必要用传统方法吗我都会说在织物检测这个场景传统方法不但能用而且很多情况下是首选。原因在于织物的纹理周期性极强这恰恰是频域方法最擅长的。正常织物的傅里叶频谱会呈现非常规则的峰值分布一旦出现缺经、破洞这类缺陷频谱上的某些峰就会减弱或消失这个特征稳定得惊人。传统路线的典型组合是先做光照不均校正再用 Gabor 滤波器组或多尺度 LBP 提取纹理特征然后用局部统计量均值、方差、极差构建异常图最后用阈值加形态学后处理得到缺陷区域。这套流程我在纯色平纹布上跑过检出率能做到九成左右误报在每百米三到五个单帧处理时间不到十毫秒用普通工控机就行完全不需要 GPU。它的优势非常实在可解释、参数少、调试快、算力需求低、不吃标注数据。但它的边界也很清楚——花型复杂的面料、提花面料、色织面料正常区域的纹理本身就千变万化传统方法构建的正常模型根本覆盖不住。另外它对光照变化的鲁棒性差车间里电压波动、灯管老化都会影响结果。所以我的判断标准是素色、规则组织、批量稳定的订单优先传统方法花色复杂或订单切换频繁的直接上学习类方法。2.2 监督式深度学习的适用条件监督式方法的效果上限确实高但它有个硬门槛你得有足够多、标注足够准的缺陷样本。织物缺陷的分布是典型的极端长尾正常图片能轻松攒到几十万张缺陷样本可能几个月才凑出几百张其中某些类型比如蛛网、稀密路更是稀有。我就遇到过整个项目周期里只收到十七条蛛网样本的情况。在这种数据条件下我的做法是分两级常见缺陷污渍、破洞、断经用监督式检测网络稀有缺陷用无监督异常检测兜底。监督这一路我倾向于用目标检测框架而不是分割框架因为检测框的标注成本远低于像素级标注一个熟练的标注员标检测框的效率大概是像素级标注的五到八倍。而且对织物缺陷来说给个准确的框加上尺寸判定层已经够用了不一定需要精确的像素轮廓。网络选型上我一般从轻量级检测网络起步输入分辨率控制在 640 到 1024 之间。这里有个反直觉的经验分辨率不是越高越好。织物的缺陷往往在放大后反而失去了局部异常的整体感而且分辨率翻倍会让算力需求翻四倍。我通常会按最小可接受缺陷尺寸反推需要的分辨率够用就行。2.3 无监督异常检测作为兜底无监督异常检测这几年在工业视觉里热得很快织物场景其实特别适合。它的基本假设是只用正常样本训练模型学会重建或表示正常纹理遇到异常时重建误差或特征距离就会偏大。这样就不需要缺陷标注解决了长尾问题。常用的几条技术路线我在织物上实测过的有基于重建的自编码器类、基于特征嵌入的 PatchCore 类、基于归一化流的类方法。综合来看PatchCore 这一路在织物上的表现比较均衡训练只要正常样本推理速度可控对纹理类缺陷的敏感度高。但它的短板也明显——对色差这类全局缓变的缺陷几乎无感因为它的核心是局部块特征匹配。我现在的标准做法是监督 无监督双通道并行监督通道负责已知缺陷类型的精准检出和分类无监督通道负责发现没见过的新异常。两路结果送到判定层做融合同一位置被两路都命中的置信度加权提高只被一路命中的按类型给不同权重。这套结构在实际产线上比单路方案稳定得多尤其是刚上线、缺陷样本还不全的阶段。3. 打光与成像决定系统上限的一步3.1 光源方案的选择逻辑织物检测的光源方案核心矛盾在于既要让缺陷明显又要让正常织纹尽量平。这两件事在很多时候是冲突的需要根据主要检测的缺陷类型来取舍。明场照明光源与相机同侧正反射方向适合检测表面污渍、色差织纹细节会被弱化图像整体均匀对颜色类缺陷友好。暗场照明光源角度大只接收散射光会把纱线的立体结构凸显出来断经、跳纱、毛羽这类缺陷会变得非常醒目但正常织纹的起伏也被放大了对算法是个挑战。透射照明光源在织物背面适合检测破洞、稀密路这类透光率变化明显的缺陷缺点是只能用于单层、透光性好的织物。我常用的组合是透射主光源 斜射辅助光源两路图像分别处理再融合。透射图抓破洞和稀密路斜射图抓断经和织纹异常。代价是相机数量翻倍成本上去了所以在预算有限的项目里我会先按缺陷优先级砍掉次要类型用单光源方案。还有一个非常容易被忽视的细节光源的频闪同步。线扫描相机是逐行曝光的如果光源用连续照明曝光时间就必须压得很短来避免运动模糊亮度往往不够用高频闪光源配合行频同步可以在保证亮度的同时冻结运动。频闪频率必须和相机行频严格一致我见过因为同步信号抖动导致图像出现规律性横纹的案例排查了整整两天才发现是触发信号线太长引入了干扰。3.2 相机与镜头参数的计算过程这部分我想给出可以照着算的过程因为参数算错是新手最常见的翻车点。假设需求是幅宽 1800 mm产线速度 60 m/min要求能检出最小 0.5 mm 的缺陷希望对应至少 2 到 3 个像素。先定检测精度。要让 0.5 mm 的缺陷占到 2.5 个像素单像素对应实际尺寸就是 0.5 / 2.5 0.2 mm/pixel。这个值就是空间分辨率。再算横向像素数1800 mm / 0.2 mm 9000 像素。市面上的线扫相机常见规格有 2K、4K、8K、16K8K 是 8192 像素不够要覆盖 9000 像素可以用一台 16K 相机或者用两台 8K 相机做拼接考虑重叠区两台 8K 各覆盖 950 mm 左右比较稳妥。拼接方案成本低但会增加标定和拼接的复杂度接缝处理不好会在中间留一条盲区我一般建议除非预算卡得很死否则优先单台高分辨率相机。接着算行频。产线速度 60 m/min 1000 mm/s每行对应 0.2 mm所以行频 1000 / 0.2 5000 行/秒。选相机时行频必须大于这个值并留出 20% 余量也就是至少 6000 行/秒。很多相机标称行频是在降低位深或缩小 ROI 的前提下达到的看规格书时一定要确认在目标位深下的实际行频。然后算数据率9000 像素 × 5000 行/秒 45 M 像素/秒。8 位灰度就是 45 MB/s如果是 3 通道彩色就是 135 MB/s。这个数字直接决定了接口选型——千兆网口理论带宽 125 MB/s实际可用约 100 MB/s跑灰度勉强够跑彩色就不行了。所以彩色方案要么用万兆网口要么用 Camera Link 或 CoaXPress。接口算错会导致丢帧而丢帧在织物检测里等于漏检属于致命问题。最后是镜头。设相机传感器像元尺寸为 5 μm那么镜头放大倍率 像元尺寸 / 空间分辨率 0.005 / 0.2 0.025。对应的工作距离和视场要按镜头公式反算这部分建议直接用厂商的选型工具同时注意镜头的解析力要匹配像元尺寸不然再高的分辨率也是白搭。4. 传统方法实操纹理特征与后处理4.1 光照校正与纹理特征提取无论后面用不用深度学习预处理这一步都跑不掉。织物图像最常见的问题是光照不均两侧暗中间亮直接用阈值分割会把暗区整片判成缺陷。我通常用大核高斯模糊得到光照背景再用原图除以背景做归一化这个操作叫同态校正的简化版实测比直接做直方图均衡效果好得多。纹理特征这块Gabor 滤波器组是经典选择。它的本质是用一组不同方向、不同频率的带通滤波器去响应图像正常织纹会在特定方向和频率上产生强响应缺陷区域则会破坏这种规律。实操上我会取 4 到 6 个方向、3 个尺度一共 12 到 18 个滤波器对每个滤波结果取局部窗口的能量就得到一组特征图。import cv2 import numpy as np def build_gabor_bank(ksize31, sigmas(2.0, 3.5, 5.0), thetasNone, lambd10.0, gamma0.5): if thetas is None: thetas [np.pi * i / 6 for i in range(6)] bank [] for sigma in sigmas: for theta in thetas: kern cv2.getGaborKernel( (ksize, ksize), sigma, theta, lambd, gamma, 0, ktypecv2.CV_32F) kern - kern.mean() # 去掉直流分量避免整体亮度干扰 bank.append(kern) return bank def gabor_energy_map(gray, bank, win15): feats [] for kern in bank: resp cv2.filter2D(gray, cv2.CV_32F, kern) energy cv2.boxFilter(np.abs(resp), cv2.CV_32F, (win, win)) feats.append(energy) return np.stack(feats, axis0)提示Gabor 核一定要减掉均值再去卷积。我第一次写的时候没做这一步结果特征图完全被整体亮度主导缺陷信号全被淹没了调了两天才想明白。除了 Gabor局部二值模式LBP也常用它的优势是计算极快对单调光照变化不敏感适合做粗筛。我一般用 Gabor 做精检LBP 做初筛先用 LBP 快速排掉九成以上的正常区域剩下的可疑区域再走 Gabor 精细分析这样能把整体耗时压下来一半左右。4.2 异常图构建与形态学后处理有了特征图接下来要把异常变成一个可以阈值化的标量。常见的做法是计算每个像素的特征向量与正常分布的距离。工程上最省事的办法是拿一批正常样本跑出特征图逐位置统计均值和标准差得到一个标准的正常模板然后对待检图像计算标准化偏差的平方和。def build_normal_model(normal_gray_list, bank, win15): stack [gabor_energy_map(g, bank, win) for g in normal_gray_list] stack np.stack(stack, axis0) # (N, F, H, W) mu stack.mean(axis0) sigma stack.std(axis0) 1e-6 return mu, sigma def anomaly_score(gray, bank, mu, sigma, win15): feat gabor_energy_map(gray, bank, win) z (feat - mu) / sigma score np.mean(z ** 2, axis0) return score异常分数图拿到后先做高斯平滑抑制噪点再用自适应阈值二值化。这里不要用全局固定阈值因为不同批次的布面反射率会漂移我一般用均值加 K 倍标准差的动态阈值K 的取值范围在 3 到 5 之间具体靠现场调。二值化之后必须做后处理否则会有大量零散噪点被误判。我的标准流程是先做开运算去孤立点再做闭运算把断裂的缺陷区域连起来最后用连通域分析过滤——面积小于最小阈值的丢掉长宽比异常的根据缺陷类型决定是保留还是舍弃。比如经向缺陷的长宽比通常大于 5如果检出一个长宽比接近 1 的小块大概率是噪声。注意形态学核的尺寸要跟检测精度挂钩。如果空间分辨率是 0.2 mm/pixel想要去掉小于 1 mm 的噪点核尺寸就应该在 5 像素左右。核开太大真实的细小缺陷会被一起抹掉这个权衡要靠现场样本反复试。5. 深度学习方法实操从数据到部署5.1 数据标注与增强的实操要点数据这块我先说结论织物缺陷检测项目里数据工作量占整个项目的一半以上而且质量比数量重要得多。我见过标注质量差的团队标出来的框有一半都不贴合缺陷边界模型训出来的定位精度惨不忍睹。标注环节有几个细节值得说。第一标注规范要写清楚框到哪算合适我的标准是框边紧贴缺陷可见边界允许一个像素级误差不允许为了保险把框放大。第二要专门设一个是否可判级的字段比缺陷类型还重要。有些缺陷过于细微人工质检员自己都不判这种样本标进去只会污染训练集。第三一定要标一部分纯正常但边缘可疑的样本作为负样本比如织纹略微不匀的区域这些是误报的主要来源。增强策略上织物有个特点纹理方向是有物理意义的。经向、纬向对应织物实际的方向所以不能随意做 90 度旋转那样会把经向缺陷变成纬向缺陷标签就错了。可以做的增强包括小幅平移、水平镜像、亮度与对比度扰动、轻微高斯噪声、局部弹性形变。特别是弹性形变能模拟织物在张力变化下的实际形变对提升泛化很有帮助。我还会用一类比较特殊的增强把真实缺陷抠下来随机贴到正常布面图像上合成新样本。这个方法能有效扩充稀有缺陷但也有风险——合成缺陷的边界和背景过渡往往不自然模型可能学到拼接痕迹这个伪特征。我的应对是只合成小尺寸缺陷并且对粘贴区域做羽化混合同时在训练时用较强增强削弱模型对局部纹理的依赖。5.2 模型训练的收敛控制与调参思路训练织物检测模型最头疼的是正负样本极度不平衡。如果按常规的随机采样一个批次里可能只有一两个正样本损失被负样本主导模型会倾向于全部预测为背景召回率上不去。常用的缓解手段有三类重采样、损失加权、难例挖掘。重采样我一般不用简单过采样因为会把同一张图重复太多次导致过拟合。我用的方式是保证每个批次里正样本占比在 25% 到 40% 之间通过控制采样器的采样权重实现。损失函数上分类分支用带聚焦机制的损失回归分支用平滑的绝对误差损失这两者组合在织物场景下比较稳。学习率策略上我用过比较有效的一套是前几轮线性预热中间用余弦退火最后几轮固定小学习率。织物缺陷的尺度普遍偏小网络在训练前期容易只学到背景所以预热阶段不要太长否则容易陷入平凡解。批量大小受显存限制时可以用梯度累积来等效大批次这个技巧在小缺陷场景下对稳定性提升明显。判断模型是否收敛我不太看训练损失主要看验证集上的几个指标召回率、误报数每百米或每千平方米统计、以及定位精度的交并比。织物检测里召回率的优先级高于精确率因为漏检一个真实缺陷的代价远高于多报几个疑点。所以我通常把置信度阈值调低让模型多报一些再用判定层去过滤。这个思路和很多通用检测任务相反但更贴合产线实际。5.3 从检测框到像素级定位的实现有些客户要求给出缺陷的面积和形状这就需要像素级的定位。我的做法不是在检测网络后面硬接一个分割头而是两阶段检测网络给出候选框然后在候选框区域上跑一个小型分割网络做精细轮廓提取再把轮廓映射回全图坐标。这样做的好处是分割网络只在局部区域工作输入尺寸小、计算量可控而且可以用少量像素级标注样本单独训练不需要全图标注。实测下来两阶段方案的总耗时比单阶段全图分割低不少精度也更好因为局部区域会先做归一化光照差异被消除了。def refine_mask(crop_bgr, seg_model, input_size256): h, w crop_bgr.shape[:2] inp cv2.resize(crop_bgr, (input_size, input_size)) inp inp.astype(np.float32) / 255.0 inp (inp - 0.45) / 0.225 # 按训练时的标准化参数来 prob seg_model.predict(inp[None, ...])[0, ..., 0] mask (prob 0.5).astype(np.uint8) mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((3, 3), np.uint8)) mask cv2.resize(mask, (w, h), interpolationcv2.INTER_NEAREST) return mask, float(prob.max())把掩码换算成物理尺寸时记住乘上空间分辨率。如果分辨率是 0.2 mm/pixel掩码面积是 300 像素那实际面积就是 300 × 0.04 12 平方毫米。外接矩形的长边乘以 0.2 就是缺陷长度。这个换算必须做因为判定层用的是毫米不是像素。6. 产线部署速度匹配与误报控制6.1 处理速度的匹配计算与架构选择先算清楚系统的算力预算再决定架构。以前面的例子为例幅宽 1800 mm速度 60 m/min分辨率 0.2 mm/pixel行频 5000 行/秒。相机会以 5000 行/秒的速度持续输出图像那么单帧处理时间上限就是 1 毫秒。这个要求相当苛刻通用服务器上的深度模型很难做到。实际工程里一般不会逐行处理而是按块处理。常见做法是把 5000 行组成一个区块对应 1000 mm 长度也就是每 0.2 秒处理一个区块。这样单块的处理时间预算就有 200 毫秒宽裕得多。区块之间要留重叠因为缺陷可能正好跨在边界上。重叠量我一般取区块高度的 5% 到 10%具体看缺陷的最大尺寸。这是产线上非常重要的一个设计点。区块模式让推理和采集可以流水线并行——采集线程持续收图写入环形缓冲区推理线程从缓冲区取块处理结果写入队列由判定线程消费。三线程用生产者消费者模式解耦任何一个环节的抖动都不会导致丢图。算力选型上如果是传统方法普通工控机 CPU 就够如果是中等规模的检测网络一块中端 GPU 的推理能力通常在每秒几十到上百帧之间按区块处理完全够用。我这两年的趋势是往边缘盒子走好处是部署简单、功耗低、不需要机柜代价是模型尺寸受限需要用轻量化骨干网络。落地时还有一个经常被忽略的问题结果的时空对齐。缺陷在图像里的位置必须映射回布匹上的实际米数才能让质检员找到它。这要求记录每一块图像对应的布匹长度并在卷绕或打标环节把位置信息同步过去。我第一版系统就漏了这件事结果检出的缺陷位置和实际对不上质检员按位置找不到直接不信任系统了。后来加上了编码器脉冲计数做长度同步问题才解决。6.2 误报控制的工程手段误报是织物检测系统能否被产线接受的决定性因素。技术指标再漂亮如果每分钟报十几个假缺陷质检员两天就会把系统关掉。我总结的误报控制手段按性价比排序是这样的。第一是多帧确认。同一个位置如果在连续 N 个区块里都被检出才最终上报。织物缺陷通常会在长度方向上延续多个区块而噪声引起的误报往往是单区块的孤立点这一招能砍掉一大半误报。代价是上报有延迟N 取 2 或 3 通常可以接受。第二是缺陷类型的先验约束。比如破洞类的缺陷面积不会特别小污渍类不会有锐利的直线边界经向缺陷的长宽比必须大于某个值。把这些领域知识写成规则过滤器效果立竿见影。第三是分区域阈值。布边区域因为张力大、组织特殊天然容易出现异常响应。我会对布边、布中、布尾分别设不同的阈值或者干脆在布边区域用更严格的过滤条件。这个技巧在传统方法里尤其重要。第四是模型集成的置信度融合。监督通道和无监督通道的结果做加权只有综合置信度超过阈值的才上报。同一位置两路都报的置信度自然高只有一路报的需要更高的单路置信度。这套融合逻辑我写成了一个可配置的打分函数现场调参非常方便。控制手段误报抑制效果召回损失风险实现成本多帧确认高低低先验规则过滤中高中低分区域阈值中低低双通道融合中高低中提高置信度阈值高高极低提示调误报的时候一定要同步记录召回率。我见过为了压误报把阈值一路调高最后误报是没了真实缺陷也全漏了系统成了摆设。正确做法是画一条 P-R 曲线选在召回率满足要求的拐点上。7. 常见问题速查与排查思路实际项目里遇到的问题八成集中在几个固定位置。我把它们整理成表方便对照排查。现象可能原因排查方法处理建议图像出现规律性横纹光源频闪与行频不同步关闭光源用环境光对比检查触发线屏蔽缩短信号线整体检出率骤降光源老化或环境光变化对比历史正常样本的均值做光照归一化定期标定布边大量误报边缘张力异常导致纹理畸变单独统计布边区域响应布边单独设阈值或裁剪缺陷位置与实际不符长度同步缺失或脉冲丢数用已知缺陷位置校验加编码器计数做时空对齐同一缺陷被重复上报区块重叠导致重复检出查看上报位置的分布做结果去重与合并新订单误报暴增面料类型变化模型未覆盖对比新旧面料图像差异增量训练或切换模型推理耗时波动大内存分配或线程竞争打开耗时埋点分段统计预分配缓冲区固定线程数排查的基本思路是先定位问题层级。我习惯按先看图像再看特征最后看模型的顺序走如果原始图像本身就有问题条纹、亮度不均、失焦那算法层面怎么调都没用图像正常但特征图上异常区域不对问题在预处理或特征提取图像和特征都正常但结果不对才是模型或规则的问题。这个顺序能省掉大量无用功。有几个坑我印象特别深。一个是相机触发信号的接地问题相机和光源分接在不同回路的电源上地电位差导致触发抖动图像上表现为随机位置的错行。解决办法是统一接地或者用光耦隔离触发。另一个是相机镜头的对焦漂移车间温度变化会让镜头轻微离焦虽然图像看着还清楚但高频纹理细节已经丢了而织纹恰恰是靠高频信息判断的。我们现在固定三个月做一次对焦校验用标准靶标拍一张看清晰度指标。还有一个是数据漂移的长期管理问题。纺织厂换季节、换原料供应商、换助剂都会让布面外观发生细微变化模型的表现会慢慢衰减。我建议在系统上线后持续保存抽样图像每周统计一次特征分布一旦发现偏离就触发增量训练。这个习惯能让系统稳定运行几年而不是半年后就开始频繁报错。8. 一些实战中攒下来的经验关于方法选型我的核心观点是不要迷信单一技术路线。传统方法在规则纹理上是利器监督学习在已知缺陷上精度高无监督方法能兜住未知异常把这三者组合起来用统一的判定层做融合是我目前认为最稳的架构。任何单一路线都会在某个角落翻车而组合方案的冗余度能把这些坑填上。关于精度指标的设定我劝大家不要一上来就追求百分之九十九。真实的产线需求是不漏掉客户会投诉的缺陷同时别让质检员烦到关掉系统。这两个条件往往对应一个相对宽松的技术指标。我在项目启动时通常会跟客户约定一个可接受的误报密度比如每千米不超过十个然后以这个为约束去最大化召回率而不是反过来。这个思路的调整会让整个项目的优先级清晰很多。关于投入分配如果重新做一个项目我会把时间这样分成像方案验证两周数据规范和标注四周算法开发六周产线联调和误报优化八周。很多团队把顺序倒过来先花两个月憋模型最后发现成像不行要换相机全部返工这是最亏的。成像先行这件事值得在项目计划里用粗体标出来。关于长期维护我强烈建议从第一天就把所有上报结果、对应图像、以及质检员的人工复核结论完整落库。这批数据是后续一切改进的基础。模型迭代、阈值调整、新缺陷类型发现全都依赖它。我见过不少系统因为没有存复核结果运行一年后想优化却没有任何可靠的评估依据只能重新开始标注这个代价太大了。最后一个操作细节判定层的参数一定要能在线改而且不改代码就能改。产线切换订单是常态不同订单的判定标准不一样如果每次都要改代码重新部署运维根本扛不住。我现在的做法是把判定规则写成配置文件改完热加载生效同时记录每次配置变更的时间和操作人。这个小设计在后期省下了数不清的沟通成本。