跳到主要内容
YOLOv8 草莓成熟度检测数据集与系统实战 | 极客日志
Python AI 算法
YOLOv8 草莓成熟度检测数据集与系统实战 介绍基于 YOLOv8 的草莓成熟度检测数据集及系统实现。数据集包含 3207 张标注图片,涵盖成熟与未成熟两类,支持 VOC 与 YOLO 格式。内容涵盖数据预处理、模型训练配置、推理脚本编写以及 Web 检测系统的搭建与部署。通过该系统可实现果园场景下的实时果实识别、分级分拣指导及病虫害预警,辅助精准农业管理。
奇形怪状 发布于 2026/3/30 更新于 2026/5/24 22 浏览一、数据集介绍
【数据集】YOLOv8 草莓成熟度检测数据集 3207 张 ,目标检测,包含 YOLO/VOC 格式标注,训练、验证、测试集已划分 。
数据集中标签包含2 种分类 :names: ['ripe', 'unripe'],代表成熟草莓、未成熟草莓 。
检测场景为果园、山庄、大棚、水果加工厂等场景 ,可用于草莓精准采收指导、种植管理优化、病虫害间接预警、采后分拣辅助等。
1、数据概述
草莓成熟度识别的重要性
草莓作为口感清甜、营养丰富的高附加值浆果,成熟度直接决定其商品价值 —— 未熟草莓酸涩、果肉坚硬,难以满足消费需求;过熟草莓易软化腐烂,货架期短,运输损耗大;仅成熟度适宜的草莓能平衡口感与耐储性,实现最佳经济效益。
但传统草莓成熟度检测存在明显短板:依赖人工逐颗观察,种植者需凭借果实颜色(青、粉、红)、果肉软硬等主观特征判断,不仅耗时耗力,还受经验差异影响大,新手易将半熟果误判为成熟果,或漏采已成熟果实;且草莓多为大棚密植,果实常被叶片遮挡,人工检测易出现漏判,尤其在采收旺季,大面积园区的检测效率远难满足需求,易导致部分果实过熟损耗,或因采收顺序混乱影响整体品质。
YOLO 算法凭借'实时目标检测 + 多成熟度分类'的优势,精准破解上述难题:其一,可结合大棚监控、手持设备或采摘机器人摄像头,快速识别画面中草莓果实,即使存在叶片遮挡也能精准定位,无需人工逐颗排查;其二,能清晰区分草莓不同成熟阶段(未熟青果、半熟粉果、成熟红果),通过图像特征精准捕捉细微颜色差异,避免主观误判;其三,检测过程可同步记录果实位置与成熟度分布,为后续采收、管理提供数据支撑,推动草莓产业从'经验种植'向'精准管控'转型,是保障草莓品质、降低损耗的关键技术。
基于 YOLO 的草莓识别系统
精准采收指导 :YOLO 可实时生成草莓园成熟度分布图谱,标注成熟果实集中区域,指导采收人员按'先熟先采'原则分区作业,避免漏采过熟果或错采未熟果。同时,能识别被叶片遮挡的成熟果实,减少漏采率,且采收时可针对性避开未熟果实,降低碰伤风险,保障采收后果实完整性。
采收与供应链规划 :通过统计不同成熟度果实的数量,YOLO 可辅助预估采收总量与批次,帮助种植者提前对接商超、电商等收购渠道,合理安排采收人力、包装材料与冷链运输资源,避免采收旺季因规划不足导致的果实积压腐烂,或因人力短缺延误采收。
大棚管理优化 :长期监测草莓成熟度数据,可分析不同大棚区域、不同品种的成熟速度差异,进而判断环境条件是否适宜。例如,若某区域草莓成熟普遍偏慢,可针对性调整大棚温度、光照时长或水肥配比,促进果实均匀成熟,提升全园果实品质一致性。
采后分级分拣 :采收后的草莓需按成熟度分级销售(如成熟果供鲜食、半熟果供加工果酱),YOLO 可结合分拣线摄像头,自动识别果实成熟度并完成分类,替代人工分拣。不仅能减少人力成本,还能避免人工分拣的主观误差,确保分级标准统一,帮助种植者按不同成熟度制定差异化售价,提升经济收益。
病虫害间接预警 :部分病虫害(如灰霉病、蚜虫侵害)会导致草莓果实出现病斑、着色不均等异常,YOLO 在检测成熟度时,可同步捕捉这类异常果实,提醒种植者排查病虫害风险,及时采取防治措施,避免病害扩散影响果实成熟与品质。
该数据集含有 3207 张图片,包含Pascal VOC XML 格式和YOLO TXT 格式,用于训练和测试果园、山庄、大棚、水果加工厂等场景进行草莓成熟度识别 。
图片格式为 jpg 格式,标注格式分别为:
YOLO:txt
VOC:xml
2、数据集文件结构
Strawberry/
——test/
————Annotations/
————images/
————labels/
——train/
————Annotations/
————images/
————labels/
——valid/
————Annotations/
————images/
————labels/
——data.yaml
该数据集已划分训练集样本,分别是:test 目录(测试集)、train 目录(训练集)、valid 目录(验证集);
Annotations 文件夹为 Pascal VOC 格式的XML 文件 ;
images 文件夹为jpg 格式 的数据样本;
labels 文件夹是YOLO 格式的 TXT 文件 ;
data.yaml 是数据集配置文件,包含草莓识别 的目标分类和加载路径。
Annotations 目录下的xml 文件 内容如下:
<annotation >
<folder > </folder >
<filename > img287129312913_jpg.rf.32aa01aa19cb300935c591582897bcf9.jpg</filename >
<path > img287129312913_jpg.rf.32aa01aa19cb300935c591582897bcf9.jpg</path >
<source >
<database > Strawberry</database >
</source >
<size >
<width > 640</width >
<height > 640</height >
<depth > 3</depth >
</size >
<segmented > 0</segmented >
<object >
<name > ripe</name >
<pose > Unspecified</pose >
<truncated > 0</truncated >
<difficult > 0</difficult >
<occluded > 0</occluded >
<bndbox >
<xmin > 388</xmin >
<xmax > 641</xmax >
<ymin > 120</ymin >
<ymax > 508</ymax >
</bndbox >
</object >
<metadata >
</metadata >
</annotation >
0 0.703125 0.5140625 0.2296875 0.4546875 1 0.4921875 0.325 0.1203125 0.2796875 1 0.19921875 0.4328125 0.0484375 0.125 1 0.37890625 0.36328125 0.0703125 0.1421875 1 0.42265625 0.52578125 0.0859375 0.1671875
3、数据集适用范围
目标检测 场景,无人机 检测,监控 识别
yolo 训练模型或其他模型
果园、山庄、大棚、水果加工厂等场景
可用于草莓精准采收指导、种植管理优化、病虫害间接预警、采后分拣辅助等。
4、数据集标注结果
4.1、数据集内容
多角度场景:人员视角数据样本,监控视角数据样本 ;
标注内容:names: ['ripe', 'unripe'] ,总计2 个 分类;
图片总量:3207 张图片数据;
标注类型:含有Pascal VOC XML 格式和yolo TXT 格式;
5、训练过程
5.1、导入训练数据 下载 YOLOv8 项目压缩包,解压在任意本地 workspace 文件夹中。
在ultralytics-main 项目根目录下,创建 data 文件夹,并在 data 文件夹下创建子文件夹:Annotations、images、imageSets、labels ,其中,将pascal VOC 格式的 XML 文件 手动导入到 Annotations 文件夹中,将JPG 格式的图像数据导入到 images 文件夹中,imageSets 和 labels 两个文件夹不导入数据。
data/
——Annotations/ //存放 xml 文件
——images/ //存放 jpg 图像
——imageSets/
——labels/
5.2、数据分割 首先在 ultralytics-main 目录下创建一个 split_train_val.py 文件,运行文件之后会在 imageSets 文件夹下将数据集划分为训练集 train.txt、验证集 val.txt、测试集 test.txt,里面存放的就是用于训练、验证、测试的图片名称。
import os
import random
trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
num = len (total_xml)
list_ = range (num)
tv = int (num * trainval_percent)
tr = int (tv * train_percent)
trainval = random.sample(list_, tv)
train = random.sample(trainval, tr)
ftrainval = open ('data/ImageSets/trainval.txt' , 'w' )
ftest = open ('data/ImageSets/test.txt' , 'w' )
ftrain = open ('data/ImageSets/train.txt' , 'w' )
fval = open ('data/ImageSets/val.txt' , 'w' )
for i in list_:
name = total_xml[i][:-4 ] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else :
fval.write(name)
else :
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
5.3、数据集格式化处理 在 ultralytics-main 目录下创建一个 voc_label.py 文件,用于处理图像标注数据,将其从 XML 格式(通常用于 Pascal VOC 数据集)转换为 YOLO 格式。
这个函数读取一个图像的 XML 标注文件,将其转换为 YOLO 格式的文本文件。
它打开 XML 文件,解析树结构,提取图像的宽度和高度。
然后,它遍历每个目标对象(object),检查其类别是否在 classes 列表中,并忽略标注为困难(difficult)的对象。
对于每个有效的对象,它提取边界框坐标,进行必要的越界修正,然后调用 convert 函数将坐标转换为 YOLO 格式。
最后,它将类别 ID 和归一化后的边界框坐标写入一个新的文本文件。
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train' , 'val' , 'test' ]
classes = ['ripe' , 'unripe' ]
abs_path = os.getcwd()
print (abs_path)
def convert (size, box ):
dw = 1. / (size[0 ])
dh = 1. / (size[1 ])
x = (box[0 ] + box[1 ]) / 2.0 - 1
y = (box[2 ] + box[3 ]) / 2.0 - 1
w = box[1 ] - box[0 ]
h = box[3 ] - box[2 ]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def convert_annotation (image_id ):
in_file = open ('data/Annotations/%s.xml' % (image_id), encoding='UTF-8' )
out_file = open ('data/labels/%s.txt' % (image_id), 'w' )
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size' )
w = int (size.find('width' ).text)
h = int (size.find('height' ).text)
for obj in root.iter ('object' ):
difficult = obj.find('difficult' ).text
cls = obj.find('name' ).text
if cls not in classes or int (difficult) == 1 :
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox' )
b = (float (xmlbox.find('xmin' ).text), float (xmlbox.find('xmax' ).text), float (xmlbox.find('ymin' ).text), float (xmlbox.find('ymax' ).text))
b1, b2, b3, b4 = b
if b2 > w: b2 = w
if b4 > h: b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str (cls_id) + " " + " " .join([str (a) for a in bb]) + '\n' )
wd = getcwd()
for image_set in sets:
if not os.path.exists('data/labels/' ):
os.makedirs('data/labels/' )
image_ids = open ('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
list_file = open ('data/%s.txt' % (image_set), 'w' )
for image_id in image_ids:
list_file.write(abs_path + '/data/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
5.4、修改数据集配置文件 在 ultralytics-main 目录下创建一个 data.yaml 文件
train: data/train.txt
val: data/val.txt
test: data/test.txt
nc: 2
names: ['ripe' , 'unripe' ]
5.5、执行命令 model = YOLO('yolov8s.pt' )
results = model.train(data='data.yaml' , epochs=200 , imgsz=640 , batch=16 , workers=0 )
yolo train data=data.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 workers=0 device=0
5.6、模型预测 你可以选择新建 predict.py 预测脚本文件,输入视频流或者图像进行预测。
import cv2
from ultralytics import YOLO
model = YOLO("./best.pt" )
video_path = "./demo.mp4"
cap = cv2.VideoCapture(video_path)
frame_width = int (cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int (cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'mp4v' )
out = cv2.VideoWriter('./outputs.mp4' , fourcc, fps, (frame_width, frame_height))
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.predict(source=frame, save=True , imgsz=640 , conf=0.5 )
results[0 ].names[0 ] = "道路积水"
out.write(annotated_frame)
cv2.imshow("YOLOv8 Inference" , annotated_frame)
if cv2.waitKey(1 ) & 0xFF == ord ("q" ):
break
else :
break
cap.release()
out.release()
cv2.destroyAllWindows()
import warnings
warnings.filterwarnings('ignore' )
from ultralytics import YOLO
if __name__ == '__main__' :
model = YOLO('models/best.pt' )
model.predict(source='test_pic' , imgsz=640 , save=True , conf=0.25 )
也可以直接在命令行窗口或者 Anaconda 终端输入以下命令进行模型预测:
yolo predict model="best.pt" source ='demo.jpg'
二、YOLO 草莓成熟度检测系统
1、功能介绍 支持自定义上传模型文件,一键加载所选模型,基于 YOLO 框架进行推理。
支持上传本地图片文件,自动完成格式校验。
对上传图片进行目标检测,检测结果以带有边框和标签的图片形式返回并展示。
检测结果可下载保存。
支持上传本地视频文件,自动完成格式校验。
对视频逐帧检测,检测结果通过 MJPEG 流实时推送到前端页面,用户可边看边等。
支持摄像头实时检测(如有接入摄像头)。
前端可实时调整检测置信度阈值,动态影响检测结果。
阈值调整后,后端推理自动应用新阈值,无需重启。
前端集成日志区,实时显示模型加载、推理、文件上传等操作的进度与结果。
检测异常、错误信息及时反馈,便于排查。
一键清空日志,避免长期占用内存。
2、创建环境并安装依赖: conda create -n ultralytics-env python=3.10
conda activate ultralytics-env
pip install -r requirements.txt
3、启动项目
4、效果展示
4.1、推理效果
4.2、日志文本框
4.3、摄像头检测
5、前端核心页面代码 <!doctype html >
<html lang ="zh-CN" >
<head >
<meta charset ="utf-8" >
<meta name ="viewport" content ="width=device-width,initial-scale=1" >
<title > 视觉检测系统 - Web UI</title >
<link rel ="stylesheet" href ="/static/style.css" >
<link rel ="icon" href ="/favicon.ico" >
</head >
<body >
<div >
<div >
<header >
<h1 > YOLO 草莓成熟度检测系统</h1 >
<div title ="当前模型" > 当前模型:未上传模型</div >
</header >
<main >
<div >
<div >
<h3 > 原图 / 视频</h3 >
<div > 预览区</div >
</div >
<div >
<h3 > 检测结果</h3 >
<div > 检测结果</div >
</div >
</div >
<section >
<div >
<h3 > 日志</h3 >
</div >
<div >
<div > </div >
</div >
</section >
</main >
</div >
<aside >
<section >
<button > 上传模型 <input type ="file" accept =".pt" title ="选择 .pt 模型文件" > </button >
<button > 加载模型</button >
</section >
<section >
<div > 请选择检测方式</div >
<div >
<label > <input type ="radio" name ="detectMode" value ="upload" checked > 图片/视频</label >
<label > <input type ="radio" name ="detectMode" value ="camera" > 摄像头</label >
</div >
<div >
<div >
<span > 未选择文件</span >
</div >
<div > </div >
<button > 上传文件 <input type ="file" accept ="image/*,video/*" title ="上传图片或视频" aria-label ="上传图片或视频" > </button >
</div >
<div >
<button > 开启摄像头</button >
<div >
<video autoplay muted playsinline > </video >
<div >
<button > 关闭摄像头</button >
</div >
</div >
</div >
<div >
<label > 置信度 <input type ="range" min ="0.01" max ="0.99" step ="0.01" value ="0.5" > <input type ="number" min ="0.01" max ="0.99" step ="0.01" value ="0.5" > </label >
</div >
</section >
<section >
<button disabled > 开始检测</button >
<button disabled > 停止</button >
<button > 清空日志</button >
</section >
</aside >
</div >
<script src ="/static/app.js" > </script >
</body >
</html >
6、代码获取 相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online