基于最新YOLOv10深度学习模型开发的瓜果成熟度智能检测系统,该系统能够实时准确地识别并分类瓜果的成熟状态,为农业生产提供科学的决策依据。该系统采用Flask Web框架构建,集成了用户管理、实时检测、历史记录查询、数据统计分析等完整功能模块,支持图片、视频、摄像头实时检测以及批量检测等多种应用场景。
一、系统架构与技术栈
本系统采用前后端分离的架构设计,后端基于Python的Flask框架搭建,前端使用HTML5、CSS3和原生JavaScript实现,数据持久化采用MySQL数据库。核心检测引擎使用YOLOv10模型,这是清华大学MIG实验室2024年发布的最新目标检测算法,相较于前代版本在推理速度和检测精度上都有显著提升。系统支持用户上传自定义训练的模型文件,通过配置文件灵活指定检测类别和置信度阈值。整个系统实现了从用户注册登录、模型加载、图像检测、结果展示到数据分析的完整工作流程,具备良好的可扩展性和实用性。
二、数据集与模型训练
本项目使用自建的瓜果数据集进行模型训练,数据集包含三个主要类别,分别是未成熟瓜果、成熟瓜果和小型瓜果。数据集被划分为训练集和验证集两部分,训练集包含2839张标注图像,验证集包含709张标注图像,所有图像均采用YOLO格式进行标注。数据集配置文件melon.yaml定义了数据路径和类别信息,为模型训练提供了标准化的数据接口。
表2-1:数据集信息
|---------|------------------------------------|
| 数据集属性 | 配置值 |
| 训练集图像数量 | 2839张 |
| 验证集图像数量 | 709张 |
| 检测类别数量 | 3类 |
| 类别定义 | immature(未成熟)、mature(成熟)、small(小型) |
| 标注格式 | YOLO格式(.txt文件) |
| 图像格式 | JPG/JPEG |
模型训练采用YOLOv10架构,通过配置训练参数如训练轮数、批次大小、输入图像尺寸等,在GPU环境下进行端到端的训练。训练过程中系统会自动保存最佳权重文件,用于后续的推理检测。用户可以根据实际应用场景选择不同规模的YOLOv10模型,从轻量级的YOLOv10-N到高精度的YOLOv10-X,以在速度和精度之间取得最佳平衡。
三、模型训练与评估结果

图3-1:混淆矩阵分析
图3-1展示了模型在验证集上的混淆矩阵,通过热力图的形式直观呈现了模型对各个类别的预测准确性。混淆矩阵是评估分类模型性能的重要工具,矩阵的行代表真实标签,列代表预测标签,对角线上的数值表示正确分类的样本数量。从图中可以看出,未成熟类别正确识别了913个样本,成熟类别正确识别了703个样本,小型类别正确识别了117个样本,对角线上的深蓝色块表明模型对主要类别具有很高的识别准确率。非对角线位置的数值较小,说明误分类情况较少,模型具有良好的类别区分能力。特别值得注意的是,未成熟和成熟两个主要类别的互相误判情况很少,这对于实际应用中的采摘决策具有重要意义。

图3-2:精确率-置信度曲线
图3-2展示了模型在不同置信度阈值下的精确率变化趋势,是评估模型预测可靠性的关键指标。横轴表示模型输出的置信度分数,纵轴表示对应的精确率。从曲线可以看出,成熟类别的精确率曲线保持在最高位置且波动最小,说明模型对成熟瓜果的识别最为可靠。未成熟类别的曲线也维持在较高水平,随着置信度的提升逐渐趋近于1.0。小型类别的曲线起点较低但上升趋势明显,这反映了小型瓜果因体积较小而更具检测挑战性。粗蓝色曲线代表所有类别在置信度为1.0时的综合表现,显示精确率达到了完美的1.0,说明模型输出的高置信度预测几乎没有误报,具有极高的实用价值。

图3-3:归一化混淆矩阵
图3-3是混淆矩阵的归一化版本,通过百分比的形式更清晰地展示各类别的分类准确率,便于不同类别之间的横向比较。从图中可以看到,未成熟类别的识别准确率高达95%,仅有3%被误判为成熟,说明模型对成熟度的判断标准把握准确。成熟类别的识别准确率达到96%,是三个类别中表现最好的,仅有1%被误判为未成熟。小型类别的准确率为64%,相对较低,这主要是因为小型瓜果可能同时具有未成熟或成熟的特征,增加了分类难度。背景类(background)的识别准确率也很高,说明模型能够有效区分真实目标和背景区域,避免误检。

