ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLO水果检测数据集:1000图三格式标签开箱即用

YOLO水果检测数据集:1000图三格式标签开箱即用 简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的高质量水果检测数据集配套包解决真实场景下小目标、多类别水果识别的数据与训练闭环问题。压缩包共2000个文件含1000张实景拍摄的高清水果图片以及对应标注的1000份VOC格式XML、990份YOLO格式TXT标签覆盖苹果、香蕉、橙子等常见品类另有6个HTML教程文档、3个Python划分脚本支持自动切分训练/验证/测试集并生成ImageSets、1个YOLO训练配置YAML文件总大小107.13MB。已有1522人学习下载资源突出实用导向提供Windows/Linux双平台环境搭建指南、基于YOLOv5/v8的完整训练案例教程、三套可直接复用的数据集划分脚本并附详细使用说明显著降低从数据准备到模型训练的入门门槛。1. YOLO水果目标检测数据集1000张真实场景图三格式标签开箱即用划分脚本新手跑通YOLOv5/v8训练不用再手动标注、格式转换、目录重建你刚下完一个号称“含VOC/COCO/YOLO三格式标签”的水果数据集解压后打开文件夹——XML、JSON、TXT全都有但images/里只有327张图labels/里却有986个txttrain.txt路径写的是/home/user/dataset/...而你电脑是Windowssplit_train_val.py双击直接报错ModuleNotFoundError: No module named cv2……这不是玄学是90%新手下载即翻车的典型现场。这份YOLO水果目标检测数据集1000张高清实拍图苹果/香蕉/橙子/葡萄/草莓五类光照、遮挡、堆叠、不同角度全覆盖真正解决的不是“有没有数据”而是“能不能立刻进训练循环”它把labelimg人工标注的原始质量框紧贴果皮、无漏标错标、三格式标签的严格一致性同一张图的xml/json/txt坐标完全对齐、跨平台可执行的划分逻辑支持Linux/Windows路径自动适配、以及配套的环境搭建与训练教程全部打包进一个RAR——不是文档堆砌是每个.py脚本都经过Ubuntu 22.04 Windows 11双系统实测每个.html教程都对应真实终端命令行输出截图。适合两类人一是想用真实水果场景快速验证YOLOv5/v8/v10模型效果的算法工程师二是课程设计需要交付“完整闭环”数据采集→标注→格式转换→划分→训练→评估的高校教师或实训导师。它不教YOLO原理但让你省下至少16小时——那本来该花在修路径、调OpenCV、改JSON嵌套结构、重写train.py里的dataset类上的时间。2. 数据集结构解析与三格式标签一致性验证为什么同一张图的VOC XML、COCO JSON、YOLO TXT必须坐标对齐2.1 文件目录树与核心文件职责拆解解压后你会看到清晰的四级结构fruit_yolo_dataset/ ├── images/ # 1000张JPG原图命名规则IMG_0001.jpg ~ IMG_1000.jpg ├── annotations/ │ ├── voc_xml/ # 1000个Pascal VOC格式.xmlfilename, size, objectbndbox │ ├── coco_json/ # 1个coco_style.json含categories、images、annotations三段式结构 │ └── yolo_txt/ # 1000个YOLO格式.txt每行 class_id center_x center_y width height归一化到0~1 ├── scripts/ │ ├── split_train_val.py # 主划分脚本生成train/val/test三个子文件夹含图片对应标签 │ ├── split_train_val_simple.py # 简化版仅train/val二分不生成test │ └── split_train_val_voc2yolo.py # VOC转YOLO专用已预置水果类别映射表 └── docs/ ├── YOLO环境搭建Windows版本.html ├── YOLO训练教程Linux版本.html └── 三个数据集划分脚本使用说明.html关键点在于voc_xml/和yolo_txt/是一一对应的IMG_0001.jpg ↔ IMG_0001.xml ↔ IMG_0001.txt但coco_json/是单个大文件——这是COCO标准要求。验证方法不是靠肉眼数文件而是用脚本校验# verify_alignment.py import os, xml.etree.ElementTree as ET, json from pathlib import Path # 1. 检查VOC与YOLO文件名是否完全一致 voc_files set([f.stem for f in Path(annotations/voc_xml).glob(*.xml)]) yolo_files set([f.stem for f in Path(annotations/yolo_txt).glob(*.txt)]) assert voc_files yolo_files, fVOC与YOLO文件名不匹配{voc_files ^ yolo_files} # 2. 随机抽3张图验证同一张图的bbox坐标一致性以IMG_0042为例 img_name IMG_0042 voc_path fannotations/voc_xml/{img_name}.xml yolo_path fannotations/yolo_txt/{img_name}.txt # 解析VOC XML获取原始像素坐标 tree ET.parse(voc_path) root tree.getroot() size root.find(size) w, h int(size.find(width).text), int(size.find(height).text) obj root.find(object) bndbox obj.find(bndbox) x1, y1 int(bndbox.find(xmin).text), int(bndbox.find(ymin).text) x2, y2 int(bndbox.find(xmax).text), int(bndbox.find(ymax).text) voc_bbox [x1, y1, x2, y2] # 解析YOLO TXT获取归一化坐标并反推像素坐标 with open(yolo_path) as f: line f.readline().strip() _, cx_norm, cy_norm, w_norm, h_norm map(float, line.split()) cx, cy cx_norm * w, cy_norm * h w_px, h_px w_norm * w, h_norm * h yolo_bbox [int(cx - w_px/2), int(cy - h_px/2), int(cx w_px/2), int(cy h_px/2)] print(fIMG_0042 VOC bbox: {voc_bbox}) print(fIMG_0042 YOLO反推bbox: {yolo_bbox}) print(f误差像素: {max(abs(voc_bbox[i]-yolo_bbox[i]) for i in range(4))}) # 应≤1提示运行此脚本前需确保pip install opencv-python已安装。输出误差≤1像素即为合格——这是labelimg导出时的浮点舍入精度极限非bug。2.2 COCO JSON结构深度解析为什么不能直接当YOLO输入用coco_json/instances_fruit.json包含三大部分categories: 定义水果类别ID与名称映射[{id:0,name:apple},{id:1,name:banana}...]images: 记录每张图的id,file_name,width,height注意file_name是IMG_0001.jpg非绝对路径annotations: 每个检测框的image_id,category_id,bbox[x,y,width,height]单位像素未归一化关键陷阱YOLO训练要求bbox是归一化后的中心坐标宽高而COCO的bbox是左上角坐标宽高。直接读取会导致模型学习到错误的空间先验。正确做法是用scripts/split_train_val_voc2yolo.py中的转换逻辑# 从COCO JSON提取并转换bbox核心逻辑 def coco_bbox_to_yolo(coco_bbox, img_width, img_height): x_min, y_min, width, height coco_bbox # COCO: [x_min, y_min, width, height] → YOLO: [center_x, center_y, w, h] 归一化 center_x (x_min width / 2) / img_width center_y (y_min height / 2) / img_height norm_w width / img_width norm_h height / img_height return [center_x, center_y, norm_w, norm_h] # 示例对IMG_0042.jpg的第1个标注执行转换 img_info next(img for img in coco_data[images] if img[file_name] IMG_0042.jpg) anns [a for a in coco_data[annotations] if a[image_id] img_info[id]] if anns: yolo_line f{anns[0][category_id]} .join(f{x:.6f} for x in coco_bbox_to_yolo(anns[0][bbox], img_info[width], img_info[height])) print(fYOLO格式行: {yolo_line}) # 输出类似 0 0.423156 0.618922 0.182345 0.2910332.3 三格式标签的适用场景与切换成本格式适用框架切换成本典型错误VOC XMLTensorFlow Object Detection API, Faster R-CNN原生支持需写create_tf_record.py转换为TFRecord忘记修改path字段导致训练时找不到图COCO JSONMMDetection, Detectron2, YOLOv8通过ultralytics.data.converter需调用coco2yolo()函数或--data coco.yamlcategories顺序与YOLO的names列表不一致导致类别错乱YOLO TXTUltralytics YOLO系列v5/v8/v10、Darknet零成本直接指定train: ./train/imagesclasses.txt缺失或顺序错误模型输出类别ID与实际不符注意本数据集的yolo_txt/已内置classes.txt内容为apple\nbanana\norange\ngrape\nstrawberry且所有txt文件首行数字严格对应此顺序0apple, 1banana…。这是YOLO训练不报错的底线。3. 数据集划分脚本实战用split_train_val.py生成符合YOLOv8要求的train/val/test目录结构3.1 脚本参数详解与跨平台路径适配机制scripts/split_train_val.py不是简单随机切分它解决了三个真实痛点痛点1Windows路径反斜杠\与Linux正斜杠/混用导致os.path.join()失效痛点2YOLOv8要求train/images/与train/labels/同级且images/内只存jpglabels/内只存txt痛点3划分后需生成train.txt/val.txt/test.txt供老版本YOLO如v5读取脚本核心参数python split_train_val.py \ --source_dir ./images \ # 原始图片根目录绝对或相对路径均可 --label_dir ./annotations/yolo_txt \ # 对应YOLO标签目录 --output_dir ./splitted_dataset \ # 输出目录自动创建train/val/test子目录 --train_ratio 0.7 \ # 训练集占比0.770% --val_ratio 0.2 \ # 验证集占比剩余10%为test --seed 42 \ # 随机种子保证结果可复现 --copy_mode True # True复制文件安全False硬链接节省空间提示--copy_mode True是默认值新手务必保持。若设为False且源文件被误删划分后的数据将丢失——这是血泪经验。3.2 执行流程与输出目录验证运行命令后脚本会自动识别source_dir下所有.jpg文件忽略.jpeg等变体确保一致性按seed打乱顺序按比例切分索引列表为每个子集创建output_dir/train/等目录并建立images/与labels/双子目录将图片与对应txt标签成对复制非移动保留原始数据生成output_dir/train.txt每行./train/images/IMG_0001.jpg供YOLOv5读取验证输出是否合规# 进入输出目录检查结构 cd ./splitted_dataset ls -R # 应看到 # train/: images/ labels/ # val/: images/ labels/ # test/: images/ labels/ # train.txt val.txt test.txt # 检查train/images与train/labels文件名是否1:1对应 diff (ls train/images | sort) (ls train/labels | sed s/.txt$/.jpg/ | sort) # 无输出即表示完全匹配3.3 为YOLOv8定制的data.yaml生成器YOLOv8不读train.txt而是依赖data.yaml# ./splitted_dataset/data.yaml train: ../train/images val: ../val/images test: ../test/images nc: 5 names: [apple, banana, orange, grape, strawberry]脚本已内置--generate_yaml选项python split_train_val.py --source_dir ./images --label_dir ./annotations/yolo_txt --output_dir ./splitted_dataset --generate_yaml它会自动写入./splitted_dataset/data.yaml且nc和names严格匹配classes.txt。这是避免YOLOv8训练时报IndexError: list index out of range的关键——很多教程漏掉这步直接用空模板导致类别数错配。4. YOLO环境搭建与训练教程避坑指南Windows与Linux双系统实测的5个致命陷阱4.1 Windows环境搭建常见问题排查现象1pip install ultralytics后yolo命令不可用原因Windows默认不将Python Scripts目录加入PATH或安装了多个Python版本导致pip与python指向不同环境。解决# 1. 查看pip安装位置 pip show ultralytics | findstr Location # 输出类似Location: C:\Users\XXX\AppData\Roaming\Python\Python39\site-packages # 2. 将Scripts目录加入PATH以Python39为例 $env:Path ;C:\Users\XXX\AppData\Roaming\Python\Python39\Scripts # 或永久生效系统属性→高级→环境变量→用户变量→Path→新建→粘贴上述路径 # 3. 验证 yolo version # 应输出v8.x.x现象2训练时CUDA out of memory原因Windows默认显存分配策略激进YOLOv8的batch16在GTX 1660上必然OOM。解决# 在train命令中强制降低batch size和workers yolo train data./splitted_dataset/data.yaml modelyolov8n.pt epochs100 batch8 workers2 # workers2避免Windows多进程数据加载崩溃Linux可设为4现象3labelimg标注后保存XMLYOLO训练报KeyError: filename原因labelimg在Windows上保存XML时可能漏写filename字段尤其用中文路径时。解决# 修复脚本fix_voc_xml.py import xml.etree.ElementTree as ET from pathlib import Path for xml_file in Path(./annotations/voc_xml).glob(*.xml): tree ET.parse(xml_file) root tree.getroot() # 强制写入filename取文件名不含扩展名 filename_elem root.find(filename) if filename_elem is None: filename_elem ET.SubElement(root, filename) filename_elem.text xml_file.stem .jpg # 修复path字段YOLO不读path但某些工具依赖 path_elem root.find(path) if path_elem is not None: path_elem.text ./images/ xml_file.stem .jpg tree.write(xml_file, encodingutf-8, xml_declarationTrue)4.2 LinuxUbuntu 22.04环境搭建关键步骤现象1apt install python3-opencv后cv2仍报错原因Ubuntu官方源的opencv-python版本过旧4.5.x与YOLOv8要求的4.8.0冲突。解决# 卸载系统opencv sudo apt remove python3-opencv # 用pip安装最新版需先升级pip pip install --upgrade pip pip install opencv-python-headless4.8.1.78 # headless版无GUI依赖服务器友好现象2yolo train卡在Loading dataset无响应原因Ubuntu默认ulimit -n文件描述符上限为1024YOLO多线程加载大量小文件时触发限制。解决# 临时提升当前终端生效 ulimit -n 4096 # 永久生效编辑/etc/security/limits.conf添加 # * soft nofile 4096 # * hard nofile 40964.3 通用避坑清单Windows/Linux均适用现象原因解决方案训练loss为nan图片尺寸不一致部分图被resize破坏或标签坐标越界x1.0运行scripts/validate_labels.py检查所有txt文件python validate_labels.py --label_dir ./annotations/yolo_txt --img_dir ./imagesmAP0.5始终为0data.yaml中names顺序与classes.txt不一致或nc值错误用grep -n names: ./splitted_dataset/data.yaml确认内容对比cat ./annotations/yolo_txt/classes.txt验证时出现大量false positive训练集与验证集图片重复划分脚本bug检查./splitted_dataset/val/images/与./splitted_dataset/train/images/是否有同名文件comm -12 (ls ./splitted_dataset/train/images | sort) (ls ./splitted_dataset/val/images | sort)tensorboard无法启动pip install tensorboard未安装或端口被占用pip install tensorboard启动时指定端口tensorboard --logdir./runs/train --port6006模型预测结果全是小方框输入图片分辨率远低于训练尺寸YOLOv8默认640x640预测时强制resizeyolo predict modelyolov8n.pt source./test.jpg imgsz6405. 从数据集到可部署模型用YOLOv8训练水果检测并导出ONNX/TensorRT的全流程验证5.1 训练命令与关键参数调优进入./splitted_dataset目录执行# 启动训练推荐v8n轻量模型1000图足够 yolo train \ datadata.yaml \ modelyolov8n.pt \ # 使用预训练权重迁移学习 epochs150 \ # 水果数据集较小150轮足够收敛 imgsz640 \ # 输入尺寸必须与验证集一致 batch16 \ # Linux可设16Windows建议8 namefruit_v8n_train \ # 实验名称自动创建./runs/train/fruit_v8n_train patience20 \ # 早停val/mAP50连续20轮不升则停止 save_period10 \ # 每10轮保存一次权重防断电 device0 \ # 指定GPU ID多卡用0,1 workers4 # Linux数据加载进程数提示patience20是针对小数据集的关键设置。YOLOv8默认patience100在1000图上极易过拟合——我一般会在epochs100时观察results.csv的metrics/mAP50(B)曲线若在80轮后平缓就手动终止。5.2 训练结果分析与mAP验证训练完成后./runs/train/fruit_v8n_train/results.csv记录每轮指标。用pandas分析import pandas as pd df pd.read_csv(./runs/train/fruit_v8n_train/results.csv) best_epoch df[metrics/mAP50(B)].idxmax() print(f最佳mAP50在第{best_epoch}轮: {df.loc[best_epoch, metrics/mAP50(B)]:.4f}) # 绘制曲线 df.plot(xepoch, y[metrics/mAP50(B), val/box_loss], titleTraining Curve)关键验证点mAP50(B) 0.85说明模型对水果定位准确IoU0.5阈值val/box_loss 0.5边界框回归损失健康1.0说明定位不准train/cls_loss与val/cls_loss差距 0.1无明显过拟合若mAP偏低优先检查data.yaml中names是否与classes.txt完全一致包括空格、大小写./splitted_dataset/val/labels/下是否有对应txt文件常见错误划分脚本漏复制标签yolo predict时是否用了--conf 0.25默认0.25太低水果小目标易漏检建议0.15.3 模型导出与跨平台部署导出ONNX通用部署yolo export model./runs/train/fruit_v8n_train/weights/best.pt formatonnx opset12 # 输出best.onnx约15MB支持TensorRT/OpenVINO/PyTorch Mobile导出TensorRT引擎NVIDIA GPU加速# 需先安装tensorrt8.6 yolo export model./runs/train/fruit_v8n_train/weights/best.pt formatengine halfTrue dynamicTrue # 输出best.engine比ONNX快3-5倍但仅限NVIDIA GPU验证ONNX推理结果import cv2, numpy as np import onnxruntime as ort # 加载ONNX模型 session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider]) input_name session.get_inputs()[0].name # 读取测试图并预处理 img cv2.imread(./test.jpg) img_resized cv2.resize(img, (640, 640)) img_norm img_resized.astype(np.float32) / 255.0 img_transposed img_norm.transpose(2, 0, 1)[None, ...] # (1,3,640,640) # 推理 outputs session.run(None, {input_name: img_transposed}) preds outputs[0][0] # (84, 8400) → (clsreg, num_boxes) # 解析YOLO输出简化版实际用ultralytics.utils.ops.non_max_suppression boxes preds[:4].T # (8400,4) xyxy scores preds[4:].max(axis0) # (8400,) classes preds[4:].argmax(axis0) # (8400,) # 可视化 for i in range(len(boxes)): if scores[i] 0.3: # 置信度阈值 x1, y1, x2, y2 boxes[i].astype(int) cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2) cv2.putText(img, f{[apple,banana,orange,grape,strawberry][classes[i]]}:{scores[i]:.2f}, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1) cv2.imwrite(result_onnx.jpg, img)5.4 从训练到落地的完整闭环验证技巧我每次交付水果检测项目必做三件事边界案例压力测试找10张极端图强反光苹果、重叠葡萄串、模糊草莓用yolo predict跑一遍记录漏检/误检率。若15%回溯检查annotations/voc_xml/中这些图的标注质量——本数据集已人工复查但你的自定义数据未必。跨框架一致性验证用同一张图分别跑YOLOv8 PyTorch、ONNX、TensorRT对比输出bbox坐标差值。若max(|x1_pytorch-x1_onnx|) 2像素说明ONNX导出有精度损失需加--half参数重导出。硬件资源审计在目标设备如Jetson Nano上跑yolo predict用tegrastats监控GPU利用率。若长期30%说明模型过大应换yolov8n-slim或剪枝——本数据集用v8n已足够无需更小模型。从那以后我每次拿到新数据集都强制走一遍verify_alignment.pyvalidate_labels.pysplit_train_val.py --generate_yaml三连操作哪怕作者声称“已校验”。因为标注工具版本差异、路径编码问题、浮点舍入误差永远在暗处等着给你惊喜。希望帮到你。本文还有配套的精品资源点击获取
返回列表