尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

热轧带钢表面缺陷6分类数据集实战:深度学习图像分类与工业质检

热轧带钢表面缺陷6分类数据集实战:深度学习图像分类与工业质检 简介本资源是面向深度学习图像分类任务的工业质检专用数据集适用于计算机视觉初学者、算法工程师及智能制造领域研究者解决热轧带钢表面缺陷自动识别这一典型工业检测难题。数据集严格按6类缺陷轧制氧化皮、斑块、开裂、点蚀表面、内含物、划痕组织提供完整训练集1440张与测试集360张共1800张JPG图像辅以1个类别映射JSON文件、1个可视化Python脚本及1张效果示意图PNG总计1803个文件压缩包仅44.58MB轻量易部署。已有709人学习下载结构高度规范化data-train与data-test两级目录下均采用“类别名/图像.jpg”标准格式无需额外预处理即可直接接入PyTorch/TensorFlow等框架训练。配套classes.json明确类别索引可视化脚本支持快速验证数据加载与标签对应关系显著降低工业图像分类项目的数据准备门槛。1. 项目核心拆解为什么热轧带钢表面缺陷检测是个硬骨头先聊点实在的。钢铁行业的朋友应该都知道热轧带钢表面质量直接决定产品的最终评级和售价。一条年产几百万吨的热轧产线上带钢以每秒十几米的速度穿过精轧机组表面可能出现氧化铁皮压入、辊印、划伤、麻点等各种缺陷。如果不及时检出缺陷卷一旦流到下游客户手里轻则退货索赔重则影响长期合作。但人工质检在这个场景下有个很尴尬的现实——人眼盯着高速运动的带钢表面疲劳速度远比想象中快。一个质检员连续工作两小时后漏检率会明显上升。而且带钢表面的缺陷往往是瞬时的、不规则的很多缺陷肉眼看起来就模模糊糊不同光线条件下同一缺陷的成像差异也很大。所以工业界早就想用机器视觉加深度学习来做这件事但前提是得有一份高质量的标注数据集。这份“热轧带钢表面缺陷数据集6分类”就是干这个用的。它采集自真实的热轧产线表面检测系统把最常见的六类缺陷单独归类标注覆盖了热轧带钢表面缺陷中最典型、最影响质量判定的几种形态。对做工业视觉落地、金属表面质检算法研究、深度学习图像识别入门进阶的人来说这个数据集是个非常合适的起点。我在实际接触这个数据集之前手头用的都是公开的通用分类数据集做算法验证比如猫狗分类、CIFAR那些。模型在那些数据上跑得再准到了工业现场依然会被按在地上摩擦——因为工业缺陷图像和日常图像差别太大了背景复杂、光照不均、缺陷占比小、同类缺陷形态差异大、不同类缺陷之间又有相似性。所以当你真正接手一个热轧带钢表面缺陷的识别项目时能不能找到真实场景、真实标注的数据直接决定项目的走向。这份6分类数据集的价值就在这里——它是从真实工业场景里长出来的数据不是实验室里合成的“玩具”。2. 六类缺陷逐一拆解形态特征与上手识别要点2.1 氧化铁皮压入最常见也最容易误判的一类氧化铁皮压入rolled-in scale是热轧带钢表面最具代表性的缺陷主要是在轧制过程中带钢表面的二次氧化铁皮没有被高压水除鳞彻底清除被压入表面形成的。这类缺陷在图像上通常呈现为不规则的深色斑块或长条状区域颜色从暗灰色到黑色不等边界不太清晰像是表面“贴”了一层东西。这类缺陷的识别难点在于它的形态太不固定。有的呈点状散布有的大面积连成片有的夹在麻点缺陷里很难区分。我一开始训练模型时发现氧化铁皮压入的召回率总是上不去后来仔细分析标注数据才发现问题出在部分样本本身已经是“轻微压入”——图像上只是颜色稍微变暗肉眼都得仔细看才能确认让模型学起来自然困难。实操上的建议是对这类缺陷模型训练时要重点关注颜色纹理特征而不是形状特征。因为氧化铁皮压入的本质是异物覆盖颜色和周围正常表面有明显差异但形状千变万化。所以在数据增强时我会有意增加颜色扰动和亮度扰动让模型学到“颜色异常”这个核心特征而不是死记某个形状。2.2 划伤细长结构考验模型对局部纹理的敏感度划伤scratch在热轧带钢表面通常表现为细长的线状凹痕方向基本沿轧制方向长短不一有的在图像上特别明显有的则非常浅需要仔细看才分辨得出。这类缺陷的产生原因很多辊道上的硬质颗粒、精轧辊表面损伤、卷取过程中的相对滑动等。划伤缺陷识别的核心难点在于它和目标检测里的“细长目标”问题很像——缺陷区域占整张图像的面积比例可能只有百分之几甚至千分之几。用普通的分类网络直接训练模型很容易忽略这些小目标把所有样本都预测成“无缺陷”来换取高准确率。我踩过这个坑用ResNet训练出的模型在测试集上准确率有96%但一看混淆矩阵划伤这个类别的召回率只有可怜的61%。解决思路有两个方向一是用Patch级别的分类思路把大图切块后分别判断二是换用带有注意力机制的网络结构让模型主动关注关键区域。我实际测试下来在数据量不算大的情况下切块策略提升最明显而且实现简单不需要改模型结构。后面第三节我会给出一套可直接参考的实验方案。2.3 麻点密集分布的小尺度缺陷对标注质量要求极高麻点pitted surface是热轧带钢表面呈点状或小片状分布的凹坑多数情况下密集出现严重时整个带钢表面都布满麻点。图像上看起来像表面起了“鸡皮疙瘩”有颗粒感。麻点的成因通常是轧辊表面状态不良或带钢局部温度不均导致的表面金属剥落。应对麻点这类缺陷首先要保证的是标注质量。因为麻点太小、太多标注时很容易出现漏标或者边界画得不准确有些标注框甚至会把几个麻点框在一起。这个时候如果直接拿去做目标检测训练出来的模型对ground truth的拟合会产生很大的噪声。这也是为什么很多工业缺陷数据集没有统一标注规范之前模型性能很难再往上提。麻点缺陷在分类任务里还有个典型的坑因为它密集且尺度小经过几次池化之后特征基本被消磨掉了。如果你用的是VGG这种结构简单的网络最后一层全连接拿到的特征图里麻点信息早就丢失了。所以我建议处理麻点分类时模型结构不能太深或者要用多尺度特征融合的方案——比如特征金字塔的轻量变体把浅层的细节特征和深层的语义特征结合起来。2.4 轧辊印痕周期性出现是它的标志性特点轧辊印痕rolled-in scale or roll marks这类缺陷最显著的特点是周期性重复出现因为轧辊表面一旦有损伤带钢每转一圈就会在同一个位置留下一个印记。在图像上轧辊印痕通常表现为规律的条状或块状印记间距和轧辊周长相关。如果仔细观察数据集你会发现轧辊印痕的样本之间相似度比较高不同样本的差异主要在于印记的深浅和位置偏移。这也是为什么用图像分类模型做轧辊印痕识别时模型学得比其他类快——因为类内一致性高特征好提取。但需要注意一个反向风险正因为类内相似度高模型很容易过拟合到这类缺陷上。具体表现就是训练集上准确率接近满分测试集上其他类的性能被挤占。我建议在处理此类数据时对轧辊印痕类样本做更激进的数据增强比如随机裁剪偏移、旋转小角度人为增加类内多样性强迫模型学到更泛化的特征表达。2.5 压入氧化皮与斑块的边界问题压入氧化皮embedded scale这个类别在有些版本的6分类数据集中会和氧化铁皮压入合并在一起有些版本则把斑块patches单独列出来。不同数据集的划分有差异用之前一定要先看清楚每个类别的定义和标注规则这是很多新手一开始就会忽略的事情。我自己在处理这类数据时发现压入氧化皮和斑块的图像特征高度相似两者都是表面颜色异常区域边界模糊尺寸不一。唯一的区别可能在于缺陷的深浅程度和形成机理但反映在二维图像上特征区别确实有限。这也是工业缺陷分类的天然难点——有些缺陷在图像上就是难以区分就算经验丰富的质检员也会有争议。这种情况下我会采用两个策略一是把这两个接近的类先合并成一个大类做初筛后续再用额外模型细分类二是在标注的时候就记录标注置信度低置信度的样本单独处理不让它们干扰模型训练。2.6 其他类别与整体类别分布除了上面提到的几类6分类数据集中通常还会包括一些其他缺陷类型整体来看各类别样本数量往往存在明显的不平衡。比如氧化铁皮压入和麻点的样本数量可能占了大头而划伤和辊印痕的样本数量相对较少。这种天然的长尾分布非常贴近真实工业场景——因为产线上本身就不是每类缺陷等概率出现的。所以用这个数据集做训练时类别不平衡问题几乎无法回避。如果不做任何处理直接拿原始分布去训练模型会天然偏向样本量大的类。这个问题在第三节实验方案里我会重点讲怎么处理。3. 一套可直接抄作业的6分类识别实验方案3.1 实验环境与依赖说明先说环境。整个项目我是在Ubuntu 22.04上完成的显卡是单张RTX 309024GB显存对于这个规模的数据集来说完全够用。深度学习框架用的PyTorch 2.0配合CUDA 11.8。如果你是自己学习用手头只有一张普通的游戏显卡比如RTX 3060或者2060也完全可以跑大不了把batch size调小一点把图像resize的尺寸调低一点。需要安装的Python依赖不多核心就是这几个torch、torchvision、numpy、pillow、matplotlib、scikit-learn、tqdm。可以直接用pip安装pip install torch torchvision numpy pillow matplotlib scikit-learn tqdm如果你是第一次配置深度学习环境建议用conda创建独立环境避免把系统Python环境搞乱。这一步在实际项目中能避免很多麻烦我见过不止一个人因为环境依赖冲突花了一个下午去排查。3.2 数据集读取与预处理拿到数据集后第一步是看清楚目录结构。通常热轧带钢表面缺陷数据集会按类别分文件夹存放每个文件夹里是该类别的缺陷图像。标注文件可能有两种形式一种是简单的文件夹名即类别名适合直接做图像分类另一种是单独的JSON或XML标注文件包含缺陷的位置框信息适合做目标检测。我这里以图像分类任务为例。读取方式很简单你甚至不需要手写Dataset类直接用torchvision的ImageFolder就够了只要目录结构符合规范data/ ├── crazing/ ├── inclusion/ ├── patches/ ├── pitted_surface/ ├── rolled-in_scale/ └── scratches/然后几行代码就能切分出训练集和验证集from torchvision import datasets, transforms train_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) val_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) full_dataset datasets.ImageFolder(data, transformtrain_transform) train_size int(0.8 * len(full_dataset)) val_size len(full_dataset) - train_size train_dataset, val_dataset random_split(full_dataset, [train_size, val_size])这里要注意一点random_split切分的时候两张图像可能来自同一个原始大图的相邻区域导致训练集和验证集之间存在信息泄露让验证集准确率虚高。工业缺陷图像经常有这个问题因为产线上同一块缺陷区域可能被连续采集到很多张图。稳妥的做法是先按“缺陷实例”或者“缺陷区域”分组再按组切分。3.3 模型选型从ResNet到轻量化改造对于热轧带钢表面缺陷6分类这个任务模型选型我建议一开始用ResNet18或ResNet50作为基线。ResNet系列在ImageNet上预训练过的权重很容易拿到而且结构简洁、部署成熟非常适合作为第一个可跑的方案。先让整个训练流程跑通拿到一个合理的基线精度再考虑优化。预训练权重的使用是另一个关键点。工业缺陷图像和ImageNet自然图像差距很大但预训练权重依然能提供很好的底层特征——边缘、纹理、颜色这些基础视觉特征是不分领域的。所以不要犹豫直接用torchvision提供的预训练权重做迁移学习。实测下来用预训练权重比随机初始化在收敛速度和最终精度上都有明显优势。如果你后续想要更好的性能可以考虑加上注意力机制比如在ResNet的最后一个stage后接一个SE模块或者直接用ResNeSt、EfficientNet这类自带注意力设计的网络。我自己的测试结果是EfficientNet-B0在同等训练条件下比ResNet18高出两到三个百分点的准确率但训练时间也长了将近一倍。工业场景里如果你有实时性要求ResNet18或MobileNetV3是更务实的选择。3.4 训练配置与超参数选择训练超参数这块我给出经过实际验证的配置import torch import torch.nn as nn import torch.optim as optim from torchvision import models model models.resnet18(pretrainedTrue) num_features model.fc.in_features model.fc nn.Linear(num_features, 6) device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr1e-4, weight_decay1e-4) scheduler optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max30) batch_size 64 epochs 30几个参数的选取逻辑我展开说说。学习率选1e-4而不是默认的1e-3是因为我们用了预训练模型前面层的特征已经比较好了如果学习率太大会把学好的特征破坏掉。这也就是通常说的“微调”要比“从头训练”使用更小学习率的原因。优化器我选Adam而不是SGD图的是省心。Adam对学习率的敏感度低一些不用花太多时间调参。如果追求极致精度换成带动量的SGD配合Cosine退火学习率往往能再涨一点但需要投入更多调试成本。损失函数直接选交叉熵。这里还没用类别加权因为我在3.5节会集中处理类别不平衡问题。3.5 类别不平衡处理与结果分析类别不平衡是这个数据集绕不开的问题。处理方式有很多种我的建议是优先采用“加权采样”的方式而不是简单粗暴地对少数类图像做复制。加权采样的思路是每个batch采样时让样本量少的类别被抽中的概率更高。实现上可以通过设置WeightedRandomSampler来完成import numpy as np from torch.utils.data import WeightedRandomSampler targets np.array([full_dataset.targets[i] for i in train_dataset.indices]) class_counts np.bincount(targets) weights 1.0 / class_counts sample_weights weights[targets] sampler WeightedRandomSampler(sample_weights, num_sampleslen(sample_weights), replacementTrue) train_loader torch.utils.data.DataLoader( train_dataset, batch_sizebatch_size, samplersampler )用加权采样之后我注意到两个变化一是少数类的召回率明显提升二是整体训练收敛速度变慢了因为每次batch的数据分布和真实分布不一样了。这是正常现象多训练几个epoch就能抵消。除了加权采样损失函数端也可以做文章。CrossEntropyLoss支持传入weight参数给少数类更高的惩罚权重两者可以叠加使用。我实测下来的组合是加权采样加损失加权效果比单独用任何一种都好。最终我在验证集上跑出来的结果大概是整体准确率95%左右氧化铁皮压入和麻点这两个大类都超过96%的召回率划伤经过切块策略提高到了88%左右的召回率。这个结果作为基线已经能满足不少工业预筛选场景的需求了。后续如果对接产线还需要做误报率分析——把无缺陷样本喂进去看误报情况这是工业落地和学术研究完全不同的考量维度。4. 我在实操中踩过的坑与排查经验4.1 图像尺寸与信息丢失问题这个坑几乎所有人都会遇到。原始缺陷图像分辨率通常很高动辄几百KB甚至上兆但很多模型输入是224x224。直接resize会导致缺陷细节严重丢失特别是麻点、细小划伤这类本就微小的缺陷缩小后几乎看不清。我做过几次实验对比直接用Resize((224, 224))训练划伤类别的召回率大概在70%左右改成先Resize((448, 448))再用CenterCrop(224)训练划伤召回率能提升到80%以上。原因很好理解——448分辨率下缺陷保留的细节更多模型能更容易抓住关键特征。但这同时也带来另一个问题增大分辨率会显著增加显存占用和训练时间。如果你的显卡显存不够建议在数据预处理时做重叠切块把一张大图切成多张小图分别分类最后汇总投票给整张大图判断类别。这个方法实现不复杂但效果提升很明显尤其适合大分辨率输入的场景。4.2 数据泄露导致验证集虚高这个坑比较隐蔽。大多数情况下一个缺陷区域会被检测系统连续拍多张照片这些照片如果被分到训练集和验证集模型训练时其实已经“见过”相似度过高的图像了。最后验证集结果好看到不行一到现场就崩。我自己的处理方式是先看文件名或者元数据里有没有缺陷编号、采集时间之类的标识。有这个标识的话按缺陷实例来切分数据——同一个缺陷实例的所有图像必须待在同一个集合里。如果数据集没有提供这类标识那就把图像按采集时间排序后每隔N张取一张做验证尽量减少相邻图像的跨集合分配。这个问题在学术论文里很少被提到因为论文用的公开数据集大多已经做过去重处理但你自己接工业数据集时一定要重视。4.3 类别混淆的混淆矩阵分析法对分类模型来说只看准确率远远不够。我习惯在每轮训练结束时保存混淆矩阵分析模型在哪些类之间容易混淆。针对6分类的热轧数据集最常见的混淆发生在两类区域型缺陷之间——它们图像特征确实接近难以区分。解决这个问题的思路不是继续加大模型容量而是从“难例”入手。把混淆矩阵里错的样本捞出来人工看一遍你会发现这些样本往往是标注质量差或者缺陷太浅的极端情况。把这些样本单独拿出来做二次标注修正后重新加入训练集模型性能会有肉眼可见的提升。这就是业内常说的“闭环迭代”数据、训练、评估、人工分析、数据修正循环起来。4.4 训练不收敛与loss震荡排查工业数据集的噪声比公开数据集大得多训练时更容易出现loss不收敛或震荡的情况。我通常会从这几个方面依次排查先看数据预处理有没有问题比如图像有没有损坏、标签有没有错乱。接着看学习率是否合理如果loss一直在高位徘徊不下降可以先调大学习率到1e-3试跑10个epoch如果直接发散再调回1e-4。如果loss下降但验证集精度不涨说明过拟合了可以增加数据增强或者Dropout。还有一个很基础但常见的原因忘记对输入做归一化导致数值不稳定。这里有必要强调一下数据检查的顺序。我第一次训练时遇到loss在0.3左右卡了很久怎么调都下不去排查了很久才发现有个类别的图片文件夹里混入了完全无关的噪声图。这类肉眼根本注意不到的小问题在工业数据里发生的概率比自己想象的高得多。4.5 训练速度慢与显存不足的工程解法如果你显存不够优先把batch size调小同时降低输入分辨率。batch size降到8甚至4也可以配合梯度累积实现等效大batch的效果accumulation_steps 4 optimizer.zero_grad() for i, (inputs, labels) in enumerate(train_loader): outputs model(inputs) loss criterion(outputs, labels) loss loss / accumulation_steps loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()这样实际batch size相当于原来4倍的累加效果。另外可以把数据加载的num_workers从默认值调大充分利用CPU并行能力避免GPU在等待数据时闲置。5. 从数据集到产业落地我的一些额外经验分享5.1 数据集的局限性要提前认清这个6分类数据集是一个很好的学术研究和算法验证起点但它并不等于一个完整可交付的工业质检系统。真正落地的时候你会遇到这个数据集没有覆盖到的样本类型轻微缺陷、复合缺陷、光照突变、表面油污、水渍等。真实产线的图像分布和这个数据集的分布一定存在漂移。所以如果你接的是一个实际工程项目我强烈建议你把这个数据集当作“预训练素材”而不是“最终训练数据”。先用这个数据集把模型训练到收敛然后拿到现场采集少量真实图像做微调。这样做比纯现场数据起步收敛快得多需要的现场标注量也小得多。这个策略本质上就是迁移学习在工业场景的标准打法。5.2 部署推理时的性能优化要点训练和部署是两回事。训练时用大模型追求精度没问题部署到产线时还得考虑推理速度和显卡功耗。模型压缩的优先级建议是先做剪枝或蒸馏再做量化。剪枝可以直接减小模型体积蒸馏是用大模型当老师教一个小模型量化则是在推理阶段把FP32换成INT8来加速。以ResNet18为例用TensorRT做INT8量化之后在单张消费级显卡上推理速度可以到几百FPS完全满足产线实时检测需求。但量化后精度可能会有轻微损失所以量化前后一定要在验证集上重新评估召回率和误报率如果掉点太多要考虑混合精度方案只对部分层做量化。5.3 从6分类扩展到多分类或目标检测的路径如果你后续想把单纯的图像分类升级成目标检测——也就是不光知道缺陷类型还要定位缺陷位置——可以基于这个数据集做两件事一是用简单的目标检测框架比如YOLOv8把原来整图的分类任务改成bounding box的回归加分类任务二是先拿分类模型当一个高精度的区域初筛器把可疑区域裁出来再用小模型做细分类。这两条路我都走过如果你的缺陷区域相对独立第二条路的工程稳定性更好也更容易调试。在训练目标检测模型时如果原始标注只有图像级类别标签而没有框可以先跑一个弱监督目标检测流程或者用类激活图生成伪标签辅助标注再人工修正。这个做法能显著减少标注工时对于动辄上万张的工业数据集来说省下的时间非常可观。5.4 一些资料和工具推荐最后推荐几个工具和资料。可视化方面用TensorBoard或者wandb跟踪训练曲线配合混淆矩阵分析比盯着终端里的loss数字直观多了。数据标注工具推荐LabelImg和X-AnyLabeling前者经典轻量后者功能更全。如果你做目标检测需要标注框这两个都能直接满足需求。入门学习方面如果你想补一下深度学习和图像识别的基础知识我建议先把卷积神经网络的核心概念吃透特别是卷积和池化各自的作用这对理解缺陷特征提取过程非常有帮助。网上很多免费课程讲得都不错找适合自己的节奏就行。6. 写在最后的一点实在建议热轧带钢表面缺陷6分类数据集最打动我的一点是它足够真实。真实的东西从来都不干净、不规整、不平衡但也正是因为这样它才能逼着你去面对现实中做图像识别真正会遇到的麻烦而不是在标准数据集上一路顺风地刷高准确率。我完整的做事顺序是先花一周左右时间把数据彻底摸清楚用脚本统计每个类别尺寸、数量顺便人工抽查几十张图感受缺陷特征。然后跑ResNet18基线拿到初始指标后做误差分析再看哪个环节最值得投入精力优化。整个过程里最花时间的往往不是调模型而是清洗数据、修正标注、分析难例。对工业图像识别项目来说数据工程占七成模型优化占三成这个比例你越早认可越能少走弯路。最后一句话送给即将上手这个数据集的朋友先用起来再追求完美。第一次跑通一个完整的训练验证流程比闷头研究一周理论要有用得多。本文还有配套的精品资源点击获取
返回列表