☰
钢材缺陷检测数据集实战:谢韦尔1000张图与YOLO标签格式转换
2026/10/7 19:06:10 网站建设 项目流程

简介:本资源为YOLO谢韦尔钢材缺陷检测数据集,面向从事工业质检、目标检测算法学习与竞赛实践的学生及开发者,帮助解决钢材表面缺陷识别任务中数据获取与格式转换的难题。压缩包共2000个文件,约12.38MB,包含1000张真实场景高质量图片,以及voc(xml)、coco(json)和yolo(txt)三种格式标签,另附yaml配置文件、划分脚本与教程页面,可直接接入YOLO系列模型训练。资源还提供训练集、验证集、测试集划分脚本,支持按需重新划分数据,并附YOLO环境搭建与训练案例教程,覆盖Windows与Linux双平台。目前已有587人学习下载,适合希望快速复现钢材缺陷检测流程、对比多格式标签差异或搭建自身数据管线的读者参考使用。

1. 钢材缺陷检测数据集怎么选:谢韦尔这批 1000 张图能省掉多少标注成本

做过工业质检落地的都知道,钢材表面缺陷检测最贵的从来不是显卡,是标注。热轧板坯上的裂纹、夹杂、斑块、麻点、氧化铁皮压入,这几类缺陷在产线相机下灰度差异极小,让新人标一批数据,返工率能到三成。谢韦尔(Severstal)钢铁缺陷数据集在 Kaggle 上原本是竞赛用的,四类缺陷、带 RLE 掩码,但那是分割任务,直接拿来训 YOLO 检测并不顺手。这份资源做的事很实在:把谢韦尔场景的 1000 张真实产线图片重新用 labelImg 按检测框标了一遍,同时导出 VOC 的 xml、COCO 的 json、YOLO 的 txt 三套标签,还配了划分脚本和 Linux/Windows 两套环境搭建与训练教程。它解决的是「我手上没有工业缺陷数据、又不想从零标一千张图」这个具体问题,适合做 YOLO 入门实战的学生、要快速验证缺陷检测方案可行性的算法工程师,以及需要一份带完整标签格式对照的从业者。1000 张不算多,但作为跑通流程、验证数据增强策略和损失函数收敛的起点,够用了。

2. 三种标签格式的差异与转换逻辑:为什么同一批图要存三份

2.1 VOC、COCO、YOLO 三种格式到底差在哪

很多人拿到数据集第一反应是「三份标签是不是冗余」,其实不是。VOC 的 xml 是每张图一个文件,框用xmin/ymin/xmax/ymax绝对像素坐标存,可读性最好,labelImg 默认就吐这个;COCO 的 json 是整份数据集一个文件,框用[x, y, width, height]绝对坐标,还带category_id、image_id、annotations三层结构,pycocotools 评估和很多预训练权重加载都认它;YOLO 的 txt 是每张图一个文件,每行class_id cx cy w h,全部归一化到 0~1,训练时直接读,不用再解析。三份并存的价值在于:你想换检测框架、想用 COCO 预训练权重做迁移、想拿 VOC 格式去跑 mmdetection,都不用重新转。常见做法是拿 YOLO 格式直接训,需要评估时用脚本转回 COCO。

这里有个容易翻车的点:YOLO 的cx cy是框中心点归一化坐标,不是左上角。我见过有人把 VOC 的xmin/ymin直接除以宽高当cx cy写进去,训出来的框整体偏移半个身位,loss 死活降不下去。转换时务必按cx = (xmin + xmax) / 2 / W、w = (xmax - xmin) / W来算。

2.2 用脚本在三种格式间互转

资源里给的是成品标签,但实际做项目时你标完新图还是得自己转。下面这段是我常用的 VOC 转 YOLO,逻辑和资源里的划分脚本一致,可以直接抄:

