尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

钢材缺陷检测数据集实战:VOC/COCO/YOLO三格式转换与YOLO训练全流程

发布时间:2026/9/24 22:09:43

资讯中心
01
ARTICLE

钢材缺陷检测数据集实战:VOC/COCO/YOLO三格式转换与YOLO训练全流程

钢材缺陷检测数据集实战:VOC/COCO/YOLO三格式转换与YOLO训练全流程
简介本资源为谢韦尔钢材缺陷检测数据集面向从事工业质检、目标检测算法学习与YOLO系列模型训练的学生、工程师及研究人员帮助解决钢材表面缺陷识别任务中数据获取与标注困难的问题。压缩包共2000个文件约12.38MB包含1000张真实场景高清图片以及vocxml、cocojson和yolotxt三种格式标签另附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/train、images/val、images/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 python3.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是根目录train、val、test是相对path的子路径。nc是类别数names要和 YOLO txt 里的 class_id 顺序严格对应第 0 类对应列表第一个名字。如果类别名写错顺序训练出来的模型会把裂纹认成划痕。改完 yaml 后启动训练yolo detect train datasteel.yaml modelyolov8n.pt epochs100 imgsz640 batch16参数上model选yolov8n.pt是最小的预训练权重适合先跑通流程epochs100 轮对 1000 张图够用imgsz640 是默认输入尺寸钢材缺陷目标偏小的话可以提到 1024但显存占用会翻倍。训练过程中看runs/detect/train下的results.csv重点盯mAP50和box_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_width和img_height是从每张图实际读取的不是写死的。用 OpenCV 读一下图片尺寸再除。4.4 CUDA out of memory 中途报错现象训练跑了几十轮突然显存爆了。原因可能是batch设太大或者imgsz提太高也可能是 DataLoader 的workers太多导致内存泄漏。解决先把batch减半再把imgsz降到 640workers设成 4 以下。如果还爆用yolo detect train ... cacheFalse关掉缓存缓存虽然加速但吃内存。4.5 类别不平衡导致小类漏检严重现象裂纹和划痕检得挺好夹杂和斑块几乎检不出来。原因是这几类样本数量差太多模型偏向多数类。解决在 yaml 里加cls权重或者用fraction参数控制每类采样比例。更直接的办法是过采样小类图片复制到训练集里但注意别复制到验证集否则指标虚高。5. 进阶技巧用这批数据验证模型鲁棒性与置信度门限调优数据跑通之后真正决定模型能不能上产线的是推理阶段的置信度门限和 NMS 参数。钢材缺陷检测有个特点缺陷目标通常很小背景占绝大部分默认的conf0.25会漏掉很多弱缺陷调低了又满屏误检。我一般会拿测试集做一轮门限扫描找出 F1 分数最高的那个点。具体做法是用yolo detect val配合不同的conf参数跑几遍把结果记下来对比# 扫描不同置信度门限下的指标 for conf in 0.1 0.2 0.3 0.4 0.5; do yolo detect val modelruns/detect/train/weights/best.pt \ datasteel.yaml conf$conf iou0.5 \ nameval_conf_$conf done逻辑说明conf是置信度门限低于这个值的框直接丢弃iou是 NMS 的交并比阈值控制重叠框的合并程度。跑完后看每个val_conf_*目录下的results.csv找mAP50和precision、recall平衡最好的那个 conf 值。钢材缺陷里如果漏检代价高就把 conf 调低到 0.15 左右宁可多报几个让下游人工复核。另一个技巧是用这批数据做交叉验证。把 1000 张图按产线批次或者拍摄时段分成 5 折每次拿 4 折训练 1 折验证看 mAP 的方差。方差大说明数据分布不均匀模型换一条产线就崩。我一般会跑 3 折就够判断了5 折太费时间。还有一个容易被忽略的点是输入尺寸。钢材缺陷在 640 分辨率下可能只有十几个像素提到 1024 或者 1280 能显著提升小目标召回但推理速度会下降。如果产线要求实时可以用yolov8s或yolov8m配 1024 输入在精度和速度之间找平衡。我自己的习惯是每次拿到新数据先跑一遍 640 的 baseline再跑一遍 1024 的对比看 mAP 提升是否值得多花的那点显存和延迟。从那以后我每次拿到新的缺陷数据集都强制先跑一遍三种格式的交叉核对再跑一遍划分脚本的随机性检查最后才动训练命令。这套流程帮我省下了至少三次通宵重训的时间。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。