news 2026/4/3 4:43:25

基于深度学习 YOLOv8➕pyqt5的西红柿成熟度检测系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习 YOLOv8➕pyqt5的西红柿成熟度检测系统

基于深度学习 YOLOv8➕pyqt5的西红柿成熟度检测系统,
完整源码源文件+已标注的数据集+训练好的模型+环境配置教程+程序运行说明文档
可以替换自己训练的模型,实现检测目标自定义

blog.csdnimg.cn/direct/31c61653310648458126c961a01fd682.png)
以下文章及示例代码仅供参考!

基于深度学习 YOLOv8 + PyQt5 的西红柿成熟度检测系统(附完整代码)

🌟 项目背景

在智慧农业中,果蔬的自动分级与成熟度识别是提升采摘效率和商品价值的关键环节。传统人工分拣成本高、效率低,而基于计算机视觉的自动化检测系统正成为研究热点。

本文将带你从零搭建一个 基于 YOLOv8 和 PyQt5 的西红柿成熟度检测系统,支持图像/视频实时推理,并提供友好的图形界面,适合科研、教学或小型农业项目部署。

🧠 技术栈介绍
YOLOv8:Ultralytics 推出的新一代 YOLO 系列模型,精度高、速度快,支持分类、检测、分割等任务。
PyQt5:Python 下流行的 GUI 开发框架,用于构建桌面应用界面。
OpenCV:用于图像/视频处理。
PyTorch:YOLOv8 的底层深度学习框架。

📦 项目结构

tomato-ripeness-detector/
├── models/
│ └── best.pt # 训练好的 YOLOv8 模型
├── ui/
│ └── main_window.ui # Qt Designer 设计的界面(可选)
├── utils/
│ └── inference.py # 推理逻辑封装
├── main.py # 主程序入口
└── requirements.txt

🔧 环境配置

bash
pip install ultralytics opencv-python pyqt5 numpy pillow
注意:YOLOv8 依赖 PyTorch,请确保 CUDA 或 CPU 环境已正确安装。

🍅 数据准备与模型训练(简要说明)

我们使用自建的西红柿数据集,包含三类标签:
unripe(未成熟,绿色)
half_ripe(半熟,黄红相间)
ripe(成熟,红色)

使用 YOLOv8 的官方训练命令:

bash
yolo detect train data=tomato.yaml model=yolov8n.pt epochs=100 imgsz=640

训练完成后得到 best.pt 模型文件,放入 models/ 目录。

💻 PyQt5 界面设计

我们使用纯代码方式构建简洁 UI,包含:
图像显示区域(QLabel)
文件选择按钮(打开图片/视频)
实时摄像头检测按钮
检测结果信息展示
main.py 核心代码

python
import sys
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer, Qt
from ultralytics import YOLO
import numpy as np

class TomatoDetector(QMainWindow):
definit(self):
super().init()
self.setWindowTitle(“🍅 西红柿成熟度检测系统 - YOLOv8 + PyQt5”)
self.setGeometry(100, 100, 1000, 700)

加载模型

self.model = YOLO(“models/best.pt”)

初始化UI

self.init_ui()

视频/摄像头相关

self.cap = None
self.timer = QTimer()
self.timer.timeout.connect(self.update_frame)

def init_ui(self):
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()

self.image_label = QLabel()
self.image_label.setAlignment(Qt.AlignCenter)
self.image_label.setMinimumSize(800, 600)
layout.addWidget(self.image_label)

btn_layout = QVBoxLayout()
self.btn_open_img = QPushButton(“📂 打开图片”)
self.btn_open_video = QPushButton(“🎥 打开视频”)
self.btn_camera = QPushButton(“📹 启动摄像头”)
self.btn_stop = QPushButton(“⏹ 停止”)

self.btn_open_img.clicked.connect(self.open_image)
self.btn_open_video.clicked.connect(self.open_video)
self.btn_camera.clicked.connect(self.start_camera)
self.btn_stop.clicked.connect(self.stop_media)

btn_layout.addWidget(self.btn_open_img)
btn_layout.addWidget(self.btn_open_video)
btn_layout.addWidget(self.btn_camera)
btn_layout.addWidget(self.btn_stop)

layout.addLayout(btn_layout)
central_widget.setLayout(layout)

def detect_and_display(self, frame):
results = self.model(frame)
annotated_frame = results[0].plot() # 自动绘制检测框和标签
self.display_image(annotated_frame)

def display_image(self, img):
h, w, ch = img.shape
bytes_per_line = ch w
q_img = QImage(img.data, w, h, bytes_per_line, QImage.Format_BGR888)
self.image_label.setPixmap(QPixmap.fromImage(q_img).scaled(
self.image_label.width(), self.image_label.height(),
Qt.KeepAspectRatio, Qt.SmoothTransformation))

