ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

铁轨缺陷检测数据集详解:VOC+YOLO格式4020张4类别训练实践

铁轨缺陷检测数据集详解:VOC+YOLO格式4020张4类别训练实践 简介面向铁轨表面缺陷检测的目标检测数据集包含4020张jpg原图并同时提供Pascal VOC格式的xml与YOLO格式的txt标注文件覆盖波纹、剥落、鞍型、轮轨烧伤4个类别共7155个矩形框可直接用于YOLO等主流模型训练与效果验证。压缩包体积120.1MB文件总数为2000个以xml标注文件为主体另含txt说明文件帮助使用者快速理解目录结构与标注规则。目前已有978人学习下载。全部标注经labelImg人工核对框选准确合理但需注意约四分之三图片由数据增强生成资源仅保证标注质量对后续训练所得模型精度不作任何承诺请按实际项目需求谨慎选用。包内还附使用前必读文档可用于数据格式检查与训练前准备降低上手门槛。 搞计算机视觉这几年我和铁轨缺陷检测打交道的时间不算短。这个领域最尴尬的事从来不是模型选型而是手里没数据。正儿八经的工业缺陷样本不好公开网上能找到的又大多是论文里的裁剪图想跑通一个完整的YOLO训练流程都费劲。所以当我看到“铁轨缺陷检测数据集VOCYOLO格式4020张4类别”这套数据时第一反应是终于能踏踏实实做一次端到端的实验了。这个数据集的整套内容打包在一个7z压缩包里解压后同时包含VOC和YOLO两套标注格式共4020张铁轨表面图像覆盖4种常见缺陷类型。VOC格式适合导入LabelImg等工具做二次修改校对YOLO格式可以直接丢进ultralytics框架训练省掉了从零标注的体力活。不管你是刚入门目标检测的研究生还是在工业现场做视觉检测的工程师这套数据都能让你在半小时内把训练流程跑起来把精力花在调优上而不是到处找数据、折腾格式。1. 拿到数据集先别急着训练先看整体价值1.1 4020张、4个类别这个规模能干什么先说结论4020张图在工业缺陷检测里属于“够用但不算富余”的体量。对比自动驾驶动辄几万张的公开数据集铁轨缺陷数据本身就难采集尤其是带缺陷标注的现场图需要轨检车跑很多里程才能拍到足够的正样本。所以4000多张图配合YOLO系列的预训练权重做迁移学习是完全可以出效果的。我见过不少项目数据量只有几百张也能把yolov8s训到能用的水平核心前提是类别不能太杂、背景别太乱。这套数据4个类别场景相对集中又给了VOC和YOLO两种格式说明整理数据的人本身是懂目标检测工作流的这类数据集用起来通常不会有大坑。4个类别具体是什么解压后看yaml文件或者classes.txt最靠谱。结合铁轨探伤常见缺陷分类大概率覆盖了轨面剥离、裂纹、擦伤、掉块这几类。轨面剥离表现为表层金属成片翘起裂纹是细长的线性暗纹擦伤多出现在车轮打滑区段掉块则是局部缺失形成的坑洞。这几类缺陷形态差异明显训练起来类别间不容易混淆。1.2 这套数据到底能解决什么问题铁轨表面缺陷检测的落地场景主要是两类一是大型轨检车上的高速相机阵列在正常行车速度下连续采集轨面图像实时返回缺陷告警二是便携式巡检设备由人工推着走对小范围伤损做精细检查。前者要求模型速度快、能上边缘设备后者更看重精度和召回率。用这套数据训练的模型可以直接作为两套方案的检测前置模块。先框出疑似缺陷区域再用分类模型或人工复核比纯人工看视频效率高得多。我在实际项目中通常把这类检测模型当作“筛子”目标是把漏检率压到最低哪怕误检多一些都可以接受因为后面还有二次确认环节。另外VOC格式的价值在于兼容性。很多老项目、论文复现代码还在用VOC格式读数据LabelImg、Labelme这类标注工具默认也支持VOC。而YOLO格式是当前训练的主流两套都给你等于从预处理到训练全链路都铺好了。2. VOC和YOLO标注格式差异一张图就能看明白2.1 VOC格式的目录结构和XML内容VOC格式是PASCAL VOC比赛流传下来的标准目录结构长这样VOC/ ├── Annotations/ # 每张图对应的xml标注 ├── JPEGImages/ # 原始图片 └── ImageSets/ └── Main/ ├── train.txt # 训练集图片名列表 ├── val.txt # 验证集图片名列表 └── trainval.txt # 训练验证每张图片对应一个同名xml文件里面记录了图片尺寸、通道数以及每一个目标的类别和边界框。关键的object节点长这样object namecrack/name bndbox xmin186/xmin ymin102/ymin xmax315/xmax ymax240/ymax /bndbox /object这里的xmin、ymin、xmax、ymax都是像素坐标直接对应图片上的实际位置。这种标注的优点是直观用LabelImg打开就能改缺点是坐标没有归一化一旦训练框架要求不同输入尺寸得自己在dataloader里做坐标变换。2.2 YOLO格式的txt文件和归一化坐标YOLO格式把标注简化成了纯文本每个目标占一行格式是class_id x_center y_center width height注意x_center、y_center、width、height全部是归一化到0到1之间的浮点数。比如一张宽1920、高1080的图某个目标中心点在(960, 540)宽480高270那这一行就是0 0.5 0.5 0.25 0.25YOLO格式的优点是不管输入图片resize成640还是1280标注都不用改模型内部会按比例自动处理。缺点是一旦图片裁剪过标注必须跟着重新算手工改基本不可能只能靠脚本批量转换。目录结构也比VOC紧凑通常就是images和labels两个大目录下面再分train、valdataset/ ├── images/ │ ├── train/ │ ├── val/ └── labels/ ├── train/ └── val/2.3 XML转YOLO标注的参考脚本数据集虽然两种格式都给了但日常工作中你会遇到只有VOC标注的旧数据需要转成YOLO格式。这里放一个我常用的转换脚本逻辑很简单先读xml里的size和bndbox再按公式换算归一化坐标import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_file, target_dir, classes): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in classes: continue cls_id classes.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) txt_name os.path.splitext(os.path.basename(xml_file))[0] .txt with open(os.path.join(target_dir, txt_name), w) as f: f.write(\n.join(lines))两个细节容易踩坑。一是xml里object可能包含difficult标记表示难例样本转换时默认过滤掉就好否则会把一些严重遮挡目标也当成正样本训。二是归一化坐标计算结果偶尔会略大于1比如标注框不规范时可能是1.000001YOLO加载会报错转换时加个min(max())裁剪更稳妥。3. 解压、校验和数据体检动手前的必要环节3.1 7z压缩包的解压和哈希校验拿到.7z文件第一步当然是解压。Windows下我习惯用7-Zip右键直接提取。Linux服务器上需要装p7zip工具# Ubuntu/Debian sudo apt install p7zip-full # CentOS/RHEL sudo yum install p7zip p7zip-plugins # 解压到当前目录 7z x 铁轨缺陷检测数据集VOCYOLO格式4020张4类别.7z7z的压缩率比zip高不少尤其是图片这种重复模式多的数据体积能省将近三分之一这也是数据集制作者选择7z格式的原因。但代价是解压速度稍慢这是正常的别以为卡住了。数据从网上下载校验完整性是基本素养。我最常用的方式是解压前先算哈希值和发布方给的比对一下# 生成压缩包本身的sha256 sha256sum 铁轨缺陷检测数据集VOCYOLO格式4020张4类别.7z # 或者用7z自带的校验 7z h 铁轨缺陷检测数据集VOCYOLO格式4020张4类别.7z提示如果发布页面给了MD5或SHA256务必比对。我遇到过下载到一半断网导致压缩包损坏解压时报“CRC错误”这种文件即使强制解压出来里面的图片也可能有缺损训练时会出现莫名其妙的loss抖动。3.2 图片与标注一致性检查解压完成后先别急着训练做一次数据体检能帮你省下后面排查问题的几个小时。重点检查三件事图片能不能正常打开、每张图有没有对应标注、标注坐标有没有越界。写个简单脚本快速扫一遍import os from PIL import Image img_dir images/train label_dir labels/train errs [] for img_name in os.listdir(img_dir): stem os.path.splitext(img_name)[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): errs.append(flabel missing: {img_name}) continue img_path os.path.join(img_dir, img_name) try: with Image.open(img_path) as im: w, h im.size except Exception: errs.append(fbroken image: {img_name}) continue with open(label_path) as f: for line in f: parts line.split() if len(parts) ! 5: errs.append(fbad line: {label_path} - {line}) continue _, cx, cy, bw, bh parts cx, cy, bw, bh map(float, (cx, cy, bw, bh)) if cx 0 or cy 0 or cx 1 or cy 1 or bw 0 or bh 0: errs.append(fcoord out of range: {label_path}) print(fchecked {len(os.listdir(img_dir))} images, {len(errs)} errors) for e in errs[:30]: print(e)这里我习惯检查坐标的边界条件不是用等于0而是用小于等于0和大于等于1因为很多转换脚本会把边界框算成0.999999这种情况模型能处理但等于1.0甚至1.1的框缩放后可能跑到图片外面去训练时容易让模型学偏。4. 用YOLOv8跑通铁轨缺陷检测训练4.1 环境配置与显卡选择建议训练YOLO系列模型最省心的是用ultralytics框架。安装就一句话pip install ultralytics显卡这块我多说两句。很多人问AMD RX580能不能跑YOLOv8实测下来挺折腾的。ultralytics依赖PyTorchPyTorch对AMD显卡主要靠ROCm支持但RX580这种GCN架构的老卡官方ROCm列表里基本已经放弃了装起来各种不兼容。如果你手头只有RX580建议先用CPU跑yolov8n这种小模型batch size调小一点体验一下完整流程没问题但训练4000张图一个epoch可能要十几分钟整体偏慢。想正经训练还是NVIDIA显卡最省事GTX 1660以上都能跑。没有本地GPU的话用云GPU按小时租或者用Google Colab免费额度都能跑动yolov8s在4000张图上的训练。注意不要盲目追求大模型。铁轨表面缺陷很多是小目标比如细裂纹可能只占几十个像素。yolov8n对小目标特征提取能力弱但如果直接上yolov8x小显卡又带不动。我通常在中型模型和输入分辨率之间找平衡yolov8s加上640以上的输入尺寸比硬上yolov8m效果还要好。4.2 数据集yaml和训练参数设置用YOLO格式训练核心是写一个data.yaml。我的做法是把数据集按images和labels的同名子目录组织然后yaml指向images的train和val目录即可train: D:/datasets/rail_defect/images/train val: D:/datasets/rail_defect/images/val nc: 4 names: 0: peeling 1: crack 2: abrasion 3: crushingnames里的顺序必须和标签txt里的class_id一一对应这是训练前必须确认的事。我习惯在训练前打印一段代码验证from ultralytics import YOLO model YOLO(yolov8s.pt) results model.train( datarail_defect.yaml, epochs100, imgsz640, batch16, patience15, device0, )epochs我这里给100配合early stoppingpatience15够模型收敛了。batch size要结合显存调显存不够就把batch降到8甚至4梯度累积也能弥补一些。还有个参数值得专门提mosaic数据增强。ultralytics默认开启mosaic把4张图拼成一张对小目标检测非常有用因为拼接后目标相对变小等于变相做了尺度增强。但如果训练集里缺陷数量本身不多mosaic可能导致某些小缺陷被裁掉出现“图片里有目标但标注丢了”的情况。真遇到loss一直降不下去试着关掉mosaic看是否改善。4.3 训练结果怎么看mAP和损失曲线训练结束后ultralytics会在runs/detect目录下生成结果重点关注三个文件results.csv、confusion_matrix.png、以及验证集的标注预览图。results.csv里记录了每个epoch的box_loss、cls_loss、dfl_loss以及metrics/precision(B)、metrics/recall(B)、metrics/mAP50(B)、metrics/mAP50-95(B)。我第一眼看mAP50第二眼看recall因为缺陷检测场景漏检比误检更致命。工业现场哪怕误报率高一点还可以靠人工复核扛住一旦漏检缺陷直接放过去了。以这个体量的数据我实测下来的参考区间大致是指标合理参考备注mAP500.75 - 0.90类别难易差异大剥落类通常比裂纹类好检mAP50-950.45 - 0.65小目标多时偏低正常precision0.80左右误检主要是锈迹、油污被当成缺陷recall0.80 - 0.90漏检集中在细裂纹和暗光环境损失曲线判断标准很简单train loss和val loss都在下降最后趋于平缓说明训练正常。val loss先降后升就是过拟合信号靠patience自动停就行。5. 实操中踩过的坑和排查经验5.1 标签类别编号与yaml不一致这是我在网上帮人看训练报错时遇到最多的问题。现象是训练能跑但val的mAP一直很低或者loss直接nan打开标注预览图发现框全乱套。原因通常是数据集的标签文件里类别顺序和yaml里的names对不上。比如原始数据里class_id0是crack你在yaml里把0写成了peeling模型看到的全是错位目标。排查方法随机挑几张图把标签txt内容和原图对照。也可以用脚本统计所有标签里出现的class_id集合以及每个id的样本数确保和yaml的names一一对应之后再开始训练。5.2 小目标和类不平衡怎么处理铁轨裂纹、擦伤这类缺陷有个共同特点目标面积占比极小。一张1920x1080的图缺陷区域可能只有几十x几十像素直接整图resize到640训练小目标会被压缩得几乎不可见。我的经验是三步走。第一步把imgsz从640提到960或1280模型输入分辨率高了小目标的特征保留更多代价是显存和训练时间上升。第二步用SAHI这类切片推理库做滑窗推理把大图切成512x512的块再分别检测然后再把结果映射回原图坐标。第三步如果某些类别样本特别少先用脚本统计类别分布对少样本类别做离线增强比如水平翻转、随机裁剪、亮度扰动把数量拉到接近多数类的一半以上比硬调loss权重更直观。5.3 模型在实验室好用到现场漏检怎么办这类问题最现实。实验室测试图是白天、光线均匀、相机固定拍的现场可能遇到逆光、油污、水渍、灰尘覆盖缺陷形态变化很大。我的处理思路是给训练集“加噪声”。首先是加背景图从现场拍的无数张没有缺陷的铁轨图中采样混入训练集作为负样本让模型学会区分“看起来像但其实是锈迹”的区域。其次是用更激进的光照增强把亮度、对比度、色温的扰动幅度调大模拟不同天气和光线。最后是换相机视角验证如果现场相机安装角度和数据集拍摄角度差异大建议少量采集现场图做微调哪怕只有几十张效果提升也很明显。提示缺陷检测项目不要只盯mAP。我用这套数据训出来的模型mAP50到0.86左右但放到真实轨检视频上跑依然会出现细裂纹漏检。后来在推理侧加了帧间连续确认逻辑同一位置连续多帧检出才告警漏检率降了一大截。视觉模型只是系统的一环后面挂什么逻辑同样重要。最后再分享一个经验这类数据集拿到手别急着马上调整模型结构。先把baseline跑出来记录精度和召回然后每次只改一个变量要么加数据增强、要么改输入尺寸、要么换模型规模一步一步往上加。我看过太多人上来就魔改网络结构结果问题出在数据格式上白折腾一周。数据是你最值钱的资产把数据吃透模型自然会给面子。本文还有配套的精品资源点击获取
返回列表