news 2026/4/16 14:16:39

基于深度学习 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/16 9:21:01

腾讯混元翻译1.5:少数民族语言支持实战

腾讯混元翻译1.5:少数民族语言支持实战 随着全球化与多语言交流的不断深化,高质量、低延迟的机器翻译需求日益增长。尤其在民族地区和跨文化场景中,对小语种与方言变体的支持成为技术落地的关键瓶颈。腾讯近期开源的混元翻译大模型 HY-MT1.5…

作者头像 李华
网站建设 2026/4/15 3:18:04

PDF智能提取工具箱实战:手写公式转LaTeX完整步骤

PDF智能提取工具箱实战:手写公式转LaTeX完整步骤 1. 引言:从扫描文档到结构化数据的智能化跃迁 在科研、教学和工程实践中,PDF文档中常包含大量手写或印刷体数学公式、表格和文本内容。传统方式下,将这些非结构化信息转化为可编…

作者头像 李华
网站建设 2026/4/16 12:46:30

STM32烧录必备:STLink驱动下载与配置实战案例

STM32烧录不翻车:STLink驱动安装与配置全实战指南 你有没有遇到过这样的场景? 新买了一块Nucleo开发板,兴冲冲插上USB线准备下载第一个“Hello World”程序,结果STM32CubeIDE弹出一串红字:“No target connected”。 …

作者头像 李华
网站建设 2026/4/15 15:17:54

图解说明STLink驱动在Keil中的设置步骤

图解说明STLink驱动在Keil中的设置步骤:嵌入式开发调试关键技术解析 为什么你连不上STM32?从一个“无法下载程序”的坑说起 上周,一位刚接触STM32的开发者在群里发问:“我用Keil编译没问题,但一点击‘Download’就报…

作者头像 李华
网站建设 2026/4/15 13:39:58

HY-MT1.5-1.8B模型裁剪:进一步减小体积的方法

HY-MT1.5-1.8B模型裁剪:进一步减小体积的方法 1. 背景与技术动机 随着大模型在翻译任务中的广泛应用,如何在保持高质量翻译能力的同时降低部署成本,成为工程落地的关键挑战。腾讯开源的混元翻译模型 HY-MT1.5 系列包含两个核心版本&#xf…

作者头像 李华
网站建设 2026/4/16 11:05:12

混元模型1.5部署:安全加固与访问控制方案

混元模型1.5部署:安全加固与访问控制方案 1. 引言:混元翻译模型的演进与安全挑战 随着大模型在多语言场景中的广泛应用,翻译模型不仅需要高精度和低延迟,更需在部署层面实现安全可控、权限分明、防滥用机制健全。腾讯开源的混元翻…

作者头像 李华