钢材缺陷检测数据集实战:VOC/COCO/YOLO三格式转换与YOLO训练全流程
2026/9/24 22:09:39 网站建设 项目流程

简介:本资源为谢韦尔钢材缺陷检测数据集,面向从事工业质检、目标检测算法学习与YOLO系列模型训练的学生、工程师及研究人员,帮助解决钢材表面缺陷识别任务中数据获取与标注困难的问题。压缩包共2000个文件,约12.38MB,包含1000张真实场景高清图片,以及voc(xml)、coco(json)和yolo(txt)三种格式标签,另附yaml配置文件、Python划分脚本与多份html教程文档,覆盖环境搭建、训练流程与数据集划分说明。已有586人学习下载。读者可获得一套可直接用于YOLO系列目标检测的完整数据,并借助划分脚本按需生成训练集、验证集与测试集,同时参考Windows与Linux双平台的环境搭建及训练案例教程,快速完成从数据准备到模型训练的全流程实践,适合课程设计、毕业项目或工业缺陷检测入门与进阶使用。

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

做过工业质检项目的人都知道,钢材表面缺陷检测最耗时的环节从来不是调模型,而是搞数据。热轧板坯上的裂纹、夹杂、斑块、麻点、氧化铁皮压入、划痕,这几类缺陷在产线高速运动下拍出来的图像,反光、油污、水渍混在一起,标注框稍微松一点,训练出来的模型就全是误检。谢韦尔钢铁公开的那批缺陷数据在圈子里流传很广,但原始数据是灰度图加单类别标注,直接拿来训 YOLO 还得自己转格式、切分、写配置文件。这份资源把 1000 张真实场景图片连同 VOC、COCO、YOLO 三种格式标签一起打包,还附了划分脚本和 Linux/Windows 双平台的训练教程,等于把从数据到模型跑通这条链路上最枯燥的几段路给铺平了。适合谁?刚接触工业缺陷检测、想拿真实数据练手 YOLO 全流程的工程师,以及需要快速搭一个钢材表面质检 demo 的团队。下面按我实际拆包复现的顺序,把这份资源里里外外讲清楚。

2. 拆开压缩包先看什么:三种标签格式的目录结构与转换逻辑

拿到一个数据集压缩包,我习惯先不急着跑训练,而是把目录树打出来,看清楚图片和标签的对应关系。这份资源解压后大致是图片文件夹、VOC 格式的 xml 文件夹、COCO 格式的 json 文件、YOLO 格式的 txt 文件夹,外加几个划分脚本和教程 html。很多人翻车就翻在没搞清三种格式的坐标定义差异,直接混用导致框全飘了。

2.1 VOC、COCO、YOLO 三种标注格式的坐标差异

VOC 格式用 xml 存,每个目标一个<object>节点,坐标是xmin, ymin, xmax, ymax,绝对像素值,原点在左上角。COCO 格式用 json 存,bbox[x, y, width, height],同样是绝对像素,但注意它是左上角坐标加宽高,不是右下角。YOLO 格式用 txt 存,每行class_id x_center y_center width height,全部是归一化到 0 到 1 的相对值,中心点坐标加宽高。这三种格式里,YOLO 的归一化最容易出错,因为一旦图片尺寸读错或者除错了宽高,框就会整体偏移。

我一般会写个小脚本先验证一遍三种格式是否指向同一批图、同一批框。下面这段代码用来统计每个格式的标注数量并做交叉核对:

import os import xml.etree.ElementTree as ET import json # 统计 VOC xml 中的目标总数 def count_voc(xml_dir): total = 0 for f in os.listdir(xml_dir): if f.endswith('.xml'): tree = ET.parse(os.path.join(xml_dir, f)) total += len(tree.findall('object')) return total # 统计 COCO json 中的标注总数 def count_coco(json_path): with open(json_path, 'r') as fp: data = json.load(fp) return len(data['annotations']) # 统计 YOLO txt 中的行数(每行一个目标) def count_yolo(txt_dir): total = 0 for f in os.listdir(txt_dir): if f.endswith('.txt'): with open(os.path.join(txt_dir, f)) as fp: total += len([l for l in fp if l.strip()]) return total print('VOC:', count_voc('./Annotations')) print('COCO:', count_coco('./annotations.json')) print('YOLO:', count_yolo('./labels'))

逻辑说明:三个函数分别遍历对应格式的标注文件,累加目标框数量。参数上只需要把路径换成你解压后的实际目录。如果三个数字对不上,说明某一种格式的标签有缺失或者转换时漏了文件,这时候别急着训练,先把不一致的图片找出来。常见做法是拿图片文件名做集合运算,找出只在某一种格式里出现的样本。

2.2 用划分脚本切分训练集、验证集、测试集

