尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

650张行李箱缺陷数据,如何用YOLOv8跑出可靠检测模型?

650张行李箱缺陷数据,如何用YOLOv8跑出可靠检测模型? 简介一套面向行李箱缺陷检测的目标检测数据集包含650张清晰图片覆盖损坏damaged与完好good_condition两类目标共936个矩形标注框适合用于YOLO及VOC格式的目标检测模型训练。压缩包共1952个文件包含650张jpg原图、650个xml标注文件、652个txt标签/说明文件整体大小25.11MB目录按图片、标注、标签分类存放结构清晰。图片未做增强标签按矩形框准确标注类别分布为damaged 199框、good_condition 737框可直接划分训练集和验证集开展实验标注格式兼容YOLOv5、YOLOv8及主流VOC工具链。已有126人学习下载适合计算机视觉初学者或工程人员快速获取合规数据用于行李箱质检、表面缺陷识别等场景的模型验证与算法调优也便于作为目标检测基准数据集进行对比测试。1. 行李箱缺陷检测650张样本能做什么拿到“行李箱缺陷检测数据集650张2类YOLOVOC格式.zip”这个包时第一反应是数量不大——650张图片在工业视觉里只够打底。但解压后发现它的结构化程度比很多“千张级”数据集更踏实JPEGImages、Annotations、labels三个文件夹一一对应VOC与YOLO两种格式同时给出标签只有damaged和good_condition两类框数分布也不均匀。这种规模恰好适合做两件事一是快速验证YOLO系列从v5到v8的迁移学习流程二是在小样本条件下对比不同的数据增强与类别平衡策略。如果你正准备跑通一个端到端的缺陷检测管线或者想拿真实工业图片练手这份数据能让你把注意力放在训练效果和坑位处理上而不是耗费时间整理标注格式。2. 数据集结构与标注格式从JPEGImages到labels解压后目录里只有三个文件夹没有多余的说明文档。先把结构说透不然后面配置训练时容易出路径错误。2.1 三层目录图片、XML、TXT的对应关系. ├── Annotations │ ├── xyxr_image001.xml │ ├── xyxr_image002.xml │ └── ... ├── JPEGImages │ ├── xyxr_image001.jpg │ ├── xyxr_image002.jpg │ └── ... └── labels ├── xyxr_image001.txt ├── xyxr_image002.txt └── ...图片、XML、TXT三类文件通过文件名前缀如xyxr_image626一一对应。JPEGImages存放原始彩色图片Annotations存放VOC格式的XML标注labels存放YOLO格式的TXT标注。三个文件夹都在同一个压缩包内直接解压即可无需额外转换。从数据集摘要看图片总数为650张全部是清晰图片分辨率参数未在压缩包内单独写明但目测不低于640×640。所有图片均未做数据增强这意味着你看到的就是原始采集状态也为后续自己加增强留下了空间。2.2 VOC格式的XML解析object里的name与bndboxVOC格式对做检测的人来说是标准入门形态。随意打开一个XML结构类似annotation folderJPEGImages/folder filenamexyxr_image626.jpg/filename size width1920/width height1080/height depth3/depth /size object namedamaged/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin412/xmin ymin300/ymin xmax788/xmax ymax654/ymax /bndbox /object /annotation注意name只有两种取值damaged划痕、破损、凹陷等和good_condition正常箱体。bndbox四个整数是绝对像素坐标左上角(xmin, ymin)和右下角(xmax, ymax)。解析时建议用xml.etree.ElementTree因为它是Python内置模块没有额外依赖。import xml.etree.ElementTree as ET def parse_voc(xml_path): tree ET.parse(xml_path) root tree.getroot() boxes [] for obj in root.findall(object): name obj.find(name).text bnd obj.find(bndbox) xmin int(bnd.find(xmin).text) ymin int(bnd.find(ymin).text) xmax int(bnd.find(xmax).text) ymax int(bnd.find(ymax).text) boxes.append((name, xmin, ymin, xmax, ymax)) return boxes这里每个object对应一个矩形框解析出来的坐标直接可用于画图或后续格式转换。字段含义一目了然但要注意VOC格式本身不强制要求类别ID类别名写在name里后面转YOLO时才需要映射成数字ID。2.3 YOLO格式的TXT归一化坐标与类别ID如果只用YOLO系列训练labels文件夹里的TXT才是主角。每行代表一个框格式为class_id x_center y_center width height所有坐标值均为相对于图片宽高的归一化小数取值01。例如1 0.4768 0.5235 0.1932 0.3289表示类别ID为1对应good_condition框中心在图片相对坐标(0.4768, 0.5235)处宽高占图片比例为0.1932和0.3289。类别ID约定是0对应damaged1对应good_condition这个顺序需要跟后续data.yaml中的names保持一致。写一个快速统计脚本来核对框数import os from collections import Counter label_dir labels class_names [damaged, good_condition] counter Counter() for txt in os.listdir(label_dir): with open(os.path.join(label_dir, txt)) as f: for line in f: cls_id int(line.split()[0]) counter[cls_id] 1 for cid in range(2): print(f{class_names[cid]}: {counter[cid]} 框)实际输出与摘要完全吻合damaged199框good_condition737框总框数936。差值538框意味着一个常见现象大量图片中只有正常箱体或者同图中正常箱体多于缺陷箱体。这个不平衡比例在后续训练中必须处理否则模型容易趋向于把一切预测为good_condition。3. 用YOLOv8训练行李箱缺陷检测从数据配置到模型评估既然已有YOLO格式标注最省力的路线是直接用Ultralytics YOLOv8。v8的训练接口比v5更简洁且近年工业场景中已经成为默认选择之一。3.1 数据集的目录规范化与data.yamlYOLOv8要求数据按固定方式组织训练时只需要提供一个YAML配置文件。把解压后的三个文件夹重新整理成如下结构luggage_defect/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml将原始JPEGImages按8:2比例随机划分为train和val同时把labels里对应的TXT文件同步移动。划分时务必保证图片与TXT同名且同时存在于相同子集。实际操作时我一般用这种脚本import os import random import shutil from glob import glob random.seed(42) images glob(JPEGImages/*.jpg) random.shuffle(images) split_idx int(len(images) * 0.8) train_imgs images[:split_idx] val_imgs images[split_idx:] os.makedirs(luggage_defect/images/train, exist_okTrue) os.makedirs(luggage_defect/images/val, exist_okTrue) os.makedirs(luggage_defect/labels/train, exist_okTrue) os.makedirs(luggage_defect/labels/val, exist_okTrue) for img in train_imgs: basename os.path.basename(img)[:-4] .txt shutil.copy(img, luggage_defect/images/train/) shutil.copy(os.path.join(labels, basename), luggage_defect/labels/train/) # val 同理为什么不用程序自动按标签分布划分因为某些缺陷图片数量少如果随机划分导致验证集里一个damaged都没有mAP评估就会失真。更稳妥的做法是按图片中是否包含damaged框做分层采样把包含缺陷的图片均匀分到两个集合。不过作为快速基线随机seed固定后也可以接受。data.yaml内容如下path: luggage_defect train: images/train val: images/val names: 0: damaged 1: good_conditionpath指数据集根目录的相对或绝对路径train和val是相对path的子目录names的索引顺序必须与TXT中的类别ID完全一致顺序错了训练过程不会报错但评估结果会全部错位。3.2 训练命令与关键参数安装ultralytics后直接用命令行训练yolo detect train dataluggage_defect/data.yaml modelyolov8n.pt epochs50 imgsz640 lr00.01 batch16 patience10几个参数值得单独说明modelyolov8n.pt使用nano规模的预训练权重。小数据集上从nano起步能显著降低过拟合风险训练速度也快。如果显存允许可以试yolov8s.pt但650张图通常没必要上到m或l。epochs50足够收敛。实测这种规模的数据集在RTX 3060上50轮不超过20分钟。imgsz640与原图分辨率契合避免强行resize导致缺陷纹理细节丢失。patience10连续10轮验证集指标不提升则早停防止后段过拟合浪费时间。训练完成后在runs/detect/train/目录下会生成权重文件best.pt验证集指标最优和last.pt最后一轮。后续推理直接用best.pt。3.3 评估指标mAP如何解读模型训练时的输出会打印每次验证的mAP50和mAP50-95。关键看mAP50即IoU阈值取0.5时的平均精度。对于行李箱缺陷这种目标较大、背景干扰相对可控的场景mAP50在0.85以上是一个比较合理的基线。如果发现damaged类的AP明显低于good_condition不要急着加数据或换模型先回到数据分布上找原因。用一个命令就能看验证集预测效果yolo detect val modelbest.pt dataluggage_defect/data.yaml save_jsonTrue这条命令会在输出目录生成predictions.json里面包含每个框的类别、置信度和坐标。通过比较damaged与good_condition的AP差距决定下一步是调阈值还是做样本平衡。4. 小数据集的训练技巧类别不平衡与过拟合这个数据集中damaged只有199框good_condition有737框比例接近1:3.7。如果不做任何处理模型会更倾向于学习出现频率高的类别。这里结合我的踩坑经验给出三个实际可操作的手段。4.1 类别不平衡不能只靠class_weightsYOLOv8本身没有直接暴露class_weights参数常用的做法是修改损失权重或在数据层面做处理。最简单有效的方法是在data.yaml里给每个类别指定权重系数YOLOv8的训练配置支持weight字段需要修改配置文件烦琐。更直接的还是调整正负样本比例——对good_condition类的TXT进行随机下采样或者对damaged类图片做离线增强。我习惯用离线复制加随机裁剪的方式扩充damaged样本把包含damaged框的图片复制一份然后对图片做轻度模糊或亮度抖动同时生成新的标注。注意不要做水平翻转因为行李箱上的划痕方向有物理意义翻转会改变缺陷的真实方向性导致模型学到错误特征。4.2 数据增强参数设置YOLOv8内置了丰富的增强策略在训练命令行中直接修改超参数即可yolo detect train datadata.yaml modelyolov8n.pt epochs50 imgsz640 hsv_h0.01 hsv_s0.5 hsv_v0.3 fliplr0.0 scale0.3 translate0.1与默认值相比我把fliplr设为0因为行李箱的正反面可能会影响表面缺陷的形态scale和translate保持较小值避免目标在缩放平移后失真或截断。下面是推荐参数表参数默认值建议值理由hsv_h0.0150.01色调偏移过大容易让箱体颜色失真hsv_s0.70.5饱和度降一点防止模型依赖颜色hsv_v0.40.3亮度扰动保持适中fliplr0.50.0保留缺陷方向性scale0.50.3小数据集下过度缩放会切掉缺陷translate0.10.1轻微平移增强鲁棒性调节这些参数的核心原则是增强手法的强度要远小于真实世界可能出现的差异。行李箱表面是硬质壳光照变化才是主要干扰所以重点放在HSV上而非大幅仿射变换。4.3 迁移学习与冻结骨干网络小数据集上最容易发生的过拟合表现是训练损失下降但验证mAP徘徊在0.7左右。一个有效手段是冻结YOLOv8的主干网络只训练检测头。执行方式是在训练脚本中设置from ultralytics import YOLO model YOLO(yolov8n.pt) model.train(dataluggage_defect/data.yaml, epochs30, freeze10, imgsz640)freeze10表示冻结前10层通常是卷积特征提取部分只更新后面的检测分支。先冻结骨干训练20轮让检测头收敛再解冻整体精调10轮是我在这种量级数据集上常见的做法。这样做能明显减缓局部纹理细节过拟合同时保留预训练模型对edge和texture的底层表达。5. 一个实用技巧批量校验标注并可视化数据集的标注是否准确不能光看框数。训练前建议写一个可视化脚本把标注框直接画到图片上逐一翻查重点看damaged类的框是否覆盖真实缺陷区域。用OpenCV即可实现。5.1 从TXT画框到图片import cv2 import os label_dir labels image_dir JPEGImages out_dir check_visual os.makedirs(out_dir, exist_okTrue) class_names [damaged, good_condition] colors [(0, 0, 255), (0, 255, 0)] for txtname in os.listdir(label_dir): if not txtname.endswith(.txt): continue imgname os.path.join(image_dir, txtname[:-4] .jpg) img cv2.imread(imgname) if img is None: continue h, w img.shape[:2] with open(os.path.join(label_dir, txtname)) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) xc, yc, bw, bh map(float, parts[1:]) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), colors[cls_id], 2) cv2.putText(img, class_names[cls_id], (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[cls_id], 1) cv2.imwrite(os.path.join(out_dir, txtname[:-4] .jpg), img)这段脚本会把TXT里的归一化坐标还原成像素坐标并绘制。注意检查两点一是坐标是否越界x2w或y2h二是框是否明显偏离目标物体的真实位置。对工业数据集来说标注噪声比算法噪声更致命一次人工翻查能避免后面一整周的无效调参。5.2 检查类别分布的另一种视角除了画框还有一个量化检查技巧统计每张图中damaged和good_condition的共现情况。如果发现大量图片只标了good_condition而没有damaged说明采集环境里正常样本占主导反之如果一张图中有多个damaged框需要确认这些框是否对应不同的缺陷实例。python -c import os from collections import Counter pair Counter() for f in os.listdir(labels): with open(fluggage_defect/labels/{f}) as fp: cls set(int(l.split()[0]) for l in fp) pair[tuple(sorted(cls))] 1 print(pair) 如果(0,1)的共现比例过低比如低于10%意味着模型很难学到“同一张图上正常与异常之间的视觉差异”此时建议将单类样本单独抽出来做难例挖掘而不是盲目调整增强参数。这个检查在接手任何新数据集时我都会先跑一遍能省下大量探索时间。本文还有配套的精品资源点击获取
返回列表