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

[毕业设计]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_())

源码获取:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移动端模型部署框架

移动端模型部署框架 1. MNN整体特点轻量性通用性高性能易用性架构设计主体工具致谢移动端模型部署框架 1. MNN https://www.yuque.com/mnn/cn/about MNN是全平台轻量级高性能深度学习引擎,广泛支持了阿里巴巴在计算机视觉、语音识别技术、自然语言处理等领域的70多个AI应用…

【Java 进阶篇】Java中的 JSP(JavaServer Pages)

JavaServer Pages(JSP)是一种用于开发动态Web页面的Java技术。它是在静态Web页面中嵌入Java代码的一种方式,使得开发者可以借助Java的强大功能来创建动态、交互性强的Web应用程序。在本文中,我们将深入探讨JSP的概念、原理和基本用…

MYSQL内容补充:

一)联合索引: 1)定义:是给一张表上面的多个列增加索引,也就是说给表上面的多个列增加索引,供快速查询使用,当两个列的组合是唯一值时,联合索引是个不错的选择 联合索引和单个索引对比来讲,联合索引的所有索引项都会出现…

重温数据结构与算法之前缀和

文章目录 前言一、基础1.1 定义1.2 时间复杂度 二、扩展2.1 二维前缀和2.2 差分数组2.3 前缀积 三、LeetCode 实战3.1 长度最小的子数组3.2 二维区域和检索 - 矩阵不可变 参考 前言 前缀和(Prefix Sum),也被称为累计和,是一种在计…

SQL必知会(二)-SQL查询篇(5)-用通配符进行过滤

第6课、用通配符进行过滤 LIKE:匹配文本 LIKE:针对未知值进行过滤。通配符搜索只能用于文本字段。 1)百分号%通配符 %表示任何字符出现任意次数。 需求:找出所有以词 Fish 起头的产品 SELECT prod_id, prod_name FROM Product…

浅谈高并发以及三大利器:缓存、限流和降级

引言 高并发背景 互联网行业迅速发展,用户量剧增,系统面临巨大的并发请求压力。 软件系统有三个追求:高性能、高并发、高可用,俗称三高。三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜&#…

Aria2 任意文件写入漏洞复现

漏洞描述 Aria2 是一款轻量级、多协议、多源下载工具(支持 HTTP/HTTPS、FTP、BitTorrent、Metalink),内置 XML-RPC 和 JSON-RPC 接口。 我们可以使用 RPC 接口来操作 aria2 并将文件下载到任意目录,从而造成任意文件写入漏洞。 …

Nginx常用配置与命令,nginx代理转发配置

Nginx特点 高并发、高性能; 模块化架构使得它的扩展性非常好; 异步非阻塞的事件驱动模型这点和 Node.js 相似; 相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性; 热部署、平滑升级; 完全开源,生态繁荣; Nginx作用 Nginx 的最重要的…

【Excel】补全单元格值变成固定长度

我们知道股票代码都为6位数字,但深圳中小板代码前面以0开头,数字格式时前面的0会自动省略,现在需要在Excel表格补全它。如下图: 这时我们需要用到特殊的函数:TEXT或者RIGHT TEXT函数是Excel中一个非常有用的函数。TEX…

SpringBoot项目调用openCV报错:nested exception is java.lang.UnsatisfiedLinkError

今天在通过web项目调用openCV的时候提示如下错误: nested exception is java.lang.UnsatisfiedLinkError:org.opencv.imgcodecs.Imgcodecs.imread_0(Ljava/la如下图所示: 但是通过直接启动java main函数确正常,初步诊断和SpringBoot热加载…

dart packages 版本问题解决 和 对 pubspenc.lock 的深入了解

先讲讲我遇到的问题 在进行写项目的时候,我需要用到一个依赖 这个依赖是 3.0.0 版本的,但是实际上我本地的上存在多个版本 虽然我修改了 pubspenc.yaml 文件中需要的依赖,但是每次使用的还是 3.4.0 版本的依赖,但是我需要的是 3…

Windows查看端口占用情况

Windows如何查看端口占用情况 方法1. cmd命令行执行netstat命令,查看端口占用情况 netstat -ano 以上命令输出太多信息,不方便查看,通过如下命令搜索具体端口占用情况,例如:8080端口 netstat -ano | findstr "…

手摸手入门Springboot+Grafana10.2接收JSON

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本…

面向对象基础(以python语言为例)

1、定义一个类;实例化类的对象;调用类中的方法 #定义一个类 class Student:#类方法(即函数)def study(self,course_name):print(f学生正在学习{course_name})def play(self):print("xx学生正在玩游戏")#实例化&#xf…

Rust的崛起:现代必备编程语言,是时候该考虑加入学习了

在不断变化的编程环境中,新的语言和框架如雨后春笋般涌现,需要一个真正强大且设计良好的工具才能脱颖而出。在这些工具中,Rust 已成为效率、安全性和性能的灯塔。从它作为 Mozilla 的一个副项目到它在软件行业中不可否认的增长,Ru…

【沐风老师】3DMAX克隆修改器插件教程

3DMAX克隆修改器插件,它通过增量平移、旋转和缩放输入几何体来创建对象的副本。在某些方面,它类似于 3ds Max 的内置阵列工具,但有一个主要优点 -克隆是完全参数化的,因此您可以随时更改重复项的数量及其分布。其他功能包括随机变…

基于单片机的空调智能控制器的设计

**单片机设计介绍,基于单片机的空调智能控制器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的空调智能控制器需要具备输入输出端口、定时器、计数器等模块,以便对空调进行精确控制。下…

【Linux(0)】为什么要学习Linux,为什么互联网公司在招聘时,会提出要有Linux经验,及其使用;一些Linux常见指令

前言 💓作者简介: 加油,旭杏,目前大二,正在学习C,数据结构等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏&#x1…

Cordova插件开发三:通过广播实现应用间跨进程通信

文章目录 1.最终效果预览2.数据发送3.插件接受数据4.JS页面中点击获取数据返回1.最终效果预览 场景说明:我们给自来水公司开发了一个h5应用,需要对接第三方厂家支持硬件设备以便于获取到高精度定位数据,之前几篇文件写过,我已经集成过南方测绘RTK和高精度定位模块的设备,厂…

Android11修改连接WiFi后AP端显示的设备名

修改build.prop文件 1.修改 /system/build.prop 最后添加,xxx 为自己设置的设备名: net.hostnamexxx 2. 重启、重连wifi,从热点或路由器后台查看设备名即为修改后的名称 代码里动态配置 暴力手段:grep -rn “net.hostname” *…