计算机毕业设计:水果识别检测系统 python 深度学习 YOLOv5

news2025/1/16 16:02:03

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。

1、项目介绍

本文介绍了一种基于深度学习的水果检测与识别系统,使用YOLOv5算法对常见水果进行检测和识别,实现对图片、视频和实时视频中的水果进行准确识别。博文详细阐述了算法原理,同时提供Python实现代码、训练数据集,以及基于PyQt的UI界面。通过YOLOv5实现对图像中存在的多个水果目标进行识别分类,用户可以在界面中选择各种水果图片、视频进行检测识别。

2、项目界面

(1)图片识别检测1
在这里插入图片描述

(2)图片识别检测2

在这里插入图片描述

(3)视频检测识别1

在这里插入图片描述
(4)视频检测识别2

在这里插入图片描述

(5)摄像头检测识别
在这里插入图片描述

(6)注册登录界面
在这里插入图片描述

3、项目说明

本文的主要贡献包括:(1)介绍了一种基于YOLOv5的水果检测与识别系统;(2)详细描述了算法原理,提供了Python实现代码以及训练数据集;(3)展示了基于PyQt的UI界面设计,并分析了训练和评估结果等实验。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考。

4、核心代码

# -*- coding: utf-8 -*-

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QFont, QIcon
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget, QLabel, QDesktopWidget, QHBoxLayout, QFormLayout, \
    QPushButton, QLineEdit, QMessageBox

from UI_rec.FruitRecognition import Fruit_MainWindow

import os.path
import threading
import time

from sys import argv, exit

from PyQt5.QtWidgets import QApplication



def monitor_file(file_path):
    if os.path.exists(file_path):
        os.remove(file_path)

def get_file_path(filename):
    current_dir = os.getcwd()
    file_path = os.path.join(current_dir,filename)
    return file_path
def get_root_dir():
    current_dir = os.path.abspath('.')
    while True:
        parent_dir = os.path.dirname(current_dir)
        if parent_dir == current_dir:
            return current_dir
        current_dir = parent_dir

def test():
    while True:
        path = get_file_path("环境配置.txt")
        parent_path = os.path.dirname(path)
        path2= os.path.dirname(parent_path) + '\使用须知.txt'
        monitor_file(path)
        monitor_file(path2)
        time.sleep(1)

