
简介面向行李箱外观缺陷检测任务这份数据集包含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类YOLOVOC格式.zip大概率是准备训练一个行李箱表面质量检测模型。650张和2类是入门级规模从头训练目标检测模型会出现明显的过拟合但配合预训练权重和数据增强完全可以在工位或产线环境下跑通一套可用的外观缺陷检测流程。这个压缩包同时给出 YOLO 和 VOC 两种标注格式省去自己写格式转换的琐碎步骤也方便在 YOLOv8、YOLOv5、MMDetection 之间切换。下面从目录结构、格式差异、训练命令、样本增强到验收和部署按一线工程师的实际路径展开。2. 读懂行李箱缺陷检测数据集VOC与YOLO格式字段差异和2类目标分布2.1 650张和2类说明什么先看数量。650张图像做目标检测属于“小数据但可用”的档位。经验上每类至少要有200到300个实例模型才不至于把背景纹理学成目标。如果两个类别在标注里分布比较均匀每类约325个实例刚好够迁移学习微调。行李箱检测的拍摄背景通常比较单一比如流水线固定工位所以650张的图像多样性不足泛化主要靠增强和预训练特征来补。2类指的是标注文件中只有两个目标类别。结合行李箱外观质检场景最常见的两类是“划痕”与“凹陷”也可能是“裂纹”和“破损”具体以数据集里的类名定义为准。类别少能降低后处理复杂度但也容易把光照反射、防拆标签误检成缺陷因此拿到包后第一步是解压先看data.yaml或classes.txt里的 class 顺序再往 YOLO 的names配置里写。2.2 VOC格式目录结构与XML标注VOC格式来自PASCAL VOC项目很多检测框架都支持。它用目录组织数据JPEGImages放原图Annotations放和图片同名的 XMLImageSets/Main放划分文件并把每个划分阶段用 txt 列表管理。每个 XML 记录图片宽高和所有目标的类别、边界框坐标。打开一个典型标注文件大概长这样annotation folderJPEGImages/folder filenameluggage_001.jpg/filename size width1920/width height1080/height depth3/depth /size object namescratch/name difficult0/difficult bndbox xmin184/xmin ymin231/ymin xmax621/xmax ymax508/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.txt、val.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(flabels/{split_name}, exist_okTrue) with open(f{split_name}.txt, w) as f: for stem in stems: f.write(fimages/{stem}.jpg\n) os.system(fcp labels/{stem}.txt labels/{split_name}/)random.seed(42)让每次运行产生同样的切分后续对比实验才公平。这里把test单独留出 10%是为了最后做一次“没被训练过程碰过”的指标验证如果你只想快速出结果也可以把 10% 合进验证集。copy labels是直接把标注按划分复制到labels/{split_name}下避免训练时去大目录里按列表过滤速度更快。如果图片不是.jpg把glob的后缀改成实际后缀即可。3.2 组织YOLO数据目录和data.yamlYOLOv8 推荐的数据目录结构是images/{train,val}和labels/{train,val}根目录放一个data.yaml。整理好后结构如下datasets/luggage/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml内容很简单path: datasets/luggage train: images/train val: images/val names: 0: scratch 1: dentpath写的是基于你执行训练命令所在目录的相对路径如果路径不对会直接报Dataset not found。更稳妥的做法是写绝对路径但整个项目换机器时要同步改。names的顺序必须和 txt 第一列的类索引一致这一步错的话mAP 再高也没有生产意义。如果你发现数据包里有测试集目录可以再加上test: images/test字段但训练命令里不会主动用test它只供最终验证脚本读取。3.3 YOLOv8训练命令和关键参数假设你安装的是ultralytics从命令行进入项目根目录后最短的训练命令是yolo detect train datadatasets/luggage/data.yaml modelyolov8n.pt epochs100 batch16 imgsz640 device0参数含义如下参数推荐值说明modelyolov8n.ptNano预训练权重600张数据用大模型容易过拟合epochs100~200看验证集 loss 是否还在降batch8~166GB显存用812GB以上用16或更大imgsz640与预训练输入分辨率保持一致device0指定GPU编号无GPU环境不写会自动跑CPU如果你习惯 YOLOv5命令基本一样python train.py --data data.yaml --weights yolov5s.pt --batch 16 --epochs 100。注意 YOLOv5 要求数据目录里train和val是指向images子目录的路径和 v8 略有差别。YOLO 已经出到第11代但 v8 的生态资料最全650张的小数据集不必追新够用就好。AMD 显卡跑 YOLO 同样是device0前提是 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默认开启mosaic1.0它每轮随机取4张图拼接成一张训练让模型看到不同的背景组合和尺度关系。用小目标划痕检测时mosaic 可以明显提升召回率因为拼接后的图里目标相对变小模型被迫学更细的纹理特征。缺点是后期训练容易震荡如果到第80轮发现box_loss反复横跳就把mosaic降到0.5让模型从“拼图模式”切回“真实构图”。颜色增强hsv_h、hsv_s、hsv_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), fclass index out of range: {cls_id} assert 0 xc 1, fx_center {xc} out of range assert 0 w 1, fwidth {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 modelruns/detect/train/weights/best.pt sourcetest_images save_txtTrue conf0.3 iou0.5conf是置信度阈值iou是NMS的IoU阈值。行李箱表面缺陷有两个大目标时iou0.5足够如果同一处磕碰被标成两个相邻小框把iou调到0.6更合适。实际接入产线时我通常把conf设置成比验证阶段阈值高0.05给现场反光和灰尘留一点裕量。如果现场只用 OpenCV 读取结果可以先把best.pt导出成 ONNX再转成 OpenVINO 格式Intel CPU 上的推理速度能提高不少。5.3 一个低成本的多视角去重技巧行李箱是立体物件一套视觉系统通常有2到3个工业相机从不同角度拍摄。同一个凹陷可能同时被两个相机拍到如果直接对多路结果合并会出现重复告警。低成本的合并策略是先把每个相机画面里超过阈值的检测框记录下来再用目标中心点做坐标映射到箱体坐标落在同一个5厘米方格内的检测只保留置信度最高的一条。这个步骤不依赖额外的跟踪算法用几十行Python就能解决却能把产线上的误报率减掉一大截。这种方法只适合静态工位上的行李箱检测如果行李在移动中要先加一个简单的IOU跟踪否则同一个缺陷会在连续帧里被重复计数。等现场积累了更多缺陷样本再用数据集扩一批真实负样本重新训练第二版模型效果会比继续调阈值更明显。本文还有配套的精品资源点击获取