图3-4:精确率-召回率曲线
图3-4展示了各类别的精确率-召回率(Precision-Recall)曲线,这是目标检测领域最重要的性能评估指标之一。曲线下的面积即为平均精度均值(mAP),数值越大表示模型性能越好。从图中可以看出,成熟类别的mAP达到了0.982,曲线几乎覆盖了整个右上角区域,说明该类别在高召回率的同时仍能保持高精确率。未成熟类别的mAP为0.960,表现同样优秀。小型类别的mAP为0.753,虽然相对较低但考虑到小目标检测的固有难度,这个结果仍然可以接受。粗蓝色曲线代表所有类别在IoU阈值0.5下的综合表现,总体mAP达到0.898,充分证明了模型在瓜果成熟度检测任务上的优异性能,能够满足实际农业生产中的精确检测需求。

图3-5:训练过程指标监控
图3-5全面展示了模型训练过程中各项指标的变化趋势,是监控训练状态和诊断问题的重要工具。图表包含了十个子图,分别显示了训练集和验证集上的边界框损失、分类损失、DFL损失,以及召回率、精确率、各类mAP等评估指标随训练轮数的变化情况。从损失曲线可以看出,训练初期各项损失值较高,随着训练的进行快速下降并逐渐收敛,蓝色的实际数值点和橙色的平滑曲线基本吻合,说明训练过程稳定。从右侧的评估指标曲线可以看到,召回率和mAP指标都呈现出持续上升后趋于平稳的趋势,最终稳定在较高水平,精确率也维持在0.8以上。这些曲线充分说明模型已经充分学习到数据特征,没有出现过拟合或欠拟合的情况,训练效果理想。

图3-6:召回率-置信度曲线
图3-6展示了模型在不同置信度阈值下的召回率变化,反映了模型检出目标的能力。召回率是指模型正确检出的目标数量占实际存在目标总数的比例,是检测模型的核心指标。从图中可以看出,当置信度阈值为0时,未成熟和成熟两个主要类别的召回率都接近1.0,说明模型几乎能够检出所有目标。随着置信度阈值的提升,召回率逐渐下降,这是因为更高的阈值会过滤掉一些低置信度的预测。值得注意的是,成熟类别的召回率曲线下降最为平缓,说明该类别的检测稳定性最好。小型类别的召回率曲线下降较快,这与小目标检测的固有难度相符。粗蓝色曲线显示所有类别在置信度为0时的综合召回率达到0.98,体现了模型出色的目标检出能力,在实际应用中可以通过调整置信度阈值来平衡检出率和误检率。

图3-7:F1分数-置信度曲线
图3-7展示了F1分数随置信度变化的曲线,F1分数是精确率和召回率的调和平均值,综合反映了模型的分类性能。一个好的检测模型应该在F1曲线上有一个明显的峰值,对应最优的置信度阈值设置。从图中可以看出,成熟类别在置信度约0.4时达到最高F1分数,接近0.97,说明该类别在该阈值下能够达到精确率和召回率的最佳平衡。未成熟类别的最高F1分数约为0.91,也保持在较高水平。小型类别的F1曲线相对较低,峰值约为0.68,这再次印证了小目标检测的挑战性。粗蓝色曲线显示所有类别的综合F1分数在置信度0.236时达到最高值0.85,这个数值可以作为实际应用中设置默认置信度阈值的参考。

图3-8:系统功能架构流程图
图3-8详细展示了瓜果成熟度检测系统的完整功能架构和业务流程,是理解系统设计的关键示意图。系统的入口是登录注册界面,为用户提供了三个分支:用户注册、用户登录和管理员登录。普通用户登录后进入普通用户界面,该界面包含两大功能分支,左侧分支提供四种检测模式,包括图片检测、批量图片检测、视频检测和摄像头检测,满足不同场景下的检测需求;右侧分支则包含开始检测、数据分析、历史记录和个人中心四个功能模块,实现了检测操作、数据查看和个人信息管理的完整闭环。管理员登录后进入管理界面,拥有更高的权限,可以进行用户管理、检测记录管理、系统统计、批量操作等管理任务,还可以创建用户和修改用户信息。
四、系统功能实现

