pyqt结合深度学习框架做系统

news2024/11/26 19:28:08

时隔将近两个月,我胡汉三又回来啦!!!将近两个月玩了一个月,半个月面试,半个月吃土沉淀(有收获)也投出去一篇论文(外审中,关于深度学习神经网络改进的一篇病害识别模型)。

经过了找实习工作的几场恶战:

1、测试员工程师(软件测试工程师)

2、图像算法工程师

       最终发现实习其实也没有那么难找,面试了几场只噶了一场,其他都有收到offer。但是因为我是限制地区的,只找了那一个城市的工作,又限定了工作岗位,可选的没几家,好的公司也不多,毕竟大部队在暑假之后9月份吧,才真正的厮杀。

       本人最终选择了相比较对口的一家公司,7月17号正式报道去实习,但是都要求长期实习,这点每个公司的同病。没有充足的时间建议不要轻试,因为现在还没入职,不知道入职后操作的难易程度,亦不知能做多久,对将来到底有没有用。(我实习的唯一目的其实是想通过实习转正,前提是得是个我满意的公司),于是乎只能去先一步入坑替大家体样一下咯,实习完了再将经验,现在问有没有必要实习?我不知道!!!

学习准备经验:

要想面试软件测试工程师的,其实不是说看一点就行,这是个什么?不就是测试吗?用不用写代码?之前一度以为很简单,也一度认为很难。这个不好好学确实不好了解,推荐一个必看的视频。

千锋软件测试必看视频

图像算法,以及视觉算法,就靠大家平时积累了,传统算法要会(opencv库),深度学习框架也要会,语言python是必须的,所有包括软件测试也要会语言,c也行,c++。这个前景还是不错的,不要听其他的,自己会的东西,工作中如鱼得水工资又高那才是最好的。

       今天做了一个入职体检,抽血遇到了实习新手,最后针口青的发紫色甚至发黑(做了一次小白鼠,呜*_*)到时候还要搬着好多好多行李去往新城市。又害怕又期待,我的新篇章马上开始了!

最后,福利来了:

(吃土也不忘学习,将pyqt和之前的深度学习训练的识别模型结合起来,实现了界面化,可以当作系统了)

实现了登录、注册、主页。三个页面的灵活切换,其中主页面如下图,实现了上传原图的功能和病害识别的功能

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton,QLabel,QTextEdit,QFileDialog,QHBoxLayout,QVBoxLayout,QSplitter,QComboBox,QSpinBox
from PyQt5.Qt import QWidget, QColor,QPixmap,QIcon,QSize,QCheckBox
# 导入login.py、main.py里面全部内容
import DengLu
import my_ui
import ZuCe
import os
from PyQt5.QtCore import Qt

import matplotlib.pyplot as plt
import numpy as np
import torch
from torch import nn

from nets import get_model_from_name
from utils.utils import (cvtColor, get_classes, letterbox_image,
                         preprocess_input, show_config)
from PIL import Image
from torchvision import transforms,models