import os import xml.etree.ElementTree as ET # 类别映射,必须和 data.yaml 里的 names 顺序完全一致 CLASSES = ['crack', 'inclusion', 'patch', 'pitted_surface'] def voc_to_yolo(xml_dir, out_dir, img_w, img_h): os.makedirs(out_dir, exist_ok=True) for xml_file in os.listdir(xml_dir): if not xml_file.endswith('.xml'): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) root = tree.getroot() # 图片真实尺寸优先从 xml 的 size 读,别硬编码 size = root.find('size') w = int(size.find('width').text) h = int(size.find('height').text) lines = [] for obj in root.iter('object'): cls_name = obj.find('name').text if cls_name not in CLASSES: continue cls_id = CLASSES.index(cls_name) bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) # 归一化中心点与宽高 cx = (xmin + xmax) / 2.0 / w cy = (ymin + ymax) / 2.0 / h bw = (xmax - xmin) / w bh = (ymax - ymin) / h lines.append(f"{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}") with open(os.path.join(out_dir, xml_file.replace('.xml', '.txt')), 'w') as f: f.write('\n'.join(lines))

逻辑说明:先建类别映射表,CLASSES的顺序决定class_id,一旦和训练配置里的names对不上,模型会把裂纹认成斑块。尺寸从 xml 的size节点读,不要用固定值,因为产线相机分辨率可能变。坐标归一化保留 6 位小数,够用且不丢精度。参数上,xml_dir是 VOC 标签目录,out_dir是输出 txt 目录,两个路径别写反。

2.3 划分脚本怎么用才不出错

资源里带了三个划分脚本:训练集验证集测试集三分、训练集验证集二分、以及生成 ImageSets 下 txt 的脚本。三分脚本会把图片和对应标签一起复制到新文件夹,这点很关键——很多人只复制图片不复制标签,训练时找不到 label 直接报No labels found。运行前先确认图片和标签文件名主干一致(比如img_001.jpg对img_001.txt),不一致的脚本会跳过,跳过的数量会在终端打印,别忽略这个数字。划分比例一般 7:2:1 或 8:1:1,工业缺陷样本少的时候测试集别低于 10%,否则评估指标抖动大。train_list.txt是给某些框架读文件列表用的,格式是每行一个图片绝对路径,路径里别带中文和空格,Windows 下尤其容易因为空格截断。

3. 环境搭建与训练:Linux 和 Windows 两条路怎么走

3.1 Linux 下从零到能跑训练

资源里的 Linux 教程基于 Ubuntu,我按自己的习惯补一下关键步骤。先确认显卡驱动和 CUDA 版本匹配,nvidia-smi右上角显示的 CUDA 版本是驱动支持上限,不是已安装版本,别搞混。然后建虚拟环境,别在系统 Python 里装:

conda create -n yolo_defect python=3.9 -y conda activate yolo_defect # 按显卡驱动支持的 CUDA 版本选 torch,这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python pycocotools

逻辑说明:Python 3.9 是 YOLO 系列兼容性最稳的版本之一,3.11 以上有些依赖轮子还没跟上。--index-url指定 PyTorch 官方源,避免装到 CPU 版。装完用python -c "import torch; print(torch.cuda.is_available())"验证,返回True才算通。如果返回False,九成是 CUDA 版本和 torch 版本不匹配,回退重装。

3.2 Windows 下的坑集中在路径和编码

Windows 教程的流程和 Linux 差不多,但有两个高频翻车点。一是路径反斜杠,YOLO 配置文件里写path: D:\dataset有时解析异常,统一改成正斜杠D:/dataset更稳。二是中文路径,conda 环境、数据集目录、输出目录任何一层带中文都可能让 dataloader 报编码错,全用英文。另外 Windows 下num_workers设大了容易卡死,建议先设 0 或 2 跑通,再往上加。

3.3 训练配置怎么改才适配这批数据

资源里的训练教程是「根据案例修改训练自己的数据集」,核心就是改data.yaml。这批数据四类缺陷,配置大概长这样:

path: ./severstal_yolo train: images/train val: images/val test: images/test nc: 4 names: ['crack', 'inclusion', 'patch', 'pitted_surface']

参数说明:nc是类别数,必须和 names 长度一致;names顺序必须和标签里的class_id对应,错一个全乱。训练命令用yolo detect train data=data.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16,imgsz设 640 是速度和精度的平衡点,缺陷目标小的话可以试 1024,但显存要够。batch根据显存调,8G 显存跑 640 大概能到 16。学习率默认 0.01,样本少的时候可以降到 0.001 防过拟合。