图4-1:用户登录界面
图4-1展示的是瓜果成熟度检测系统的登录界面,该界面是用户访问系统的入口。登录界面提供了用户登录和管理员登录两种模式切换,通过顶部的选项卡可以选择不同的登录身份。用户需要输入用户名和密码进行身份验证,系统后台通过MySQL数据库存储的用户信息进行校验,密码采用哈希加密存储保证安全性。登录成功后,系统根据用户角色自动跳转到相应的功能界面:普通用户进入用户主界面,可以使用检测功能、查看历史记录、进行数据分析等操作;管理员进入管理员面板,可以查看所有用户的检测记录、管理用户信息等。界面底部提供了注册链接,新用户可以通过注册功能创建账号。整个登录流程基于Flask框架的Session机制实现,确保用户身份在整个会话期间保持有效,未登录用户访问系统功能时会自动重定向到登录页面。

图4-2:管理员后台界面
图4-2展示了管理员面板界面,界面是系统管理员的后台管理面板,用于监控系统运行状态和管理用户数据。界面顶部显示四个关键指标卡片:系统状态(正常/异常)、模型状态(已加载/未加载)、检测总数和注册用户数,让管理员快速了解系统整体运行情况。中间的用户管理模块以表格形式展示所有注册用户的信息,包括用户ID、用户名、创建时间等字段,管理员可以通过编辑和删除按钮对用户账号进行管理操作。底部的检测历史记录管理模块是核心功能区,以分页表格形式展示所有用户的检测记录,每条记录包含检测ID、用户ID、文件名、未成熟数量、成熟数量、小型数量、总数、检测时间等详细信息。管理员可以通过该模块查看系统的使用情况,分析检测数据的分布特征,并对异常记录进行处理。界面右上角提供了添加用户和查看检测统计的快捷按钮,支持批量数据导出功能,方便管理员进行数据分析和报表生成。

图4-3:系统主页展示
图4-3展示了该界面是普通用户登录后的功能导航主页,采用卡片式布局设计,为用户提供了四个核心功能模块的快捷入口。界面顶部展示系统标题"瓜果成熟度智能检测系统"和系统简介,说明了系统的应用场景和技术优势。中间区域以四个功能卡片形式呈现:开始检测模块支持上传图片进行瓜果成熟度识别,用户可以选择单张图片、批量图片或视频流进行实时检测;历史记录模块展示用户的所有检测历史,包括检测时间、文件名、检测结果等信息,支持查看详情和删除操作;数据分析模块提供可视化图表,统计用户的检测数据分布、成熟度趋势等信息,帮助用户了解检测情况;个人中心模块允许用户查看和修改个人信息、修改密码等账户管理操作。界面右上角显示当前登录用户名和退出登录按钮。

图4-4:检测操作主界面
图4-4展示了系统的检测界面,是系统的核心功能模块,用于执行瓜果成熟度的智能检测任务。界面左侧为功能控制面板,包含文件操作区、模型设置区、检测参数区和导出选项区四个部分。文件操作区支持四种检测模式:单张图片检测、批量图片检测、视频流检测和打开摄像头进行实时检测,用户可根据实际需求选择合适的检测方式。模型设置区提供模型加载功能,用户可以上传自定义的模型文件或使用系统默认模型。检测参数区允许用户调整置信度阈值和IoU阈值,置信度阈值控制检测结果的可靠程度,IoU阈值用于非极大值抑制去除重复检测框。界面中间为原始图像显示区和检测结果显示区,原始图像区展示上传的待检测图像,检测结果区实时显示标注了边界框和类别标签的检测结果图像,不同成熟度类别用不同颜色区分。底部的检测结果表格详细列出每个检测目标的序号、时间戳、类别、置信度、数量和检测时间等信息,右侧提供统计按钮可查看各类别的数量分布。导出选项区支持将检测结果导出为,TXT、CSV或JSON格式,便于后续数据分析和存档。

