
简介本资源为面向YOLO系列目标检测算法的瓶子数据集适用于yolov5、yolov7、yolov8、yolov9、yolov10及yolo11等主流框架可直接用于模型训练与验证测试适合正在做目标检测项目、课程设计或算法对比实验的开发者与学习者。压缩包共2000个文件约27.24MB包含597张jpg图像、701个txt标签、701个xml标签以及1个data.yaml配置文件图像与标注一一对应并已按训练与验证需求划分好数据集结构。标签同时提供YOLO格式与VOC格式两套YOLO格式以类别索引和归一化后的中心点坐标、宽高比例记录目标框VOC格式则以xml文件保存方便不同框架直接读取。data.yaml中已写好类别与路径配置省去手动整理与转换的步骤拿到即可投入训练也能用于验证模型精度、排查标注问题或做数据增强实验。目前已有339人学习下载。1. 瓶子数据集与 YOLO 训练701 张图像带标签到底能跑出什么手上拿到一个叫「yolo算法-瓶子数据集-701张图像带标签-瓶子.zip」的压缩包第一反应通常不是兴奋而是怀疑701 张图够不够训一个能用的瓶子检测模型我一开始也这么想直到把它当成一个真实的小样本检测任务跑完整条链路才发现这个量级恰好卡在一个很微妙的位置——它不足以从零训一个通用检测器但足够在预训练权重上做一次有效的领域微调尤其是针对「瓶子」这种类内差异大、类间边界清晰的单类别目标。这个数据集真正解决的问题是让你在半天内走完「数据检查 → 格式转换 → 训练 → 推理 → 导出部署」的完整闭环而不是卡在找数据、洗数据、配环境上。它适合三类人刚接触 YOLO 想跑通第一个自定义数据集的入门者需要快速验证某个检测思路是否成立的一线工程师以及手上有类似小样本场景、想参考一套可复现流程的从业者。701 张不是终点而是你判断「要不要继续加数据、加到多少」的基准线。2. 先看清数据701 张瓶子图像的标签结构与格式判断2.1 解压后先别急着训练先做三件事拿到压缩包很多人直接unzip然后往 YOLO 里一扔就开始训结果训练日志里 loss 不降、mAP 长期贴地回头才发现标签格式根本对不上。血泪经验是先花十分钟做数据体检比后面调三天参都值。第一步看目录结构。常见的小样本数据集有两种组织方式一种是images/和labels/平行存放文件名一一对应另一种是每张图旁边跟一个同名.txt。用一条命令就能看清# 查看解压后的目录层级确认 images 与 labels 是否平行 find . -maxdepth 3 -type d | sort # 统计图像数量与标签数量两者应一致 find . -name *.jpg -o -name *.png | wc -l find . -name *.txt | wc -l如果图像数和标签数对不上说明有图没标或标了没图这种样本在训练时会被当成背景直接拉低召回。第二步打开任意一个.txt看内容。YOLO 格式每行是class x_center y_center width height五个值后四个是归一化到 0~1 的相对坐标。如果你看到的是xmin ymin xmax ymax这种绝对像素值或者带类别名的 XML那就是 VOC 格式必须先转。第三步抽查坐标是否越界。归一化坐标一旦出现大于 1 或小于 0 的值训练时框会跑到图外表现为某些目标永远学不到。用一段 Python 快速扫一遍import os, glob bad [] for txt in glob.glob(labels/**/*.txt, recursiveTrue): with open(txt) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((txt, i, 字段数不对)) continue cls, x, y, w, h parts vals list(map(float, parts[1:])) # 归一化坐标必须落在 0~1宽高必须为正 if any(v 0 or v 1 for v in vals) or vals[2] 0 or vals[3] 0: bad.append((txt, i, 坐标越界或宽高非正)) print(f异常标签数: {len(bad)}) for b in bad[:10]: print(b)这段逻辑很直白逐行读标签先卡字段数再卡数值范围。参数上唯一要注意的是路径通配recursiveTrue能覆盖多层子目录避免漏检。跑完如果异常数为 0说明标签基本干净可以进入下一步如果有异常先修再训别指望模型自己扛过去。2.2 单类别还是多类别决定了你的类别映射怎么写「瓶子数据集」这个名字有歧义它可能是只标了「瓶子」一个类也可能把塑料瓶、玻璃瓶、易拉罐分开标了多个类。这直接决定你后面data.yaml里nc和names怎么写。判断方法很简单把所有标签文件的第一列取出来做去重统计import glob from collections import Counter cls_counter Counter() for txt in glob.glob(labels/**/*.txt, recursiveTrue): with open(txt) as f: for line in f: if line.strip(): cls_counter[line.split()[0]] 1 print(cls_counter) # 例如 Counter({0: 701})如果输出只有一个键就是单类别nc: 1names: [bottle]。如果有多个键比如0和1那你要确认每个数字对应什么语义这个信息通常藏在数据集的说明文件里没有说明就只能靠可视化抽样反推。我一般会随机抽 20 张图把框画出来看确认类别划分是否符合预期这一步偷懒后面类别混淆的锅就得自己背。提示类别数写错是新手最常见的翻车点之一。nc写成 2 但标签里只有 0训练不报错但第二个类永远学不到mAP 表里那一行会一直是 0很容易被误判成模型不行。3. 从零跑通训练环境、配置与最小可复现命令3.1 环境怎么选PyCharm 里装 YOLO 的稳妥路径热搜里「使用 pycharm 安装并使用 yolo」出现频率很高说明很多人是在 PyCharm 里起步的。我的建议是PyCharm 只当编辑器和调试器真正的环境用 conda 或 venv 单独管别把包直接装进系统 Python。原因很实际——YOLO 依赖的 torch、torchvision、numpy 版本耦合紧系统环境一旦被污染后面想换版本就是灾难。# 创建独立环境Python 版本选 3.9 或 3.10兼容性最好 conda create -n bottle_yolo python3.10 -y conda activate bottle_yolo # 安装 PyTorch具体 CUDA 版本按你显卡驱动来这里以 cu118 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralyticsYOLOv8/v11 系列的统一入口 pip install ultralytics装完在 PyCharm 里把解释器指向这个 conda 环境即可。验证是否装好跑一句yolo checks它会打印出 torch 版本、CUDA 是否可用、设备型号。如果 CUDA 显示不可用但你确实有 N 卡八成是 torch 的 CUDA 版本和驱动不匹配回退重装对应版本别硬扛。3.2 data.yaml 与训练命令把 701 张图喂进去数据体检通过后建一个data.yaml这是 YOLO 认数据的唯一入口# data.yaml path: /home/user/bottle_dataset # 数据集根目录绝对路径最稳 train: images/train # 训练集图像相对路径 val: images/val # 验证集图像相对路径 nc: 1 # 类别数按 2.2 的统计结果填 names: [bottle] # 类别名顺序必须和标签里的 class 编号一致如果原始数据没有划分 train/val需要自己切。701 张按 8:2 切训练约 560 张验证约 140 张。切分脚本要注意图像和标签必须同步移动否则又会出现图标签对不上的问题import os, random, shutil random.seed(42) # 固定种子保证切分可复现 imgs [f for f in os.listdir(images) if f.endswith((.jpg, .png))] random.shuffle(imgs) split int(len(imgs) * 0.8) for phase, subset in [(train, imgs[:split]), (val, imgs[split:])]: os.makedirs(fimages/{phase}, exist_okTrue) os.makedirs(flabels/{phase}, exist_okTrue) for img in subset: shutil.copy(fimages/{img}, fimages/{phase}/{img}) txt os.path.splitext(img)[0] .txt shutil.copy(flabels/{txt}, flabels/{phase}/{txt})切分完就可以起训。小样本微调我一般从预训练权重出发而不是随机初始化yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/bottle \ nameexp1参数逐个说清楚modelyolov8n.pt用 nano 版701 张图撑不起大模型nano 收敛快、过拟合风险低epochs100配合patience20意思是 20 轮验证指标不涨就早停避免无效训练imgsz640是 YOLO 的默认输入尺寸瓶子这种中等目标够用batch16看显存8G 显存跑 640 的 nano 基本没问题爆显存就降到 8lr00.01是微调的常用起点如果你发现 loss 前期震荡厉害降到 0.001 再试。3.3 训练过程看什么loss 曲线与 mAP 的读法训练启动后终端会实时打印每一轮的 box_loss、cls_loss 和 mAP50。很多人只盯 mAP其实 loss 更能反映问题。box_loss 长期不降说明框回归没学好常见原因是标签坐标有问题或学习率太大cls_loss 不降多半是类别映射错了或正负样本失衡。mAP50 在 30 轮左右应该开始明显爬升如果 50 轮还贴着 0.1 以下别继续等了回去查数据和配置。训练结束后runs/bottle/exp1/下会有weights/best.pt和results.png。results.png把几条曲线画在一起是判断这次训练健不健康最直观的依据。我习惯先看 train 和 val 的 loss 是否同步下降如果 train 降 val 不降甚至上升就是过拟合701 张图出现这种情况很正常对策是加数据增强或减模型容量。4. 推理、验证与导出让模型真正能落地用4.1 用验证集确认模型不是「背答案」训练完的 best.pt 必须先在验证集上跑一遍确认指标不是训练集上的虚高。命令行验证yolo detect val \ modelruns/bottle/exp1/weights/best.pt \ datadata.yaml \ imgsz640 \ batch16输出里重点看三类指标precision 反映误检recall 反映漏检mAP50-95 反映框的贴合精度。瓶子检测这种场景如果下游是计数recall 比 precision 更重要宁可多检也别漏如果下游是抓取precision 更关键误检会导致机械臂抓空。根据你的实际用途决定要不要调置信度阈值默认 0.25 不一定适合你的场景。4.2 单张图推理与批量推理的写法验证指标过关后用实际图片测一下观感。单张推理from ultralytics import YOLO model YOLO(runs/bottle/exp1/weights/best.pt) # conf 控制置信度阈值iou 控制 NMS 重叠阈值 results model.predict(test.jpg, conf0.3, iou0.5, saveTrue) for r in results: for box in r.boxes: print(r.names[int(box.cls)], float(box.conf), box.xyxy.tolist())conf0.3比默认 0.25 略高是为了压掉一些低置信度的误检iou0.5是 NMS 的常规值如果发现同一个瓶子被框了两次把 iou 调低到 0.4 再试。批量推理把路径换成目录即可saveTrue会把画好框的图存到runs/detect/下方便肉眼抽查。4.3 导出 ONNX为部署铺路如果模型最终要上边缘设备或集成进别的推理框架导出 ONNX 是常见做法yolo export \ modelruns/bottle/exp1/weights/best.pt \ formatonnx \ imgsz640 \ opset12 \ simplifyTrueopset12兼容性较好simplifyTrue会做一次图优化去掉冗余节点。导出后务必用 onnxruntime 跑一张图和 PyTorch 的输出对比确认数值一致再往下走。我见过导出后精度掉一截的情况多半是预处理没对齐比如归一化方式或通道顺序不一致这种问题在 PyTorch 里测不出来只有跨框架对比才暴露。5. 避坑与排查701 张小样本训练最容易翻车的 5 个点现象一训练 loss 正常下降但 mAP 一直是 0。原因data.yaml里的names顺序和标签里的 class 编号对不上或者nc写多了。模型学的是「第 0 类」你告诉它第 0 类叫别的名字评估时对不上号。 解决回到 2.2 的统计脚本确认 class 编号集合nc严格等于编号种类数names按编号顺序排列。现象二验证集 mAP 比训练集低一大截差距超过 0.3。原因701 张图本身量小如果 train/val 切分时同一场景的相似图被分到两边验证集就失去意义或者增强过强训练分布和验证分布偏离。 解决切分时按场景或拍摄批次分层抽样别纯随机把 mosaic、mixup 这类强增强的概率调低小样本下它们容易把语义搞乱。现象三推理时同一个瓶子出现多个重叠框。原因NMS 的 iou 阈值设太高或者模型对同一目标输出了多个高置信度框。 解决把iou从 0.5 降到 0.4 甚至 0.3观察框是否合并如果仍然重复说明训练时正样本分配有问题检查标签框是否本身就有重叠标注。现象四换一台机器或换一个环境推理结果完全不对。原因图像预处理不一致最常见的是 BGR 和 RGB 通道顺序颠倒或者归一化系数不同。 解决把预处理步骤固定成一份代码训练、验证、推理、导出全走同一套跨框架部署时用同一张图分别跑两个框架逐层对比输出。现象五训练到一半显存爆了报 CUDA out of memory。原因batch或imgsz超过显存承受范围或者 dataloader 的 worker 数太多。 解决先把batch减半还不行就降imgsz到 512workers在 Windows 上设 0 或 2Linux 上可以设 8但别超过 CPU 核数。注意小样本训练里数据质量对结果的影响远大于超参。701 张图如果标注框普遍偏大或偏小你调再多学习率也救不回来。先保证标注准再谈调参。6. 把 701 张用出 7000 张的效果小样本增强与迭代技巧701 张图训出来的模型天花板是肉眼可见的。想让它更稳核心思路不是换更大的模型而是让这 701 张的「有效信息量」变大。我常用的两个手段一个是离线增强扩样本一个是主动学习补难例。离线增强适合在训练前做用 albumentations 生成一批几何和色彩变换后的图连同变换后的标签一起存盘。注意增强必须同步变换标签框否则图变了框没变等于在教模型学错。旋转、缩放、亮度对比度扰动是安全牌随机裁剪要小心裁掉目标后标签得同步删掉不然会出现空标签图被当成负样本。我的经验是增强到原始量的 2~3 倍就够再多收益递减还拖慢训练。主动学习更适合迭代阶段。第一版模型训完后拿它去跑一批未标注的瓶子图挑出置信度在 0.3~0.6 之间的「模型拿不准」的样本人工补标后加进训练集。这批难例的信息量远大于随机新增的图往往补一两百张就能让 mAP 涨几个点。这个循环可以跑两三轮直到新增样本带来的提升低于你的预期。验证增强和迭代是否有效别只看 mAP 一个数。我会额外做一个「分场景验证」把验证集按拍摄背景、光照、瓶子姿态分成几组分别算每组的 recall。如果整体 mAP 涨了但某个场景的 recall 没动甚至掉了说明增强把模型往别的场景偏了得针对性补那个场景的数据。这个习惯让我避开了好几次「指标好看、实际不能用」的坑。最后说个我自己的教训早期我总想一步到位拿到 701 张就想着调出最优模型结果在超参上耗了两天收益还不如花半天补 100 张难例。小样本任务的正确姿势是快速跑通基线然后靠数据迭代而不是靠调参硬抠。希望帮到你。本文还有配套的精品资源点击获取