提示:训练前先用yolo detect train ... epochs=1跑一轮,确认数据能正常加载、类别数对得上,再开长训练。直接上 100 轮,数据有问题的话白等几小时。

4. 避坑与排查:这批数据训练时最容易踩的五个坑

4.1 训练 loss 不降,框全糊在一起

现象:训练几十轮后 box_loss 在 2.0 附近震荡不降,验证时框位置明显偏移。原因:标签坐标没归一化,或者归一化时用了错误的宽高(比如用了缩放后的尺寸)。解决:抽查几个 txt 文件,确认所有值都在 0~1 之间,且cx cy是中心点。用2.2的脚本重新转一遍,转换时尺寸从原图读。

4.2 报 No labels found in cache

现象:训练启动就报这个错,或者提示某张图没有对应标签。原因:图片和标签文件名主干不一致,或者划分脚本只复制了图片没复制标签。解决:写个脚本比对两个目录的文件名集合,差集就是问题文件。划分时确保图片和标签成对复制。

4.3 类别索引错位,裂纹被识别成斑块

现象:模型能检出框,但类别标签系统性错误。原因:data.yaml里names顺序和标签生成时的CLASSES顺序不一致。解决:两边顺序严格对齐,改完清掉labels.cache重新训练,缓存不清改了也不生效。

4.4 显存溢出 CUDA out of memory

现象:训练中途报显存不足。原因:batch或imgsz设太大,或者num_workers过高导致内存泄漏。解决:先把batch减半,还不行就降imgsz到 416。Windows 下把num_workers设 0 试试。

4.5 验证集指标虚高,实际推理一塌糊涂

现象:mAP 看着不错,但拿新图推理漏检严重。原因:划分时没打乱,训练集和验证集图片来自同一批次、光照条件高度相似,模型过拟合了。解决:划分前先 shuffle,或者按拍摄批次分层划分。工业场景尤其要注意,不同批次的钢材表面反光差异很大。

5. 从 1000 张到产线可用:数据增强与验证的进阶技巧

1000 张图训出来的模型,直接上产线大概率不够看。我的习惯是在训练配置里开足增强,YOLO 自带的mosaic、mixup、hsv_h、hsv_s、hsv_v这几个参数对钢材缺陷特别有用——产线光照变化大,HSV 抖动能让模型对亮度不敏感。degrees旋转别开太大,钢材缺陷有方向性,转 180 度可能把裂纹转成不存在的形态,一般 10 度以内。flipud和fliplr可以开,缺陷没有严格上下左右语义。

验证阶段别只看 mAP,工业质检更关心漏检率和误检率。写个推理脚本批量跑测试集,统计每类的召回和精确率:

from ultralytics import YOLO import os model = YOLO('runs/detect/train/weights/best.pt') test_dir = './severstal_yolo/images/test' results = model.predict(source=test_dir, conf=0.25, iou=0.5, save_txt=True) # conf 阈值按产线要求调,宁可误检不可漏检就调低 print(f"共处理 {len(results)} 张图")

参数说明:conf=0.25是置信度阈值,产线要求高召回就降到 0.1,要求低误报就升到 0.5。iou=0.5是 NMS 的 IoU 阈值,重叠目标多的时候调低。save_txt=True会把预测结果存成 YOLO 格式,方便和真值对比算指标。

还有一个容易被忽略的点:这批数据是静态图片,但产线是视频流。图片训的模型直接跑视频,帧间抖动会导致框闪烁。常见做法是加跟踪算法做时序平滑,或者对连续几帧的检测结果做投票。这个资源没带跟踪部分,属于要自己补的环节。

从那以后我每次拿到新数据集,都强制先跑一遍「单轮训练 + 抽查标签 + 验证集可视化」这三步,确认数据管道没问题再开长训练。工业缺陷检测这行,数据质量比模型结构重要得多,1000 张标得准的图,胜过 10000 张糊弄的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询