图4-5:历史记录查询界面
图4-5展示用户的所有检测历史记录,以表格形式呈现每次检测任务的详细信息。表格包含文件名、检测时间、未成熟数量、成熟数量、小型数量和总计六个字段,其中不同成熟度类别用不同颜色的数字标识,未成熟用红色、成熟用绿色、小型用蓝色,便于用户快速识别检测结果的分布情况。界面右上角提供数据分析和返回主页两个功能按钮,数据分析按钮可跳转到统计图表页面查看检测数据的可视化分析结果。表格底部配备分页控件,支持翻页浏览大量历史记录,每页显示固定数量的记录条目。用户可以通过该界面回顾之前的检测任务,对比不同时间段的检测结果,追踪瓜果成熟度的变化趋势。系统通过数据库查询当前登录用户的检测记录,按时间倒序排列,确保最新的检测记录显示在最前面,方便用户快速查看近期的检测情况。

图4-6:数据统计分析界面
图4-6展示了界面提供用户检测数据的可视化统计分析功能,帮助用户直观了解检测结果的整体分布和趋势。界面顶部展示四个统计卡片,分别显示总检测次数、检测到的成熟瓜果总数、未成熟瓜果总数和小型瓜果总数,用不同颜色标识各类别数据。左下方的瓜果类型数量对比图采用柱状图形式,横向对比三种成熟度类别的检测数量,绿色代表成熟、红色代表未成熟、蓝色代表小型,柱状图的高度直观反映各类别的数量差异。右下方的瓜果类型分布图采用饼图形式,展示三种类别在总检测数量中的占比情况,扇形面积大小代表该类别的比例。

