资讯动态

VOC+YOLO双格式轮胎缺陷数据集:从解压到YOLOv8训练实战

发布时间:2026/9/15 3:26:59 来源:尧图企业网站定制
简介轮胎缺陷检测数据集适用于计算机视觉目标检测任务面向深度学习算法工程师、工业质检研究人员及相应专业学生可服务于智能制造产线外观检测、轮胎表面缺陷识别等场景。数据集包含2154张真实轮胎图像标注了debris、ground、side、side_cut四类缺陷共计2844个边界框边界框定位准确、类别覆盖常见外观问题并提供Pascal VOC与YOLO两种主流标注格式可直接用于YOLOv系列、SSD等模型的训练与评估节省大量数据采集和人工标注成本。资源包共2000个文件以xml标注文件为主另含txt说明文件压缩后约105.65MB目录结构规整并附有使用前必读说明便于按图像与标注对应关系快速拆分训练集和验证集。已有662人浏览学习适合需要快速搭建实验数据集、开展缺陷检测算法研究或进行工程落地的用户。1. 轮胎缺陷检测数据集2154张VOCYOLO双格式为什么值得直接用轮胎缺陷检测是工业质检里少有的「数据好标、模型好训、上线价值清晰」的场景缺陷区域相对固定背景受控类别区分度也够。但真正动手做时最耗时间的不是模型选型而是数据准备——从生产线采样、缺陷标注、格式转换到目录整理两三个星期就过去了。这个名为“轮胎缺陷检测数据集VOCYOLO格式2154张4类别.7z”的包把最麻烦的一步提前做完了2154张真实轮胎图像已经按VOC和YOLO两种主流格式标注好解压后直接喂给YOLOv5、YOLOv8或MMDetection这类框架。适合谁用一类是做工业视觉项目但客户没给数据的工程师一类是拿公开数据集做算法验证、毕设或竞赛的学生。它的体量不大但足以跑通完整的目标检测流程也能暴露不少实际训练中的坑——比如类别不平衡、小目标漏检、标注框边界不干净。接下来就从这个压缩包开始一步步拆开看里面到底是什么以及怎么最快用起来。2. 数据集内部结构与4类别标注VOC和YOLO两种格式怎么对应拿到.7z文件第一件事不是急着训练而是先摸清目录结构。很多下载下来的数据集解压后图片和标签散落一地或者XML、txt混在一起不规划好直接训练会报AssertionError或者Loss直接NaN。所以先花五分钟看一下目录能省下后面一小时的排错。2.1 解压7z后先看目录布局在Linux或macOS下7z解压用p7zip提供的命令sudo apt update sudo apt install -y p7zip-full 7z x 轮胎缺陷检测数据集VOCYOLO格式2154张4类别.7zWindows下如果不想装额外软件可以用7-Zip自带的GUI或者用命令行C:\Program Files\7-Zip\7z.exe x 轮胎缺陷检测数据集VOCYOLO格式2154张4类别.7z如果只是为了快速看一眼内容可以加-l参数列出压缩包内的文件列表不解压也能知道大概结构7z l 轮胎缺陷检测数据集VOCYOLO格式2154张4类别.7z这里x表示解压到当前目录并保留目录结构-o可以指定输出目录。解压后常见布局有两种一种是根目录下直接有images、Annotations、labels三个目录另一种是按train/val分好各含图片和标注。两种布局不影响后面训练但需要你把它整理成YOLO要求的固定形式。2.2 VOC格式XML里藏着类别名和边界框VOC格式的核心是每张图片对应一个同名XML文件。打开一个标注文件能看到类似这样的结构annotation folderimages/folder filenametire_0001.jpg/filename size width1920/width height1080/height depth3/depth /size object namecrack/name bndbox xmin312/xmin ymin450/ymin xmax520/xmax ymax612/ymax /bndbox /object /annotation字段含义很直接filename是图片名size是宽高通道数object可以出现多次表示同一张图里有多个缺陷。name就是类别名bndbox是左上角和右下角的像素坐标。这个数据集标注了4个类别常见的轮胎缺陷类型包括裂纹、气泡、凹陷、杂质等具体是哪四个以标注文件里的name值为准。2.3 YOLO格式从像素坐标到归一化中心点YOLO的txt标注是每行一个目标格式为class x_center y_center width height全部是归一化坐标也就是像素值除以图片宽高。同样一个框在YOLO里是这样0 0.2167 0.4917 0.1083 0.1500对应关系是class是类别索引从0开始后四项都是0到1的小数。如果你把XML里的xmin312, xmax520对1920宽度的图算一下center_x (312520)/2/1920 416/1920 ≈ 0.2167就明白了。这种双格式并存的设计好处在于VOC适合用LabelImg等工具检查或重新标注YOLO格式省去框架内部的转换步骤可以直接被YOLOv5、YOLOv8读取。两类文件必须保持同名图片叫tire_0001.jpg标签就得叫tire_0001.txt扩展名不同前缀必须一致。否则训练时会出现No labels found的警告。3. 从解压到训练用YOLOv8/v5跑通2154张数据的完整命令这一章直接给出一套能在本地跑通的最小训练流程。假设你已经解压好了数据集并且把images和labels两个目录放在了项目下。这里以YOLOv8为例因为它的接口更简洁模型文件和配置都是自包含的不需要额外写Network配置。3.1 准备YOLO要求的目录结构YOLO训练时默认按images和labels两个平行目录组织数据训练集、验证集可以再细分。常见做法是分成images/train、images/val、labels/train、labels/val四层比例按8:2或9:1。用脚本随机划分即可import os import random import shutil images_dir tire_dataset/images labels_dir tire_dataset/labels train_img tire_dataset/images/train val_img tire_dataset/images/val train_lbl tire_dataset/labels/train val_lbl tire_dataset/labels/val for d in [train_img, val_img, train_lbl, val_lbl]: os.makedirs(d, exist_okTrue) all_imgs [f for f in os.listdir(images_dir) if f.endswith(.jpg)] random.seed(42) random.shuffle(all_imgs) val_count int(len(all_imgs) * 0.2) for f in all_imgs: label f.replace(.jpg, .txt) if all_imgs.index(f) val_count: shutil.move(os.path.join(images_dir, f), os.path.join(val_img, f)) shutil.move(os.path.join(labels_dir, label), os.path.join(val_lbl, label)) else: shutil.move(os.path.join(images_dir, f), os.path.join(train_img, f)) shutil.move(os.path.join(labels_dir, label), os.path.join(train_lbl, label))这里random.seed(42)保证每次划分结果一致方便对比实验。如果你原来的标签已经在labels目录下这段脚本会直接移动文件如果只有VOC的XML需要先转换下一章会写转换脚本。划分完后训练集应该有1700多张验证集400多张。3.2 编写 data.yaml 并解释关键参数接着写一份data.yamlpath: tire_dataset # 数据集根目录 train: images/train val: images/val nc: 4 names: [crack, bubble, dent, impurity]注意path最好写绝对路径或者相对于运行目录的路径。train和val的值是图片目录的相对路径YOLO会自动在同一个父目录下找同名txt。nc必须和names的数量一致类别顺序决定了txt里class索引的含义。如果你不确定类别名用下面的命令扫描所有标注文件awk {print $1} tire_dataset/labels/train/*.txt | sort | uniq -c这条命令会统计训练集txt里第一个字段class索引的出现次数帮你核实4个类别是否齐全、有没有缺类或空文件。3.3 训练、验证与导出显存占用安装YOLOv8后一行命令开始训练yolo detect train datatire_dataset/data.yaml modelyolov8n.pt epochs100 batch16 imgsz640 device0参数含义modelyolov8n.pt用Nano版作为预训练骨架2154张的数据量喂大模型容易过拟合epochs100对这个小数据集来说足够收敛batch16在常见8GB显存下没问题如果OOM就降到8或4imgsz640是YOLOv8默认推理尺寸。如果用的是老电脑CPU训练可以加devicecpu但一个epoch会慢很多。训练过程会输出每个类别的mAP50和mAP50-95指标。轮胎缺陷是明显的目标检测场景mAP50目标至少到0.85以上才算正常如果你的数据里小裂纹多mAP50-95可能偏低这属于小目标问题的典型表现不用急着调模型可以回到数据层面看标注框是否完整覆盖了裂纹两端。训练结束后模型权重存在runs/detect/train/weights/best.pt验证和推理直接引用它。4. 数据校验与格式转换把VOC转成YOLO以及踩坑参数看到这里你可能会发现上一章的划分脚本假设标签已经是YOLO格式但如果下载包里只有VOC XML或者两个格式都存在但内容不一致直接训练会有隐患。这一章解决「手上只有VOC想转成YOLO」以及「转完后如何验证数据质量」两个问题。这也是YOLO训练自己的数据集时最常卡住的地方。4.1 先做一致性校验在动脚本之前先检查三件事ls tire_dataset/images/*.jpg | wc -l ls tire_dataset/labels/*.txt | wc -l find tire_dataset/labels -name *.txt -size 0 -delete第一、二条统计图片和标签数量差值可能就是缺标注的图片。第三条删除空标签文件——空文件在YOLO训练时不会报错但会让模型学到「没有目标」的错误信号。接着抽一张图用LabelImg或Python读XML把边界框画回原图肉眼确认一下框是否贴近缺陷边缘。常见坑是标注时误把整条轮胎画成一个框或者只框出部分裂纹。这类错误在训练中很难靠Loss异常发现只能靠抽查。4.2 VOC XML 转 YOLO txt 的可靠脚本如果确认XML没问题下面这段脚本把所有VOC标注转换成YOLO txtimport os import xml.etree.ElementTree as ET def convert_annotation(xml_path, txt_path, class_names): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_names: continue class_id class_names.index(name) box obj.find(bndbox) xmin int(box.find(xmin).text) ymin int(box.find(ymin).text) xmax int(box.find(xmax).text) ymax int(box.find(ymax).text) x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines)) class_names [crack, bubble, dent, impurity] xml_dir tire_dataset/Annotations txt_dir tire_dataset/labels os.makedirs(txt_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue convert_annotation( os.path.join(xml_dir, xml_file), os.path.join(txt_dir, xml_file.replace(.xml, .txt)), class_names )脚本里root.find(size/width)是VOC XML的标准路径注意不要写成root.find(size).find(width)两种写法都对但前者更简洁。转换时遇到不在class_names里的类别会跳过这能过滤掉背景框或干扰标注。输出用:.6f保留6位小数避免精度不足导致边界框偏移。4.3 4类别数据集的平衡性与样本量边界2154张图4个类别听起来数量够用但分布往往不均。轮胎表面最常见的是细小裂纹crack气泡和杂质可能各占20%凹陷可能只有10%。如果某个类别只有一两百个实例模型很难学好它。先用命令统计各类别目标数量for i in 0 1 2 3; do echo class $i:; cat tire_dataset/labels/*.txt | awk -v c$i $1c | wc -l; done如果发现类别严重失衡有两条路一是针对少类别做数据增强二是调整data.yaml里的class_weights或训练时的loss_gain。但更常用的做法是在转换阶段保留所有标注靠mosaic增强让模型多看到少类样本。训练时YOLOv8默认开启mosaic如果少类样本太少也可以在第100轮后关闭mosaic做精调具体参数是close_mosaic10表示最后10轮不用mosaic减少增强对真实分布的影响。另外需要注意2154张是图片数不是标注框数。一张轮胎图可能同时有3个裂纹和1个气泡模型学的是框定位因此实例总数可能接近一万。这比直接看图片数更接近有效的训练规模。5. 进阶用2154张做数据增强和缺陷定位验证小数据集训练最怕模型记住背景而不是缺陷。轮胎图像的光照、角度和轮胎型号如果不统一模型的泛化能力会打折。这一章讲两个具体技巧一是针对轮胎场景的数据增强设置二是用混淆矩阵和热力图验证模型是真的在找缺陷还是只靠「轮胎纹路猜位置」。5.1 轮胎场景下的增强参数推荐YOLOv8的增强参数在训练时直接可调不需要改代码。这里给一组比较稳的参数yolo detect train datatire_dataset/data.yaml modelyolov8n.pt epochs150 batch16 imgsz640 hsv_h0.015 hsv_s0.7 hsv_v0.4 translate0.1 scale0.4 fliplr0.5 mosaic1.0关键变通在于hsv_h0.015让色调变化很小因为轮胎本身的颜色就是黑灰色相大幅变化会引入不真实的蓝色或绿色轮胎scale0.4允许缩放40%这能模拟轮胎在画面中大小不一的情况fliplr0.5左右翻转对轮胎纹理对称区域有效但对带有方向性纹理的胎面要慎重如果缺陷形态有左右之分把fliplr改成0。translate0.1控制平移扰动用来模拟轮胎在传送带上位置偏移。5.2 验证网络关注的是缺陷而非背景训练完后用验证集生成混淆矩阵yolo detect val modelruns/detect/train/weights/best.pt datatire_dataset/data.yaml在runs/detect/val/confusion_matrix.png里别只看对角线数值重点看两个地方一是背景列有没有明显误报二是类别之间是否互相混淆。如果crack和bubble经常互相误判说明两类缺陷在纹理或形状上太接近这时候需要回头检查标注边界是否把两种缺陷框在了同一个框里。如果背景列有高响应多半是增强参数过猛或者某些标注框太小模型学成了「见较亮区域就报警」。更直接的验证方法是看val_batch1_pred.jpg这张图会把预测框和置信度画在原图上。轮胎缺陷检测的行业经验是置信度低于0.5的预测框先别急着当误报很多细裂纹在轻度磨损后对比度很低模型给出0.3的置信度不一定错可能是标注时漏标了。这种「预测框落在未标注的缺陷上」的情况恰恰说明模型学到了泛化特征反而可以用来补充数据集标注。用Grad-CAM或YOLO的plot_feature_maps也能看特征图激活区域但最直观的还是画预测框。如果在背景复杂但无缺陷的轮胎图片上模型稳定输出高于0.6的框那就要回到训练集检查是不是所有负样本都不干净——有些标注漏了缺陷模型把未标注的缺陷当成了背景负例这是一种常见的数据集问题。把这类漏标的图找出来重新标注比调模型参数更有效。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价