ARTICLE DETAIL

资讯详情

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

铁轨裂纹检测数据集:VOC/COCO/YOLO格式与YOLO训练实操指南

铁轨裂纹检测数据集:VOC/COCO/YOLO格式与YOLO训练实操指南 简介面向铁路安全检测与计算机视觉学习者提供一份真实场景的YOLO铁轨裂纹检测数据集包含5000张高质量图片。数据集采用LabelImg标注提供VOC、COCO和YOLO三种格式标签分别存放可直接用于YOLO系列目标检测模型训练。压缩包共2000个文件以xml标签文件为主另有划分脚本、txt列表和说明文档整体约517.85MB便于按需调用。随包附赠环境搭建、训练教程和数据集划分脚本覆盖Linux与Windows版本可帮助新手快速完成训练集、验证集、测试集划分并跑通检测流程。已有385人学习使用适合需要真实工业场景数据练习目标检测或开展铁轨缺陷识别研究的开发者。 高铁、地铁、矿山轨道这些场景结构安全永远是第一位。铁轨表面一旦出现裂纹早期发现就能避免大问题而 YOLO 这类目标检测算法正好可以在巡检图像里自动定位裂纹。我最近在整理一套“铁轨裂纹检测数据集”里面包含 5000 张已经标注好的图片并且同时提供了 VOC、COCO、YOLO 三种格式的标签文件还附带划分训练集/验证集/测试集的脚本和一份完整的 YOLO 训练教程。这篇文章就把这个数据集的核心内容、格式细节、训练流程和我在实际使用过程中踩过的坑一次性说清楚给正在做轨道交通视觉检测、工业缺陷识别或者刚入门 YOLO 目标检测的朋友一个可以直接参考的实操指南。1. 项目整体设计与数据构成拆解1.1 这套数据集到底解决了什么问题做目标检测项目的人应该都清楚一个项目能不能快速跑起来很多时间不是花在模型上而是花在数据上。铁轨裂纹这种缺陷目标本身属于小目标、低对比度、纹理复杂的一类随便拿一个通用目标检测数据集去训练效果基本没法用。专用的铁轨裂纹数据集相对稀少而且很多都有标注格式不统一、缺少划分脚本的问题。这套数据集的重点在于它直接帮我把最麻烦的“数据准备”环节解决了。5000 张图片不算特别大但这个体量用来训练 YOLOv5、YOLOv8 这类模型是足够的尤其是做迁移学习场景不需要从零开始。图片内容基本覆盖了铁轨表面裂纹的常见形态包括横裂纹、纵裂纹、网状裂纹以及部分带有光斑、油污、锈蚀干扰的样本。这种贴近真实巡检环境的多样性比单纯追求图片数量更有实用价值。1.2 数据集的文件结构与标签体系解压后可以注意到数据集按图片和标签分开放置标签同时存在于三个目录中VOC格式XML文件、COCO格式JSON文件和YOLO格式TXT文件。这种多格式并存的设计很有意思它不是为了堆文件数量而是为了适配不同训练框架。VOC格式Pascal VOC XML每个XML文件对应一张图片内含目标的bounding box坐标、类别名、图片尺寸等信息。适合使用SSD、Faster R-CNN以及一些基于VOC数据格式的检测框架。COCO格式JSON文件所有标注集中在一个JSON里包含images、annotations、categories三个核心字段。适合使用Detectron2、MMDetection等框架。YOLO格式TXT文件每个TXT文件对应一张图片每行格式为class_id x_center y_center width height坐标已归一化到0-1之间。这是YOLO系列直接读取的格式。实际使用中我最常使用YOLO格式因为YOLOv5和YOLOv8都原生支持这种格式。但如果你需要对比实验或者迁移到其他框架VOC和COCO版本就非常省事了不需要自己再写转换脚本。这里有个容易搞错的细节VOC和COCO的坐标是像素坐标而YOLO格式是归一化坐标。如果你拿到标签后直接用文本编辑器打开YOLO的TXT文件看到一堆0.3、0.8之类的数字别奇怪这就是归一化后的相对坐标。后续训练时模型会自动根据图片宽高反算像素位置。1.3 划分脚本的使用逻辑数据划分是训练前非常关键的一步很多人为了省事直接把所有图片都丢进去训练结果模型在训练集上表现很好一到验证集就露馅。这个数据集里附带了一个划分脚本通常是一个Python文件思路是把图片和对应的标注文件按照设定好的比例比如8:1:1或者7:2:1随机分配到train、val、test三个文件夹中。脚本内部做了两个比较重要的处理一是随机种子固定保证每次运行划分出的结果一致方便复现实验二是同步移动图片和标签保证图片和标注文件不会错位。这点非常关键尤其当你使用的是YOLO格式时如果图片和TXT文件没有对应上训练过程要么报错找不到标签要么干脆把标签错误地匹配到别的图片上导致模型学到错误信息。我拿到这个数据集时先用下面这个命令大概看了一下目录结构tree -L 3如果发现图片和标签不在同一个索引层级可以先运行划分脚本再检查train/labels和train/images两个目录下文件数量是否一致。正常情况下数量应该完全相等这是一个最直接的完整性校验。2. 三种标注格式的核心细节与转换思路2.1 VOC、COCO、YOLO格式的差异对比很多刚接触目标检测的朋友会被这三种格式绕晕其实它们本质上都是“告诉模型目标在哪、是什么”的描述方式差别在于组织方式和坐标表达。格式文件形式坐标体系典型框架特点VOC每张图一个XML像素绝对坐标(xmin, ymin, xmax, ymax)Faster R-CNN、SSD、MMDetection文件数量多可读性强适合单图查看COCO整个数据集一个JSON像素绝对坐标[x, y, width, height]Detectron2、MMDetection适合大规模数据集后续做实例分割也兼容YOLO每张图一个TXT归一化坐标(x_center, y_center, width, height)YOLOv5、YOLOv8、YOLOv9文件轻量训练读取快但可读性差需要注意COCO和VOC虽然都是像素坐标但COCO的bbox是左上角坐标加宽高x,y,w,h而VOC是左上角和右下角坐标xmin,ymin,xmax,ymax。如果你在框架里导入标注时搞混了这两个字段模型训练出来的预测框会全部偏移而且你很难立刻察觉。2.2 标签内容与类别设置分析从标签中可以推测这个数据集的类别应该只有一个类别裂纹crack。如果你使用YOLOv5或YOLOv8的数据配置文件yaml文件中names列表只需要一行[crack]。这里有一个实际经验单类检测任务并不比多类简单。因为裂纹的形状变化非常大有的裂纹细长有的呈块状有的还有分支模型需要学习的是缺陷的“纹理特征”而不是简单的“形状特征”。所以即使是单类数据多样性依然非常重要。我在训练时也尝试过把“光斑”、“锈蚀”这种干扰项单独标一类让模型区分“真裂纹”和“假裂纹”但效果并不理想因为干扰项本身边界模糊会引入更多标注噪声。最后我还是回到单类检测用增加数据增强的方式来压制误检。2.3 格式转换时容易忽略的边界情况虽然数据集已经提供了三种格式但如果你自己扩展了图片或者重新标注了一部分数据就可能需要做格式转换。转换过程中要注意几个边界情况当目标超出图片边界时VOC允许坐标小于0或大于图片宽高但YOLO格式要求归一化后的数值必须在0到1之间严格来说超过一点也会被很多框架容忍但最好是clip到0-1范围内。当图片EXIF信息包含旋转角时直接转换坐标会导致错位。读取图片时应该用cv2.imread或者ImageOps.exif_transpose统一处理忽略旋转信息保证像素坐标和图片数据一致。当某个XML里没有目标空标注时转换出的TXT文件应该为空文件而不是删除标注。因为训练时图片和标注文件需要一一对应缺少TXT会导致框架报错或跳过该图片。3. 基于YOLO的训练实操教程3.1 环境配置与依赖安装训练YOLO系列模型环境配置是不少人的第一道坎。以YOLOv8为例如果使用GPU训练你需要确认显卡、驱动、CUDA和PyTorch之间的兼容性。很多人问“AMD显卡能跑YOLO吗”这里展开说一下。NVIDIA显卡可以直接用CUDA加速这是目前YOLO训练最主流、最省心的方案。如果你用的是NVIDIA显卡安装顺序是先装显卡驱动再装CUDA toolkit最后装匹配的PyTorch。可以通过nvidia-smi命令查看驱动支持的CUDA版本然后去PyTorch官网选择对应的安装命令。如果是AMD的RX系列显卡YOLOv5和YOLOv8也并非完全不能用。PyTorch在ROCm版本上支持部分AMD显卡但配置过程比较折腾且很多预编译车轮可能不匹配你的显卡型号。我的建议是如果你是新手老老实实用NVIDIA显卡来跑YOLO。如果手头只有AMD显卡可以先使用CPU训练一小批数据来验证流程是否走通再考虑GPU加速否则大概率会在环境安装上消耗掉大量时间。安装依赖时建议创建一个独立的虚拟环境不要直接装在系统Python里。conda create -n yolotrain python3.10 -y conda activate yolotrain pip install ultralytics这样哪怕后续环境崩了重新创建一个也是几分钟的事。3.2 数据配置与训练参数设置假设你已经把数据集划分为train和val两个目录并且图片和TXT标签在对应子目录下YOLO格式的标准目录结构应该长这样dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/接下来创建一个数据集配置文件crack.yamlpath: /path/to/dataset train: images/train val: images/val names: 0: crack如果定义了test集可以加一行test: images/test没有也没关系。训练命令很简单以YOLOv8为例yolo train datacrack.yaml modelyolov8s.pt epochs100 imgsz640 batch16这里面几个参数我单独说一下modelyolov8s.pt代表使用YOLOv8的small版本预训练权重来自COCO。自带的预训练模型会极大加快收敛速度也提高最终精度。imgsz640是输入图片的像素尺寸。如果裂纹非常小可以尝试使用1280尺寸但显存占用会成倍增加。小目标检测在原理上依赖特征图的分辨率但盲目的imgsz增大也可能导致训练过拟合。batch16是批大小训练过程中可以观察GPU显存使用率来调整。显存不够时优先降低batch而不是关闭所有数据增强。3.3 训练过程的监控与模型评估训练YOLO时终端会实时打印每个epoch的损失值、精度、召回率、mAP等指标。很多人只关注mAP而忽略训练过程是否稳定。我习惯看训练曲线里的train/box_loss和val/box_loss如果验证集损失在训练后期反而上升说明模型开始过拟合此时应该提前终止训练、增加数据增强强度或减小模型复杂度。如果完整跑完100个epoch最后会在runs/detect/train/目录下生成weights/best.pt和weights/last.pt。best.pt是根据验证集mAP挑选出的最优权重后续推理直接用best.pt而不是last.pt。这是一个新手非常容易踩的坑有时候last.pt在训练集上精度很高但验证集和实际场景效果差很多。评估时可以调用以下代码直接输出指标yolo val modelruns/detect/train/weights/best.pt datacrack.yaml主要看mAP50和mAP50-95两个值。mAP50指的是IoU阈值为0.5时的平均精度mAP50-95是多个IoU阈值下的平均后者对定位精度更敏感。裂纹检测场景中mAP50如果超过0.85就已经具备很可用的效果mAP50-95则不要低于0.6否则模型边界框不够精准。4. 常见问题与排查技巧实录4.1 图片和标签不匹配这是新手高频问题。表现是训练过程中报错Image ... has no labels或者某个epoch的标签数为0。排查步骤很简单先用Python脚本统计一下images/train和labels/train下的文件前缀去掉扩展名的文件名集合是否完全一致。import os img_dir dataset/images/train label_dir dataset/labels/train imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir)} labels {os.path.splitext(f)[0] for f in os.listdir(label_dir)} print(imgs - labels) # 有图片但没有标签 print(labels - imgs) # 有标签但没有图片如果发现图片多而标签少多半是标注过程中遗漏了如果标签多而图片少可能是采用了不受支持的图片格式如tif、bmp导致数据加载时被过滤了。YOLO训练框架通常只支持常见的jpg、png格式如果你的数据集里有其他格式图片建议统一转换为jpg或png。4.2 显存不足与训练崩溃训练过程中最常见的错误是CUDA out of memory。出现这个错误时优先做三件事第一关闭电脑上其他占用显存的程序比如浏览器、图像处理软件等第二将batch调小从16降到8甚至4第三降低模型尺寸从yolov8m换成yolov8s。如果batch已经为1还是显存不足那就需要检查是否开了withNMS或者过多的训练线程。有时数据加载线程数量过多也会干扰显存分配可以在训练命令中加上workers2来限制。4.3 标注格式转换后坐标错乱我遇到过不少朋友从VOC转换到YOLO后训练出的模型预测框总是偏左或偏上且偏移量不固定。排查下来的根因多数是转换脚本没有加上“宽高除以归一化时使用的图片宽高”这个步骤。VOC的xmin、ymin是相对原始图片的但YOLO需要的是相对输入尺寸归一化后的中心点坐标和宽高。正确的转换公式如下假设图片宽度为w高度为hx_center (xmin xmax) / 2 / w y_center (ymin ymax) / 2 / h width (xmax - xmin) / w height (ymax - ymin) / h如果你使用了精细标注工具标注时图片经过缩放但在转换脚本里没有同步缩放宽高也会出现坐标错乱。更稳妥的做法是直接从标注工具导出系统生成的标注文件而不是手工修改。4.4 模型训练了但检测不到裂纹有时训练过程看起来很正常loss一直在下降mAP也不错但真正部署到视频流或者现场图片上却什么都检测不出来。这种情况大多是因为训练集和推理图像之间的“域差距”太大。例如训练集都是白天光线下的图片部署时到了夜间或者高曝光场景模型自然失效。解决方案有两种一种是收集更多现场场景的数据手动标注后加入训练集做增量训练另一种是在推理前对图片做一些预处理比如限制对比度增强、锐化等让输入图像更接近训练集的视觉分布。实践中我更推荐第一种因为数据才是最根本的。预处理只能改善一部分情况而且处理不当还会引入新的噪声。5. 训练之外的扩展思考5.1 从检测到分割的延伸铁轨裂纹检测如果只输出边界框对实际维护人员来说定位到“这里有裂纹”并不足够通常还希望知道裂纹的精确面积。这时可以将YOLO检测作为第一阶段的区域候选再对候选区域使用分割模型比如SegFormer、U-Net或者YOLOv8-seg来做像素级分割。我实测过的流程是先用YOLO在整张图像上快速找出裂纹区域再对每个区域做分割既能控制算力开销又能得到更精细的裂纹形态。这套数据集的VOC和COCO格式标签在迁移到分割任务时也有一定价值。虽然本来的标注是矩形框但如果后续有精力去补充多边形标注会进一步提升工业场景下的实用性。5.2 模型轻量化与边缘部署铁轨巡检场景通常有两种部署方式一种是轨检车上的高性能工控机另一种是手持设备或边缘盒子。如果要在边缘设备上部署YOLOv5n、YOLOv8n这类nano模型是首选参数量不到3M压缩到OpenVINO或者TensorRT后在普通边缘设备上可以跑到几十帧。在训练时就有意识地使用小模型然后用ONNX导出yolo export modelbest.pt formatonnx imgsz640如果你的部署平台支持TensorRT还可以进一步转为engine格式推理速度会进一步提升。需要注意的是模型轻量化后单张图片的小目标召回率可能会下降这时可以配合TTA测试时增强或多尺度推理来弥补但实时性会打折扣需要根据实际场景权衡。5.3 数据增强策略的调整训练YOLO模型时ultralytics默认开启了马赛克增强、随机仿射变换、HSV变换等策略。这些增强对通用目标很有效但对铁轨裂纹这种纹理型缺陷要谨慎。马赛克增强会把4张图拼在一起如果裂纹本身很小拼图后目标被缩小模型可能学不到足够细节。我实际使用中会适当降低mosaic的概率同时增加对图片的随机裁剪和旋转幅度来模拟不同拍摄角度下裂纹的形态变化。如果发现模型对反光区域误检严重可以增加亮度对比度扰动较高的样本或者在训练集中人工合成一些带有光斑的负样本让模型学会抑制干扰。最后再分享一个我自己实践中的小技巧训练铁轨裂纹这类小目标检测时不要一开始就追求高分和完美的模型。我先用默认参数快速跑一轮50个epoch用这个粗糙的模型对训练集进行推理把预测框和真实框叠在一起可视化出来能非常直观地发现标注错误和难以学习的样本。这些“难例”往往才是决定模型上限的关键。把难例挑出来重新审核标注、适当补充类似场景的数据比单纯调参有效得多。希望这套数据集和教程能帮你少走一些弯路。本文还有配套的精品资源点击获取
返回列表