行李箱缺陷检测数据集:YOLO+VOC格式训练实战指南
2026/9/16 5:59:11 网站建设 项目流程

简介:面向行李箱外观缺陷检测任务,这份数据集包含650张清晰jpg图片及对应VOC和YOLO两种格式的标注文件,适合目标检测模型训练与算法验证。数据覆盖2类标签:damaged与good_condition,矩形框总数936个,其中损坏框199个、完好框737个,类别分布可按需进行样本均衡处理。压缩包共1952个文件,主要包含650个jpg图像、650个xml标注和652个txt格式标签,整体约25.11MB,目录按JPEGImages、Annotations、labels三个文件夹组织,便于直接接入YOLO或VOC训练流程。目前已有126人学习下载,标注经人工校验,仅提供准确合理的框选数据,不承诺模型精度,适合深度学习初学者练习数据预处理或质检场景研究者快速获取规范数据。

1. 行李箱缺陷检测数据集:650张图,两个类别,YOLO与VOC双格式意味着什么

如果您刚从网盘下载得到行李箱缺陷检测数据集650张2类YOLO+VOC格式.zip,大概率是准备训练一个行李箱表面质量检测模型。650张和2类是入门级规模:从头训练目标检测模型会出现明显的过拟合,但配合预训练权重和数据增强,完全可以在工位或产线环境下跑通一套可用的外观缺陷检测流程。这个压缩包同时给出 YOLO 和 VOC 两种标注格式,省去自己写格式转换的琐碎步骤,也方便在 YOLOv8、YOLOv5、MMDetection 之间切换。下面从目录结构、格式差异、训练命令、样本增强到验收和部署,按一线工程师的实际路径展开。

2. 读懂行李箱缺陷检测数据集:VOC与YOLO格式字段差异和2类目标分布

2.1 650张和2类说明什么

先看数量。650张图像做目标检测,属于“小数据但可用”的档位。经验上每类至少要有200到300个实例,模型才不至于把背景纹理学成目标。如果两个类别在标注里分布比较均匀,每类约325个实例,刚好够迁移学习微调。行李箱检测的拍摄背景通常比较单一,比如流水线固定工位,所以650张的图像多样性不足,泛化主要靠增强和预训练特征来补。

2类指的是标注文件中只有两个目标类别。结合行李箱外观质检场景,最常见的两类是“划痕”与“凹陷”,也可能是“裂纹”和“破损”,具体以数据集里的类名定义为准。类别少能降低后处理复杂度,但也容易把光照反射、防拆标签误检成缺陷,因此拿到包后第一步是解压,先看data.yamlclasses.txt里的 class 顺序,再往 YOLO 的names配置里写。

2.2 VOC格式:目录结构与XML标注

VOC格式来自PASCAL VOC项目,很多检测框架都支持。它用目录组织数据:JPEGImages放原图,Annotations放和图片同名的 XML,ImageSets/Main放划分文件并把每个划分阶段用 txt 列表管理。每个 XML 记录图片宽高和所有目标的类别、边界框坐标。打开一个典型标注文件,大概长这样:

<annotation> <folder>JPEGImages</folder> <filename>luggage_001.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>scratch</name> <difficult>0</difficult> <bndbox> <xmin>184</xmin> <ymin>231</ymin> <xmax>621</xmax> <ymax>508</ymax> </bndbox> </object> </annotation>

这段 XML 里size是整个标注的关键。后续转成 YOLO 时必须用图像宽高做归一化,如果尺寸写错或缺失,转换出来的中心点、宽高全是错的。bndbox的四个值是像素坐标,左上角和右下角,不需要推理换算;一张图里有多个目标就重复写多个object节点。如果 XML 和图片没有同名文件,或者Annotations目录里混入隐藏文件,后面训练时会出现“找不到标签”的告警,这是最常见的低级错误。

VOC 格式的好处是透明、可读性好,方便用 labelImg 或 CVAT 再次人工复核;缺点是 XML 冗余信息多,在千级数据量下磁盘占用大,训练前通常都会转成 YOLO 的纯文本标签。