图4-7:用户个人中心
图4-7展示了用户的个人信息管理中心,用于查看和修改账户相关信息。界面中央以卡片形式展示用户的基本信息,顶部显示用户头像和用户名,下方列出用户ID、注册时间和账号状态等详细信息。用户ID是系统自动分配的唯一标识符,注册时间记录了账号的创建日期,账号状态显示当前账号是否正常可用。界面底部提供修改密码按钮,用户点击后可以进入密码修改页面,需要输入原密码和新密码完成密码更新操作,系统对新密码有长度和复杂度要求,确保账户安全。右上角的返回主页按钮允许用户随时返回主界面。
五、技术实现要点
5.1 实时视频检测与摄像头接入
系统实现了视频文件和摄像头实时流的检测功能。对于视频文件,系统使用OpenCV读取视频帧,逐帧进行检测并将结果绘制到画布上。对于摄像头检测,系统通过浏览器的MediaDevices API获取摄像头视频流,将每一帧图像发送到后端进行检测,后端返回检测结果后前端实时更新显示。这种设计实现了流畅的实时检测体验,用户可以在检测过程中动态调整置信度阈值,立即看到参数变化对检测结果的影响。
核心实现代码如下:
python
@app.route('/detect_video_frame', methods=['POST'])
@login_required
def detect_video_frame():
"""视频帧检测接口"""
if model is None:
return jsonify({'error': '请先加载模型'}), 400
file = request.files['frame']
conf_threshold = float(request.form.get('confidence', 0.5))
iou_threshold = float(request.form.get('iou', 0.5))
# 读取图像数据
file_bytes = np.frombuffer(file.read(), np.uint8)
frame = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
# 保存临时文件并执行检测
temp_path = os.path.join(app.config['UPLOAD_FOLDER'], 'temp_frame.jpg')
cv2.imwrite(temp_path, frame)
result_image, detections = detect_melons(temp_path, conf_threshold, iou_threshold)
# 将结果编码为base64返回前端
_, buffer = cv2.imencode('.jpg', result_image)
result_base64 = base64.b64encode(buffer).decode('utf-8')
return jsonify({
'success': True,
'result_image': f'data:image/jpeg;base64,{result_base64}',
'detections': detections
})
5.2 批量检测与结果导出
批量检测功能允许用户选择一个包含多张图片的文件夹,系统会自动遍历所有图片文件并依次进行检测。检测过程中会显示进度条,用户可以实时了解检测进度。所有检测结果会被保存到一个带时间戳的文件夹中,包括原始图片、检测结果图片和JSON格式的检测报告。系统还提供了检测结果的导出功能,支持CSV、JSON和TXT三种格式,用户可以选择合适的格式导出数据用于进一步分析。
批量检测核心代码:
python
@app.route('/detect_batch', methods=['POST'])
@login_required
def detect_batch():
"""批量检测接口"""
files = request.files.getlist('images')
conf_threshold = float(request.form.get('confidence', 0.5))
# 创建批量检测结果文件夹
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
batch_folder = os.path.join(app.config['DETECTION_SAVE_FOLDER'], f'batch_{timestamp}')
os.makedirs(batch_folder, exist_ok=True)
all_results = []
total_stats = {'immature': 0, 'mature': 0, 'small': 0, 'total': 0}
for idx, file in enumerate(files):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], f"{timestamp}_{idx}_{filename}")
file.save(filepath)
# 执行检测
result_image, detections = detect_melons(filepath, conf_threshold, iou_threshold)
if result_image is not None:
# 保存结果
result_path = os.path.join(batch_folder, f"result_{idx}_{filename}")
cv2.imwrite(result_path, result_image)
# 统计数据
stats = {'immature': 0, 'mature': 0, 'small': 0, 'total': len(detections)}
for det in detections:
stats[det['class']] += 1
total_stats[det['class']] += 1
all_results.append({'filename': filename, 'statistics': stats})
return jsonify({'success': True, 'results': all_results, 'statistics': total_stats})
5.3 中文标签渲染与可视化
为了提升用户体验,系统实现了检测结果图像上的中文标签显示功能。由于OpenCV默认不支持中文字符渲染,系统采用PIL库进行图像处理,加载系统中的中文字体文件如微软雅黑或黑体,在检测框旁边绘制中文类别名称和置信度数值。系统还为不同类别定义了不同的颜色编码,未成熟用红色表示,成熟用绿色表示,小型用蓝色表示,使得检测结果一目了然,大大提高了系统的易用性和专业性。
中文标签绘制核心代码:
python
def detect_melons(image_path, conf_threshold=0.5, iou_threshold=0.5):
"""检测图像中的瓜果"""
image = cv2.imread(image_path)
# 使用YOLO进行推理
results = model.predict(source=image_path, conf=conf_threshold, iou=iou_threshold)[0]
if len(results.boxes) > 0:
boxes = results.boxes.xyxy.cpu().numpy()
confidences = results.boxes.conf.cpu().numpy()
class_ids = results.boxes.cls.cpu().numpy().astype(int)
# 转换为PIL图像以支持中文显示
pil_image = PILImage.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(pil_image)
# 加载中文字体
try:
font = ImageFont.truetype("msyh.ttc", 80) # 微软雅黑
except:
font = ImageFont.load_default()
for box, conf, class_id in zip(boxes, confidences, class_ids):
x1, y1, x2, y2 = map(int, box)
class_name = CLASS_NAMES[class_id]
# 绘制边界框和中文标签
color = CLASS_COLORS[class_name]
color_rgb = (color[2], color[1], color[0])
draw.rectangle([x1, y1, x2, y2], outline=color_rgb, width=8)
label_text = f"{CLASS_NAMES_CN[class_name]} {conf:.2f}"
draw.text((x1, y1 - 90), label_text, font=font, fill=color_rgb)
# 转换回OpenCV格式
image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
return image, detections
5.4 用户认证与权限管理
系统实现了基于Flask Session的用户认证机制,使用Werkzeug提供的安全哈希函数对密码进行加密存储。通过装饰器模式实现了登录验证和管理员权限控制,确保不同角色只能访问授权的功能模块。
python
def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated_function
@app.route('/api/login', methods=['POST'])
def api_login():
"""登录接口"""
data = request.get_json()
username = data.get('username')
password = data.get('password')
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
user = cursor.fetchone()
if user and check_password_hash(user['password'], password):
session['user_id'] = user['id']
session['username'] = user['username']
return jsonify({'success': True, 'message': '登录成功'})
return jsonify({'success': False, 'error': '用户名或密码错误'}), 401
六、总结与展望
本文介绍的基于YOLOv10的瓜果成熟度智能检测系统,通过深度学习技术实现了对瓜果成熟状态的自动识别和分类,为农业生产提供了一个高效实用的技术工具。系统在模型训练、Web应用开发、用户体验设计等方面都体现了较高的技术水平和工程实践能力。未来可以在以下几个方面进一步优化和扩展:一是扩充数据集规模和类别,支持更多种类瓜果的检测;二是优化模型结构,进一步提升检测速度和精度;三是增加移动端应用,让用户可以在田间地头直接使用手机进行检测;四是引入物联网技术,实现设备联动和自动化控制;五是结合区块链技术,建立农产品质量追溯体系。随着人工智能技术的不断发展,相信智能检测系统将在现代农业中发挥越来越重要的作用,为农业现代化和乡村振兴贡献科技力量。
七、视频演示
基于YOLOv10的瓜果成熟度智能检测系统