YOLOv5果蔬识别实战:从数据集标注到模型训练与调优

发布时间:2026/9/16 5:54:25

YOLOv5果蔬识别实战:从数据集标注到模型训练与调优 简介Yolov5果蔬识别系统是一套面向计算机专业毕业设计、期末大作业及项目实战的高分完整方案基于深度学习目标检测框架YOLOv5实现果蔬类别的识别与界面演示难度适中适合需要快速搭建可运行项目的学习者。资源包共56个文件压缩包大小94.07MB文件类型涵盖14个Python脚本、模型权重h5文件、xml标注、txt配置说明以及png/jpg图片素材等脚本覆盖数据切分、格式转换、模型训练、实时检测与界面展示等流程结构完整便于二次开发。目前已有123人学习浏览。项目经过严格调试与导师审定评审得分98分内含数据集、源代码及配套教程并包含主页面、实时检测窗口、热力图与训练过程记录等可视化内容可直接运行验证能帮助读者快速理解YOLOv5在果蔬识别场景中的落地思路。1. YOLOv5果蔬识别为什么能压住课题答辩的提问做过果蔬识别课设的人大多经历过这种翻车现场用分类网络把单张番茄图训到 98% 准确率一到食堂窗口的俯拍实景框不住、错位、数不清答辩时被追问一句“检测和分类有什么区别”就卡壳。换个思路用 YOLOv5 做目标检测第一版就能把苹果、香蕉、番茄框出来还能顺便统计数量视觉反馈直接对应“系统”两个字课程设计或毕业设计评委看到的效果不是纸面指标而是窗口里绿框实时跳动。YOLOv5 在基于 yolov5 的水果识别上能成为高分项目原因就三个任务边界清晰、数据集好做、源码生态完整。检测任务天然带框带数量评估有 mAP演示有画面数据可以下载开源果蔬集也能自己用手机拍train.py、val.py、detect.py 三级入口直接能跑。适合正在做课设、毕设或比赛想找一个“改动少、演示效果强”的落地项目的读者。这篇文章按我自己做果蔬识别系统时的顺序写先选数据、再标注划分配置 YOLOv5 环境并训练用官方脚本评估和推理最后落到真实场景里最常调的两个点——重叠果实漏检和数量统计。照着走至少能产出一套答辩现场能跑的识别 demo。2. 果蔬识别数据集开源数据、自采标注与划分脚本果蔬识别的精度上限不是网络结构决定的而是数据集决定的。YOLOv5 的检测头结构是固定的决定你能否顺利毕业的是三个数据问题类别是否互斥、背景是否多样、标签是否准确。先花两天把数据做扎实比多训 50 个 epoch 有用得多。2.1 开源果蔬数据集怎么选背景差异怎么补常见的开源果蔬数据集主要有 Fruits-360 和各类 vegetable dataset。Fruits-360 类别全、数量足也有苹果、香蕉、番茄这些常见类但它的图像大多是纯白背景、单果居中直接用训出来的模型去识别复杂环境里的水果泛化会明显变差mAP 可能直接掉 20 个点以上。我一般把它当“预训练前的热身数据”而不是系统数据的全部。如果做 3 类果蔬识别我常用的数据配比是开源数据提供类别多样性自采照片提供场景复杂度。自采照片去超市、水果店或食堂拍每类至少 200 张包含俯拍、侧拍、部分遮挡和不同光照条件。开源数据中每类挑 500 张左右与自采数据按 1:1 混合。按这种配比数据量大约 1300 张左右时训练 YOLOv5s 已经能跑出像样的效果。整理数据时要注意类别互斥。不要同时设“绿苹果”和“青苹果”也不要把“圣女果”和“番茄”分两类YOLOv5 的标注人员遇到边界模糊的样本时标注会前后不一致网络学习到的类别特征会互相干扰。果蔬类别宁少勿混答辩时把“类别设计理由”讲清楚反而是加分项。2.2 用 LabelImg 标出 YOLO 格式标签从装工具到存盘数据照片收集完之后给图片打标签。常见做法是用 LabelImg它对小规模数据集的流程最短YOLOv5 原生需要的 YOLO 格式可以直接输出。conda activate yolov5 pip install labelimg labelimgLabelImg 打开后做四件事Open Dir 选图片目录Change Save Dir 选标签输出目录Edit 菜单里把标注格式切换成 YOLOView 里勾选 Auto Save mode。然后用 W 键画矩形框输入类别名D 键切到下一张。一张图里有多个目标就画多个框YOLO 格式会把每张图写成同名 txt一行一个目标格式为 class_id cx cy w h四个数值均为相对于宽高的归一化坐标。0 0.5213 0.6812 0.2233 0.4512 1 0.7821 0.3316 0.1687 0.4028标注时别用中文类别名。YOLOv5 读取 names 时如果碰到编码不一致最典型的问题是训练不报错但推理输出乱码而且 classes.txt 里第几行就对应 id 几训练集、验证集、测试集必须共用同一份 classes 顺序。另一点是画框宁紧勿松框的上边界最好贴着果实的可见边缘不要把阴影或背景也包进去。我自己标第一遍时 20% 的框都偏大回看可视化时才发现后面统一按“果实实际可见轮廓”重标了一遍mAP0.5 从 0.89 升到 0.94。若 LabelImg 启动报缺失 PyQt5 相关的错误补一句pip install pyqt5再启动即可这在 Windows 和 Linux 上都是同一个解法。2.3 用一份 Python 脚本划出 train/val/test 目录YOLOv5 的训练入口要求数据按 images 和 labels 同名列组织所以我先把标注好的所有图片和 txt 放同一个临时目录再做随机划分import os import random import shutil SRC fruit_raw # 原始图片与同名 txt 标签放在同一目录 OUT fruit_data # 输出目录自动生成 train/val/test RATIO {train: 0.8, val: 0.15, test: 0.05} random.seed(42) names [f[:-4] for f in os.listdir(SRC) if f.endswith(.jpg)] random.shuffle(names) train_n int(len(names) * RATIO[train]) val_n int(len(names) * RATIO[val]) parts { train: names[:train_n], val: names[train_n:train_n val_n], test: names[train_n val_n:], } for part in parts: os.makedirs(f{OUT}/{part}/images, exist_okTrue) os.makedirs(f{OUT}/{part}/labels, exist_okTrue) for name in parts[part]: shutil.move(f{SRC}/{name}.jpg, f{OUT}/{part}/images/{name}.jpg) shutil.move(f{SRC}/{name}.txt, f{OUT}/{part}/labels/{name}.txt)random.seed(42)固定随机种子别人复现你实验时划分结果一致。test 目录一定要单独留很多项目模型评测时拿 val 当测试集答辩时被追问测试集划分逻辑容易露怯。test 只用于训练结束后评估一次期间不能反复跑否则它本质上就变成了验证集。划分完顺手做一个类别均衡检查避免某一类样本量明显偏低from collections import Counter import os counts Counter() label_dir fruit_data/train/labels for f in os.listdir(label_dir): with open(os.path.join(label_dir, f)) as fp: for line in fp: counts[int(line.split()[0])] 1 print(counts) # 期望三类数量差距不超过30%如果某一类边框数明显少优先补拍其次才是用翻转、亮度变化做离线增强。补数据时只增强训练集绝不能对 val 和 test 做同样的变换否则验证分数会虚高这一点在写教程类项目时很容易被忽略。3. YOLOv5 源代码目录与果蔬训练参数逐一拆解数据准备好之后才算真正进入 YOLOv5 训练自己的数据集环节。这个阶段大多数问题不在模型本身而在环境依赖、路径配置和超参数的组合上。yolov5 环境配置跑不通代码再对也没有画面。3.1 Miniconda 建环境装好 PyTorch 和 YOLOv5 依赖我习惯用 Miniconda 而不是直接装在系统 Python 里原因是可以干净地隔离 PyTorch 版本。果蔬识别项目对算力要求不高但 PyTorch 版本与 CUDA 版本不匹配导致 torch.cuda.is_available() 返回 False 的问题几乎每周都会遇到独立环境能少踩一半坑。conda create -n yolov5 python3.9 conda activate yolov5 # 先执行 nvidia-smi 看驱动支持的 CUDA 大版本比如 11.8 或 12.1 conda install pytorch torchvision cudatoolkit11.8 -c pytorch git clone 官方YOLOv5仓库 cd yolov5 pip install -r requirements.txt装完先跑python -c import torch; print(torch.cuda.is_available(), torch.__version__)输出 True 再继续。常见报错是 GLIBC 版本过低或 nvcc 存在但 torch 仍用 CPU 版本前者换 Python 3.8 或升级系统库后者重新安装与 nvidia-smi 显示大版本一致的 PyTorch。YOLOv5 的目录结构里train.py、val.py、detect.py 是三个入口weights 目录放预训练权重models 目录是网络结构定义。果蔬识别只需要改数据文件不用动网络源码。3.2 写好自己的 fruit.yaml 与目录结构YOLOv5 用 yaml 文件描述数据集位置和类别列表。上一步划分的 fruit_data 目录与 yolov5 目录平级放置fruit.yaml 放在 yolov5 目录下path: ../fruit_data # 相对 yolov5 目录的路径也可写绝对路径 train: train/images val: val/images test: test/images nc: 3 names: 0: apple 1: banana 2: tomato路径定位是最常见的报错点。如果训练时报 “AssertionError: train: No labels in”先检查 path 拼写再看 labels 目录里是否有 txt。YOLOv5 在训练前会扫描 txt 里的类别编号编号超过 nc-1 会直接报错所以 labels 里出现 3而 nc3 时问题几乎都出在 LabelImg 输出了一行新类别或 classes.txt 顺序后移。另外 images 和 labels 的子目录名必须固定叫 images、labels别改成 jpg、label 之类YOLOv5 内部按这两个名字拼接路径。3.3 train.py 训练命令与 5 个必调参数训练入口是 train.py我通常在笔记本或单卡工作站上跑第一版命令如下python train.py --img 640 --batch 16 --epochs 100 \ --data fruit.yaml --weights yolov5s.pt \ --cache --name fruit_exp --patience 20参数我的建议值参数作用与调整逻辑--img640训练输入分辨率。果蔬目标在俯拍图里通常大于 20×20 像素640 够用小目标多再试 704显存会明显上涨--batch16受显存限制8G 显存从 8 起步训练日志里出现 CUDA out of memory 就降到 8--epochs100搭配 --patience 使用100 轮足够模型收敛早停 20 轮不涨会自动断--weightsyolov5s.pt加载 COCO 预训练权重迁移学习稳定也可以用 yolov5n.pt 提速但精度会掉--cache无参数把图像缓存进内存小数据集下训练提速明显数据集太大或内存吃紧就删掉第一轮训练建议只看两个东西显存是否够用以及前 5 个 epoch 的 loss 是否线性下降。如果 loss 一直在 0.7 附近不动优先检查数据增强是否过强。YOLOv5 默认的 hyp.scratch-low.yaml 里已经包含 mosaic、mixup 等增强果蔬识别不需要加复杂策略。想调超参数时复制一份 hyp 文件改lr0初始学习率和mosaic开关即可。小数据集把 mosaic 从 1.0 降到 0.5有时比增加训练轮数更有效因为 mosaic 拼图会让小目标更碎干扰果蔬这类几何特征明显物体的学习。训练结束看 runs/train/fruit_exp 目录里面 weights 文件夹下会有 best.pt 和 last.pt还有一个 results.png 展示 loss 和 mAP 曲线。best.pt 是按验证集 mAP 保存的最优权重后续推理全部换它不要用 last.pt。4. 用 val.py 和 detect.py 验证果蔬识别效果训练结束不等于系统完成。YOLOv5 的源码里给了完整的评估链路先把 val.py 跑明白再去看 detect.py 的推理源码最后按需要导出 ONNX。果蔬识别系统的上线标准一般看两层验证集 mAP 是否稳定以及实际图片上的框是否贴合。4.1 先跑 val.pymAP、混淆矩阵和 PR 曲线怎么看验证命令如下python val.py --weights runs/train/fruit_exp/weights/best.pt \ --data fruit.yaml --task val跑完终端会输出各类别的 AP 和整体 mAP。重点看三张图confusion_matrix.png、PR_curve.png、results.png。混淆矩阵里如果番茄和苹果互相错分说明两类训练样本的背景或颜色特征太接近先回去补数据不要急着调模型PR 曲线在 0.9 时还保持高召回说明边界框质量可以进入推理阶段。指标它在回答什么问题果蔬识别项目怎么用mAP0.5预测框与真实框 IoU 大于 0.5 就算对mAP 就是各类别 AP 的均值达到 0.9 以上系统“看起来像样”的最低要求mAP0.5:0.95从 0.5 到 0.95 每隔 0.05 算一次 IoU 后再平均指标更严格项目汇报时可以展示但不需要为此牺牲推理速度各类别 AP单独看每一类的表现香蕉被叶子遮住时 AP 会明显低针对它补样本F1-confidence不同置信度阈值下精确率和召回率的平衡实际演示时按它选 conf-thresval 时容易犯的错误是用 train 集评估。果蔬识别项目常见演示方式是“一组图片来回跑”最后 val 集里混着训练图片不自知mAP 看似很高换几张现场图立刻原形毕露。可以写一个最简单的脚本对比 fruit_data 的 train、val、test 三个 images 目录里是否有同名文件从源头上卡住重复。4.2 detect.py 推理源码从图像输入到置信度框输出果蔬识别系统的演示环节跑的是 detect.pypython detect.py --source fruit_test.jpg \ --weights runs/train/fruit_exp/weights/best.pt \ --conf-thres 0.30 --iou-thres 0.45 \ --save-txt --save-confdetect.py 的推理链路主要走四个步骤LoadImages 读图letterbox 做等比缩放填充模型前向输出原始预测non_max_suppression 做置信度过滤和去重。其中 letterbox 对果蔬识别影响最大因为训练时输入是 640×640现场图片长宽比不可能都是 1:1letterbox 会先按比例缩放原图再用灰色填充剩余区域避免图像形变。# utils/augmentations.py 中 letterbox 的核心思路 def letterbox(im, new_shape(640, 640), color(114, 114, 114)): shape im.shape[:2] # 原始高度、宽度 r min(new_shape[0] / shape[0], new_shape[1] / shape[1]) # 取较小缩放比 new_unpad (round(shape[1] * r), round(shape[0] * r)) # 等比缩放后的宽高 dw (new_shape[1] - new_unpad[0]) / 2 # 水平方向填充像素数 dh (new_shape[0] - new_unpad[1]) / 2 # 垂直方向填充像素数 # 缩放后放在画布中间四周填充 color return im_padded, r, (dw, dh)代码里r和(dw, dh)必须保持训练和推理一致如果推理时改动了 new_shape 或 auto 参数检测框会整体偏移。detect.py 里调用 non_max_suppression 时有两个阈值conf-thres 决定一个候选框置信度到多少才算检测到目标果蔬识别一般设 0.30iou-thres 决定两个重叠框要不要合并这个参数在果蔬这类互相遮挡的场景里影响很大后面单独讲。4.3 导出 ONNX模型部署前的最后一步YOLOv5 源码自带 export.py把 PyTorch 权重转成 ONNXpython export.py --weights runs/train/fruit_exp/weights/best.pt \ --include onnx --opset 12 --img 640导出后用 onnxruntime 加载推理需要自己做 letterbox 和坐标缩放YOLOv5 的 detect.py 不会直接接 ONNX。果蔬识别分辨率固定 640不需要开 dynamic batch保持静态宽度高度容易避开算子兼容问题。如果设备是 Jetson 这类嵌入式平台导 engine 前需要先装对应版本的 TensorRT并确认 torch 与 TensorRT 的 CUDA 版本一致。导出前先跑一次 val.py记录下 best.pt 的 mAP导出后再拉一份同验证集结果对比mAP 掉 5 个点以上说明 opset 或动态轴配置出了问题不要直接拿去部署。5. 果蔬识别系统的两个高频调优点重叠果实与计数训练阶段解决“能不能识别”落地阶段解决“现场好不好用”。果蔬识别和车牌识别最大的不同是目标之间会堆叠番茄一筐挨着一筐香蕉一把叠在一起。我把做系统时最常碰到的两个调优点单独说一下。5.1 重叠果实的 NMS 参数把 iou-thres 调高默认 iou-thres 是 0.45两个紧挨的果实框如果 IoU 大于 0.45NMS 会认为它们指向同一个目标于是合并成一个框表现出来就是漏检。处理重叠果蔬时我一般把推理参数改成python detect.py --source scene.jpg \ --weights best.pt \ --conf-thres 0.35 --iou-thres 0.60调高 iou-thres 允许保留更多重叠框代价是同一个果实可能出现两个紧贴的框所以同时把 conf-thres 从 0.30 提到 0.35抵掉多余低置信度框。NMS 是按类别分别执行的不同类别之间的重叠不会互相抑制番茄堆里出现一个苹果不需要担心苹果框把番茄压掉。5.2 用 detect 输出做果蔬计数标题里的“系统”两个字的直观落点就在这里。detect.py 加上--save-txt --save-conf后每张推理图会生成一个同名 txt记录每个框的类别、归一化坐标和置信度。统计一份果蔬数量from collections import Counter counts Counter() with open(runs/detect/exp/labels/scene.txt) as fp: for line in fp: cls, conf int(line.split()[0]), float(line.split()[1]) if conf 0.35: # 与推理时的 conf-thres 保持一致 counts[cls] 1 names [apple, banana, tomato] print({names[c]: n for c, n in counts.items()})这份计数结果可以接到 PySide2 界面的 label 上也可以写进 CSV。注意读取 txt 时不要二次套非极大值抑制detect.py 输出的框已经是后处理结果再做一次抑制会把重叠果实又并回去。把--conf-thres 0.35 --iou-thres 0.60写进启动脚本演示现场按一次回车就能同时刷新画面和数量这个细节在答辩演示里比一堆训练曲线更直接。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/16 5:54:25