2.3 YOLO格式:归一化坐标与转换逻辑

YOLO 格式是一张图片对应一个同名 txt,每一行是class_id x_center y_center width height。四个坐标值都除以图像宽高,统一在0到1之间。这样图片更换分辨率时标注不用重做,也能让 Mosaic、随机缩放等增强直接作用在归一化坐标上。

对比项VOC格式YOLO格式
文件载体XMLtxt
坐标描述左上角(xmin,ymin)和右下角(xmax,ymax)的像素值归一化的中心点坐标加上宽高
类别名字符串,如 scratch数字索引,如 0
对图像尺寸依赖强依赖,size错误会直接影响转换不依赖,推理时与分辨率无关

因为压缩包里两种格式都给了,你大概率不用自己写转换脚本。但如果 VOC 和 YOLO 版本标注不完全同步,就需要自己补一个转换工具。下面是我常用的函数:

import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_txt, class_map): 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_map: continue # 跳过未注册的类,避免写入未知索引 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 width = (xmax - xmin) / img_w height = (ymax - ymin) / img_h lines.append(f"{class_map[name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}") with open(out_txt, "w") as f: f.write("\n".join(lines))

class_map的键必须和 XML 里的name完全一致,值从0开始连续编码,例如{"scratch": 0, "dent": 1}。如果你提前换过顺序,训练配置里的names必须同步修改,否则模型记住的类别索引是乱的。转换完成后不要急着删 XML,先随机抽出几张图,把 txt 里的坐标还原成像素框画一遍,确认没有整体偏移或比例反了,再进入训练环节。

3. 用YOLO在行李箱缺陷检测数据集上训练:划分、data.yaml与loss曲线

3.1 数据集划分:固定随机种子,按7:2:1拆分

训练前先用固定随机种子把650张图切开。如果压缩包里已经帮你准备好了train.txtval.txt,也要重新核对一遍,确认验证集和训练集没有重图。行李箱缺陷检测中最容易翻车的是同一张行李箱的不同角度照片被同时放进训练集和验证集,让验证指标虚高。

没有现成划分时,我一般用下面这段脚本:

import os import random from pathlib import Path random.seed(42) image_stems = [p.stem for p in Path("images").glob("*.jpg")] random.shuffle(image_stems) n = len(image_stems) train = image_stems[: int(n * 0.7)] val = image_stems[int(n * 0.7): int(n * 0.9)] test = image_stems[int(n * 0.9):] for split_name, stems in [("train", train), ("val", val), ("test", test)]: os.makedirs(f"labels/{split_name}", exist_ok=True) with open(f"{split_name}.txt", "w") as f: for stem in stems: f.write(f"images/{stem}.jpg\n") os.system(f"cp labels/{stem}.txt labels/{split_name}/")

random.seed(42)让每次运行产生同样的切分,后续对比实验才公平。这里把test单独留出 10%,是为了最后做一次“没被训练过程碰过”的指标验证;如果你只想快速出结果,也可以把 10% 合进验证集。copy labels是直接把标注按划分复制到labels/{split_name}下,避免训练时去大目录里按列表过滤,速度更快。如果图片不是.jpg,把glob的后缀改成实际后缀即可。

3.2 组织YOLO数据目录和data.yaml

YOLOv8 推荐的数据目录结构是images/{train,val}labels/{train,val},根目录放一个data.yaml。整理好后结构如下:

datasets/luggage/ images/ train/ val/ labels/ train/ val/ data.yaml

data.yaml内容很简单:

path: datasets/luggage train: images/train val: images/val names: 0: scratch 1: dent

path写的是基于你执行训练命令所在目录的相对路径,如果路径不对会直接报Dataset not found。更稳妥的做法是写绝对路径,但整个项目换机器时要同步改。names的顺序必须和 txt 第一列的类索引一致,这一步错的话,mAP 再高也没有生产意义。如果你发现数据包里有测试集目录,可以再加上test: images/test字段,但训练命令里不会主动用test,它只供最终验证脚本读取。

