☰
谢韦尔钢材缺陷检测数据集VOC+YOLO双格式6666张实战指南
2026/9/27 23:12:11 网站建设 项目流程

简介:本数据集面向工业质检与钢材表面缺陷检测方向的研究者、算法工程师及高校学生,提供谢韦尔钢材缺陷的Pascal VOC与YOLO双格式标注数据,可用于目标检测模型的训练、验证与算法对比实验。压缩包共2000个文件,以1999个xml标注文件和1个说明txt为主,整体约606.94MB,jpg图片与对应的VOC xml、YOLO txt一一对应,方便直接接入主流检测框架。标注涵盖crack、patches、pitting、scratches四类,总框数达20017个,其中scratches与pitting样本较多,crack相对稀缺,适合研究类别不平衡问题。目前已有1142人学习下载,可作为钢材缺陷检测课题的可靠数据基础,帮助读者省去自行采集与标注成本,快速搭建训练流程并复现基线结果。

1. 谢韦尔钢材缺陷检测数据集:6666 张 VOC+YOLO 双格式到底怎么用

拿到一个钢材缺陷检测数据集,第一反应往往不是“太好了”,而是“这 6666 张到底能不能直接喂给 YOLO”。谢韦尔钢材缺陷检测数据集 VOC+YOLO 格式 6666 张 4 类别,名字里已经把关键信息给全了:数据量 6666 张、标注格式同时提供 VOC 和 YOLO 两套、缺陷类别 4 个、压缩包是 7z。它解决的是钢材表面缺陷检测从零标注成本太高的问题,适合做工业质检方向的学生、算法工程师和需要快速验证 YOLO 训练链路的从业者。但真正落地时,坑不在模型,而在解压、格式对齐和类别映射这三步。下面按“先搞清楚数据长什么样,再跑通训练,最后避开翻车点”的顺序拆开讲。

2. 钢材缺陷检测数据集的文件结构与 VOC/YOLO 双格式差异

2.1 7z 包解开后一般能看到什么

钢材缺陷检测数据集这类工业数据,压缩包解开后通常不是直接给你 images 和 labels 两个文件夹,而是按 VOC 那套目录组织,再额外附一份 YOLO 格式的 txt。常见结构是:

Severstal_steel_defect/ ├── JPEGImages/ # 6666 张 jpg 原图 ├── Annotations/ # VOC 格式 xml,每张图一个 ├── ImageSets/ │ └── Main/ # train.txt / val.txt / test.txt ├── labels/ # YOLO 格式 txt,每张图一个 └── classes.txt # 4 个类别名

先别急着训练,用两条命令确认文件数量和配对情况:

# 统计图片、VOC xml、YOLO txt 各有多少个 find JPEGImages -name "*.jpg" | wc -l find Annotations -name "*.xml" | wc -l find labels -name "*.txt" | wc -l

三个数字应该都是 6666。如果 labels 数量对不上,说明 YOLO 格式是后转换的,可能有漏转。参数说明:find后面跟目录名,-name指定扩展名,wc -l统计行数。这一步花不了一分钟,但能省掉后面训练时“某张图没有标签”的报错。

2.2 VOC 的 xml 和 YOLO 的 txt 差在哪

VOC 格式的 xml 记录的是绝对像素坐标,长这样:

<object> <name>defect_1</name> <bndbox> <xmin>120</xmin><ymin>45</ymin> <xmax>260</xmax><ymax>190</ymax> </bndbox> </object>

YOLO 格式的 txt 记录的是归一化后的中心点加宽高,一行一个目标:

0 0.287 0.176 0.211 0.218

四个数分别是class_id center_x center_y width height,全部除以了图像宽高。钢材缺陷检测数据集同时给两套格式,好处是你用 YOLO 训练时不用自己写转换脚本,坏处是两套标注如果类别顺序不一致,直接混用会出大问题。常见做法是:训练只用 labels 里的 txt,xml 留着做可视化核对或转 COCO 用。

2.3 4 个类别怎么映射到 YOLO 的 class_id

YOLO 的 class_id 从 0 开始连续编号,而 VOC 的类别名是字符串。钢材缺陷检测数据集里 4 个类别,你需要先确认 classes.txt 的顺序,再确认 txt 里的 id 和它一致。写个脚本核对:

import os classes = open("classes.txt").read().strip().split("\n") print("类别顺序:", classes) label_dir = "labels" id_set = set() for f in os.listdir(label_dir): if f.endswith(".txt"): for line in open(os.path.join(label_dir, f)): if line.strip(): id_set.add(int(line.split()[0])) print("txt 中出现的 class_id:", sorted(id_set)) assert max(id_set) < len(classes), "class_id 超出类别数,映射错了"

逻辑说明:先读 classes.txt 拿到类别顺序,再遍历所有 label 文件收集出现过的 class_id。如果最大 id 大于等于类别数,说明 txt 里的编号和 classes.txt 对不上,必须重新映射。参数说明:line.split()[0]取每行第一个字段即类别 id,assert用来在训练前直接拦下错误。这一步不做,训练时 loss 会正常下降,但检测出来的框全是错类别,属于典型的“玄学翻车”。

3. 用 YOLO 训练钢材缺陷检测模型的完整链路

3.1 环境配置与 7z 解压的稳妥做法

钢材缺陷检测数据集是 7z 格式,Linux 下默认没有 7z 命令,先装:

sudo apt-get install p7zip-full 7z x Severstal_steel_defect.7z -o./data

参数说明:x表示保留目录结构解压,-o指定输出目录,后面紧跟路径不要加空格。如果遇到“密码正确但一直报错”,八成是压缩包分卷或下载不完整,先用7z t测试完整性:

7z t Severstal_steel_defect.7z

测试通过再解压。环境方面,YOLOv8 是目前工业缺陷检测里比较稳的选择,装依赖:

pip install ultralytics yolo checks

yolo checks会打印 PyTorch 版本和 CUDA 是否可用。如果是 V100 这类卡,确认 CUDA 版本和 PyTorch 对得上,否则训练会掉到 CPU 上,速度差几十倍。

3.2 把数据集整理成 YOLO 要求的目录

YOLO 训练要求 images 和 labels 分 train/val,且图片和同名 txt 放在对应目录。写个整理脚本:

import os, shutil, random src_img = "JPEGImages" src_lbl = "labels" dst = "dataset" random.seed(42) files = [f for f in os.listdir(src_img) if f.endswith(".jpg")] random.shuffle(files) split = int(len(files) * 0.8) sets = {"train": files[:split], "val": files[split:]} for name, flist in sets.items(): os.makedirs(f"{dst}/images/{name}", exist_ok=True) os.makedirs(f"{dst}/labels/{name}", exist_ok=True) for f in flist: shutil.copy(f"{src_img}/{f}", f"{dst}/images/{name}/{f}") txt = f.replace(".jpg", ".txt") shutil.copy(f"{src_lbl}/{txt}", f"{dst}/labels/{name}/{txt}")

逻辑说明:按 8:2 随机划分 train 和 val,固定随机种子保证可复现。参数说明:random.seed(42)让每次划分结果一致,方便对比实验;split控制训练集比例,工业数据量少时可以调到 0.9。注意图片和 txt 必须同名,否则 YOLO 找不到标签。

3.3 data.yaml 的四个必填字段

在 dataset 目录下建 data.yaml:

path: ./dataset train: images/train val: images/val nc: 4 names: ['defect_1', 'defect_2', 'defect_3', 'defect_4']

参数说明:path是数据集根目录,train和val是相对路径,nc是类别数必须等于 4,names顺序必须和 txt 里的 class_id 一一对应。names 写错顺序,训练照样跑,但推理时类别名全乱,这是最常见的低级错误。

3.4 启动训练与关键参数怎么设

yolo detect train \ data=dataset/data.yaml \ model=yolov8s.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ device=0

参数说明:model用预训练权重比从头训收敛快很多,钢材缺陷这种纹理特征明显的任务,yolov8s 在精度和速度之间比较平衡;imgsz=640是默认值,缺陷目标小可以提到 1024,但显存要够;batch=16在 V100 上比较稳,显存不够就降到 8;lr0初始学习率 0.01 是 YOLO 常用值,数据量小可以降到 0.001 防止震荡。训练中重点看mAP50和mAP50-95,如果 loss 一直降但 mAP 不涨,多半是标注有问题。

4. 钢材缺陷检测训练中的避坑与排查

4.1 现象:训练 loss 正常下降,但验证 mAP 一直是 0

原因:YOLO 格式的 txt 里 class_id 和 data.yaml 的 names 顺序不一致,或者 txt 里坐标没有归一化。钢材缺陷检测数据集如果是从 VOC 转过来的,转换脚本可能把绝对坐标直接写进去了。