class Classification(object):
    _defaults = {
        # --------------------------------------------------------------------------#
        #   使用自己训练好的模型进行预测一定要修改model_path和classes_path!
        #   model_path指向logs文件夹下的权值文件,classes_path指向model_data下的txt
        #   如果出现shape不匹配,同时要注意训练时的model_path和classes_path参数的修改
        # --------------------------------------------------------------------------#
        # "model_path"        : 'logs/resnet_CBAM-100-best_epoch_weights-loss0.117-val_loss0.009.pth',
        "model_path": 'logs/mobilenetv2-100-ep050-best-loss0.418-val_loss0.078.pth',
        #   所用模型种类:
        "backbone": 'mobilenetv2',
        # --------------------------------------------------------------------#
        #   mobilenetv2、
        #   resnet18、resnet34、resnet50、resnet101、resnet152
        #   vgg11、vgg13、vgg16、vgg11_bn、vgg13_bn、vgg16_bn、
        #   vit_b_16、
        #   swin_transformer_tiny、swin_transformer_small、swin_transformer_base
        "classes_path": 'model_data/cls_classes.txt',
        # --------------------------------------------------------------------#
        #   输入的图片大小
        # --------------------------------------------------------------------#
        "input_shape": [224, 224, 3],

        # --------------------------------------------------------------------#
        #   该变量用于控制是否使用letterbox_image对输入图像进行不失真的resize
        #   否则对图像进行CenterCrop
        # --------------------------------------------------------------------#
        "letterbox_image": False,
        # -------------------------------#
        #   是否使用Cuda
        #   没有GPU可以设置成False
        # -------------------------------#
        "cuda": True
    }

    @classmethod
    def get_defaults(cls, n):
        if n in cls._defaults:
            return cls._defaults[n]
        else:
            return "Unrecognized attribute name '" + n + "'"

    # ---------------------------------------------------#
    #   初始化classification
    # ---------------------------------------------------#
    def __init__(self, **kwargs):
        self.__dict__.update(self._defaults)
        for name, value in kwargs.items():
            setattr(self, name, value)

        # ---------------------------------------------------#
        #   获得种类
        # ---------------------------------------------------#
        self.class_names, self.num_classes = get_classes(self.classes_path)
        self.generate()

        show_config(**self._defaults)

    # ---------------------------------------------------#
    #   获得所有的分类
    # ---------------------------------------------------#
    def generate(self):
        # ---------------------------------------------------#
        #   载入模型与权值
        # ---------------------------------------------------#
        if self.backbone not in ['vit_b_16', 'swin_transformer_tiny', 'swin_transformer_small',
                                 'swin_transformer_base']:
            self.model = get_model_from_name[self.backbone](num_classes=self.num_classes, pretrained=False)
        else:
            self.model = get_model_from_name[self.backbone](input_shape=self.input_shape, num_classes=self.num_classes,
                                                            pretrained=False)
        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        self.model.load_state_dict(torch.load(self.model_path, map_location=device))
        self.model = self.model.eval()
        print('{} model, and classes loaded.'.format(self.model_path))

        if self.cuda:
            self.model = nn.DataParallel(self.model)
            self.model = self.model.cuda()

    # ---------------------------------------------------#
    #   检测图片
    # ---------------------------------------------------#
    def detect_image(self, image):
        # ---------------------------------------------------------#
        #   在这里将图像转换成RGB图像,防止灰度图在预测时报错。
        #   代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB
        # ---------------------------------------------------------#
        image = cvtColor(image)
        # ---------------------------------------------------#
        #   对图片进行不失真的resize
        # ---------------------------------------------------#
        image_data = letterbox_image(image, [self.input_shape[1], self.input_shape[0]], self.letterbox_image)
        # ---------------------------------------------------------#
        #   归一化+添加上batch_size维度+转置
        # ---------------------------------------------------------#
        image_data = np.transpose(np.expand_dims(preprocess_input(np.array(image_data, np.float32)), 0), (0, 3, 1, 2))

        with torch.no_grad():
            photo = torch.from_numpy(image_data)
            if self.cuda:
                photo = photo.cuda()
            # ---------------------------------------------------#
            #   图片传入网络进行预测
            # ---------------------------------------------------#
            preds = torch.softmax(self.model(photo)[0], dim=-1).cpu().numpy()
        # ---------------------------------------------------#
        #   获得所属种类
        # ---------------------------------------------------#
        class_name = self.class_names[np.argmax(preds)]
        probability = np.max(preds)

        # ---------------------------------------------------#
        #   绘图并写字
        # ---------------------------------------------------#
        plt.subplot(1, 1, 1)
        plt.imshow(np.array(image))
        plt.title('Class:%s Probability:%.3f' % (class_name, probability))
        plt.show()
        # plt.imsave(.../img,back.jpg)

        img_data = np.array(image)
        # 保存图像
        plt.imsave('back.png', img_data)

        return class_name


