pyqt は深層学習フレームワークを組み合わせてシステムを構築します

約2か月ぶりに、私、胡漢山が帰ってきました!2ヶ月近くプレイして、半月面接を受けて、半月頑張って(結果が出て)論文を提出しました(外部審査中、深層学習ニューラルネットワークの改良に基づく疾病識別モデル)。

インターンシップの仕事を見つけるための数回の熾烈な戦いの末:

1. テスターエンジニア(ソフトウェアテストエンジニア)

2. 画像アルゴリズムエンジニア

       結局、インターンシップを見つけるのは実はそれほど難しいことではなく、数回の面接のうち面接を受けたのは1回だけで、残りはオファーをもらえました。しかし、私は制限地域にいるので、その都市でしか仕事を探しませんでしたし、求人も限られていました。選択肢はあまりなく、良い企業もあまりありませんでした。結局、大軍が本格的に働き始めたのです。夏休み後の9月に戦います。

       最終的に比較的適切な企業を選択し、7月17日に正式にインターンシップの報告をしましたが、いずれも長期のインターンシップが必要であり、これはどの企業でも同じ問題です。まだ入社して間もないですし、入社後の仕事がどれだけ楽になるか、どれくらいの期間できるか分かりませんので、時間がない場合は安易に挑戦することはお勧めしません。 、将来役立つかどうか。(実際、インターンシップの目的はインターンシップを通じて正社員になることだけです。自分が納得した会社であることが前提)なので、まずはピットに行ってみんなに試してもらうことしかできません。インターンシップが終了したら、私の経験を共有したいと思いますが、必要なインターンシップはありますか? わからない!

学習準備の経験:

ソフトウェア テスト エンジニアにインタビューしたい場合は、少し読むだけでは不十分です。これは何ですか? ただのテストじゃないの?コードを書く必要がありますか? 簡単だと思ったこともあれば、難しいと思ったこともあります。これはしっかり勉強しないと理解するのが難しいので、必見の動画をお勧めします。

Qianfeng ソフトウェア テストの必見ビデオ

画像アルゴリズムと視覚アルゴリズムは、皆さんの日々の積み重ねに依存します。従来のアルゴリズム (opencv ライブラリ)、深層学習フレームワーク、および言語 Python を知っている必要があります。また、ソフトウェア テストを含むすべての言語 (C および C++ を含む) を知っている必要があります。 。この見通しはまだ良好で、他人の意見を聞く必要はありません。自分が知っていることが一番良く、水を得た魚のように働くことができ、給料も高いです。

       今日は健康診断があり、血液検査を受け、新しいインターンに会ったのですが、最終的にはあざが紫色になったり、黒くなったりしました(私はモルモットでした、うわ*_*)そして、たくさんのことを背負わなければなりません新しい街への荷物の量。怖くて楽しみ、私の新章が始まります!

最後に、次のような利点があります。

(土を食べながらも学習は忘れません。以前ディープラーニングで学習させた認識モデルにpyqtを組み合わせてシステムとして使えるインターフェースを実現しました。)

ログイン、登録、ホームページが実装されています。3つのページを柔軟に切り替え可能 メインページは以下のようなもので、オリジナル写真のアップロードや疾患特定機能を実現しています。

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_())

おすすめ

転載: blog.csdn.net/m0_63172128/article/details/131689158