基于深度学习YOLOv12的苹果成熟度识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
一、项目介绍本文提出了一种基于深度学习YOLOv12的苹果成熟度识别检测系统该系统能够高效准确地识别苹果的成熟度等级包括20%、50%、75%、100%成熟及腐烂状态。系统采用YOLOv12目标检测算法结合自定义的YOLO格式数据集包含训练集2144张、验证集359张和测试集225张图像实现了高精度的成熟度分类。此外系统配备了用户友好的UI界面支持登录注册功能。引言苹果成熟度检测在农业自动化、智能采摘和供应链管理中具有重要意义。传统依赖人工观察或机械传感器的方法效率低、成本高且易受主观性影响。近年来基于深度学习的目标检测技术如YOLO系列模型在农业领域展现出巨大潜力但其在细粒度成熟度分类如20%、50%、75%、100%成熟及腐烂中的应用仍需进一步优化。本文基于YOLOv12算法构建了一个端到端的苹果成熟度识别系统。系统采用高质量标注数据集共2728张图像按成熟度分为5类。系统创新性地集成UI界面和用户管理模块支持多角色操作与数据可视化。实验表明模型在测试集上准确率达到93.1%较传统方法显著提升。本研究为农业智能化提供了可扩展的技术方案代码和模型已开源便于后续研究和应用。关键词YOLOv12苹果成熟度检测深度学习农业自动化用户界面目录一、项目介绍引言二、项目功能展示2.1 用户登录系统2.2 检测功能2.3 检测结果显示2.4 参数配置2.5 其他功能3. 技术特点4. 系统流程三、数据集介绍数据集配置文件四、项目环境配置创建虚拟环境安装所需要库五、模型训练训练代码训练结果六、核心代码登录注册验证 多重检测模式️ 沉浸式可视化⚙️ 参数配置系统✨ UI美学设计 智能工作流七、项目源码(视频简介)基于深度学习YOLOv12的苹果成熟度识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv12的苹果成熟度识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型二、项目功能展示✅ 用户登录注册支持密码检测和安全性验证。✅ 三种检测模式基于YOLOv12模型支持图片、视频和实时摄像头三种检测精准识别目标。✅ 双画面对比同屏显示原始画面与检测结果。✅ 数据可视化实时表格展示检测目标的类别、置信度及坐标。✅智能参数调节提供置信度滑块动态优化检测精度适应不同场景需求。✅科幻风交互界面深色主题搭配动态光效减少视觉疲劳提升操作体验。✅多线程高性能架构独立检测线程保障流畅运行实时状态提示响应迅速无卡顿。2.1 用户登录系统提供用户登录和注册功能用户名和密码验证账户信息本地存储(accounts.json)密码长度至少6位的安全要求2.2 检测功能图片检测支持JPG/JPEG/PNG/BMP格式图片的火焰烟雾检测视频检测支持MP4/AVI/MOV格式视频的逐帧检测摄像头检测实时摄像头流检测(默认摄像头0)检测结果保存到results目录2.3 检测结果显示显示原始图像和检测结果图像检测结果表格展示包含检测到的类别置信度分数物体位置坐标(x,y)、2.4 参数配置模型选择置信度阈值调节(0-1.0)IoU(交并比)阈值调节(0-1.0)实时同步滑块和数值输入框2.5 其他功能检测结果保存功能视频检测时自动保存结果视频状态栏显示系统状态和最后更新时间无边框窗口设计可拖动和调整大小3. 技术特点采用多线程处理检测任务避免界面卡顿精美的UI设计具有科技感的视觉效果发光边框和按钮悬停和按下状态效果自定义滑块、表格和下拉框样式检测结果保存机制响应式布局适应不同窗口大小4. 系统流程用户登录/注册选择检测模式(图片/视频/摄像头)调整检测参数(可选)开始检测并查看结果可选择保存检测结果停止检测或切换其他模式三、数据集介绍本研究的苹果成熟度检测系统采用高质量的自定义YOLO格式数据集共包含2728 张苹果图像涵盖5 种成熟度类别具体分布如下类别定义nc: 520-_ripeness20%成熟50-_ripeness50%成熟75-_ripeness75%成熟100-_ripeness100%成熟即完全成熟rotten_apple腐烂苹果数据集划分训练集Train2144 张占比 ~78.5%验证集Val359 张占比 ~13.2%测试集Test225 张占比 ~8.3%数据集配置文件数据集采用标准化YOLO格式组织train: F:\苹果成熟度数据集\train\images val: F:\苹果成熟度数据集\valid\images test: F:\苹果成熟度数据集\test\images nc: 5 names: [100-_ripeness, 20-_ripeness, 50-_ripeness, 75-_ripeness, rotten_apple]四、项目环境配置创建虚拟环境首先新建一个Anaconda环境每个项目用不同的环境这样项目中所用的依赖包互不干扰。终端输入conda create -n yolov12 python3.9激活虚拟环境conda activate yolov12安装cpu版本pytorchpip install torch torchvision torchaudio安装所需要库pip install -r requirements.txtpycharm中配置anaconda五、模型训练训练代码from ultralytics import YOLO model_path yolo12s.pt data_path data.yaml if __name__ __main__: model YOLO(model_path) results model.train(datadata_path, epochs100, batch8, device0, workers0, projectruns, nameexp, )根据实际情况更换模型 # yolov12n.yaml (nano)轻量化模型适合嵌入式设备速度快但精度略低。 # yolov12s.yaml (small)小模型适合实时任务。 # yolov12m.yaml (medium)中等大小模型兼顾速度和精度。 # yolov12b.yaml (base)基本版模型适合大部分应用场景。 # yolov12l.yaml (large)大型模型适合对精度要求高的任务。--batch 8每批次8张图像。--epochs 100训练100轮。--datasets/data.yaml数据集配置文件。--weights yolov12s.pt初始化模型权重yolov12s.pt是预训练的轻量级YOLO模型。训练结果六、核心代码import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLO from UiMain import UiMainWindow import time import os from PyQt5.QtWidgets import QDialog from LoginWindow import LoginWindow class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parentNone): super().__init__(parent) self.model model self.source source self.conf conf self.iou iou self.running True def run(self): try: if isinstance(self.source, int) or self.source.endswith((.mp4, .avi, .mov)): # 视频或摄像头 cap cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # 保存原始帧 original_frame frame.copy() # 检测 results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) # 控制帧率 time.sleep(0.03) # 约30fps cap.release() else: # 图片 frame cv2.imread(self.source) if frame is not None: original_frame frame.copy() results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) except Exception as e: print(fDetection error: {e}) finally: self.finished_signal.emit() def stop(self): self.running False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model None self.detection_thread None self.current_image None self.current_result None self.video_writer None self.is_camera_running False self.is_video_running False self.last_detection_result None # 新增保存最后一次检测结果 # 连接按钮信号 self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result) # 初始化模型 self.load_model() def load_model(self): try: model_name self.model_combo.currentText() self.model YOLO(f{model_name}.pt) # 自动下载或加载本地模型 self.update_status(f模型 {model_name} 加载成功) except Exception as e: QMessageBox.critical(self, 错误, f模型加载失败: {str(e)}) self.update_status(模型加载失败) def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.clear_results() self.current_image cv2.imread(file_path) self.current_image cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测图片: {os.path.basename(file_path)}) def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_path: self.clear_results() self.is_video_running True # 初始化视频写入器 cap cv2.VideoCapture(file_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) cap.release() # 创建保存路径 save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) save_path os.path.join(save_dir, fresult_{timestamp}.mp4) fourcc cv2.VideoWriter_fourcc(*mp4v) self.video_writer cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height)) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测视频: {os.path.basename(file_path)}) def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return self.clear_results() self.is_camera_running True # 创建检测线程 (默认使用摄像头0) conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, 0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(正在从摄像头检测...)登录注册验证对应文件LoginWindow.py# 账户验证核心逻辑 def handle_login(self): username self.username_input.text().strip() password self.password_input.text().strip() if not username or not password: QMessageBox.warning(self, 警告, 用户名和密码不能为空) return if username in self.accounts and self.accounts[username] password: self.accept() # 验证通过 else: QMessageBox.warning(self, 错误, 用户名或密码错误) # 密码强度检查注册时 def handle_register(self): if len(password) 6: # 密码长度≥6位 QMessageBox.warning(self, 警告, 密码长度至少为6位)多重检测模式对应文件main.py图片检测def detect_image(self): file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.start() # 启动检测线程视频检测def detect_video(self): file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_path: self.video_writer cv2.VideoWriter() # 初始化视频写入器 self.detection_thread DetectionThread(self.model, file_path, conf, iou)实时摄像头def detect_camera(self): self.detection_thread DetectionThread(self.model, 0, conf, iou) # 摄像头设备号0 self.detection_thread.start()️沉浸式可视化对应文件UiMain.py双画面显示def display_image(self, label, image): q_img QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap QPixmap.fromImage(q_img) label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio)) # 自适应缩放结果表格def add_detection_result(self, class_name, confidence, x, y): self.results_table.insertRow(row) items [ QTableWidgetItem(class_name), # 类别列 QTableWidgetItem(f{confidence:.2f}), # 置信度 QTableWidgetItem(f{x:.1f}), # X坐标 QTableWidgetItem(f{y:.1f}) # Y坐标 ]⚙️参数配置系统对应文件UiMain.py双阈值联动控制# 置信度阈值同步 def update_confidence(self, value): confidence value / 100.0 self.confidence_spinbox.setValue(confidence) # 滑块→数值框 self.confidence_label.setText(f置信度阈值: {confidence:.2f}) # IoU阈值同步 def update_iou(self, value): iou value / 100.0 self.iou_spinbox.setValue(iou)✨UI美学设计对应文件UiMain.py科幻风格按钮def create_button(self, text, color): return f QPushButton {{ border: 1px solid {color}; color: {color}; border-radius: 6px; }} QPushButton:hover {{ background-color: {self.lighten_color(color, 10)}; box-shadow: 0 0 10px {color}; # 悬停发光效果 }} 动态状态栏def update_status(self, message): self.status_bar.showMessage( f状态: {message} | 最后更新: {time.strftime(%H:%M:%S)} # 实时时间戳 )智能工作流对应文件main.py线程管理class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 信号量通信 def run(self): while self.running: # 多线程检测循环 results self.model(frame, confself.conf, iouself.iou) self.frame_received.emit(original_frame, result_frame, detections)七、项目源码(视频简介)演示与介绍视频基于深度学习YOLOv12的苹果成熟度识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv12的苹果成熟度识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型