Notepad++ 8.6 完整指南:安装、配置、插件与高效技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 5:54:25

Ubuntu 22.04上安装SUMO并跑通第一个交通仿真完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 5:54:25

系统提示词泄露防范:从原理到对抗性评估的完整指南

说个让我印象特别深的场景,大概是几个月前的一个早上,我一打开技术群,就看到有人在刷屏式地分享某款知名 AI 产品的“内部指令”。整份 system prompt 被完整贴了出来,连标点符号都没改,评论区里瞬间炸了锅——有人惊呼…

2026/9/16 7:49:30

自研CRM系统实战:从需求拆解到技术落地与避坑指南

从零落地一套 DeskcommCRM:从需求拆解到调度实现一听名字有点带感——DeskcommCRM,桌面通信和客户关系管理的组合。我最初的理解是“带即时通信能力的CRM”,做出来之后才发现,真正让团队买单的不是聊天窗口,而是把“客…

2026/9/16 7:49:30

开源AI音乐生成模型YuE本地部署实战:从环境搭建到生成完整歌曲

最近AI音乐生成这块是真的热闹,Suno、Udio这些在线平台让普通人也能哼两句词就出一首歌,但闭源、付费、可定制性差这几个问题一直卡着很多想认真玩音乐的人。说白了,你永远不知道它下一秒会不会抽风改版权条款,也没法把它接进自己…

