热轧带钢表面缺陷检测:深度学习实战与产线落地指南

发布时间:2026/9/26 3:57:43
热轧带钢表面缺陷检测:深度学习实战与产线落地指南 简介面向计算机专业毕业设计、课程设计和期末大作业场景这份资料提供了一套基于深度学习的热轧带钢表面缺陷自动检测完整方案涵盖数据预处理、模型设计、训练评估与界面可视化等关键环节包含卷积神经网络优化与迁移学习思路并针对裂纹、凹坑、划痕等典型缺陷进行分类识别。压缩包内共15个文件包括7个源码脚本、2个界面文件、2份PDF文档中期报告与答辩PPT、环境配置、说明文本及模型权重文件总大小7.01MB结构清楚。已有70人学习浏览适合需要完整项目参考的学生。资源中既有可运行的训练与测试代码也给出数据集网盘地址和训练好的模型权重便于直接复现缺陷识别流程同时论文与答辩材料可辅助撰写研究报告整体实用性强。1. 热轧带钢表面缺陷检测深度学习能解决的远不止“找裂纹”热轧产线的表面质量检验过去靠质检员肉眼盯在线监控画面一条产线一小时要过几百米带钢眼睛早花得不行。后来用传统机器视觉做阈值分割、边缘检测起初能抓大块氧化铁皮一到光照变化、水雾、板面高速抖动就彻底翻车。深度学习进这个场景本质是把“缺陷长什么样”的界定权交给数据模型从成千上万的带钢图像里自己学“裂纹、麻点、氧化铁皮、划伤”的特征而不是人去写死一个灰度阈值。这个方向已有公开数据集NEU-DET、成熟源码YOLO 系列、Faster R-CNN和大量论文支撑适合刚入门的学生做课题也适合工厂工程师评估“能不能上产线”。本篇按“数据集 → 模型 → 源码 → 训练 → 避坑 → 落地”的顺序把这条路讲透。2. 数据是前提从 NEU-DET 到自建热轧缺陷数据集2.1 公开数据集能做什么NEU-DET 的字段、类别与坑做热轧带钢表面缺陷检测绕不开东北大学发布的 NEU-DET 数据集。它包含 1800 张 200×200 像素的灰度图标注成“裂纹crazing、夹杂inclusion、麻点patches、氧化铁皮rolled-in scale、划伤scratches、斑块pitted surface”六类每张图一个或几个缺陷框是早期的工业检测经典数据集。拿它跑通深度学习模型足够了但直接把它当成产线效果做预算后面会哭。这个数据集的坑在细节一是类别极不均衡“氧化铁皮”类数量远远多于“裂纹”二是 200×200 分辨率对细长划伤来说太低很多划伤只有几个像素宽肉眼都难辨三是它的照片是实验室采集的没有水雾、油污、震动模糊和真实现场差距很大。所以我把 NEU-DET 定义为“炼丹基准集”——用来调网络结构、验证模型能不能收敛而不是用来宣称系统能达到多少准确率。2.2 产线自采数据的标注策略缺陷边界怎么画才不算错如果奔着落地去一定要自建数据集。常见做法是在现有产线的质检区加一台高速工业相机用频闪光源冻结带钢运动采集原始图像。采回来要做三件事清洗、裁切、标注。清洗是删掉没有缺陷的“空帧”但注意不能全删——负样本也要留一部分否则模型没见过正常表面会把水印当成缺陷。标注是最容易翻车的一步。热轧缺陷不是都像目标检测框那样能框得干净裂纹是树根状氧化铁皮是一大片麻点是密密麻麻的小点。用矩形框标注大片氧化铁皮框里大部分像素其实是正常板面模型一学就乱。我的标注策略分两类孤立缺陷划伤、夹杂用矩形框做目标检测区域缺陷麻点、氧化铁皮用多边形勾轮廓做分割。如果你坚持只做目标检测那至少把“氧化铁皮”这类大块缺陷拆成多个小框不要一个框框满整片区域。标注工具我一般用开源的 LabelMe 或 X-AnyLabeling导出成 JSON 或 COCO 格式。团队标注时一定要写标注规范存在争议的缺陷标记为“待定”不要硬分。否则两个标注员对同一张图一个标“裂纹”一个标“划伤”模型会学疯。2.3 数据增强的边界别把氧化铁皮增强成“新缺陷”热轧现场的光照、角度不可能固定数据增强是必要的。对 200×200 的小图我通常做随机旋转±15°、水平翻转、亮度对比度扰动和高斯噪声。但有两个坑必须注意第一不要做随机裁剪缩放——带钢缺陷的尺度相对固定过度缩放会把“麻点”放大成“斑块”把语义搞乱第二不要做马赛克增强像 YOLOv5 的 Mosaic去拼接四张图因为带钢表面有纹理方向拼接会产生虚假的条状边界模型容易把拼接线学成“划伤”。我一般在训练集上用 Albumentations 库做增强代码示例如下import albumentations as A from albumentations.pytorch import ToTensorV2 train_transform A.Compose([ A.Rotate(limit15, border_mode0, p0.5), A.HorizontalFlip(p0.3), A.RandomBrightnessContrast(brightness_limit0.1, contrast_limit0.1, p0.3), A.OneOf([ A.GaussNoise(var_limit(10, 50), p0.5), A.MotionBlur(blur_limit4, p0.5), ], p0.3), ToTensorV2() ])这段代码设置了旋转、翻转、亮度对比度扰动并用OneOf在噪声和运动模糊里二选一。border_mode0表示旋转后的边界填黑对带钢图像来说填黑比填镜像更安全因为镜像填充会产生伪纹理。注意我没有用随机缩放避免影响缺陷尺度。参数上旋转角度不超过 15°模糊核不超过 4 像素这些值是从实际产线振动幅度反推出来的盲目加大只会让模型学会“看模糊”不会提高真实能力。3. 模型选型与源码跑通从分类到检测到分割的取舍3.1 先定位任务缺陷检测不只有目标检测一条路面对标题里“缺陷自动检测”几个字很多新手第一反应是“用 YOLO 做检测”。但热轧带钢表面缺陷里有很大一类是“区域型”比如氧化铁皮“一大片”用矩形框去框没有任何意义。正确做法是先把任务分成三层分类判断这块带钢有没有缺陷。适合当产线的粗筛但无法定位。目标检测标出孤立缺陷的位置和类别。适合划伤、夹杂、裂纹。语义分割逐像素判断每块区域是什么缺陷。适合麻点、氧化铁皮这类区域缺陷。产线落地通常不是选一个模型而是两条支路并行一条用目标检测抓孤立缺陷一条用分割抓区域缺陷。如果你的资源只够做一个优先做分割——因为分割模型可以输出缺陷面积和占比这些是质检记录里真正要填的数据而目标检测只能给你一个框。3.2 用 YOLOv8 跑通最小训练流程YOLOv8 是当前最顺手的基准源码。Ultralytics 官方仓库把训练、验证、导出打包成了一行命令很适合快速出基线。先准备数据集目录结构放到datasets/neu下neu/ ├── images/ │ ├── train/ # 训练集图像 │ └── val/ # 验证集图像 ├── labels/ │ ├── train/ # 训练集标注 txt │ └── val/ # 验证集标注 txt └── neu.yaml # 数据集描述文件neu.yaml内容如下path: datasets/neu train: images/train val: images/val names: 0: crazing 1: inclusion 2: patches 3: rolled-in_scale 4: scratches 5: pitted_surface这是 YOLO 格式的标准数据集描述。path是数据根目录train和val指图片路径names按 id 顺序列出类别名。注意标签 txt 里每行是class_id x_center y_center width height坐标是归一化到 0~1 的。如果从 LabelMe 的 JSON 转过来用脚本把多边形或矩形坐标转换一下即可。数据备好后安装 ultralytics 包并开始训练pip install ultralytics yolo train dataneu.yaml modelyolov8n.pt epochs100 imgsz640 batch16这行命令用yolov8n预训练权重做迁移学习训练 100 轮输入分辨率 640×640。yolov8n是最轻量的型号适合先跑通验证逻辑如果精度不足再换成yolov8s或yolov8m。imgsz640是从 200×200 原图上采样来的不是必须的如果你的标注框很小建议imgsz640以上否则小目标特征会丢。训练完成后模型权重保存在runs/detect/train/weights/best.pt。测试一句yolo predict modelruns/detect/train/weights/best.pt sourcedatasets/neu/images/val它会自动把所有验证集图片跑一遍并把画了框的结果存到runs/detect/predict。这一步主要看两件事框有没有贴住缺陷边界类别是否错乱。如果发现“裂纹”被频繁标成“划伤”别急着调模型先回查标注。3.3 想发论文/进产线Faster R-CNN 与分割模型的适用场景YOLO 类单阶段检测器胜在快但缺陷检测场景对速度没那么敏感对漏检却极其敏感。论文里常见做法是用 Faster R-CNN 作为基线它的两阶段结构对难例细裂纹、弱对比度缺陷召回率通常比 YOLO 高。如果你做课题拿 Faster R-CNN 与 YOLO 做对比实验是很稳的套路。实现上直接跑 MMDetection 或者 Detectron2 的源码NEU-DET 有现成 COCO 格式转换脚本。如果缺陷形态是“一片一片的”建议用语义分割。经典方案是 U-Net 加 ResNet 编码器热轧场景下输入图不需要特别大512×512 足够。分割模型的源码链路相对复杂我用的是 smpsegmentation-models-pytorch库import segmentation_models_pytorch as smp model smp.Unet( encoder_nameresnet34, encoder_weightsimagenet, classes6, activationNone, )这段代码创建了一个以 ResNet34 为编码器的 U-Net输出 6 类分割图不做 softmax在 loss 里处理。用 ImageNet 预训练权重做初始化对缺陷这类纹理特征有强迁移效果。classes6对应六类缺陷如果想额外分割“正常表面”那就设 7。训练时用 DiceLoss 加 BCE 或者用 CrossEntropyLoss。数据不平衡时DiceLoss 通常比 CE 稳因为它是按区域重叠率计算的不容易被大块氧化铁皮带偏。输入图像建议做均值和方差归一化热轧图像对比度差异大归一化的坑比模型结构更常见。4. 训练与评估mAP 之外热轧现场还看这 4 个指标4.1 mAP 的误导类别不平衡下的假阳性论文里默认指标是 mAP0.5但在热轧缺陷场景mAP 有一个明显缺陷它对各类别平均而小样本缺陷比如裂纹稍微错几个mAP 掉得不多可现场最怕的就是裂纹漏检。你真正要盯的是每个类别的 AP尤其是裂纹和划伤这两类。看训练日志时不要只看 total loss 曲线。YOLO 训练结束后会输出混淆矩阵confusion_matrix.png这是最重要的诊断图。如果“裂纹”行的值大量落在“划伤”列说明这两类的特征太像要么合并类别要么增加难例样本。很多坑论文不写NEU-DET 里裂纹和划伤在灰度图上其实很难分人眼都会犹豫模型分错很正常。你在论文里可以把这两类合并成“表面线性缺陷”立刻解决一大半准确率问题。4.2 针对热轧的评估指标误检率 vs 漏检率产线质检关心的是有缺陷的钢卷别漏出去没缺陷的带钢别被误杀。所以比 mAP 更重要的是三个数漏检率False Negative Rate缺陷被当成正常、误检率False Positive Rate正常被当成缺陷和重复报警率。在训练集上评估远远不够我一般单独存一批“难例集”挑那些水雾重、油污多、带钢震动模糊的画面专门测试误检率。热轧的误检大头来自水雾形成的反光条纹模型很容易把它们学成划伤。计算这些指标不要自己写循环直接使用模型在验证集上的预测结果结合真实标注算from sklearn.metrics import confusion_matrix # y_true为真实类别idy_pred为预测类别id-1表示误报/漏报 cm confusion_matrix(y_true, y_pred) fnr cm.sum(axis1) - cm.diagonal() # 每类漏检数 fpr cm.sum(axis0) - cm.diagonal() # 每类误检数这段代码用 sklearn 算混淆矩阵fnr是每一类被漏掉的数量fpr是每一类被错认的数量。注意这里的-1代表背景类需要先过滤掉。看这两个向量的分布一般会发现麻点类fpr很高因为麻点密集分布预测框容易重叠重复报警裂纹类fnr很高因为细裂纹在图像里只有几个像素模型极易忽略。4.3 训练超参数批次、学习率、锚框在 304 不锈钢上的经验值热轧缺陷检测的超参数跟自然图像检测差别不小。我长期调参的经验是输入分辨率NEU-DET 原图 200×200放大到 640 几乎不增加信息反而增加显存。先试 416再试 640对比 mAP 差异。如果小于 3 个点用 416 更划算。Batch size显存允许下尽量大。工业图像背景单一bn 层的统计量需要大批次才稳定。8GB 显存跑 YOLOv8nbatch16通常没问题。学习率迁移学习时初始学习率不要超过 0.001。我发现用cos_lr衰减比固定步长衰减更稳因为热轧表面纹理周期性很强固定步长容易在后期反复振荡。锚框YOLOv8 是 anchor-free 的不用调。如果你改回 YOLOv5记得用yolo train里--noautoanchor关掉自动锚框重新计算热轧缺陷的长宽比极端划伤长宽比可达 1:20默认锚框完全不够用。另外我习惯关闭 YOLO 的 mosaic 增强前面说了原因这里再强调一遍热轧图里叠加四张图拼接线宽度 1-2 像素很像划伤模型学到的是“拼接检测器”下产线就废。5. 避坑指南热轧带钢缺陷检测最常见的 6 个坑5.1 坑一直接迁移 ImageNet 权重在灰度图上效果反而变差现象用yolov8n.pt在 RGB 彩色图上预训练直接训练灰度图发现收敛很慢前 30 轮 loss 不动。原因ImageNet 预训练权重的第一层卷积核是为 RGB 三通道设计的你把它变成单通道时默认操作是复制三次或者取均值等于把预训练知识丢了一半。热轧灰度图还缺少 ImageNet 里那种丰富的物体边缘、角点特征迁移增益被削掉。解决不要把灰度图复制成三通道。要么在输入端用单通道模型要么对灰度图做伪彩色映射比如用 skimage 的gray2rgb这样至少保留通道一致性。时间充裕的话直接从随机初始化训练一套灰度模型作为对照往往更诚实。5.2 坑二缺陷框标注得太“紧”训练时上下文全丢现象模型学完后检测框总是偏小把缺陷截掉一半尤其划伤。原因标注规范太追求贴合缺陷像素框紧贴划伤边缘导致正样本里全是“缺陷特写”没有周围板面纹理作为上下文。深度学习检测目标时周围背景是有用的判别信息特别是低对比度缺陷。解决标注时每个框向外扩 10~20 个像素固定扩边让模型既看到缺陷又看到周边纹理。扩边量根据原图尺寸定NEU-DET 200×200 的图扩 5 像素就够大了产线大图可以扩 20~30 像素。5.3 坑三验证集跟训练集有“血缘关系”mAP 虚高现象把产线同一卷带钢的视频帧切出来随机分配到 train 和 val训练时 mAP 到 0.98一到现场新拍的图就掉到 0.7。原因相邻视频帧几乎一模一样模型相当于“记住了”这些帧验证集是开卷考。工业缺陷是连续出现的同一块缺陷可能被拍了几十帧切分时没有按“缺陷实例”隔离。解决按时间窗口切分把同一卷带钢的连续帧放到同一侧或者按缺陷实例去重。最稳妥的做法是以“不同批次/不同炉次”的数据做验证模拟真正的跨产线迁移。5.4 坑四只使用彩色图而忽略红外/深度信息现象模型在打光均匀的实验室图效果好产线白天和夜晚效果差异大。原因许多热轧线除了可见光相机还有红外相机或激光轮廓仪。深度学习只吃 RGB等于放弃了对温度、高度差敏感的缺陷比如麻点深度、氧化铁皮的堆积厚度信息。这些在灰度图里表现微弱但在红外图里非常清晰。解决如果产线有多模态数据做一个简单的两路输入可见光图进 RGB 分支红外或深度图进灰度分支在检测头前融合。这个改动网络不大但能显著提升对麻点和氧化铁皮的召回。如果只有单相机至少要做光度校准让不同灯光下的图像方差接近。5.5 坑五只调模型不调光源最后模型等于白训现象训练时用随机增强模拟光照变化现场测试仍然过不了误检一堆。原因光源方向和强度固定后板面纹理的阴影会掩盖真实缺陷。深度学习模型是“吃数据”的你要是喂给它一堆对比度极低、水雾严重的图它只能学会猜。模型的精度上限由数据质量决定调架构只是在逼近这个上限。解决先解决成像问题。用高亮低频闪光源加偏振滤光片消除反光确保带钢在图像里占满视野且不出现过曝。在调试产线时我会带一块已知缺陷的样板过线先人工确认画面能看清缺陷再训练模型。成像做不好后面的功夫全白费。5.6 坑六忽略推理速度上了产线延迟爆炸现象实验室用大模型 mAP 很高部署到工控机发现一帧处理 500 毫秒带钢已经跑出去一米多根本没法实时。原因检测速度不只看模型大小还取决于输入分辨率、前后处理和后量化。很多人只关注模型 FPS忽略了“从取帧到输出坐标”的全链路延迟。解决在选模型前先定产线节拍。一般热轧线相机帧率 30~60fps你不需要每帧都检测可以做抽帧检测比如每 5 帧检测一次只要重叠框做时间去重也能实现连续性监控。模型层面先用onnxruntime或 TensorRT 导出把输入分辨率降到最低可接受值。我在实际项目中用 YOLOv8n 加 TensorRT416 分辨率下推理时间 8~12 毫秒整个链路控制在 40 毫秒以内。6. 进阶技巧从离线检测到产线实时监控的工程化当模型在离线图片集上达到要求下一步才是真正拉开差距的工程环节把模型塞进产线系统。常见做法是搭一个“相机 工控机 控制器”的闭环。相机触发后图像传到工控机里的推理服务服务返回缺陷类别、坐标和面积再把这些信息推给 PLC 触发报警或标记。我一般用 FastAPI 包一个推理服务流程很短但有几个细节需要特别注意。输入图像按模型要求先resize到目标尺寸再做归一化。热轧图像是 16 位灰度图时记得先转成 8 位img.astype(np.uint8)否则模型输出的概率分布会乱掉。推理返回的坐标要映射回原图尺寸公式很简单x_orig x_norm * orig_width。如果同时跑检测和分割两个模型用两个独立进程或者两个 GPU 流不要混在一个进程里否则显存碎片会让吞吐忽高忽低。产线调试时我从第一个班次开始记录所有误报和漏报的缩略图每晚做一次增量微调。增量微调不是拿新图无脑训练而是把当天误报率最高的 100 张图挑出来重新标注后加入训练集用低学习率lr0.0001只训练 20 轮防止灾难性遗忘。这套“日报 周训”的节奏能让模型在线稳定运行。最后的习惯是我每次上线前必做的把训练集里最好和最差的样本各打印一页贴出来跟质检员、工艺员一起过一遍。如果他们说“这个框画得不对”那是标注问题如果他们看着图说“这块其实算正常”那才是真的需求理解问题。这一关过了系统才算真正被现场接受而不是模型自己以为的“准”。希望这个方向能帮你在热轧质检里少踩几个坑。本文还有配套的精品资源点击获取