class my_ui(my_ui.Ui_MainWindow, QMainWindow):
    def __init__(self):
        super(my_ui, self).__init__()
        self.setupUi(self)  # 初始化

        # 每写一个按钮链接对应的让它做啥可以在下面添加一个函数
        # 返回登录页slot_btn_function
        self.pushButton_back.clicked.connect(self.slot_btn_function)
        # 选择图片打开上传图片select_image
        self.pushButton_openimg.clicked.connect(self.select_image)
     
        # 开始识别按钮链接
        self.pushButton_6.clicked.connect(self.on_btn_Recognize_Clicked2)

    def slot_btn_function(self):
        self.hide()
        self.f = DengLu()
        self.f.show()

    def select_image(self):
        global fname
        imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.png;;*.jpg;;All Files(*)")
        jpg = QtGui.QPixmap(imgName).scaled(self.label.width(), self.label.height())
        # jpg = QtGui.QPixmap(imgName)
        self.label.setPixmap(jpg)
        fname = imgName
        print(fname)



    def on_btn_Recognize_Clicked2(self):
        classfication = Classification()

        while True:
            global fname
            # savePath = fname
            img = os.path.abspath(fname)
            print("图像的绝对路径:",img)

            # img = input('Input image filename:')
            try:
                image = Image.open(img)
            except:
                print('Open Error! Try again!')
                self.textBrowser.setText("请先上传待测图片!")
                continue
            else:
                class_name = classfication.detect_image(image)
                print("识别结果为:" + class_name)
                if class_name == "rot":
                    class_name = "褐腐病\r\n灰斑病常发病于秋季,初期病斑呈黄褐色圆形状且边缘清晰,病后期病斑区域不断扩大呈现不规则状,病斑区域密集相连加快叶片枯萎。"
                elif class_name == "scab":
                    class_name = "黑星病黑\r\n星病病斑初期呈淡黄色圆形或放射状,逐渐变为棕色,最终变为黑色,病叶上常有多个斑点相互融合,病部干枯开裂,叶柄上的病斑通常是长条状的。"

                elif class_name == "rust":
                    class_name = "雪松锈病\r\n雪松锈病初期病斑呈明亮的桔红色,随后为圆型,边缘为红色病斑呈橙色;患病后期,叶片上病斑逐渐增多,表面呈现密集的小颗粒黄色状病斑。"

                self.textBrowser.setText("识别结果为:" + class_name)
            #  break跳出循环
            break

        # self.edit.setText('识别结果为:' str(txt))


class DengLu(DengLu.Ui_Form, QMainWindow):
    def __init__(self):
        super(DengLu, self).__init__()
        self.setupUi(self)

        # 每写一个按钮链接对应的让它做啥可以在下面添加一个函数
        '''定义跳转到主页按钮'''
        self.btn_login.clicked.connect(self.tiaozhuanzhuye)
        '''定义跳转到注册页按钮'''
        self.btn_login_zuce.clicked.connect(self.tiaozhuanzuce)

    def tiaozhuanzhuye(self):
        self.hide()
        self.f = my_ui()
        self.f.show()
    def tiaozhuanzuce(self):
        self.hide()
        self.f = Ui_ZuCe()
        self.f.show()



class Ui_ZuCe(ZuCe.Ui_Form, QMainWindow):
    def __init__(self):
        super(Ui_ZuCe, self).__init__()
        self.setupUi(self)

        # 每写一个按钮链接对应的让它做啥可以在下面添加一个函数
        self.btn_back.clicked.connect(self.slot_btn_function)
    def slot_btn_function(self):
        self.hide()
        self.f = DengLu()
        self.f.show()


if __name__ == '__main__':
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)  # 支持高分屏自动缩放
    app = QApplication(sys.argv)

    # 为my_ui_window类和login_window类创建对象
    # main_window = main()

    login_window = DengLu()
    classification = Classification()
    zuce_window = Ui_ZuCe()
    my_ui_window = my_ui()

    # 显示登陆窗口
    login_window.show()


    # 关闭程序,释放资源
    sys.exit(app.exec_())

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

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

相关文章

如何将代理IP集成到自动化测试框架中?

自动化测试框架是现代软件工程中不可或缺的一部分。它们提供了许多好处,包括:更快的测试速度,更高的可靠性和更广泛的测试覆盖范围。然而,在测试过程中,有些网站可能需要使用代理IP,这是因为一些网站会限制…

踩坑记录:xorm的sql()函数后无法使用FindAndCount()

一、起因 懒省事想用 sql 写个有连表操作的分页查询语句,看到 xorm 中 sql 要和代码紧密纠缠在一起就不爽,所有就想用 xorm 中的 session.SQL(sql).Limit(size, offset).FindAndCount() 方法解决。不曾想。。。 sql: expected 15 destination argument…

[计算机入门] 磁盘、磁盘分区、盘符、卷标

2.5 磁盘、磁盘分区、盘符、卷标 磁盘:指计算机中存储数据和文件的物理设备,也称为硬盘。 磁盘分区:指将一个磁盘分成多个逻辑部分,每个部分可以独立地进行管理和操作,例如格式化、安装操作系统等。 如上图&#xf…

AWS 中文入门开发教学 46- S3 - AWS的存储核心, Simple Storage Service

知识点 S3的基础知识官网 https://aws.amazon.com/cn/s3 基础介绍 Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,(其实就是文件存储) 提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种…

归并排序—C语言实现