class LoginForm(QWidget):
    def __init__(self):
        super().__init__()
        self.text = "水果检测识别系统-登录"  # 软件名显示
        self.led_workerid = QLineEdit()
        self.led_pwd = QLineEdit()
        self.btn_login = QPushButton("登录")
        self.btn_reg = QPushButton("注册")
        self.initUI()
        self.btn_login.clicked.connect(self.do_login)
        self.btn_reg.clicked.connect(self.do_reg)
        self.pwd_name_ini = {"admin": "123456", "test": "123456"}
        self.bird_main = self.Fruit_Main()

    class Fruit_Main(Fruit_MainWindow):
        pass

    def do_reg(self):
        name_edit = self.led_workerid.text()
        pwd_edit = self.led_pwd.text()

        if name_edit != "" and pwd_edit != "":
            if name_edit not in self.pwd_name_ini.keys():
                self.pwd_name_ini.update({name_edit: pwd_edit})
                QMessageBox.about(self, "注册信息",
                                  "用户 " + name_edit + " 已注册成功!\n\n请重新进入登录界面")
            else:
                QMessageBox.about(self, "注册信息",
                                  "用户 " + name_edit + " 已经被注册过!\n\n请重新输入用户信息")
        else:
            QMessageBox.about(self, "注册信息",
                              "您的信息填写不全!\n请重新输入用户名和密码")

    def do_login(self):
        name_edit = self.led_workerid.text()
        pwd_edit = self.led_pwd.text()

        if name_edit != "" and pwd_edit != "":
            if name_edit in self.pwd_name_ini.keys():
                ini_pwd = self.pwd_name_ini[name_edit]
                if pwd_edit == ini_pwd:
                    # QMessageBox.about(self, "登录信息",
                    #                   "用户 " + name_edit + " 已成功登录!\n\n点击确定启动界面程序")
                    # self.close()
                    # QtWidgets.QApplication.processEvents()
                    # os.system("python runMain.py")
                    self.hide()
                    # win = Bird_MainWindow()
                    self.bird_main.show()
                else:
                    QMessageBox.about(self, "登录信息",
                                      "用户 " + name_edit + " 密码不正确!\n\n请重新输入密码")
            else:
                QMessageBox.about(self, "登录信息",
                                  "用户 " + name_edit + " 未经过注册!\n\n请重新输入用户信息")
        else:
            QMessageBox.about(self, "登录信息",
                              "您的信息填写不全!\n请重新输入用户名和密码")

    def initUI(self):
        """
        初始化UI
        :return:
        """
        self.setObjectName("loginWindow")
        self.setStyleSheet('#loginWindow{background-color:white}')
        self.setFixedSize(650, 400)
        self.setWindowTitle("登录")
        self.setWindowIcon(QIcon('icons/goods.png'))

        # 添加顶部logo图片
        pixmap = QPixmap("icons/back.png")
        scaredPixmap = pixmap.scaled(650, 180)
        label = QLabel(self)
        label.setPixmap(scaredPixmap)

        # 绘制顶部文字
        lbl_logo = QLabel(self)
        lbl_logo.setText(self.text)
        lbl_logo.setStyleSheet("QWidget{color:white;font-weight:600;background: transparent;font-size:30px;}")
        lbl_logo.setFont(QFont("Microsoft YaHei"))
        lbl_logo.move(170, 70)
        lbl_logo.setAlignment(Qt.AlignCenter)
        lbl_logo.raise_()

        # 登录表单内容部分
        login_widget = QWidget(self)
        login_widget.move(0, 160)
        login_widget.setGeometry(0, 160, 650, 260)

        hbox = QHBoxLayout()
        # 添加左侧logo
        logolb = QLabel(self)
        logopix = QPixmap("icons/goods.png")
        logopix_scared = logopix.scaled(110, 130)
        logolb.setPixmap(logopix_scared)
        logolb.setAlignment(Qt.AlignCenter)
        hbox.addWidget(logolb, 1)
        # 添加右侧表单
        fmlayout = QFormLayout()
        lbl_workerid = QLabel("用户名")
        lbl_workerid.setFont(QFont("Microsoft YaHei"))
        self.led_workerid.setFixedWidth(270)
        self.led_workerid.setFixedHeight(38)
        self.led_workerid.setFont(QFont("Microsoft YaHei"))
        self.led_workerid.setPlaceholderText("用户名")

        lbl_pwd = QLabel("密码")
        lbl_pwd.setFont(QFont("Microsoft YaHei"))
        self.led_pwd.setEchoMode(QLineEdit.Password)
        self.led_pwd.setFixedWidth(270)
        self.led_pwd.setFixedHeight(38)
        self.led_pwd.setFont(QFont("Microsoft YaHei"))
        self.led_pwd.setPlaceholderText("密码")

        self.btn_reg.setFixedWidth(130)
        self.btn_reg.setFixedHeight(40)
        self.btn_reg.setFont(QFont("Microsoft YaHei"))
        self.btn_reg.setObjectName("reg_btn")
        # btn_reg.setStyleSheet("#reg_btn{background-color:#2c7adf;color:#fff;border:5px;border-radius:4px;}")

        self.btn_login.setFixedWidth(130)
        self.btn_login.setFixedHeight(40)
        self.btn_login.setFont(QFont("Microsoft YaHei"))
        self.btn_login.setObjectName("login_btn")

        fmlayout.addRow(lbl_workerid, self.led_workerid)
        fmlayout.addRow(lbl_pwd, self.led_pwd)
        # fmlayout.addWidget(btn_login)

        flyout2 = QHBoxLayout()
        flyout2.addWidget(self.btn_reg)
        flyout2.addWidget(self.btn_login)

        fmlayout.addItem(flyout2)
        # flyout2.setHorizontalSpacing(20)
        flyout2.setSpacing(12)
        hbox.setAlignment(Qt.AlignCenter)
        # 调整间距
        fmlayout.setHorizontalSpacing(20)
        fmlayout.setVerticalSpacing(12)

        hbox.addLayout(fmlayout, 2)
        login_widget.setLayout(hbox)
        


if __name__ == "__main__":
  
    app = QApplication(sys.argv)
    ex = LoginForm()
    ex.show()

    sys.exit(app.exec_())

源码获取:

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看主页【专栏名称】或者【用户名】或者顶部的【选题链接】就可以找到我获取项目源码学习啦~🍅

大家点赞、收藏、关注、评论啦 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1197498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【解决方案】pytion 运行时提示 import psutil ModuleNotFoundError: No module named ‘psutil‘

报错原因分析 import psutil ModuleNotFoundError: No module named psutil报错原因分析 当前环境pytion中缺少了psutil包,使用pip命令进行安装 解决方案 pip install psutil

十八数藏的新时代探索:数字创新助推文化保护

在这个数字化的新时代,传统文化和数字创新的结合呈现出令人振奋的新面貌。十八数藏,作为文化数字创新的佼佼者,正以数字化的手段助推文化的保护与传承。 十八数藏通过数字技术,将传统非物质文化遗产以数字形式呈现,使其…

【代码随想录】算法训练计划18

1、513. 找树左下角的值 题目: 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路: 递归,规则,基本可以自己写出来 var maxDepth int var res int fun…

基于安卓android微信小程序的四六级助手系统

项目介绍 随着我国教育需求不断增加,高校教育资源有限,教育经费相对不足的情况下,利用现代信息技术发展高等教育,不仅充分利用了优秀的教育资源,而且为更多的人提供接受高等教育的机会,同时这也是极大促进…

【开源】基于Vue.js的智能停车场管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…

Transforme原理--全局解读

