
做笔记本LCD屏幕缺陷检测的人应该都有过这种体会产线上一个米粒大小的亮点强光下明明存在模型却视而不见一片淡淡的Mura水波纹人眼要来回换几个角度才能确认模型直接漏成一片空白。我们这次做YOLO11-SEG-SDI实战就是冲着这类“小而淡”的屏幕缺陷去的。方案核心是用YOLO11-SEG做实例分割基座再叠加一个自定义的SDI模块Spatial-Detail Interaction空间-细节交互把上下文信息和细节信息重新融合起来最终在笔记本LCD屏幕缺陷检测与分类任务上跑出了一版能实际落地、能上机试跑的结果。这篇文章会把整体思路、数据集建设、模块设计原理、训练参数和踩坑记录完整拆开讲给做工业视觉缺陷检测的朋友尤其是被小目标、低对比度缺陷困扰的人提供一个可以直接参考的完整路线。1. 项目概述与整体设计思路1.1 笔记本LCD面板检测的真实痛点笔记本LCD屏幕的缺陷检测和普通外观检测有个本质区别缺陷本身极其不显眼。我们面对的缺陷类型主要有亮点、暗点、细划痕、Mura亮度不均云团、脏污和坏线其中大量缺陷的尺寸只有几百微米到一两毫米在一整块14寸屏幕上占比不到千分之一。对比度更是低得离谱Mura类缺陷的灰度差异往往只有几个亮度值人眼都需要在暗室、特定光源角度下才能辨认。产线上传统做法是人工目检老师在强光下逐屏翻看。这里的问题很现实一条产线一个班次要看上千块屏幕人的注意力撑不过两个小时漏检率随疲劳程度大幅波动而且不同检验员对“算不算缺陷”的标准不一致经常出现上下游复判扯皮。我们也试过传统机器视觉方案阈值分割、频域滤波、梯度特征加分类器都搭过单一场景调得不错换一版屏幕或换一种光源就崩尤其是Mura和细划痕这种无固定形状、边缘模糊的目标传统算子基本无能为力。所以这个项目的核心诉求非常明确用一套深度学习分割模型把“检测、分割、分类”三件事一次做完。检测要足够敏感漏检率尽量压到最低分割要给出缺陷的掩码方便后续统计面积、位置、形态分类要支持按缺陷类型分拣方便产线定位问题工序。1.2 为什么基座模型选YOLO11-SEG选型的时候我们对比过两阶段检测器、经典的语义分割网络和YOLO系列的分割版本。最后定在YOLO11-SEG理由有三条。第一是实例分割能力。屏幕缺陷的形态信息太重要了。划痕要看方向和长度Mura要看面积和形状脏污要看纹理是否规则。YOLO11-SEG输出的是“检测框实例掩码类别”掩码直接给了我们缺陷的像素级轮廓后处理阶段可以顺势统计面积、周长、最小外接矩形等形态学参数这对产线分拣和缺陷分级非常关键是纯目标检测框没法比的。第二是工程链路成熟。YOLO11-SEG的训练、验证、导出、量化、部署有一套完整闭环对工业项目来说能在产线快速落地比单纯刷指标重要得多。它的网络结构在YOLOv8-SEG的基础上做了不少优化backbone里采用了新的卷积堆叠方式整体计算量控制得不错实测单张显卡就能承载完整训练流程推理速度也能满足在线检测的要求。第三是它对小目标的回归能力整体好于早期版本。当然这话得说完整YOLO11-SEG本身对小目标有改善但放到LCD这种极端小目标、极端低对比度的场景里光靠基座模型是不够的。我们跑过一轮基线小尺寸的亮点和Mura漏检率依然偏高这才有了后面加SDI模块的动机。1.3 SDI模块到底是解决什么问题的SDI全称Spatial-Detail Interaction空间-细节交互模块。听名字可能觉得玄其实思路很简单屏幕缺陷检测难本质是“上下文”和“细节”这两个信息没有同时被用好。什么叫上下文一块Mura所以你判断它异常是因为它和周围正常区域的亮度分布不一致一条划痕所以被识别是因为它周围的屏幕底色是均匀的。缺陷本身的信号弱但“周围应该是正常的”这个信息是强的这就是上下文。什么叫细节缺陷尺寸太小进了深层特征图之后往往只剩几个像素边缘、纹理这些高频信息早就被下采样抹平了。亮点和划痕靠的就是这种高频细节信息。主流检测网络在设计时通常默认两者兼顾但实际对工业小缺陷来说都不够极致深层感受野大上下文足细节丢了浅层细节足但感受野小缺少上下文判断。SDI模块的思路就是拉两条独立分支一条专门扩感受野抓上下文一条专门保高频细节最后通过交互融合把两边的信息按空间位置重新对齐、加权合并。这个模块的详细结构在第三章展开这里先记住它的定位轻量、可插拔、只改Neck不动Backbone不伤推理速度。2. 缺陷分类体系与数据集建设2.1 六类常见缺陷的定义与形态特征做工业检测项目第一步永远不是选模型而是定义清楚“你要检测的东西到底长什么样”。我们和产线质量工程师一起把笔记本LCD缺陷收敛成六类每类定了明确的外观描述和判定边界。缺陷类别典型外观尺寸范围检测难点亮点终端照射下呈点状发亮常为单像素或小团像素0.1~0.5mm尺寸极小易与灰尘反光混淆暗点点状暗斑常由坏点或异物压迫导致0.2~1mm低对比度边界不清细划痕线状连续或断续痕迹方向随机长度2~30mm宽度0.02~0.1mm极细长长宽比极端Mura无固定形状的亮度不均云团边缘模糊5~50mm低对比度无清晰边界脏污表面异物形状不规则常伴纹理0.5~10mm形态多变与灰尘背景难分坏线整条水平或竖直发亮/发暗线贯穿屏幕跨度大细且长这里要强调一个经验分类体系不是越细越好而是越“可判定”越好。我们一开始把Mura细分成三种结果标注员之间的一致性很差同一块缺陷有人标成竖向Mura有人标成团状Mura模型学出来的特征自然也是乱的。后来合并成大Mura一类标注争议立刻少了很多模型准确率反而上来了。2.2 采集、标注与数据清洗数据采集是在模拟产线光源环境下完成的。我们用了工业面阵相机加低角度环光、同轴光两组光源对每一块屏分别采集亮场、暗场和灰度场三组图像以覆盖不同缺陷的最佳呈现角度。这里有个关键细节光源角度和亮度必须和最终部署现场保持一致否则模型训练时看到的缺陷形态和现场根本对不上指标再高都白搭。标注环节用的是开源的多边形标注工具逐实例标注掩码。我们给标注员定了三条强制规范第一一个缺陷实例只标一个多边形粘连的两个缺陷必须分开第二拿不准的疑似缺陷单独建一个“待定”标签不进训练集第三Mura类标注时必须在暗室环境下放大到原始尺寸的200%以上再描边防止边缘位置随手一画。原始数据攒了大概1200多张有效图像缺陷实例总数接近8000个。拿到标注后我们做了三轮清洗先用脚本去重删除几乎一模一样的重复图再筛掉对焦模糊、光源不均明显失衡的样本最后把标注置信度低的样本抽出来人工复核。这个环节看着琐碎但实际对模型上限的影响比后边调参大得多。2.3 针对小目标的切图与增强策略笔记本屏幕原图分辨率很高直接把整块屏塞进网络训练小缺陷会进一步缩小。我们的做法是先把屏幕裁成若干子图子图尺寸设在1024像素左右裁切时使用重叠滑动窗口重叠区256像素保证跨边界缺陷不会因为被切成两半而漏标。数据增强上我们做了明确的取舍。常规的Mosaic增强一开始是开着的后来发现一个问题Mosaic把四张图拼在一起小目标会被随机缩放本来就只有十几个像素的亮点可能直接被缩没了标注还留在原坐标上等效于给模型喂了错误样本。所以对液晶屏这类极端小目标场景我把Mosaic关掉了转而采用翻转、小幅旋转、亮度扰动、高斯模糊模拟Mura效果这几类增强。针对类别不均衡用的办法是对Mura和亮点这两个最难检的类别做欠采样复制再把复制的小目标实例通过贴图方式随机粘贴到干净的屏幕子图上相当于做定向的复制粘贴增强实测这类增强对亮点的召回提升非常直接。3. SDI模块的结构设计与原理拆解3.1 小缺陷检测难在哪儿要理解SDI模块的价值得先搞清楚小缺陷在网络里到底经历了什么。一张输入图经过Backbone逐级下采样特征图分辨率从输入尺寸一路降到1/32。一个原本只有几个像素的亮点在第4、第5层特征图里可能就衰减成一个响应强度极低的单点和背景噪声几乎无法区分。而Neck后续的融合虽然能补充部分信息但如果Backbone这一路已经丢失了关键细节后面再融合也是无米之炊。另一头Mura这种大而不清的目标整体尺寸不小但它的特征不是“形状”而是“相对周围的亮度差”。深层特征图有足够的感受野看到周围正常区域却因为下采样丢了精确的灰度关系浅层特征图有灰度精度但感受野又不够大看不到上下文。这就是我前面说的两难知道该看哪但看不清边缘看清了边缘又不知道是不是异常。SDI模块做的就是拆开这个结你不是右眼看细节、左眼看环境吗那就在网络结构上也这样分两条路走最后再合起来。3.2 空间上下文分支把“环境”还给缺陷空间上下文分支的设计目标很明确在不大幅度增加计算量的前提下把感受野拉大让每个位置的输出特征都“见过”周围一大片区域。具体做法是采用多分支空洞卷积结构。三条分支分别使用空洞率1、3、5的卷积核空洞率不同感受野覆盖范围不同能看到近处细节和远处背景的不同组合三条分支的输出按通道拼接后过一层轻量空间注意力让网络自己学习“哪些空间位置上的上下文对判断缺陷更重要”。这里有个设计细节值得说。空洞卷积虽然能扩感受野但如果空洞率太大卷积核中间是空的会丢失连续信息反而对细长目标不友好。所以我们没有一味加大空洞率而是保持最大空洞率5并用空洞率1的分支兜底保留原始连续特征。这个折中是在消融实验里试出来的空洞率再往上加划痕的检测反而掉点。3.3 细节特征分支把“边缘”还给缺陷细节特征分支解决的是另一头的问题恢复被下采样抹掉的边缘和纹理。我们的做法是从Backbone较早的高分辨率特征层直接引一条旁路出来这条分支的特征图分辨率要比Neck主流分支高很多保留了更多原始像素信息。光有高分辨率还不够还得把“高频变化”显式地强调出来。我们在细节分支内部接了一个高频特征提取模块用固定参数的拉普拉斯卷积核和Sobel算子分别提取二阶和一阶梯度信息再把原始高分辨率特征和梯度特征沿通道拼接。这么做的好处是让网络不用自己隐式学习“什么是边缘”而是直接把边缘响应喂到面前对亮点、细划痕这类靠边界存在的缺陷帮助尤其明显。实验里有个有意思的观察单独接高分辨率分支而不加高频提取时模型在Mura上略有提升但亮点召回几乎没有变化加了高频提取之后亮点和划痕的召回一下子拉开差距。这说明对这类缺陷网络确实缺的不是分辨率而是对高频响应的显式感知。3.4 交互融合与模块插入位置两条分支各自提取完特征后最后一步是交互融合。我们这里用的是一种轻量交叉注意力机制空间分支的输出生成一组注意力权重用来对细节分支特征做空间位置上的加权同时细节分支的输出也生成一组权重对空间分支特征做加权两者相加后再与Neck原始特征残差相加。这样处理的好处是两个分支的信息不是简单拼接完事而是按空间位置做了对齐和互相调制。比如某个位置空间上下文强烈提示“这里异常”这个信号就会放大细节分支上对应位置的边缘响应反过来某处有清晰的边缘细节也会帮助空间分支确认这不是一块正常区域。模块插入位置我们只在Neck的P3和P4两处加了SDIP3对应中等分辨率特征图是小缺陷的主要落脚层P4提供稍大区域的整体信息。P5层我们没有动因为Mura这类大目标主要靠这里贸然加模块反而会拖慢训练收敛。整个模块设计成可插拔形式用预训练权重初始化时不会破坏原网络结构可以直接加载官方预训练参数再微调。# SDI模块核心结构伪代码 class SpatialContextBranch: # 输入: 下采样特征 F_low # 1. 三路空洞卷积 (dilation1,3,5) 并行提取 # 2. 输出沿通道拼接 # 3. 空间注意力加权, 输出 F_spatial class DetailPreserveBranch: # 输入: 高分辨率浅层特征 F_high # 1. 拉普拉斯/sobel高频卷积提取梯度 # 2. 原始高分辨率特征与梯度特征通道拼接 # 3. 输出 F_detail class SDIFusion: # 输入: F_spatial, F_detail # 1. F_spatial 生成空间注意力权重 W_s # 2. F_detail 生成空间注意力权重 W_d # 3. 交叉加权融合 # 输出: F_out F_neck fusion_result4. 训练环境与完整实操流程4.1 软硬件环境与工程组织训练环境方面我们用的是单张专业显卡显存24GB整体配置就是入门级AI工作站没有上多卡集群。实测下来YOLO11-SEG加上SDI模块训练时的显存占用和基线模型相比只增加了约8%单卡完全跑得动。软件层面基于当前主流的深度学习框架搭建训练和验证过程都挂在YOLO11的工程体系下这样可以复用数据加载、增强、验证、导出这些成熟链路不用重复造轮子。新增的SDI模块单独放在一个目录里和原有网络代码解耦方便随时开关做消融。工程目录建议按这个结构组织分工清晰lcd_defect_project/ ├── data/ # 数据集与标注文件 ├── configs/ # 数据配置与训练参数 ├── models/ # 基座模型与SDI模块定义 ├── scripts/ # 训练、验证、推理脚本 ├── weights/ # 预训练权重与训练产出 └── results/ # 指标曲线与预测可视化4.2 数据配置与训练参数数据配置是YAML格式核心是把上一步建好的数据集路径和类别定义清楚。我们的配置大概长这样path: ./data/lcd_defect train: images/train val: images/val names: 0: bright_spot 1: dark_spot 2: scratch 3: mura 4: dirt 5: dead_line训练参数我们是这么定的输入分辨率1024批大小16训练200轮优化器用带动量的随机梯度下降初始学习率0.01配合前期数百步的预热。选择SGD而不是自适应优化器是因为在检测分割任务上SGD配合合适的调度器最终收敛点的泛化性通常比自适应优化器更稳尤其在数据量不是很大的工业场景里不容易过早过拟合。针对小目标有两条参数经验值得记录。一是输入分辨率我们对比过640和10241024下亮点和划痕的mAP提升了近5个点代价是训练和推理时间增加这个取舍在产线可接受范围内二是置信度阈值训练时保持默认但评估漏检率时要把置信度阈值往下压到0.1再统计否则会高估实际表现。4.3 训练、验证与模型导出流程完整流程分四步走。第一步加载预训练权重把Backbone和原Neck参数全部初始化好只随机初始化SDI模块新增的参数。第二步正常训练训练过程中每10轮保存一次权重并同时跑验证集记录每个类别的精确率和召回率曲线。第三步挑验证集最优的一版权重做完整指标评估。第四步导出部署格式先导出为通用中间格式再做量化最后在产线工控机上试跑推理速度。# 训练命令示例 python train.py \ --model yolo11s-seg \ --data lcd_defect.yaml \ --imgsz 1024 \ --epochs 200 \ --batch 16 \ --optimizer SGD \ --lr0 0.01 \ --warmup 300这里要特别提醒一点很多项目训练完直接用最后一轮权重这是最容易翻车的地方。我们的习惯是专门写一个模型选择脚本在验证集上遍历所有保存的中间权重按“mAP50和难例召回率加权”的标准选出最优模型。工业场景里最后一轮权重经常不是因为过拟合导致效果不佳而是学习率衰减到这个阶段后模型在少数难例上的表现波动很大早几十轮的那版反而更稳。5. 评估结果与实测对比5.1 指标怎么选工业缺陷检测的指标选择和学术比赛有明显区别。学术榜上看mAP但产线真正关心的是漏检率也就是召回率。所以我们的评估体系是三套指标并行mAP50和mAP50-95看整体检测和分割精度mIoU看掩码质量另外单独统计每个类别的召回率并算一个“关键难例召回率”指标专门统计Mura和亮点这两个此前漏检最严重类别的表现。还有一个容易被忽略的指标是推理速度。产线检测有节拍要求模型跑太慢即使指标再高也没法上线。我们在验证集上统计去除预热耗时后的单张平均推理耗时折算成FPS用来判断部署可行性。5.2 基准模型与SDI改进的对比结果在同一份数据集、同一套训练参数下我们对比了纯YOLO11-SEG基线和加SDI模块的完整方案。验证集上的典型结果如下模型mAP50mAP50-95mIoU难例召回率推理耗时YOLO11-SEG 基线88.471.369.276.5%18msYOLO11-SEG SDI93.678.575.889.2%20ms从结果能看出三点。第一整体mAP的提升幅度约5个点主要是难例类别贡献的容易检的脏污、坏线本身已经接近满分提升空间有限。第二难例召回率从76.5%涨到89.2%这是这个项目最有价值的提升因为产线关注的就是这最难的一批。第三推理耗时只增加了大概2毫秒对产线节拍完全没压力这正是可插拔轻量模块该有的样子。按类别拆开看Mura的召回率提升最明显从71%左右拉到86%亮点从78%拉到91%划痕提升相对小一些从82%到88%。划痕提升幅度小分析下来主要是因为标注本身的长宽比极端部分细划痕在人眼标注时就存在边界模糊的争议模型预测的不确定性也相应更大。5.3 典型失败案例与后续补强再好的模型也有翻车的时候。我们专门把验证集上漏检和误检的样本捞出来做了一次复盘最有代表性的两例可以分享。第一例是漏检低对比度细划痕。这类划痕在图上只占两三个像素宽度灰度差几乎贴着噪声水平人眼要反复比对周围纹理才能确认。SDI模块已经尽力恢复了高频信息但原始图像信噪比太低模型把真正的划痕响应当成了背景纹理。后续补强方向是改善成像通过增加一组高角度定向光源让划痕产生更强的散射信号从源头提升信噪比这个思路比继续加大模型更有效。第二例是把灰尘误检成了脏污。灰尘和脏污在特征上高度相似区别往往只在来源和分布方式仅靠单张灰度图很难完全分对。我们的处理是两个方向并行一是在后处理里引入面积和圆度约束把孤立小圆点单独归类降低误检二是把多光源图像在输入层做了通道融合相当于给模型多提供一组“看穿表面”的信息。6. 常见问题与避坑经验6.1 数据层面最容易踩的坑数据层面第一个坑是重复样本。工业生产的数据往往来自同一批屏幕同一种缺陷在连着几十张图里反复出现看上去数据量很大真实信息量很少。训练集和验证集如果都是从这批屏幕里随机分的模型其实在“背屏”换一批新屏幕立刻现原形。我们的做法是按屏幕批次划分数据集同一个批次的所有图要么全在训练集要么全在验证集绝不混在一起。第二个坑是光源不一致。我们早期有一批数据是在设备调试阶段采的光源亮度和稳定后采的不完全一致结果模型学出了一个隐含假设暗一点的图就是脏污。后来排查指标异常时才发现验证集里偏暗的屏幕几乎全部被误判。解决方案只有一条把不同光源条件下采集的图分开管理按比例分布到训练和验证里宁可训练集小一点也要保证成像分布一致。第三个坑是标注一致性。工业标注是多人协作的不同标注员的松紧尺度天然有差Mura这种边界模糊的目标尤其明显。我们做过一次统计同一个缺陷让两个人重新标注掩码面积能差30%。后来我们强制要求所有新增标注过一遍“双人复核”明显提高了掩码质量也直接反映在mIoU的提升上。6.2 训练与调参层面的坑训练阶段遇到最典型的问题是Mosaic增强对小目标的伤害前面已经提过。这里再补充一个连带问题关闭Mosaic后数据多样性下降大目标类别的精度略有下降。解决办法是只在训练的前半段关闭Mosaic后半段再开回来或者用小概率开启我实测把开启概率压到0.3左右小目标和大目标能兼顾。另一个高发问题是类别不均衡导致的学习倾斜。脏污和坏线样本多模型输出自然偏向它们亮点和Mura这种样本少的类别会持续欠拟合。除了复制粘贴增强我们还在损失层面加重了难例类别的权重把Mura和亮点的分类损失权重提高1.5倍。调参时要留意不能加太狠否则模型会为了保难例把其他类别的表现拉下去得不偿失。还有一个容易被忽略的坑是验证集指标和现场表现的差异。模型在验证集上mAP很高到了现场却频繁报警。主要原因是现场图像和验证集图像的预处理不一致比如缩放方式、归一化参数、裁切区域稍有偏差模型输出就会抖动。我们的解决方法是把现场采集的图像做和训练时完全一致的前处理后再送进模型同时保留大约2%的现场真实样本定期做复核测试。6.3 部署与性能优化经验部署阶段第一个建议是不要急着量化。低对比度缺陷对数值精度非常敏感我们最初把模型量化到低精度后Mura的响应几乎全部消失验证集mAP直接掉十几个点。后来改混合量化方案只对部分对精度不敏感的网络层做量化其余层保持高精度才把精度损失控制到可以接受的范围。如果你对精度极度敏感建议优先用高精度部署等确定节拍有富余再做量化。第二点是推理时的多尺度测试要谨慎。训练时用1024输入推理时为了多抓细节又切成1280这会导致模型看到的特征尺度分布变化输出可能反而不稳定。如果部署现场确实需要更高分辨率应该让训练和推理保持一致的分辨率和切片策略而不是只在推理端临时改。第三点是工程制品环境尽量固定依赖版本。我们踩过一次坑开发环境和部署环境的框架版本不一致导出后的中间格式模型在部署端跑出不同的结果。后来把环境依赖全部锁版本导出和部署用同一套运行时这个问题再没出现过。这个项目做完我个人最深的体会是在工业缺陷检测里数据、成像和工程链路至少要占七分力气模型和网络结构最多占三分。SDI模块确实有效但它的有效建立在一个前提上——我们有足够规范的数据、足够贴合现场的成像方案以及一条从训练到部署不脱节的工程链路。如果你也在做类似屏幕检测项目建议先别急着堆模型复杂度先用标准YOLO11-SEG把数据链路和评估体系跑通再引入像SDI这样的定制模块每一步的改进都能量化对比这才是能长期迭代的做法。最后再分享一个小技巧产线落地时建议给现场留一个“难例回流”机制把每天误检漏检的图保存下来每周补充进训练集重训一次模型会越用越贴合现场这种持续迭代的能力比任何单次训练的指标都宝贵。