解决:随机抽一张图,用脚本把 txt 画出来核对:

import cv2 img = cv2.imread("dataset/images/train/0001.jpg") h, w = img.shape[:2] for line in open("dataset/labels/train/0001.txt"): c, cx, cy, bw, bh = map(float, line.split()) x1 = int((cx - bw/2) * w); y1 = int((cy - bh/2) * h) x2 = int((cx + bw/2) * w); y2 = int((cy + bh/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite("check.jpg", img)

如果画出来的框位置对但类别不对,就是 names 顺序问题;如果框位置都不对,就是归一化问题。

4.2 现象:7z 解压报错“密码正确但无法解压”

原因:压缩包下载不完整或分卷缺失,7z 在文件尾校验失败时会报密码错误,误导性很强。

解决:先7z t测试完整性,不通过就重新下载。如果确认是分卷,把所有分卷放同一目录再解压。Linux 下注意文件名大小写,7z和7Z不是一回事。

4.3 现象:训练中 BN 层崩溃,loss 变成 NaN

原因:batch size 太小导致 batch normalization 统计量不稳定,或者学习率太大。钢材缺陷检测数据集如果缺陷目标特别小,梯度容易爆炸。

解决:把 batch 提到 16 以上,或者改用yolov8n这种小模型先跑通;学习率从 0.01 降到 0.001;加warmup_epochs=3让前几个 epoch 慢慢升学习率。

4.4 现象:混淆矩阵总和和验证集数量对不上

原因:YOLO 验证时默认有置信度阈值和 NMS,部分预测框被过滤掉了,所以混淆矩阵统计的是过滤后的结果,不是全部标注。

解决:这是正常现象,不用改代码。想看完整统计就把conf阈值调到 0.001,iou调到 0.9,再看混淆矩阵。工业质检里更关注漏检,所以 recall 比 precision 更重要,调阈值时优先保 recall。

4.5 现象:V100 上训练速度远低于预期

原因:PyTorch 版本和 CUDA 不匹配,或者device参数没指定,跑到了 CPU 上。

解决:yolo checks确认 CUDA available 是 True;训练命令里显式加device=0;如果还是慢,检查是不是开了amp=False,V100 支持混合精度,开着能快不少。

5. 从 6666 张到产线可用:提升钢材缺陷检测精度的几个实操技巧

数据集只有 6666 张、4 个类别,直接训一个 YOLO 能跑通,但离产线可用还有距离。我一般会做三件事。第一,用预训练模型做 backbone 冻结训练。前 20 个 epoch 把 backbone 冻住,只训 head,让模型先适应钢材表面的纹理分布,再解冻全量微调。命令里加freeze=10表示冻结前 10 层,这个参数对少样本工业数据特别管用。

第二,针对小缺陷调整 anchor 和 imgsz。钢材缺陷里划痕、夹杂这类目标往往只占几十个像素,imgsz=640下特征图分辨率不够。把输入提到 1024,同时用yolo detect train ... imgsz=1024,mAP 通常能涨 3 到 5 个点。代价是显存翻倍,V100 上 batch 要降到 8。

第三,用验证集做阈值扫描。YOLO 默认 conf 阈值 0.25,但工业场景漏检代价高,我会把 conf 从 0.05 到 0.5 扫一遍,画 recall-confidence 曲线,选 recall 最高且 precision 可接受的点。代码很简单:

from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") for conf in [0.05, 0.1, 0.15, 0.2, 0.25, 0.3]: metrics = model.val(data="dataset/data.yaml", conf=conf) print(f"conf={conf} mAP50={metrics.box.map50:.4f} recall={metrics.box.mr:.4f}")

参数说明:conf是推理置信度阈值,metrics.box.map50是 IoU 0.5 下的 mAP,metrics.box.mr是平均召回。扫完选一个 recall 和 precision 平衡的点写进部署配置。

最后说个血泪经验:钢材缺陷检测数据集里的类别不平衡很常见,某个类别可能只有几百个样本。别急着上 Focal Loss,先把该类别的图片过采样,或者用 YOLO 的copy_paste增强,往往比改损失函数见效快。我习惯在训练前先统计每个类别的框数量,低于 500 的类别单独做增强。希望帮到你。

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

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

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

立即咨询