相关新闻

python+vue开发的摄影约拍跟拍预定管理系统-pycharm DJANGO FLASK

python+vue开发的摄影约拍跟拍预定管理系统-pycharm DJANGO FLASK

文章目录技术栈概述核心功能模块技术实现要点部署与扩展大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈概述 该系统采用Python(Django/Flask)后端与Vue.js前端…

2026/7/3 15:22:03 阅读更多 →
python+vue开发的医疗护工陪护系统-pycharm DJANGO FLASK

python+vue开发的医疗护工陪护系统-pycharm DJANGO FLASK

文章目录技术栈概述核心功能模块开发工具链安全与合规性能优化大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈概述 采用Python(Django/Flask)后端与Vue.js前端…

2026/7/3 15:22:07 阅读更多 →
python+vue开发的写字楼危险品管理信息系统的设计和实现-pycharm DJANGO FLASK

python+vue开发的写字楼危险品管理信息系统的设计和实现-pycharm DJANGO FLASK

文章目录 系统概述技术栈设计核心功能模块实现亮点部署方案 大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式! 系统概述 该系统采用Python(Django/Flask)后端与Vue.js…

2026/7/3 15:22:08 阅读更多 →

最新新闻

【计算机Java毕业设计案例】基于 SpringBoot 的商超会员折扣与收银结算系统的设计与实现 商场限时折扣满减优惠管理系统(程序+文档+讲解+定制)