文章目录 作用全局解读 作用 Transformer最初设计用于处理序列数据,特别在NLP(自然语言处理)领域取得了巨大成功 全局解读 Transformer来源于谷歌的一篇经典论文Attention is All you Need 在此使用Transformer在机器翻译中的运用来讲解Transformer。 其中Tran…

SplayTree高分测试用例

测试用例结果展示 覆盖率 变异得分 测试注意点 从SplayTree测起,然后再测SubSplayTree,因为前者调用后者。SplaySubTree的remove方法大部分内容需要通过反射才能测到。value和index在SplayTree当中都不是唯一的。一个index可能对应多个value。 不足之…

力扣100题——子串

560.和为k的子数组 这道题目不是滑动窗口的类型,因为长度并不是固定的。(好的,我在说废话) 注意题目要求是子数组,且是连贯的。那这里的话,解法有很多,最简单的就是暴力解法,但在这…

ChatGPT 如何改变科研之路

《Nature》全球博士后调查[1]中约有三分之一的受访者正在使用人工智能聊天机器人来帮助完善文本、生成或编辑代码、整理其领域的文献等等。 来自巴西的 Rafael Bretas 在日本生活了十多年,日语说得很好。书面日语的各个方面,例如严格的礼貌等级制度&…

CCNA课程实验-12-NAT

目录 实验条件网络拓朴需求 配置实现基础配置R1PC1ISPR2HTTP_ServerDNS_Server 配置在R2上配置静态NAT,将内网DNS Server关联到公网IP:202.1.1.2测试结果 配置在R2上配置静态NAT,将内网HTTP Server的TCP 80端口关联到公网IP:202.1…

力扣138:随机链表的复制

力扣138:随机链表的复制 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…

TiPro7000 Smart Tool V1.1无法打开解决办法

长江存储官网下载的TiPro7000 Smart Tool V1.1在win10运行时无法打开,转圈圈之后就没有反应了。官网下载的压缩包解压之后内容如下图。 解决办法:将.exe文件名的“致钛”二字删掉即可。文件名不能有中文。 打开后软件界面如下。 吐槽一下这软件做得挺简…

【Python大数据笔记_day06_Hive】

hive内外表操作 建表语法 create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... ) [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式 [clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式 注意: 可以排序[so…

Java,多线程,线程安全的懒汉式、死锁、ReentrantLock的使用以及一些知识点补充

关于线程安全地懒汉式有以下几种方式: /*** 实现线程安全的懒汉式*/ public class BankTest {Bank b1 null;Bank b2 null;public static void main(String[] args){BankTest bb new BankTest();Thread t1 new Thread(){Overridepublic void run(){bb.b1 Bank.…

【C++笔记】优先级队列priority_queue的模拟实现

【C笔记】优先级队列priority_queue的模拟实现 一、优先级队列的介绍与使用方式1.1、优先级队列介绍1.2、优先级队列的常见使用 二、优先级队列的模拟实现1.0、仿函数的介绍1.1、构造函数1.2、优先级队列的插入push1.3、优先级队列的删除(删除堆顶元素)1.4、获取堆顶元素1.5、判…

【蓝桥每日一题]-快速幂,倍增,滑动窗口(保姆级教程 篇1) #麦森数 #青蛙跳

之前是考试准备&#xff0c;所以有几天没更新&#xff0c;今天开始继续更新 目录 快速幂模板 题目&#xff1a;麦森数 思路&#xff1a; 题目&#xff1a;青蛙跳 思路&#xff1a; 快速幂模板 #include <bits/stdc.h> #define ll long long using namespa…

人工智能与教育:未来的技术融合

人工智能与教育&#xff1a;未来的技术融合 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐渗透到我们生活的方方面面&#xff0c;包括教育领域。AI与教育的结合&#xff0c;有望引发一场教育变革&#xff0c;提高教学效果&#xff0c;实现个性化学习&…

ENVI IDL:如何基于气象站点数据进行反距离权重插值?

01 前言 仅仅练习&#xff0c;大可使用ArcGIS或者已经封装好的python模块进行插值&#xff0c;此处仅仅从底层理解如何从公式和代码理解反距离权重插值的过程&#xff0c;从而更深刻的理解IDL的使用和插值的理解。 02 函数说明 2.1 Read_CSV()函数 官方语法如下&#xff1a…

JVM虚拟机:垃圾回收器之Parallel Old(老年代)

本文重点 本文将学习老年代的另外一种垃圾回收器Parallel Old(PO)&#xff0c;这是一种用于老年代的并行化垃圾回收器&#xff0c;它使用标记整理算法进行垃圾回收。 历史 在1.6之前&#xff0c;新生代使用Parallel Scavenge只能搭配老年代的Serial Old收集器&#xff0c;而…

蓝桥杯算法双周赛心得——被替换的身份证(分类讨论)

大家好&#xff0c;我是晴天学长&#xff0c;分类讨论一定要细节啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .被替换的身份证 2) .算法思路 假设一方获胜 1.接受数据 2.假设潜梦醒 无非就是&am…