前言 🥰在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据,当然操作数据首先想到的就是数据的排序,排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等,这些就是储存数据的方法&#xff0…

2021机器学习阶段性复盘

文章目录 特征选择一、GBDT和Xgboost简介二、 GBDTLR协同过滤,SVD的劣势:极大化似然估计Wide&DeepxDeepFM朴素贝叶斯SVM转为拉格朗日函数转为对偶问题 决策树分类交叉熵损失函数数据预处理连续型特征为什么取对数 深度学习激活函数的作用Softmax与Si…

剑指offer64.求1+2+...+n

看到题脑子里就有了想法,这还不简单,直接用递归啊,return一个nsumNums(n-1)写完之后发现到了0你得终止但是不能用if等语句你没办法终止,想了大概十分钟放弃了,这没办法终止啊,然后看了题解。 class Soluti…

QCFS-related work

一、代码 def replace_maxpool2d_by_avgpool2d(model): # 将模型中的所有MaxPool2d层替换为AvgPool2d层。for name, module in model._modules.items(): # 函数使用递归方式遍历模型的所有模块,通过model._modules.items()获取模型的子模块以及它们对应的名称。if …

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

【Elasticsearch】文档操作

目录 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 3.4.2.增量修改 3.5.总结 3.文档操作 3.1.新增文档 语法: POST /索引库名/_doc/文档id {"字段1": "值1","字段2": "值2"…

软件测试当中的测试用例模板,仅供参考

测试用例这块知识、经验,小酋在前面陆续都讲完了。这章提供几种用例模板,作为这块知识的收尾。 - 1 - 测试用例(主指功能测试用例模板)的内容通常包括测试目标(目的),需求标示(一般…

Background-2 盲注关卡 sqli-Labs Less5-Less-6

文章目录 一、Less-5-less-6一、利用left(database(),1)进行尝试1.查看版本号2.查看数据库的长度3.猜测数据库的第一位 二、利用substr(),ascii()函数进行尝试三、利用regexp()获取(2)中users表中的列四、利用ord(),mid函数获取us…

elasticsearch插件ik分词器,无法启动解决方案

首先7以后的版本一定要与es的版本保持一致下载包只能下载这个路径的文件,版本号与自己的es版本保持一致 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.6.0/elasticsearch-analysis-ik-8.6.0.zip这里可以直接替换 docker容器无法启动&…

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“

一、现象说明 最近在调试 RabbitMQ 程序的时候,日志里如下错误: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/cod…

排序算法笔记-快速排序

文章目录 笔记简介时间复杂度空间复杂度解题模版练习题 笔记 简介 快速排序:确定分界数,左边小于分界,右边大于分界数,通过递归来不断重置分界数划分区域,直至完成排序 时间复杂度 最优 n*logn 最差 n^2 空间复杂…

找工作不用愁!送你一份Salesforce顾问面试秘籍(下)(含答案)

作为SaaS行业的先驱,Salesforce的发展一路高歌猛进。在Salesforce生态系统中不仅能学习到最新的技术,而且比其他行业的同岗位享有更高的薪水,这也驱使了越来越多人加入Salesforce大军。 在之前的文章中,自由侠部落为学习者梳理了…

Qt6之QSetting读取为空或失败

一、目的 QSetting终极目的是,模糊平台,一套方法可以同时写入或者读取配置文件及注册表。 二、问题 QSetting确实兼顾了平台,linux、mac、windows三大平台均能使用,但就像所有事物一样,大一统的背后必定要做出一些让步…

STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065

STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 Proteus仿真小实验: STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 功能: 硬件组成:STM32F103C8单片机 LCD1602显示器ADC220V转3.3V电路DS18B20温度多个按键&#xf…

刚刚出炉,速看7月编程语言排行榜

2023年已经过半,最新一期的编程语言排行榜你看了吗?刚刚,全球知名编程语言社区TIOBE公布了7月榜单, TIOBE 7 月 TOP 15 编程语言: 详细榜单可参考官网: https://www.tiobe.com/tiobe-index/ 在众多编程语…

openpnp - 伺服JAWD7502的参数读取

文章目录 openpnp - 伺服JAWD7502的参数读取概述笔记备注END openpnp - 伺服JAWD7502的参数读取 概述 设备用的双Y轴用到了伺服JAWD7502, 准备将参数读出来, 以备不时之需. 笔记 JAWD7502直接提供了USB接口, 连到电脑就行. 不用准备特别的通讯线. USB接口类型是MicroUSB U…