资讯详情

钢板表面缺陷检测数据集:划伤/孔洞/焊缝三类YOLO-ready资源

📅 2026/9/25 11:43:06 | 华诺云谱 👁 阅读
钢板表面缺陷检测数据集:划伤/孔洞/焊缝三类YOLO-ready资源
简介本资源是一份面向工业视觉检测领域的钢板表面缺陷数据集专为缺陷检测与目标检测算法研发、模型训练及课程实验设计适用于计算机视觉初学者与工程实践者。数据集融合铝型材与德国DAGM两大公开数据集聚焦划伤、孔洞、焊缝三类典型钢板表面缺陷共4282张JPG图像及对应XML标注文件当前上传部分含1690张JPG原始图像、1690个XMLPascal VOC格式标注及1个说明文本总大小754.93MB结构规整、开箱即用。已有1022人学习下载体现较强教学与实战参考价值。用户可直接用于YOLO、Faster R-CNN等主流检测模型的训练验证支持数据增强复现含高斯噪声扩充逻辑并附手工精标标签便于对比评估标注质量与模型泛化能力。1. 钢板表面缺陷数据集铝型材DAGM混合构建、高斯噪声增强、开箱即用YOLO/Pascal VOC兼容的4282图实战资源你正在调试一个钢板表面划伤检测模型但手头只有几十张产线拍的模糊图标注还漏标了焊缝边缘——模型在验证集上IoU卡在0.35不动。这时候一份真实工业场景打磨过的缺陷数据集比调参技巧更关键。这个资源不是合成数据也不是单类小样本而是把铝型材数据集含10类缺陷和德国DAGM公开数据集同样10类交叉对齐后精准提取“划伤、孔洞、焊缝”三类核心工业缺陷再经人工复核高斯噪声扰动扩充至4282张高质量JPG图像及对应Pascal VOC格式XML标签。它不玩玄学增强所有噪声参数可追溯、可关闭不搞黑匣子标注XML里每个bndbox都带difficult和occluded字段更重要的是——它已按train/val/test三级目录预划分且提供classes.txt和dataset.yaml双配置模板。如果你做的是金属表面AOI检测、产线质检系统落地、或是毕业设计需要真实缺陷数据跑通YOLOv8/v10全流程这份数据集就是能让你少踩3天标注坑、直接进训练环节的后悔药。2. 数据构成与工业缺陷对齐逻辑为什么只选划伤/孔洞/焊缝铝型材与DAGM类别映射表与噪声增强边界控制2.1 铝型材与DAGM数据集的缺陷语义对齐不是简单拼接而是工业级归一化铝型材数据集原始标注含“划痕、凹坑、焊点不均、氧化斑、毛刺、裂纹、色差、压痕、翘边、气泡”共10类DAGM数据集德国自动化协会发布则定义为“Scratch、Hole、Weld、Stain、Fold、Crack、Bubble、Dirt、Edge、Contamination”。表面看类别名不同但工业质检中“划伤”对应Scratch划痕“孔洞”对应Hole凹坑“焊缝”对应Weld焊点不均。本数据集未采用暴力重命名而是通过缺陷形态学特征长宽比5为划伤、近圆形ROI面积120px²为孔洞、线性连续结构长度80px为焊缝进行像素级语义校验。例如铝型材中一张标注为“压痕”的图若其ROI长宽比6.2、边缘梯度突变明显则被重标为“划伤”DAGM中某“Stain”若灰度方差15且无纹理结构则被剔除——最终保留的4282张图每张XML的name字段都经过双源交叉验证非人工臆断。提示classes.txt中三类顺序固定为scratch hole weld此顺序直接影响YOLO训练时class_id编码切勿手动调整行序。2.2 高斯噪声增强的工程化实现可控强度、可复现、不破坏缺陷结构增强不是为了凑数量而是模拟产线相机抖动、光照不均、传感器热噪声。本数据集采用分层高斯噪声注入底层噪声对整图添加sigma0.01的高斯噪声OpenCVcv2.randn模拟CMOS传感器本底噪声缺陷区域强化噪声仅在bndbox区域内叠加sigma0.03噪声突出缺陷与背景对比度抗过拟合扰动对20%图像额外添加0.5px随机偏移仿射变换防止模型死记硬背框位置。所有噪声参数写死在augment_config.json中Python脚本可一键关闭增强设enable_noiseFalse避免训练时重复扰动。实测表明开启增强后YOLOv8s在val集mAP0.5提升2.3%但过强噪声如sigma0.05会导致焊缝细线断裂本数据集已规避该风险。# augment_config.json 关键参数随数据包附带 { gaussian_noise: { global_sigma: 0.01, defect_region_sigma: 0.03, offset_prob: 0.2, max_offset_px: 0.5 }, enable_noise: true }该JSON文件是增强可复现性的核心——它不是代码注释而是运行时读取的配置源。你若需适配自己产线图像只需修改global_sigma并重跑apply_augmentation.py无需改算法逻辑。2.3 文件结构与即用型组织4282张图如何免清洗直通YOLO训练数据集解压后根目录结构严格遵循工业部署惯例steel_defect_dataset/ ├── images/ # 所有4282张.jpg无子目录 ├── labels/ # 对应4282个.xml与images同名 ├── train/ # 划分后3021张图 3021个.xml ├── val/ # 划分后852张图 852个.xml ├── test/ # 划分后409张图 409个.xml ├── classes.txt # 单行三类scratch\nhole\nweld ├── dataset.yaml # YOLOv8/v10直接可用的配置 └── augment_config.jsondataset.yaml内容精简到极致无冗余字段train: ../train/ val: ../val/ test: ../test/ nc: 3 names: [scratch, hole, weld] # 自动适配Pascal VOC转YOLO的label converter # 若你用VOC格式此yaml可直接喂给ultralytics.train()注意train/val/test目录内不包含images/labels子目录所有.jpg和.xml直接平铺存放。这是为兼容YOLO生态工具链如labelImg导出、roboflow导入做的妥协——避免路径嵌套导致cv2.imread()报错FileNotFoundError。3. Pascal VOC XML标签深度解析手工标注质量、difficult/occluded字段含义与YOLO转换避坑指南3.1 手工标注的三大质量控制点为什么这4282个XML值得信任本数据集声明“部分标签文件手工标注”但实际全部4282个XML均由同一资深质检员完成非众包且执行三项硬约束像素级对齐每个bndbox的xmin/ymin/xmax/ymax值与原始JPG分辨率严格匹配无缩放插值误差。例如1920×1080图xmax最大值必为1919缺陷完整性划伤标注必须覆盖起始点到末端毛刺孔洞标注必须闭合无缺口焊缝标注必须沿中心线延伸非矩形框裁剪多实例容错单图含多个同类缺陷时每个object独立存在绝不合并为一个大框——这对后续NMS阈值调优至关重要。验证方法随机抽100张图用voc_viewer.py随包提供加载检查bndbox是否贴合缺陷边缘。我们实测漏标率0.7%远低于公开数据集平均3.2%水平。3.2difficult与occluded字段的工业级语义不只是YOLO转换的摆设Pascal VOC标准中这两个字段常被忽略但在本数据集中承载关键信息difficult值为1表示该缺陷处于反光区、边缘畸变区或低对比度区域模型易漏检。训练时可加权损失如YOLOv8的loss_box * (1 difficult_weight)occluded值为1表示缺陷被油污、水渍或相邻部件遮挡≥30%面积此时bndbox仅标注可见部分而非理想完整轮廓。注意difficult和occluded均为0或1整数非字符串。YOLO转换脚本会自动将其存入txt标签的第5列class_id x_center y_center width height difficult occluded供高级训练策略调用。3.3 VOC转YOLO的四步安全转换避开坐标溢出、类别错位、文件名不一致三大雷区直接用网上脚本转换VOC易翻车。本数据集配套voc2yolo.py已预置防御逻辑# voc2yolo.py 核心安全机制简化版 def convert_voc_to_yolo(xml_path, img_path, output_dir): tree ET.parse(xml_path) root tree.getroot() # 【避坑1】坐标溢出校验强制clamp到[0,1] img_w, img_h cv2.imread(img_path).shape[1], cv2.imread(img_path).shape[0] for obj in root.findall(object): bbox obj.find(bndbox) xmin max(0, int(bbox.find(xmin).text)) / img_w ymin max(0, int(bbox.find(ymin).text)) / img_h xmax min(1, int(bbox.find(xmax).text) / img_w) # 防止xmax1 ymax min(1, int(bbox.find(ymax).text) / img_h) # 【避坑2】类别映射防错严格按classes.txt顺序 class_name obj.find(name).text.strip() class_id [scratch, hole, weld].index(class_name) # 报错即终止 # 【避坑3】文件名一致性忽略.xml后缀只比对主名 img_name os.path.splitext(os.path.basename(img_path))[0] xml_name os.path.splitext(os.path.basename(xml_path))[0] assert img_name xml_name, f文件名不匹配{img_name} vs {xml_name} # 写入YOLO格式txt含difficult/occluded with open(f{output_dir}/{img_name}.txt, a) as f: f.write(f{class_id} {x_center} {y_center} {width} {height} {difficult} {occluded}\n)关键参数说明img_w/img_h从cv2.imread()实时读取避免依赖XML中可能错误的size字段max(0, ...)/min(1, ...)坐标归一化前强制截断杜绝负值或超界值assert img_name xml_name在转换首张图时即校验失败立刻抛异常不生成脏数据。4. 常见问题排查YOLO训练报错、mAP异常、标签错位的5条血泪经验4.1 现象YOLOv8训练时报错AssertionError: Error loading data日志指向dataset.py第127行原因dataset.yaml中train:路径写成./train/而非../train/导致相对路径解析失败。本数据集dataset.yaml默认以steel_defect_dataset/为工作目录train/与其同级故必须用../train/。解决打开dataset.yaml确认所有路径以../开头若你将整个文件夹移到其他位置需同步更新train/val/test的相对路径。4.2 现象训练loss下降但val mAP0.5始终为0.0confusion_matrix.png显示全为背景类原因classes.txt末尾有多余空行导致YOLO读取时nc4误将空行当第四类而模型输出通道数与真实类别数不匹配。解决用vim classes.txt检查并删除所有空行确保文件严格为三行scratch回车、hole回车、weld回车无末行空行。4.3 现象预测结果框严重偏移尤其焊缝检测框整体右移20像素原因原始JPG图像被某些看图软件如Windows照片查看器自动旋转但EXIF方向标记未清除导致cv2.imread()读取时尺寸错乱。解决运行fix_exif_orientation.py包内提供批量清除所有JPG的EXIF Orientation标记python fix_exif_orientation.py --input_dir ./images/ --output_dir ./images_fixed/然后将images_fixed/替换原images/目录。4.4 现象val_batch0_labels.jpg可视化图中孔洞标注框覆盖了划伤区域原因XML中同一张图存在两个object但name字段分别为scratch和hole而bndbox坐标重叠——这属于真实工业场景如划伤末端衍生微孔非标注错误。YOLO默认NMS会抑制重叠框需调高iou0.7或启用agnostic_nmsTrue。解决在train.py中添加参数--iou 0.7 --agnostic-nms或修改ultralytics/cfg/default.yaml中的iou: 0.7。4.5 现象test/目录下409张图但test_labels.txt只生成382行原因test/目录内混入了非JPG文件如.DS_Store、Thumbs.dbvoc2yolo.py遍历时跳过非JPG但未校验XML匹配数。解决执行清理命令find ./test -name *.jpg | wc -l # 应输出409 find ./test -name *.xml | wc -l # 应输出409 # 若不等删除多余文件find ./test ! -name *.jpg ! -name *.xml -delete5. 工业部署级验证技巧用TensorRT加速推理、量化精度损失评估、产线相机标定补偿5.1 TensorRT加速YOLOv8s从120ms到18ms的实测优化链在Jetson AGX Orin上直接跑PyTorch模型延迟达120ms无法满足产线30FPS要求。本数据集配套tensorrt_export.py实现端到端加速# tensorrt_export.py 关键步骤 import torch from ultralytics import YOLO # 1. 加载已训练权重假设best.pt在当前目录 model YOLO(best.pt) # 2. 导出为ONNX固定输入尺寸640x640禁用动态轴 model.export( formatonnx, imgsz640, dynamicFalse, # 关键TensorRT不支持动态batch/size halfTrue, # 启用FP16显存减半速度翻倍 simplifyTrue # 删除冗余opONNX体积缩小40% ) # 3. 调用trtexec编译需提前安装TensorRT # trtexec --onnxyolov8s.onnx --saveEngineyolov8s.engine --fp16 --workspace4096实测参数环境PyTorch FP32ONNX FP16TensorRT FP16Jetson AGX Orin120ms45ms18msRTX 409022ms12ms7ms注意dynamicFalse是TensorRT部署铁律。若产线需多尺寸输入必须导出多个engine如640.engine,1280.engine运行时按需加载。5.2 量化精度损失评估表INT8 vs FP16的mAP与延迟博弈TensorRT INT8量化可进一步提速但工业缺陷检测对精度敏感。我们用calibration_dataset/从val/中抽取200张图做校准实测损失如下模型mAP0.5:0.95推理延迟缺陷类型敏感度FP16 Engine0.72118ms基准INT8 Engine0.698(-0.023)12ms(-33%)划伤下降0.015孔洞下降0.008焊缝下降0.031因焊缝细线特征易丢失结论若产线允许mAP0.7INT8可接受若焊缝检测是核心KPI坚持FP16——宁可多花6ms不赌0.031的mAP。5.3 产线相机标定补偿用undistort.py消除镜头畸变对检测框的影响工厂常用广角镜头拍摄钢板径向畸变导致边缘划伤框拉伸。本数据集提供camera_calibration/目录含calibration_images/20张棋盘格标定图与产线同型号相机拍摄calibration_result.npz内参矩阵mtx、畸变系数distundistort.py批量校正脚本# undistort.py 核心逻辑 def undistort_image(img_path, mtx, dist, output_dir): img cv2.imread(img_path) h, w img.shape[:2] # 计算最优新相机矩阵保留有效像素 newcameramtx, roi cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h)) # 畸变校正 dst cv2.undistort(img, mtx, dist, None, newcameramtx) # 裁剪ROI区域去除黑边 x, y, w, h roi dst dst[y:yh, x:xw] cv2.imwrite(f{output_dir}/{os.path.basename(img_path)}, dst)关键参数cv2.getOptimalNewCameraMatrix的alpha1表示保留全部像素含黑边alpha0表示裁剪黑边——本数据集采用alpha0因产线图像需满分辨率分析。从那以后我每次部署新产线模型都强制走一遍undistort.py校正tensorrt_export.py编译val_batch0_labels.jpg可视化三连验。校正不彻底后面所有优化都是空中楼阁编译不测延迟再高mAP也卡在产线节拍外可视化不看框偏移模型再快也是废模型。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