【计算机Java毕业设计案例】基于 SpringBoot 的商超会员折扣与收银结算系统的设计与实现 商场限时折扣满减优惠管理系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 22:05:55 阅读更多 →
告别“聊完就忘”的 AI:程序员必看的 AI Agent Harness 与 Hermes 深度解析

告别“聊完就忘”的 AI:程序员必看的 AI Agent Harness 与 Hermes 深度解析

引言 作为一名身处 2026 年的程序员,你一定经历过这种令人抓狂的“赛博西西弗斯”时刻: 你打开了一个 AI 编程助手(无论是网页端的对话框,还是 IDE 里的插件),耐心地把项目的目录结构、团队的命名规范、甚…

2026/7/3 22:05:55 阅读更多 →
3000元成本72小时赚50万美元——AI短剧出海怎么落地

3000元成本72小时赚50万美元——AI短剧出海怎么落地

一部AI短剧,成本3000元,上线海外平台72小时,GMV做到50万美元。 这不是标题党。这部叫《波斯复仇记》的作品,2026年上半年上线后,营收倍率接近1200倍。同期,广州头部短剧企业AI短剧出海订单同比激增5倍&…

2026/7/3 22:03:54 阅读更多 →
数字人多角色访谈怎么做:2026年数字人口播,5款实测解析

数字人多角色访谈怎么做:2026年数字人口播,5款实测解析

没有嘉宾也能做访谈视频,难点到底在哪 想做一档双人甚至多人对话的访谈短视频,但找不到合适的嘉宾、约不到档期、录音棚成本又高——这是很多知识博主、播客团队和中小企业内容号共同的难题。更现实的问题是:就算用 AI 数字人顶替嘉宾&#x…

2026/7/3 22:03:54 阅读更多 →
OpenCore Configurator:黑苹果引导配置的技术重构与架构解析

OpenCore Configurator:黑苹果引导配置的技术重构与架构解析

OpenCore Configurator:黑苹果引导配置的技术重构与架构解析 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator OpenCore Configurator 作为一款专为…

2026/7/3 22:01:53 阅读更多 →
掌握图像转3D模型:ImageToSTL实现智能立体照片打印

掌握图像转3D模型:ImageToSTL实现智能立体照片打印

掌握图像转3D模型:ImageToSTL实现智能立体照片打印 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. 项…

2026/7/3 22:01:53 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