资源里带了三个划分脚本,分别是「训练集、验证集、测试集划分脚本」「训练集、验证集划分脚本」和「split_train_val生成ImageSets下txt文件划分脚本」。前两个是把图片和标签一起复制到新的文件夹结构里,第三个是生成 ImageSets 目录下的 txt 索引文件,适合配合某些框架的 DataLoader 使用。

我一般用第一个三划分脚本,因为它直接产出images/trainimages/valimages/test和对应的labels/train这样的结构,YOLOv5 和 YOLOv8 都能直接吃。运行前先看一眼脚本里的比例参数,通常是 8:1:1 或 7:2:1。下面是我改过的调用示例:

# 假设脚本名为 split_train_val_test.py # 参数依次为:图片目录、标签目录、输出目录、训练集比例、验证集比例 python split_train_val_test.py \ --img_dir ./images \ --label_dir ./labels \ --out_dir ./dataset_split \ --train_ratio 0.8 \ --val_ratio 0.1

逻辑说明:脚本内部会先打乱文件列表,按比例切分,然后把图片和同名 txt 标签复制到对应子目录。测试集比例不用传,等于 1 减去训练和验证比例。参数上注意--label_dir里的 txt 文件名必须和图片名一一对应,只有扩展名不同。如果切分完发现某个子目录是空的,多半是文件名匹配规则写死了,比如图片是.jpg但脚本只认.png,这时候去脚本里改一下后缀过滤条件就行。

提示:切分前先备份原始标签文件夹。有些划分脚本是移动文件而不是复制,跑错一次原始数据就散了。

3. 从零跑通 YOLO 训练:Linux 和 Windows 双平台环境搭建要点

数据切好了,下一步是把环境搭起来。资源里给了 Linux 和 Windows 两套环境搭建教程,还有对应的训练教程。我两边都试过,Linux 下用 conda 建虚拟环境最省事,Windows 下稍微麻烦一点,主要是 CUDA 和 cuDNN 版本要对齐。这一章把两条路都走一遍,重点讲容易卡住的地方。

3.1 Linux 下 conda 建环境与 PyTorch 安装

Linux 服务器上我一般用 Miniconda 建一个独立环境,避免和系统 Python 打架。资源里的教程写的是 Ubuntu 环境安装,我按自己的习惯补全成可复现的命令序列:

# 创建名为 yolo 的虚拟环境,指定 Python 3.9 conda create -n yolo python=3.9 -y conda activate yolo # 安装 PyTorch,注意 CUDA 版本要和显卡驱动匹配 # 这里以 CUDA 11.8 为例,具体版本看 nvidia-smi 输出 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLOv8 官方包 pip install ultralytics # 验证 GPU 是否可用 python -c "import torch; print(torch.cuda.is_available())"

逻辑说明:conda create那行指定 Python 3.9 是因为 ultralytics 对 3.10 以上偶尔有依赖冲突。PyTorch 安装命令里的cu118要和nvidia-smi右上角显示的 CUDA Version 对应,不是越新越好。最后一行打印True才算 GPU 通了,如果是False,先检查驱动版本,再检查是不是装成了 CPU 版。参数上--index-url指定 PyTorch 官方源,国内网络环境可以换成清华镜像,但镜像有时更新滞后,装不到最新版。

3.2 Windows 下环境搭建与训练教程的适配修改

Windows 下资源里给了两份教程,一份环境搭建一份训练。我实际跑的时候发现,教程里的路径写法是 Linux 风格,Windows 下要改成反斜杠或者用原始字符串。另外 Windows 下 DataLoader 的num_workers设大了容易卡死,我一般设成 0 或 2。

训练自己的数据集,核心是改一个 yaml 配置文件。资源里的训练教程是基于案例改的,我把它抽象成通用步骤。先建一个steel.yaml

# 数据集配置文件 path: D:/dataset_split # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径 # 类别数和类别名 nc: 4 names: ['crack', 'inclusion', 'patch', 'scratch']

逻辑说明:path是根目录,trainvaltest是相对path的子路径。nc是类别数,names要和 YOLO txt 里的 class_id 顺序严格对应,第 0 类对应列表第一个名字。如果类别名写错顺序,训练出来的模型会把裂纹认成划痕。改完 yaml 后启动训练:

yolo detect train data=steel.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16

参数上modelyolov8n.pt是最小的预训练权重,适合先跑通流程;epochs100 轮对 1000 张图够用;imgsz640 是默认输入尺寸,钢材缺陷目标偏小的话可以提到 1024,但显存占用会翻倍。训练过程中看runs/detect/train下的results.csv,重点盯mAP50box_loss两条曲线。