3.3 YOLOv8训练命令和关键参数

假设你安装的是ultralytics,从命令行进入项目根目录后,最短的训练命令是:

yolo detect train data=datasets/luggage/data.yaml model=yolov8n.pt epochs=100 batch=16 imgsz=640 device=0

参数含义如下:

参数推荐值说明
modelyolov8n.ptNano预训练权重,600张数据用大模型容易过拟合
epochs100~200看验证集 loss 是否还在降
batch8~166GB显存用8,12GB以上用16或更大
imgsz640与预训练输入分辨率保持一致
device0指定GPU编号,无GPU环境不写会自动跑CPU

如果你习惯 YOLOv5,命令基本一样:python train.py --data data.yaml --weights yolov5s.pt --batch 16 --epochs 100。注意 YOLOv5 要求数据目录里trainval是指向images子目录的路径,和 v8 略有差别。YOLO 已经出到第11代,但 v8 的生态资料最全,650张的小数据集不必追新,够用就好。AMD 显卡跑 YOLO 同样是device=0,前提是 PyTorch 装的是 ROCm 版本,否则会掉回 CPU,一个 epoch 能慢出数量级。

3.4 用YOLO损失函数趋势判断训练状态

YOLOv8 的训练日志里重点看三个损失:box_loss回归边界框位置,cls_loss计算分类置信度,dfl_loss是分布焦点损失,负责让预测框的分布更集中。对行李箱这种大目标占比比较高的场景,box_loss下降趋势会比cls_loss更明显。如果训练到第50轮box_loss还在抖动,优先去查标注框是不是有大偏移。cls_loss如果一直下不到0.02以下,考虑类名顺序是否有错,或者两类样本量差距过大。

训练结束后可以用results.csv做定量检查:

import pandas as pd df = pd.read_csv("runs/detect/train/results.csv") df.columns = [c.strip() for c in df.columns] print(df[["epoch", "train/box_loss", "val/box_loss", "metrics/mAP50(B)"]].tail(10))

这段代码能直接显示出最后10轮的验证 mAP50。如果val/box_loss下降到一个低点后反弹,说明模型开始记训练集噪声,这时应增加增强强度或把epochs减小。区分欠拟合和过拟合不需要看得太精细,只看 val loss 是否先降后升就够了。

4. 行李箱缺陷样本少怎么练:增强策略、VOC标注清洗与类别均衡

4.1 用Mosaic增强和自动增强补足背景多样性

650张的行李箱缺陷检测集最缺的是背景多样性。YOLOv8默认开启mosaic=1.0,它每轮随机取4张图拼接成一张训练,让模型看到不同的背景组合和尺度关系。用小目标划痕检测时,mosaic 可以明显提升召回率,因为拼接后的图里目标相对变小,模型被迫学更细的纹理特征。缺点是后期训练容易震荡,如果到第80轮发现box_loss反复横跳,就把mosaic降到0.5,让模型从“拼图模式”切回“真实构图”。

颜色增强hsv_hhsv_shsv_v对行李箱材质差异也有帮助。塑料壳和金属拉杆在不同灯光下反光差异很大,适当提高hsv_v的扰动范围,能让模型对光线变化更鲁棒。不过degrees旋转别乱开,传送带上行李箱姿态基本是水平的,硬加90度旋转会教出错误的空间先验。整体原则是:增强只模拟现场会出现的工况,不要凭空加现实中不会存在的变形。

4.2 用CVAT快速检查VOC标注

在训练前值得做的一次人工检查是用 CVAT 把这650张图过一遍。CVAT 能直接导入 PASCAL VOC 格式,导入后每个object变成可编辑的矩形框。重点看两类目标:一是框住了大半个行李箱的无效框,二是只有几个像素的“点状标注”。前者会让模型学出“行李箱整体等于缺陷”的错觉,后者由于下采样后特征被吃掉,对训练几乎没有帮助。

