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

发布时间:2026/11/13 16:03:45

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/11/13 16:03:45

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/11/9 14:31:43

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/11/11 1:28:49

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

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

2026/11/13 16:00:30

石家庄电工证怎么查询 良心建议帮你解决异地证书转过来的难题

石家庄电工证怎么查询 良心建议帮你解决异地证书转过来的难题 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题之一,尤其是那些在外地工作、后来回到石家庄的电工朋友。今天我就用 良心建议 的方式,详细说说 石家庄电工证怎么查询…

2026/11/13 16:00:30

贵州电工证样板图高清千万别踩坑,学历不高也能报

贵州电工证样板图高清千万别踩坑,学历不高也能报 学历不高怕报不上名?别急,贵州电工证样板图高清你搞懂了,其实报考门槛没你想的那么高。今天就带你从头到尾说清楚,怎么拿到这张证书,避开那些坑,让你顺利走好第一步。…

2026/11/13 16:00:30

东营市电工证报名保姆级教程:零基础也能考到电工证

东营市电工证报名保姆级教程:零基础也能考到电工证 急需特种作业证才能上岗找工作,东营市电工证报名成了很多建筑工人、电气维修工、施工人员的刚需。现在市场上电工证缺口大,尤其是低压电工证和高压电工证,持证上岗已经成为行业标准。很多人因为不了解流…

2026/11/13 16:00:30

滨江区电工证怎么复审 郑州报考避坑指南

滨江区电工证怎么复审 郑州报考避坑指南 工地太忙根本没时间复习考试,你是不是也经常这样想?特别是对于在滨江区工作的电工来说,特种作业操作证的复审工作常常被忽视,等到证件到期才想起来,结果一拖再拖,不仅影响工作,还可能面临处罚。今天就来聊聊…

2026/11/13 16:00:30

电工证高压低压区别吗考前押题怎么用能过

电工证高压低压区别吗考前押题怎么用能过 工地太忙根本没时间复习考试,高压电工和低压电工证的区别到底在哪?很多一线工人连报名流程都不清楚,更别说考前押题怎么用。其实,搞清楚这两个证的区别,不仅关系到能不能上岗,更直接影响到你未来的薪资和职业发…

2026/11/13 15:55:29

电工证在宁波哪里培训报名入口与办理流程

宁波电工证培训哪里报名?多久拿证?全攻略来了! 你是不是正为找不到电工证培训发愁?找工作急需特种作业证,偏偏又不知道哪里靠谱?别急,这篇文章帮你搞定【电工证在宁波哪里培训】和【多久拿证】这两个核心问题。如果你是焦作的在职建筑工人,想要转型或…

2026/11/12 20:35:13

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/13 0:01:06

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了 你是不是也像我一样,第一次听说“高压电工证”这个名词,就感觉一头雾水?其实很多人都跟我一样,不知道去哪报名、怕被中介坑,结果花了冤枉钱还考不上。今天我就从一个在商丘培训过的学员角度,…

2026/11/13 0:01:06

黎里考电工证在哪里值不值得考

黎里考电工证在哪里值不值得考 之前考的证在外省能不能转过来?这是很多在外地工作、准备回老家发展的朋友最关心的问题。特别是在黎里地区,很多从事电力相关工作的朋友,都面临这样一个难题: 外省的电工证能否在本地使用?值不值得考?…

2026/11/13 0:01:06

毕节哪里考电工证 怎么报名学历不高也能上手

毕节哪里考电工证 怎么报名学历不高也能上手 你是不是也和我一样,学历不高,想着考个电工证,但又担心自己条件不够,怕报不上名?其实不然,只要符合条件,学历不高也能考电工证。今天就来聊聊【毕节哪里考电工证】这个问题,还有怎么报名,让你一步到位不…

2026/11/12 22:10:13

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

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

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

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