注意:Windows 下如果报DataLoader worker exited unexpectedly,把workers参数设成 0,这是 Windows 多进程的老问题,不是数据集的锅。

4. 避坑与排查:钢材缺陷数据集训练时最容易翻车的五个地方

这一章是我自己踩过的坑,也是社群里问得最多的几个问题。每条按现象、原因、解决来写,照着排查能省不少时间。

4.1 训练 loss 不降反升,mAP 一直卡在 0 附近

现象:启动训练后box_loss震荡不降,mAP50始终接近 0。原因通常是标签路径没对上,YOLO 找不到标签文件,把所有框当成了背景。解决:检查labels/train下是否有和images/train同名的 txt,且 txt 内容不是空的。另一个可能是 yaml 里的nc和实际类别数不一致,比如数据有 4 类但nc写了 1,模型只学第一类。

4.2 验证集 mAP 很高但测试集一塌糊涂

现象:验证集mAP50到 0.9,拿测试集图片推理却全是误检。原因多半是划分脚本没打乱,训练集和验证集来自同一批连续帧,图片高度相似,模型过拟合了。解决:重新跑划分脚本,确认内部有random.shuffle,或者手动在切分前把文件列表打乱。钢材缺陷数据如果来自连续拍摄,相邻帧差异极小,必须打散。

4.3 标注框整体偏移或缩放

现象:推理出来的框位置对,但大小不对,或者整体往一个方向偏。原因通常是 YOLO 格式归一化时用错了图片尺寸。比如标注时图片是 1280x1024,转换脚本却按 640x640 去除,框就全乱了。解决:回到转换脚本,确认img_widthimg_height是从每张图实际读取的,不是写死的。用 OpenCV 读一下图片尺寸再除。

4.4 CUDA out of memory 中途报错

现象:训练跑了几十轮突然显存爆了。原因可能是batch设太大,或者imgsz提太高,也可能是 DataLoader 的workers太多导致内存泄漏。解决:先把batch减半,再把imgsz降到 640,workers设成 4 以下。如果还爆,用yolo detect train ... cache=False关掉缓存,缓存虽然加速但吃内存。

4.5 类别不平衡导致小类漏检严重

现象:裂纹和划痕检得挺好,夹杂和斑块几乎检不出来。原因是这几类样本数量差太多,模型偏向多数类。解决:在 yaml 里加cls权重,或者用fraction参数控制每类采样比例。更直接的办法是过采样小类图片,复制到训练集里,但注意别复制到验证集,否则指标虚高。

5. 进阶技巧:用这批数据验证模型鲁棒性与置信度门限调优

数据跑通之后,真正决定模型能不能上产线的是推理阶段的置信度门限和 NMS 参数。钢材缺陷检测有个特点,缺陷目标通常很小,背景占绝大部分,默认的conf=0.25会漏掉很多弱缺陷,调低了又满屏误检。我一般会拿测试集做一轮门限扫描,找出 F1 分数最高的那个点。

具体做法是用yolo detect val配合不同的conf参数跑几遍,把结果记下来对比:

# 扫描不同置信度门限下的指标 for conf in 0.1 0.2 0.3 0.4 0.5; do yolo detect val model=runs/detect/train/weights/best.pt \ data=steel.yaml conf=$conf iou=0.5 \ name=val_conf_$conf done

逻辑说明:conf是置信度门限,低于这个值的框直接丢弃;iou是 NMS 的交并比阈值,控制重叠框的合并程度。跑完后看每个val_conf_*目录下的results.csv,找mAP50precisionrecall平衡最好的那个 conf 值。钢材缺陷里,如果漏检代价高,就把 conf 调低到 0.15 左右,宁可多报几个让下游人工复核。

另一个技巧是用这批数据做交叉验证。把 1000 张图按产线批次或者拍摄时段分成 5 折,每次拿 4 折训练 1 折验证,看 mAP 的方差。方差大说明数据分布不均匀,模型换一条产线就崩。我一般会跑 3 折就够判断了,5 折太费时间。

还有一个容易被忽略的点是输入尺寸。钢材缺陷在 640 分辨率下可能只有十几个像素,提到 1024 或者 1280 能显著提升小目标召回,但推理速度会下降。如果产线要求实时,可以用yolov8syolov8m配 1024 输入,在精度和速度之间找平衡。我自己的习惯是,每次拿到新数据先跑一遍 640 的 baseline,再跑一遍 1024 的对比,看 mAP 提升是否值得多花的那点显存和延迟。

从那以后我每次拿到新的缺陷数据集,都强制先跑一遍三种格式的交叉核对,再跑一遍划分脚本的随机性检查,最后才动训练命令。这套流程帮我省下了至少三次通宵重训的时间。希望帮到你。

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

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

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

立即咨询