2026/9/16 7:49:30

Nginx下载安装与nginx.conf配置解析:从入门到实践

做Web服务这一行,Nginx几乎是绕不开的家伙。无论是个人博客、企业官网还是高并发接口,很多流量入口就是它。最近后台常收到私信问Nginx的下载、安装和配置文件解析,不少人卡在安装完启动不了,或者配置文件改了不生效。这篇干脆把从…

2026/9/16 7:49:30

kali中怎么连接数据库(mycli/DBeaver/Navicat)

安装mycli kali 里面启动数据库的命令 (AI Agent) 把这个内容给保存到本地 (markdown) systemctl start mysqld systemctl start mariadb 通过命令连接数据库 mysql -u root -p 推荐使用 mycli 这个 mysql 连接工具来进行连接 pip install -i http…

2026/9/16 7:49:30

WSL中安装Rocky Linux完整指南:从rootfs导入到开发环境配置

1. 项目概述与思路拆解1.1 为什么要在WSL里装Rocky Linux先说结论:Rocky Linux这类RHEL系发行版,在WSL场景下用的人远少于Ubuntu,但真正需要它的人往往非常刚需。如果你是企业运维、搞过CentOS迁移、或者在生产环境里用的是AlmaLinux/Rocky这…

2026/9/16 7:44:30

2027届毕设-基于YOLO的跌倒检测系统

04-跌倒检测系统 解决毕设全流程开题报告、任务书、中期报告、论文写作难题 解决毕设系统雷同、查重、技术栈落后、撞车等问题 解决售后短、无售后问题 2026届所有客户全部顺利毕业 目前2026届的产品已停售,2027届专业版产品根据2026届遇到的高频需求全面升级&…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码