【数据集+源码+文章】基于yolov8+streamlit的12种水果品质、成熟度检测系统
文末附项目下载链接

开发目的
随着人们生活水平的不断提高,消费者对水果品质与食用体验的要求日益提升,水果的新鲜度、成熟度及外观品质已成为影响购买决策的关键因素。然而,在传统果蔬流通与零售环节中,水果质量检测主要依赖人工经验判断,存在主观性强、效率低下、标准不统一以及易受疲劳等因素干扰的问题,难以满足现代智慧农业与智能零售场景下的高效、精准检测需求。尤其在果园采摘、分拣包装、商超品控及电商平台质检等关键环节,缺乏自动化、可量化的评估手段严重制约了水果产业链的标准化与智能化发展。
为解决这一痛点,本系统创新性地融合YOLOv8目标检测算法与Streamlit交互式Web框架,构建了一套面向12种常见水果(如苹果、香蕉、橙子、芒果等)的品质与成熟度智能识别系统。YOLOv8凭借其卓越的多尺度特征提取能力、高精度定位性能和实时推理优势,能够在复杂背景、不同光照条件及密集摆放场景下准确识别水果种类并判别其成熟阶段与表面缺陷;而Streamlit的轻量化前端架构则实现了模型预测结果的可视化展示与用户友好交互,支持图像上传、实时检测、结果输出与分析报告生成,极大提升了系统的实用性与可部署性。
该系统的研发不仅推动了人工智能技术在农业质检领域的落地应用,更为实现水果从田间到餐桌全链条的智能化品控管理提供了高效、低成本的技术路径,对于提升农产品附加值、减少损耗、保障消费者权益以及促进智慧农业转型升级具有重要的现实意义与广阔的应用前景。
YOLO介绍
YOLOv8:目标检测的新标杆
随着目标检测技术的不断演进,Ultralytics推出的YOLOv8在继承YOLO系列高效、实时优势的基础上,进行了多项关键性改进,成为当前工业界和学术界广泛关注的高性能检测模型。本文将从骨干网络(Backbone)、Neck结构以及检测头(Head)三个方面深入解析YOLOv8,并对比其与YOLOv5、YOLOv7相比的创新与提升。
一、骨干网络(Backbone)
YOLOv8采用CSPDarknet作为主干特征提取网络,延续了Darknet架构的简洁高效特性,但在设计上进行了优化。相较于YOLOv5中的CSPDarknet53,YOLOv8对跨阶段部分结构进行了重构,引入了更多的梯度流路径,增强了特征复用能力。更重要的是,YOLOv8全面摒弃了传统的SiLU激活函数(Swish),转而使用更高效的ReLU变体或动态Reparam卷积模块(如在某些变体中),提升了训练稳定性和推理速度。
此外,YOLOv8根据不同规模(n/s/m/l/x)灵活调整深度和宽度,通过深度乘数和宽度乘数实现模型缩放,使得小模型更轻量、大模型更具表达力。
二、Neck结构
YOLOv8的Neck沿用了PANet(Path Aggregation Network)的双向特征融合结构,但进行了精简与优化。与YOLOv5中使用的SPPF + PAN结构相比,YOLOv8在特征金字塔的连接方式上更加注重底层细节信息的保留与高层语义信息的有效融合。
具体而言,YOLOv8采用更简洁的跨尺度连接方式,减少冗余计算,并在部分版本中引入基于注意力机制的轻量级特征加权模块,增强关键特征的传播能力。这种改进使得模型在处理多尺度目标时表现更优,尤其在小目标检测方面有明显提升。
三、检测头(Head)
YOLOv8最大的革新之一在于其解耦式检测头(Decoupled Head)设计。与YOLOv5采用的耦合头(分类与回归共用同一分支)不同,YOLOv8为分类任务和边界框回归任务分别设置独立的子网络,显著提升了两者的专业化程度。
同时,YOLOv8取消了传统的锚点(Anchor-based)机制,全面转向Anchor-free方案,采用基于中心点预测的机制进行目标定位。这不仅简化了后处理流程,还避免了Anchor聚类等繁琐操作,使模型更加通用且易于部署。
在损失函数方面,YOLOv8采用Task-Aligned Assigner作为正负样本匹配策略,动态对齐分类得分与回归质量,确保高质量预测框获得更高的优先级。回归损失则使用CIoU Loss结合Distribution Focal Loss(DFL),进一步提升定位精度。
四、与YOLOv5、YOLOv7的对比与创新
-
相比YOLOv5:
- YOLOv8采用解耦头+Anchor-free设计,摆脱了YOLOv5的Anchor依赖,检测逻辑更简洁;
- Backbone结构优化,增强梯度流动,提升训练效率;
- 引入更先进的标签分配策略(Task-Aligned Assigner),替代静态匹配,提升检测性能;
- 默认使用Mosaic数据增强和AutoAugment等策略,训练策略更先进。
-
相比YOLOv7:
- YOLOv8结构更简洁,去除了YOLOv7中复杂的E-ELAN、计划性重参数化等复杂模块,强调“极简高效”;
- YOLOv7侧重于模型压缩与重参数化优化,而YOLOv8更注重端到端性能与易用性;
- YOLOv8在Neck和Head设计上更加现代化,支持更灵活的扩展与部署;
- 官方提供完整生态(训练、验证、导出、部署一体化),用户体验大幅提升。
总结
YOLOv8并非简单地堆叠模块,而是基于大量实践经验对YOLO系列的一次系统性重构。它在保持高速推理的同时,通过解耦检测头、Anchor-free设计、优化的Backbone与Neck结构,实现了检测精度与速度的双重突破。相比YOLOv5和YOLOv7,YOLOv8在架构设计上更加现代化、模块化,兼具高性能与高可用性,是当前目标检测领域极具竞争力的标杆模型。
系统设计
数据集
(1) 数据集基本情况
本项目使用的数据集为自建的“12种水果品质与成熟度检测”目标检测数据集,共包含苹果、鳄梨、香蕉、火龙果、葡萄、柠檬、芒果、橙子、木瓜、菠萝、红毛丹果、草莓等12类常见水果。每类水果根据其状态细分为三种标签:成熟(好的)、未成熟、腐烂(坏的),因此总共有36个类别标签。

