ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

瓷砖表面缺陷识别:从数据集构建到模型部署的完整实战指南

瓷砖表面缺陷识别:从数据集构建到模型部署的完整实战指南 简介本资源是面向深度学习初学者与工业视觉应用开发者的瓷砖表面缺陷分类数据集聚焦制造业质检场景中的常见瑕疵识别任务可直接用于图像分类模型训练与验证。数据集共395个文件包含392张JPG格式缺陷图像按气孔、破碎、裂纹、磨损、凹凸不平五类组织、1个类别映射JSON字典、1个可视化分析Python脚本及1张示例PNG图结构清晰、开箱即用无需额外标注或格式转换。压缩包仅14.38MB轻量高效适配算力受限的本地实验环境。已有909人学习下载配套提供标准train/test双目录结构训练集315张、测试集77张每个子文件夹以缺陷类型命名辅以classes.json统一管理标签体系并内置可视化脚本支持数据分布查看与样本预览显著降低数据准备门槛助力快速构建端到端缺陷识别原型。 做瓷砖表面缺陷识别我一开始以为难点在模型上真正把项目推倒重来的却是数据集。那会儿用YOLO跑了几轮mAP看着还行结果一上产线就露馅同一种裂纹换个光源、换个角度就认不出来。后来把工作重心彻底转向数据集——拍什么、怎么拍、怎么标、标完怎么验——模型精度才真正稳住。这篇文章就围绕“5种常见瓷砖缺陷分类数据集”把完整闭环讲一遍从缺陷定义、采集标注、模型选型到训练评估和产线部署。适合正在做工业质检、瓷砖或类似表面缺陷识别的朋友参考哪怕你还没拿到产线数据里面的思路也能直接套用。1. 产线质检的真实需求为什么非要把缺陷分成5类1.1 5类缺陷的工艺成因与视觉特征在正式做数据之前我和产线质检员开了三次会。最开始我想得很简单做个“好砖/坏砖”二分类不就行了结果质检老师傅直接摇头坏砖也得看是哪种坏法后续处理方式完全不一样有的能修补有的只能降级有的直接报废。于是我们定了5个常见类别都是瓷砖生产中最容易看到、也最适合用单张图像识别的缺陷类别主要成因视觉表现常见处理裂纹热应力、机械应力烧成或冷却阶段温度不均匀细线状、树枝状裂纹长度宽度不一直接报废崩边/崩角切割、搬运、压机边缘掉块边缘或角部小块缺失有崩裂痕迹视面积修补或降级针孔坯体或釉层中的气体在烧成过程中排出表面微小圆孔密集或分散降级或二次加工缺釉/缩釉施釉不均匀、釉料与坯体不匹配、釉面局部不润湿釉面局部缺失露出坯体光泽明显不同补釉或降级斑点/杂质原料含铁、有机物燃烧不完全、生产环境粉尘污染表面异色点、块状杂质视严重程度降级这里有一个容易被外行忽略的细节同样是裂纹“辊道窑辊棒粘渣造成的压痕裂纹”和“出窑后切割产生的崩裂”在图像上长得完全不一样。这不是坏事恰恰说明缺陷分类的粒度要和工艺对应。如果模型只输出“有缺陷”后端根本不知道该把砖送到哪个处理工位。从视觉上看这5类缺陷的典型特征差异也比较明显裂纹是线状结构崩边集中在边缘和角部针孔是小而圆的点状缺釉是片状区域反光异常斑点则是不规则的异色区域。正因为彼此之间有区分度用深度学习做有监督分类才可行。如果两类的视觉特征高度重叠比如针孔和细小的斑点那再好的网络也吃力。这个情况我后面会专门讲它直接决定了你的标注规范怎么写。1.2 为什么不是“缺陷/无缺陷”二分类很多入门项目习惯用“OK/NG”二分类简单是简单放在实际产线却远远不够用。第一处理动作不同。裂纹砖必须报废崩边可能还能打磨修补斑点严重的降级为B品轻微的甚至可以直接放行。二分类模型只能告诉后端“有问题”却没法告诉它往哪个方向处理。如果整条自动化分拣线只有两个机械臂一个抓好的、一个抓坏的那二分类勉强够用但只要你想让系统真正参与工艺调整就必须知道缺陷类型。第二二分类的评估指标容易骗人。假设产线上”好砖“占比95%缺陷砖只占5%一个什么都不学、永远输出“无缺陷”的模型准确率也能到95%。你看着准确率很高实际上缺陷一张都没找出来。这时候如果做的是5分类哪怕某类样本少你也会被迫去看每个类别的精确率、召回率模型是不是真的学到了特征一眼就看出来了。第三细分标签其实是在帮模型“聚焦”。同样一张图二分类模型可能只学到“砖面颜色暗就是坏”因为它只需要找到一个粗粒度特征就能把训练损失降下去。一旦让它区分裂纹、针孔、斑点模型就不得不去关注边缘梯度、局部纹理、区域反光这些更有判别力的信息。实际效果是5分类模型对“有没有缺陷”的判断能力往往比同结构的二分类模型更强。1.3 色差和尺寸偏差为什么没进数据集可能有人会问瓷砖缺陷常见的还有色差、尺寸偏差为什么不一起做进去这里有个很现实的约束色差是“批次相对概念”。同一块砖单独拿出来你很难判断它是不是偏色要跟同型号的标准砖、或者同批次的相邻砖对比才行。深度学习单图分类在输入层面就没有“参照物”硬要做也可以但需要成对输入或者引入额外的标准色卡数据集构建成本会高很多而且不同型号瓷砖的色差标准各不相同做出来的模型泛化能力很有限。尺寸偏差则涉及物理标定。镜头距离变化、砖在传送带上的微小偏移都会导致图像上像素尺寸变化你需要先做畸变校正和尺度标定本质上是一个测量问题而不是单纯的图像识别问题。所以在做“瓷砖缺陷分类数据集”时我更推荐先把视觉特征明确、单图可判的缺陷类别做扎实色差和尺寸交给另外的传感器或专门的测量工位去解决。2. 数据集构建的完整链路现场采集、清洗与标注规范2.1 拍摄环境怎么定光照、角度、背景数据集里的每一张图都是模型见到的“世界”。拍摄环境的稳定性比相机分辨率还要重要。先说光源。瓷砖是强反光材质直接用普通顶灯拍釉面会形成大面积反光裂纹和针孔会被高光吃掉。我们最后用的是均匀的白色LED条光源45度角斜照稍微压低亮度让釉面呈现均匀柔和的漫反射。低角度照明对裂纹特别有效因为裂纹有微小深度起伏斜光会形成一条阴影线人眼和模型都能看得更清楚。针孔在斜光下也会形成微小的暗点比正光下明显得多。再说拍摄角度和背景。相机固定镜头垂直砖面高度保持不变。拍的时候砖面必须放平不能用手扶着、也不能放在有阴影的区域。背景统一用深色哑光板避免浅色背景把砖面边缘“吃”掉也方便后续如果做检测模型时把背景和砖体分离。分辨率建议至少1280×1024这样一块600×600mm的瓷砖摊到每个像素的物理尺寸大概在0.5mm左右针孔、细小裂纹才不至于在图像中消失。拍摄数量上我们做了三轮采集最终每类缺陷保留800到1200张正常砖单独留了1000张作为“无效类别”。为什么这么抠数量因为深度学习模型虽然吃数据但工业项目的核心是可控质量而不是无脑堆量。一个类别里有3000张模糊重影图比1000张清晰目标图的效果差得多。2.2 图像筛选与清洗宁缺毋滥很多人把采集到的图片往文件夹里一扔就开始训练这是我在整个项目里踩过最深的坑。第一版数据集里混了不少对焦不准、运动模糊、曝光过头、砖面还有生产时残留水渍的照片模型训练出来的验证集准确率居然有92%一上真实产线马上掉到70%出头。原因就是训练和验证都是在同一批“脏数据”里自嗨根本没有模拟真实场景的难度。后来我定了一条规矩每一张原图在进入标注环节之前必须人工快速过一遍。筛选标准很明确模糊、对焦不准的图删过曝或者过暗导致缺陷看不清的图删同一块砖在同一角度重复拍摄的图只留一张缺陷被其他物体遮挡比如包装膜、手影的图删无法确定缺陷属于哪一类、甚至质检员之间都争论不定的图先放到“存疑文件夹”不参与训练。这套清洗流程听起来繁琐实际做起来就是把图像按缩略图模式排布人工快速扫一天能过两三千张。但这道工序省不得它决定了你后续所有实验的可信度。图像清洗和标注规范应该当作数据集的“质检”和瓷砖质检本身一样重要。2.3 用目录做标签分类数据集最简单实用的组织方式分类任务的数据集组织我推荐直接用文件夹名作为标签。好处是零额外格式、可读性好、换谁接手都不会弄错。目录结构大致如下dataset/ ├── train/ │ ├── crack/ # 裂纹 │ ├── chip/ # 崩边/崩角 │ ├── pinhole/ # 针孔 │ ├── glaze_defect/ # 缺釉 │ ├── stain/ # 斑点/杂质 │ └── normal/ # 正常砖 ├── val/ │ └── ... └── test/ └── ...用PyTorch的ImageFolder或者Keras的flow_from_directory直接就能读取不用写任何解析代码。要注意的是训练集、验证集、测试集要按照同类别比例切分不能简单地把文件夹里的前80%当训练集。比如裂纹图片是在上午拍的崩边图片是下午拍的按时间顺序切分会让验证集和训练集的拍摄条件不一致指标虚高或者虚低都可能发生。要先把每个类别的图片路径全部打乱再按7:2:1的比例做分层划分。2.4 如果要同时输出位置YOLO格式标注怎么处理有些场景不只需要分类还想知道缺陷在砖面的哪个位置。比如崩边明明在左上角后续打磨工序只需要处理那个角这时候纯分类模型帮不上忙得用目标检测模型。检测模型的数据集和分类数据集不是一套标注思路。分类是“整张图一个标签”检测是“每个目标一个矩形框类别”。我们用的标注工具是LabelImg界面很简单画框、选类别、存成YOLO格式的txt文件。一个标注文件长这样0 0.458333 0.743056 0.086806 0.108333 1 0.812500 0.312500 0.075000 0.090278每一行是“类别id x中心点 y中心点 宽 高”坐标值除以了图像宽高归一化到0到1。注意类别id的顺序必须和数据集配置文件里的类别列表完全一致YOLO系列读取txt时是按数字找类名的一旦顺序错位整个模型训练就会错乱。标注时还要注意一个原则矩形框紧贴缺陷外边缘不要留太大背景但也不要切到缺陷本身。对裂纹这种长条目标YOLOv8默认的矩形框会包含大量背景检测效果不如分割模型但胜在标注成本和推理成本低。如果产线上瓷砖随意旋转、裂纹方向任意可以考虑mmrotate这类旋转框检测不过常规固定工位拍照的场景普通水平框就够用了别为了炫技增加复杂度。2.5 数据增强怎么做才不过火数据增强是深度学习的“免费午餐”但工业场景里容易做过头。我们用了这样一组增强方式随机水平翻转、随机垂直翻转、随机旋转90/180/270度、随机亮度抖动、随机对比度抖动、随机高斯噪声、随机裁剪缩放。这组方案基本覆盖了产线上常见变化光源亮度波动、砖面摆放方向变化、相机轻微晃动。但有两个增强操作我建议不要随便用一是任意角度的旋转比如旋转17度。砖面本身有纹理方向虽然人眼看不出问题但旋转会引入非真实的边缘形态而且影响模型对“水平裂纹”这类方向性特征的理解。二是过大的缩放把缺陷缩得比实际产线还小模型会学到在模糊特征上瞎猜。增强的目的是模拟真实分布而不是创造不可能出现的图像。所以在实验中我们通过控制缩放范围在0.8到1.2倍之间尽量保证增强后的图像和真实产线拍摄的图像分布一致。另外数据增强不一定非要做成离线扩图。把增强写在数据加载器里在线随机增强每个epoch看到的图像都不完全一样既能提高泛化又不用把几百G的增强图像写进硬盘。只有数据集真的很小且需要大量重复训练时才考虑离线增强。3. 模型选型与训练实验从ResNet到YOLO的取舍3.1 先想清楚你需要的到底是分类还是检测模型选型之前先回答一个问题你要的是“知道砖有没有问题、是哪种问题”还是“知道问题在砖面的哪个位置”需求推荐路线输入尺寸输出只判断缺陷类别CNN分类网络224×224或256×256类别标签需定位缺陷位置YOLO系列目标检测640×640矩形框类别需精确分割缺陷轮廓分割模型512×512以上像素级掩码我们最初做的是“缺陷分类数据集”所以主力是CNN分类。但我在项目中期发现崩边缺陷如果同时存在多处而且分散在不同角落分类模型只能回答“有崩边”没法告诉后端“两处崩边一处在左上角一处在下缘”。这时候就需要检测模型接力。实际项目中我建议先花两周把分类模型跑通再从数据里抽出一部分做检测标注。分类模型可以快速验证“数据能不能学出来”检测模型则负责落地“能不能定位出来”。这里特别提醒不要因为看到网上很多YOLOv8教程就一上来套检测模型。检测模型标注成本是分类模型的数倍训练也需要更多图片。如果业务上只需要判断缺陷类型分类模型更轻、更快、更好调。3.2 5000张图该选什么网络我们最终的数据集总量在6000张左右其中正常砖1000张5类缺陷各800到1200张。这个规模在工业图像分类里属于“小到中等”用不了特别大的模型。对比下来ResNet18和EfficientNet-B0表现最稳MobileNetV3则适合后续部署到低算力设备。ResNet18的参数量少、结构成熟最重要的是在ImageNet上预训练过的权重很容易找到迁移学习效果好。EfficientNet-B0理论上精度更高一点但对训练超参数更敏感调不好反而容易过拟合。MobileNetV3的优势是推理快缺点是特征提取能力稍弱到了针孔和斑点这种细粒度分类上会明显比ResNet18吃力。如果你是第一次做类似项目我建议直接用ResNet18打底。它足够简单出问题好排查精度对于5万到10万张以内的工业图像数据集也不会成为瓶颈。一定要用预训练权重不要从零开始训练。我们的实验里从零训练ResNet18在验证集上只能到88%左右用ImageNet预训练权重微调后能到94%以上差距非常明显。3.3 训练参数与数据划分把坑提前堵住一套能复现的实验配置比任何“炼丹玄学”都重要。我习惯把训练参数写死在配置里然后固定随机种子保证每次实验结果可对比。下面这一组是实测效果比较稳定的配置数据划分训练集:验证集:测试集 7:2:1分层采样 输入尺寸224×224 Batch Size32 优化器AdamW初始学习率 3e-4 权重衰减1e-4 学习率策略warmup 3个epoch余弦退火到 1e-5 损失函数交叉熵 label smoothing 0.1 训练轮数50轮早停patience 10 数据增强在线增强随机翻转、随机旋转90/180/270、亮度/对比度抖动为什么选AdamW而不是SGD这个数据量下AdamW收敛更稳对学习率不那么敏感适合做算法验证。如果你想让模型精度再压榨一点可以把优化器换成带动量的SGD学习率设为0.01训练时间会更长但最终的泛化能力往往更好。工业项目里先求稳定跑通再追求极限精度。数据划分是我特别想强调的一点。整个过程必须保证分层采样也就是每个类别在train、val、test中的比例保持一致。简单随手train_test_split时要加上stratifylabel这个参数。否则如果某个类别本来只有800张随手一划分测试集里可能只有50张评估结果波动就会非常大一次实验出来97%下一次换随机种子变成91%根本没法分析改进方向。3.4 评价指标别只盯着准确率多分类任务最忌讳只看整体准确率尤其是缺陷数据天然不平衡的情况。我平时看四类指标每个类别的精确率precision、召回率recall、F1分数以及测试集上的混淆矩阵。精确率关心的是“模型说是裂纹的图里有多少真的是裂纹”召回率关心的是“所有的裂纹图里模型找回了多少”。对产线来说召回率低意味着漏检缺陷砖流到客户手里精确率低意味着误检好砖被错杀返工成本升高。两类问题都要人命。我们的基线模型在测试集上的分类报告大概长这样缺陷类别精确率召回率F1裂纹0.960.940.95崩边/崩角0.970.960.96针孔0.880.920.90缺釉/缩釉0.930.900.91斑点/杂质0.910.940.92正常砖0.990.980.99整体准确率94.7%但你看针孔那一行的精确率只有0.88意味着模型打出10次“针孔”标签差不多有1次是错的。如果不看分项指标这个问题会被整体准确率盖住。所以评估时必须把classification_report和confusion_matrix打印出来发现问题后再回看具体误判样本。4. 训练实验里最容易翻车的细节和我的排查过程4.1 验证集卡住不动问题出在数据读取还是标签项目中期我发现验证集准确率卡在89%左右连续15个epoch没有提升。训练集loss还在继续下降这明显是过拟合但问题没这么简单我之前跑另一组实验时同样的模型同样的数据验证集能到93%。为什么这组就卡住了我没有急着调学习率或者换模型而是按顺序排查。第一步取了20张验证集图像把模型预测结果打印出来和真实标签做对比发现几乎所有误判都发生在“针孔”和“斑点”两类之间。第二步打开标注记录回到原始图片库把针孔和斑点的边界样本全部翻出来看。第三步我发现问题的根源不在模型而在标注规范早期标注时一个芝麻大的暗色小点甲标注员标成针孔乙标注员标成斑点两个人的标准不一致。这就是数据集的“脏标签问题”。模型在杂乱标签上只能学到“这两个类别有很多共同特征”所以验证集怎么都上不去。解决方式是把有争议的样本全部挑出来重新定标注口径再人工复核。我们把“直径小于2mm、近似圆形、边界清晰”的归为针孔“形状不规则、颜色明显偏黑或偏黄、面积可大可小”的归为斑点并给标注人员配了标尺卡拿不准就量一下。重新清洗完这200多张争议图模型准确率直接跳到93.8%。4.2 一个典型的“看起来涨点、实际没用”的调整有一次我想试试加一个注意力模块能不能提升精度网上看了不少文章都说SE模块对CNN有效。我加进去后测试集准确率确实从93.8%涨到了94.3%当时还挺开心。但后来我发现这次测试集划分时忘了固定随机种子每次划分出来的测试集都不一样。把随机种子固定、重新划分之后SE模块的提升只有0.3%在误差范围内基本等于白加。这个经历想提醒所有做实验的人工业项目的对比实验必须保证数据划分、数据增强、模型初始化三者完全一致只改变你要测试的那一个变量。否则你根本不知道指标变化是来自改动还是来自随机波动。最好把每个版本的配置、指标、测试集划分的随机种子都记录下来组内评审时一键复现。4.3 类不平衡带来的假阳性加权采样怎么调缺陷数据天然有长尾分布。我们数据集中正常砖有1000张斑点类也有1000张但针孔类只有600多张缺釉更少只有500多张。如果不做处理模型会倾向于把不确定的样本预测成“正常砖”因为训练中正常砖样本多模型见得多、学得好整体loss也更容易被主导。处理类不平衡我推荐先试加权损失函数也就是给样本少的类别更高的损失权重。PyTorch里可以直接给CrossEntropyLoss传一个weight参数class_weights torch.tensor([1.0, 1.0, 1.8, 2.2, 1.2, 1.0]) criterion nn.CrossEntropyLoss(weightclass_weights)权重的设置一般是某类样本数的倒数再归一化。如果加权后还有问题再考虑用WeightedRandomSampler做采样让每个batch里各类别出现的概率均衡。这两种方式我都试过加权损失函数实现简单、训练稳定加权采样会更加直接但要注意batch内重复样本增多训练速度会下降。我们的最终方案是二者结合先加权重然后看混淆矩阵如果某些类别召回率还是太低再加加权采样。4.4 换一条产线效果暴跌域偏移问题模型在测试集上已经能到95%了我以为基本收工结果把模型部署到另一条生产线上实测准确率直接掉到78%。这两条线生产的瓷砖规格不同花纹深浅不同周围环境光也不一样。最要命的是第二条线的相机曝光参数和第一条线不一样拍出来的图像整体更亮对比度更低。这就是典型的域偏移domain shift。深度学习模型对输入分布的变化极其敏感哪怕只是图像亮度分布变化都可能导致特征偏移。缓解方式有几个层次第一在训练数据增强里加入更激进的亮度抖动、对比度抖动和灰度扰动让模型对亮度变化不敏感第二如果允许用第二条线的20到30张图像做小样本微调很快就能重新对齐第三把图像预处理标准化成固定模式比如先转灰度图再做直方图均衡化减少颜色信息对模型的干扰。从根本上说最好是在数据集构建阶段就考虑多产线覆盖。我们现在采集数据都会刻意安排两个不同时段、不同光照方向、不同砖型批次保证数据本身就有足够的分布多样性。5. 从实验室到产线部署与持续迭代的实践经验5.1 模型导出与推理速度模型训练完成后不能直接拿PyTorch那套代码上产线。工业现场通常不用Python环境跑推理模型要导出成ONNX或者TensorRT引擎方便C或者边缘设备调用。分类模型导出ONNX后在CPU上推理一张224×224图像延迟大约5到10毫秒如果换成GPU或者TensorRT可以压到2毫秒以内。这个速度对大多数瓷砖产线是绰绰有余的——产线上相机通常一秒拍几块砖单张图像推理时间必须在几十毫秒内完成。对YOLOv8检测模型我建议先切成YOLOv8n或者YOLOv8s导出为TensorRT的FP16引擎在NVIDIA的嵌入式设备上640×640输入的单张推理大约在5到15毫秒。模型剪枝和量化是后面的事不要一开始就做。最容易出的偏差是TensorRT的精度和PyTorch略有不同可能在边界样本上产生不一致所以部署前必须同一批测试集分别跑一遍PyTorch和TensorRT对比输出差距是否在可接受范围内。5.2 产线的图像触发和结果联动算法部署不是把模型跑起来就完事了。产线上有个很实际的工程问题图像怎么触发、结果怎么返回。我们的方案是光电传感器检测到瓷砖到位发送触发信号给工业相机拍摄图像进入队列推理进程从队列取图模型判断后把结果发送给PLC。这套链路里最容易出问题的地方是队列积压。如果相机拍摄速度大于推理速度队列长度会持续增长延迟越来越高。所以必须做压测确认在最大节拍下端到端推理时间小于相机的拍摄间隔。另外瓷砖产线的传送带通常不是完全匀速的偶尔会有停顿导致砖块在画面中的位置有偏移。这个偏移在2到3厘米范围内对分类模型影响不大但检测模型画框会偏移。处理办法是在画面中设定一个固定的检测ROI区域只对ROI内的图像做推理或者先做一个简单的目标定位把砖块区域裁出来再送入模型。5.3 缺陷分类结果要形成业务闭环如果一个模型上线后数据只被用来“报警”那它创造的价值就只发挥了一半。缺陷分类的真正价值在于把缺陷统计结果反馈到工艺端。比如我们上线三个月后统计发现斑点类缺陷在每天下午两点到四点明显增多而崩边类缺陷主要集中在换班前后。后来查下来下午两点到四点是原料仓搅拌设备切换批次的时间原料中铁杂质含量波动导致斑点增多换班前后崩边增多是因为新到岗的切割工位操作手法还不够稳定。有了缺陷分类数据生产主管能很快定位问题环节而不是让质检员凭记忆猜。这块业务闭环需要你在需求阶段就和工艺部门对齐模型输出哪种缺陷标签对应哪个工位、哪种工艺参数、哪种处理动作。最好把每类缺陷和返修动作做一个映射表后端系统根据推理结果自动分发指令。5.4 用漏检误判样本做持续迭代工业视觉项目没有“模型上线就结束”的说法。瓷砖表面缺陷形态会随着窑炉老化、釉料批次、季节变化而漂移模型必须持续迭代。我在产线侧加了一个数据回流通道每天自动把推理置信度低于0.9或者模型预测和质检员复检结果不一致的样本保存下来每周人工复核一次筛选出标注错误和模型没见过的缺陷形态补充到训练集里。分类模型重训一次成本很低在几张GPU卡上跑30到50轮也就一两个小时。重训后先在留一周的在线数据上做离线回放确认指标没有回退再更新线上模型。这套流程跑顺之后模型精度会随着时间推移稳步上升。别指望一朝一夕搞一个万能模型持续迭代才是工业质检项目真正能落地的关键。最后说一点个人体会。我踩过最大的坑就是一开始以为算法先进就能赢最后发现赢在数据基础和人机协作流程上。如果你准备做自己的瓷砖缺陷分类数据集我的建议很简单先和产线老师傅把缺陷定义写清楚再花时间把拍摄标准化然后才轮到模型。前面这几步做得越扎实后面模型训练和部署的痛苦就越少。本文还有配套的精品资源点击获取
返回列表