def open_image(self):
path, _ = QFileDialog.getOpenFileName(self, “选择图片”, “”, “Image Files (.png .jpg .jpeg)”)
if path:
img = cv2.imread(path)
self.detect_and_display(img)

def open_video(self):
path, _ = QFileDialog.getOpenFileName(self, “选择视频”, “”, “Video Files (.mp4 .avi)”)
if path:
self.cap = cv2.VideoCapture(path)
self.timer.start(30)

def start_camera(self):
self.cap = cv2.VideoCapture(0)
if not self.cap.isOpened():
print(“无法打开摄像头”)
return
self.timer.start(30)

def update_frame(self):
if self.cap and self.cap.isOpened():
ret, frame = self.cap.read()
if ret:
self.detect_and_display(frame)
else:
self.stop_media()

def stop_media(self):
if self.timer.isActive():
self.timer.stop()
if self.cap:
self.cap.release()
self.image_label.clear()

ifname== “main”:
app = QApplication(sys.argv)
window = TomatoDetector()
window.show()
sys.exit(app.exec_())

🖼️ 效果展示


✅ 优势与应用场景
高精度:YOLOv8 在小目标和密集场景下表现优异。
跨平台:PyQt5 支持 Windows/Linux/macOS。
易扩展:可轻松替换模型用于其他果蔬检测(如苹果、草莓)。
实用性强:适用于智能分拣机、农业机器人、教学演示等。

📥 获取完整代码
文章底部获取完整代码

包含:
完整源码源文件+已标注的数据集+训练好的模型+环境配置教程+程序运行说明文档

💬 结语

通过 YOLOv8 强大的检测能力与 PyQt5 的灵活界面开发,我们成功构建了一个实用的西红柿成熟度检测系统。未来可集成到边缘设备(如 Jetson Nano)实现田间实时检测。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发!也欢迎在评论区交流改进意见或分享你的项目成果!

关注我,获取更多 AI + 农业 + GUI 实战项目! 🌱🤖

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 3:17:58

深度剖析ST7789初始化序列:适合初学的理解方式

点亮第一帧:拆解ST7789初始化背后的工程逻辑你有没有遇到过这样的场景?硬件接好了,代码烧进去了,LVGL界面也写得漂漂亮亮——结果屏幕一动不动,黑屏、白屏、花屏轮番上演。反复检查接线无误,SPI通信也有波形…

作者头像 李华
网站建设 2026/3/31 13:34:15

告别文件存储的混乱:我用SQLite重构了AI对话记录管理

深夜11点,当大多数开发者已经结束一天的工作时,我却刚刚开始。原因无他,昨天“玩”了,今天起得晚。但手头这个任务却让我异常兴奋——我正在将个人AI助手项目中“原始”的文件存储方案,彻底升级为结构化的SQLite数据库…

作者头像 李华
网站建设 2026/3/27 15:54:10

HY-MT1.5-1.8B实战:低功耗设备部署方案

HY-MT1.5-1.8B实战:低功耗设备部署方案 1. 引言 随着多语言交流需求的快速增长,高质量、低延迟的翻译模型成为智能终端和边缘计算场景的核心组件。腾讯近期开源了混元翻译大模型1.5版本(HY-MT1.5),其中包含两个关键模…

作者头像 李华
网站建设 2026/3/8 6:45:10

混元翻译模型1.5实战:术语干预功能详细解析

混元翻译模型1.5实战:术语干预功能详细解析 1. 引言:混元翻译模型1.5的技术演进与核心价值 随着全球化进程加速,高质量、可定制的机器翻译需求日益增长。传统翻译模型在面对专业术语、混合语言和上下文依赖等复杂场景时,往往表现…

作者头像 李华
网站建设 2026/3/14 4:55:58

腾讯HY-MT1.5应用:社交媒体内容翻译

腾讯HY-MT1.5应用:社交媒体内容翻译 随着全球化进程的加速,跨语言交流已成为社交媒体平台的核心需求之一。用户生成内容(UGC)在多语言环境下的高效、准确传播,直接影响平台的用户体验与国际化能力。然而,传…

作者头像 李华
网站建设 2026/3/15 9:05:21

HY-MT1.5-1.8B工业场景应用:设备手册实时翻译系统部署案例

HY-MT1.5-1.8B工业场景应用:设备手册实时翻译系统部署案例 1. 引言 1.1 工业场景中的多语言挑战 在全球化制造与跨国协作日益频繁的背景下,工业设备制造商和运维团队常常面临多语言技术文档的处理难题。设备手册、操作指南、维护说明等关键资料往往需要…

作者头像 李华