数据集已按照标准格式划分为训练集、验证集和测试集:
- 训练集:5851张图像及对应
.txt标注文件 - 验证集:1414张图像及对应
.txt标注文件 - 测试集:93张图像及对应
.txt标注文件

所有图像均为真实拍摄场景下的水果照片,未经过任何形式的数据增强处理,确保模型在实际应用中的泛化能力。标注准确率高,经YOLOv8s模型实测,在mAP@0.5指标上达到70.7%,具备良好的训练基础。

(2) 数据集处理
在完成图像采集后,使用开源标注工具 LabelMe 对图像进行手动标注。LabelMe支持多边形标注,适用于不规则形状物体,但在本项目中我们将其导出为矩形框(bounding box)形式,并转换为YOLO目标检测所需的格式。
标注完成后,LabelMe生成的是 .json 文件,需通过脚本将其批量转换为 YOLO 所需的 .txt 格式。YOLO目标检测的标准数据格式如下:
每个图像对应一个同名的 .txt 文本文件,文件中每一行表示一个目标,格式为:
<class_id> <x_center> <y_center> <width> <height>
其中:
class_id:类别索引(从0开始)x_center,y_center:边界框中心点坐标(相对于图像宽高的归一化值,范围[0,1])width,height:边界框宽高(同样归一化)
例如:
0 0.45 0.67 0.21 0.33
此外,还需提供一个 data.yaml 配置文件,定义类别名称列表、训练/验证集路径等信息,供YOLO训练时读取。完整的标签信息可在 data.yaml 中查看注释说明。
模型训练
安装 Ultralytics
使用官方推荐的 ultralytics 库来训练YOLOv8模型,安装命令如下:
pip install ultralytics
该库集成了模型定义、训练、验证、推理全流程功能,接口简洁高效。
训练代码编写
训练过程主要通过调用 YOLO 类实现。以下为基本训练代码示例:
from ultralytics import YOLO# 加载预训练模型(如yolov8s.pt)
model = YOLO('yolov8s.pt')# 开始训练
results = model.train(data='path/to/data.yaml',epochs=100,imgsz=640,batch=16,name='fruit_quality_v8s'
)
训练参数设置(超参数详解)
YOLOv8 提供丰富的可调节超参数以优化训练效果。以下是关键超参数及其含义与常用取值:
| 超参数 | 含义 | 常见取值 | 说明 |
|---|---|---|---|
epochs | 训练轮数 | 50~300 | 控制模型学习充分程度,过大会导致过拟合 |
batch | 每批次样本数量 | 8, 16, 32 | 受GPU显存限制,越大收敛越稳定 |
imgsz | 输入图像尺寸 | 640 | 统一分辨率输入,影响精度与速度平衡 |
optimizer | 优化器类型 | ‘SGD’, ‘Adam’, ‘AdamW’ | 默认SGD,AdamW适合小数据集微调 |
lr0 | 初始学习率 | 0.01 | 学习率过高易震荡,过低收敛慢 |
lrf | 最终学习率比例 | 0.01 | 末轮学习率为初始的1% |
momentum | 动量系数 | 0.937 | SGD优化器专用,提升收敛稳定性 |
weight_decay | 权重衰减 | 0.0005 | 正则化项,防止过拟合 |
warmup_epochs | 热身训练轮数 | 3.0 | 前几轮缓慢提升学习率 |
iou_loss | IOU损失函数 | ‘ciou’ | 改进版IOU损失,提升定位精度 |
anchor_free | 是否无锚框 | False | YOLOv8默认仍使用锚框机制 |
这些参数可通过字典传入 .train() 方法进行自定义配置。
训练后评估
为什么需要模型评价?
训练完成后必须对模型性能进行量化评估,判断其是否满足实际部署需求。尤其在农业质检这类高精度要求场景中,误检或漏检可能导致经济损失。因此,引入科学的评估指标至关重要。
PR曲线与mAP评价标准
1. PR曲线(Precision-Recall Curve)
PR曲线反映模型在不同置信度阈值下的精确率(Precision)与召回率(Recall)之间的权衡关系。
-
精确率(Precision):预测为正类的样本中有多少是真正的正类
P=TPTP+FPP = \frac{TP}{TP + FP} P=TP+FPTP -
召回率(Recall):真实正类样本中有多少被正确预测出来
R=TPTP+FNR = \frac{TP}{TP + FN} R=TP+FNTP
其中:
- TP:真正例(预测正确且为正类)
- FP:假正例(预测为正类但实际为负类)
- FN:假反例(预测为负类但实际为正类)
PR曲线下面积即为 AP(Average Precision),用于衡量单个类别的检测性能。
2. mAP(mean Average Precision)
将所有类别的AP求平均,得到整体检测性能指标:
mAP=1N∑i=1NAPimAP = \frac{1}{N} \sum_{i=1}^{N} AP_i mAP=N1i=1∑NAPi
通常报告两种指标:
- mAP@0.5:IoU阈值为0.5时的mAP
- mAP@0.5:0.95:IoU从0.5到0.95多个阈值下的平均mAP
本项目中,YOLOv8s在测试集上达到了 70.7% 的 mAP@0.5,表明模型具有较好的识别与定位能力。