CVAT 导出 YOLO 格式时,类名顺序要和导入时一致,否则导出的 txt 第一列会错乱。如果你只想修几个框,不要从头标注,导入VOC后改完导出即可。没有 CVAT,用 labelImg 也能干,只是批量效率低一些。650张图并不算多,值得花一到两小时把所有标注快速过一遍,这比训练完再回头查数据要省时间。

4.3 清洗VOC→YOLO时的越界框和空标签

从XML转到YOLO时最常见的问题有:越界、坐标反了、图像尺寸读错、空标签。在转换脚本里可以顺手加校验:

for cls_id, xc, yc, w, h in parsed_boxes: assert 0 <= cls_id < len(class_map), f"class index out of range: {cls_id}" assert 0 <= xc <= 1, f"x_center {xc} out of range" assert 0 < w <= 1, f"width {w} out of range"

遇到越界框不要直接 clip,先拿原始XML人工确认。有些框是标注工具鼠标拖过头导致的,clip 后会把背景区域当目标输入给模型,反而制造低质量正样本。对650张的小数据集,一两个脏框就足以把 mAP50 拉低2到3个点。如果某些图片没有对应 txt,通常是 XML 里的object全被class_map过滤掉了,或者原图损坏导致size读不出来。

4.4 类别不均衡怎么办:损失权重与硬负样本

2类数据若scratch出现300次,dent只出现50次,模型会偏向多数类。可以统计每个类别的实例数,输出成表:

类别实例数是否过少
scratch312正常
dent58过少

当某一类实例明显少时,训练时cls_loss会被多数类主导,mAP50 可能很高,但 mAP50-95 或小目标指标会很难看。处理办法是把少类样本复制到训练集做2到3倍过采样,或者对少类目标使用 copy-paste 增强,把目标抠出来贴到其他背景图上。常见做法是先跑一版看 per-class 的 recall,如果少类 recall 明显低于多数类,再决定要不要过采样。这类增强要在划分数据集之后做,避免同一张增强图同时出现在训练集和验证集。

5. 行李箱缺陷模型的验收指标与集成技巧

5.1 先看混淆矩阵再决定上线

训练结束后,runs/detect/train/confusion_matrix.png暴露的问题比 mAP 更直接。如果scratch和背景混淆严重,把置信度阈值从0.25提到0.35,可以压掉一批误检,但召回会下降。如果两个缺陷类别之间互相混淆,说明类别边界本身不清晰,要么重新审视标注标准,要么合并成一个大类“表面缺陷”,降低分类难度。650张数据下,mAP50 在0.75以上就可以开始试跑推理,不必追求高得离谱的指标。

5.2 推理时的置信度调节

best.pt做推理时,可以命令行直接给阈值:

yolo detect predict model=runs/detect/train/weights/best.pt source=test_images save_txt=True conf=0.3 iou=0.5

conf是置信度阈值,iou是NMS的IoU阈值。行李箱表面缺陷有两个大目标时,iou=0.5足够;如果同一处磕碰被标成两个相邻小框,把iou调到0.6更合适。实际接入产线时,我通常把conf设置成比验证阶段阈值高0.05,给现场反光和灰尘留一点裕量。如果现场只用 OpenCV 读取结果,可以先把best.pt导出成 ONNX,再转成 OpenVINO 格式,Intel CPU 上的推理速度能提高不少。

5.3 一个低成本的多视角去重技巧

行李箱是立体物件,一套视觉系统通常有2到3个工业相机从不同角度拍摄。同一个凹陷可能同时被两个相机拍到,如果直接对多路结果合并,会出现重复告警。低成本的合并策略是:先把每个相机画面里超过阈值的检测框记录下来,再用目标中心点做坐标映射到箱体坐标,落在同一个5厘米方格内的检测只保留置信度最高的一条。这个步骤不依赖额外的跟踪算法,用几十行Python就能解决,却能把产线上的误报率减掉一大截。这种方法只适合静态工位上的行李箱检测,如果行李在移动中,要先加一个简单的IOU跟踪,否则同一个缺陷会在连续帧里被重复计数。等现场积累了更多缺陷样本,再用数据集扩一批真实负样本,重新训练第二版模型,效果会比继续调阈值更明显。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询