模型推理
图片推理代码
利用训练好的模型进行图片推理,代码如下:
from ultralytics import YOLO
from PIL import Imagemodel = YOLO('runs/detect/fruit_quality_v8s/weights/best.pt')
image = Image.open('test.jpg')results = model.predict(image, conf=0.25, iou=0.45)
annotated_img = results[0].plot()annotated_img.save('result.jpg')
视频推理代码
对视频文件或摄像头流进行实时检测:
import cv2model = YOLO('best.pt')
cap = cv2.VideoCapture('video.mp4') # 或 0 表示摄像头while cap.isOpened():success, frame = cap.read()if not success:breakresults = model.predict(frame, conf=0.25, iou=0.45)annotated_frame = results[0].plot()cv2.imshow('Fruit Quality Detection', annotated_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
上述代码实现了逐帧推理并可视化结果,可用于视频监控或现场质检系统。
系统UI设计
Streamlit框架优点
Streamlit 是一个专为机器学习和数据科学打造的Python Web框架,具有以下显著优势:
- 开发简单:无需前端知识,纯Python即可构建交互式界面
- 快速部署:几行代码即可创建按钮、滑块、上传组件
- 实时更新:自动重载页面,便于调试
- 组件丰富:支持图像显示、表格、图表、视频播放等多媒体元素
- 易于集成:可无缝对接PyTorch、TensorFlow、Ultralytics等主流库
非常适合用于搭建AI模型的演示系统或原型产品。
UI实现方式(结合源码说明)
基于 streamlit 搭建了完整的Web界面系统,核心逻辑如下:
- 页面配置与隐藏默认样式
st.set_page_config(page_title="水果品质检测系统", layout="centered")
hide_streamlit_style = """<style>footer {visibility: hidden;}</style>"""
st.markdown(hide_streamlit_style, unsafe_allow_html=True)
-
用户登录与权限控制
系统包含登录/注册模块,使用SQLite数据库存储用户名、密码及角色(管理员/游客)。管理员可查看详细检测结果表,游客仅能查看可视化结果。 -
侧边栏参数配置
model_type = st.sidebar.selectbox("选取模型", MODEL_LIST)
confidence = st.sidebar.slider("调整置信度", 10, 100, 25) / 100
iou = st.sidebar.slider("调整iou", 10, 100, 45) / 100
source = st.sidebar.radio('检测类型', ("图片检测", "视频检测", "本地摄像头检测"))
- 主区域功能响应
根据不同选择加载对应处理逻辑:
- 图片上传 → 使用
PIL.Image.open()读取并调用infer_image - 视频上传 → 临时保存后用
cv2.VideoCapture逐帧处理 - 摄像头检测 → 实时调用
cv2.VideoCapture(0)并持续推理
- 结果显示
使用st.image()显示原始图与检测结果图,st.data_editor()展示检测详情表格(管理员权限下可编辑)。
整个UI结构清晰、交互流畅,极大提升了用户体验。
系统功能
根据提供的源码分析,该系统具备以下主要功能:
-
多模式检测支持
- 支持上传图片进行静态检测
- 支持上传视频文件进行逐帧检测
- 支持调用本地摄像头进行实时在线检测
-
模型灵活切换
用户可在侧边栏选择不同的YOLOv8模型(如n/s/m/l/x),适应不同硬件环境下的性能需求。 -
参数动态调节
提供置信度(Confidence)和IOU阈值调节滑块,用户可实时调整检测灵敏度。 -
结果可视化展示
自动绘制边界框、类别标签和置信度,并在主界面展示检测前后对比图。 -
检测结果结构化输出
将检测结果整理为表格形式,包含序号、类别、置信度、边界框坐标等字段,便于后续分析。 -
权限分级管理
管理员账户可查看完整可编辑的结果表格;普通游客仅能查看不可修改的结果,保障数据安全。 -
用户认证系统
内置SQLite数据库支持用户注册与登录,防止未授权访问。 -
轻量级部署能力
整个系统基于Streamlit构建,可一键运行,适合教学演示、科研展示或小型应用场景部署。
总结
本系统成功构建了一套基于YOLOv8与Streamlit的12种水果品质与成熟度智能识别平台,实现了从数据采集、模型训练、性能评估到可视化部署的完整闭环。通过采用先进的YOLOv8目标检测算法,系统在复杂环境下仍能高效、准确地识别多种水果的种类及其品质状态(成熟、未成熟、腐烂),并在测试集上取得了70.7%的mAP@0.5成绩,展现出良好的检测精度与鲁棒性。
结合Streamlit框架所构建的交互式Web界面,不仅实现了图像、视频及实时摄像头的多模态输入支持,还提供了模型切换、置信度调节、结果可视化与结构化输出等实用功能,极大提升了系统的可用性与用户体验。同时,系统引入用户权限管理机制,保障了数据访问的安全性与可控性,具备向实际生产环境迁移的潜力。
该系统的实现充分体现了人工智能技术在智慧农业与食品质检领域的应用价值,为水果产业链的自动化、标准化品控提供了切实可行的技术解决方案。未来可进一步拓展至更多品类、引入温度湿度等多源传感信息融合,并探索边缘设备部署,推动农业智能化迈向更高水平。

另外,限于本篇文章的篇幅,无法一一细致讲解系统原理、项目代码、模型训练、系统文章等细节,需要数据集、整套项目源码、训练代码、系统文档的小伙伴可以从下面的链接中下载:
水果品质度数据集 基于yolov8+streamlit的12种水果品质、成熟度检测系统
