看熱訊:QT部署YOLOV5 pyqt5搭建YOLOV5的檢測平臺
文章目錄
前言一、準備工作1、代碼下載2、環境安裝2.1、安裝PyQt52.2、安裝Qt Designer圖形界面開發工具2.3、pycharm配置 3、模型準備 二、界面展示1.界面大致如下 三、效果展示1、圖片效果展示如下:2、攝像頭或視頻檢測 四、整體代碼:總結
前言
(資料圖片)
這篇文章主要用來記錄用pyqt5搭建YOLOV5的檢測平臺,代碼是在yoloV5官方代碼上加了個qt模塊,目前可以支持GPU/CPU下pt/onnx推理。
一、準備工作
1、代碼下載
2、環境安裝
根據代碼中的requirements.txt進行環境搭建,前提是你已有Python環境
pip install -r requirements.txt
這里需要注意的是,pyqt5需要配置下環境,參考連接為:安裝pyqt5,步驟如下:
2.1、安裝PyQt5
pip install PyQt5
2.2、安裝Qt Designer圖形界面開發工具
pip install PyQt5-tools
安裝完成后,會在當前環境目錄下生成如下文件
2.3、pycharm配置
先配置Qt Designer 參數如下: Name:Qt Designer。方便記憶。實際可以任意取值。
Program:designer.exe程序絕對路徑。根據實際安裝路徑填寫,參考路徑為安裝的xxxx/Lib/sit-packages/qt5_applications\Qt\bin\designer.exe(其中xxxx為虛擬環境目錄下)。 Working directory: $ProjectFileDir$。固定取值。
配置PyUIC,該工具是用于將Qt Designer工具開發完成的.ui文件轉化為.py文件。配置打開路徑同Qt Designer。參數配置說明: Name:PyUIC。方便記憶。實際可以任意取值。 Program:python.exe程序絕對路徑。根據實際安裝路徑填寫。 Parameters:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py。固定取值。 Working directory: $FileDir$。固定取值。
3、模型準備
根據readme.md文件中的地址選擇對應的模型下載,如圖:
本文直接以yolov5s.pt進行示范
二、界面展示
1.界面大致如下
代碼如下(示例):
class Ui_Form(QtWidgets.QWidget): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(1130, 730) self.stride=64 #檢測結果展示區 self.label2 = QtWidgets.QLabel(Form) self.label2.setGeometry(QtCore.QRect(650, 410, 300, 300)) self.label2.setAlignment(QtCore.Qt.AlignCenter) self.label2.setStyleSheet("border: 1px solid black;") self.label2.setObjectName("label2") #圖片或視頻路徑選擇 self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(50, 310, 160, 30)) self.pushButton.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton.setChecked(False) # 設置開始時的狀態為未選中 self.pushButton.clicked.connect(lambda :self.select_file()) self.pushButton.setObjectName("pushButton") #圖片選擇按鈕 #模式選擇 self.comboBox = QtWidgets.QComboBox(Form) self.comboBox.setGeometry(QtCore.QRect(50, 260, 160, 30)) self.comboBox.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.comboBox.setPlaceholderText("") self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.currentIndexChanged.connect(lambda :self.select_mode()) #開始檢測按鈕 self.pushButton_2 = QtWidgets.QPushButton(Form) self.pushButton_2.setGeometry(QtCore.QRect(190, 610, 100, 70)) self.pushButton_2.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.setChecked(False) self.pushButton_2.clicked.connect(lambda :self.vim_show()) self.pushButton_3 = QtWidgets.QPushButton(Form) self.pushButton_3.setGeometry(QtCore.QRect(50, 210, 160, 30)) self.pushButton_3.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.setChecked(False) # 設置開始時的狀態為未選中 self.pushButton_3.clicked.connect(lambda :self.select_modelfile()) self.pushButton_7 = QtWidgets.QPushButton(Form) self.pushButton_7.setGeometry(QtCore.QRect(50, 550, 160, 30)) self.pushButton_7.setStyleSheet("font: 15pt \"宋體\";\n" "border:1px solid black;\n" "background-color:#e1e1e1;") self.pushButton_7.setObjectName("pushButton_7") self.lineEdit_2=QtWidgets.QLineEdit(Form) self.lineEdit_2.setGeometry(QtCore.QRect(230, 550, 220, 30)) self.lineEdit_2.setStyleSheet("border: 1px solid black;") self.lineEdit_2.setObjectName("lineEdit_2") self.label1=QtWidgets.QLabel(Form) self.label1.setGeometry(QtCore.QRect(650, 100, 300, 300)) self.label2.setAlignment(QtCore.Qt.AlignCenter) self.label1.setStyleSheet("border: 1px solid black;") self.label1.setObjectName("label1") self.textEdit = QtWidgets.QTextEdit(Form) self.textEdit.setGeometry(QtCore.QRect(600, 100, 40, 300)) self.textEdit.setLayoutDirection(QtCore.Qt.LeftToRight) self.textEdit.setStyleSheet("border: 1px solid black;\n""font: 15pt \"宋體\";") self.textEdit.setObjectName("textEdit") self.textEdit_2 = QtWidgets.QTextEdit(Form) self.textEdit_2.setGeometry(QtCore.QRect(600, 410, 40, 300)) self.textEdit_2.setStyleSheet("border: 1px solid black;\n""font: 15pt \"宋體\";") self.textEdit_2.setAlignment(QtCore.Qt.AlignHCenter) self.textEdit_2.setObjectName("textEdit_2") self.tableWidget = QtWidgets.QTableWidget(Form) self.tableWidget.setGeometry(QtCore.QRect(230, 370, 221, 170)) self.tableWidget.setStyleSheet("font: 15pt \"宋體\";\n""") self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(1) self.tableWidget.setRowCount(4) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) self.tableWidget.horizontalHeader().setDefaultSectionSize(100) self.tableWidget.horizontalHeader().setMinimumSectionSize(100) self.tableWidget.verticalHeader().setDefaultSectionSize(30) self.lineEdit_3 = QtWidgets.QLineEdit(Form) self.lineEdit_3.setGeometry(QtCore.QRect(230, 210, 220, 30)) self.lineEdit_3.setStyleSheet("border: 1px solid black;") self.lineEdit_3.setObjectName("lineEdit_3") self.lineEdit_4 = QtWidgets.QLineEdit(Form) self.lineEdit_4.setGeometry(QtCore.QRect(230, 260, 220, 30)) self.lineEdit_4.setStyleSheet("border: 1px solid black;") self.lineEdit_4.setObjectName("lineEdit_4") self.widget_3 = QtWidgets.QWidget(Form) self.widget_3.setGeometry(QtCore.QRect(20, 30, 460, 690)) self.widget_3.setStyleSheet("border : 1px solid black;") self.widget_3.setObjectName("widget_3") self.lineEdit_5 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_5.setGeometry(QtCore.QRect(90, 20, 261, 51)) self.lineEdit_5.setStyleSheet("font: 16pt \"宋體\";") self.lineEdit_5.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit_5.setObjectName("lineEdit_5") self.lineEdit_7 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_7.setGeometry(QtCore.QRect(210, 280, 220, 30)) self.lineEdit_7.setStyleSheet("border: 1px solid black;") self.lineEdit_7.setObjectName("lineEdit_7") self.pushButton_4 = QtWidgets.QPushButton(self.widget_3) self.pushButton_4.setGeometry(QtCore.QRect(30, 410, 160, 61)) self.pushButton_4.setStyleSheet("font: 15pt \"宋體\";\n""background-color:#e1e1e1;") self.pushButton_4.setObjectName("pushButton_4") #參數確認按鈕 self.pushButton_5 = QtWidgets.QPushButton(Form) self.pushButton_5.setGeometry(QtCore.QRect(50, 610, 100, 70)) self.pushButton_5.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_5.setObjectName("pushButton_5") self.pushButton_5.setChecked(False) self.pushButton_5.clicked.connect(lambda: self.param_show()) #結束檢測按鈕 self.pushButton_6 = QtWidgets.QPushButton(Form) self.pushButton_6.setGeometry(QtCore.QRect(330, 610, 100, 70)) self.pushButton_6.setStyleSheet("font: 15pt \"宋體\";\n" "border:1px solid black;\n" "background-color:#e1e1e1;") self.pushButton_6.setObjectName("pushButton_6") self.pushButton_6.setChecked(False) self.pushButton_6.clicked.connect(lambda: self.end_detect()) self.lineEdit_8 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_8.setGeometry(QtCore.QRect(210, 120, 220, 30)) self.lineEdit_8.setStyleSheet("border: 1px solid black;") self.lineEdit_8.setObjectName("lineEdit_8") self.comboBox_2 = QtWidgets.QComboBox(self.widget_3) self.comboBox_2.setGeometry(QtCore.QRect(30, 120, 160, 30)) self.comboBox_2.setStyleSheet("font: 15pt \"宋體\";\n""background-color:#e1e1e1;") self.comboBox_2.setPlaceholderText("") self.comboBox_2.setObjectName("comboBox_2") self.comboBox_2.currentIndexChanged.connect(lambda : self.select_device()) self.comboBox_2.addItem("") self.comboBox_2.addItem("") self.comboBox_2.addItem("") self.lineEdit_5.raise_() self.lineEdit_7.raise_() self.lineEdit_8.raise_() self.comboBox_2.raise_() self.pushButton_4.raise_() self.widget_4 = QtWidgets.QWidget(Form) self.widget_4.setGeometry(QtCore.QRect(530, 30, 510, 690)) self.widget_4.setStyleSheet("border:1px solid black;") self.widget_4.setObjectName("widget_4") self.lineEdit_6 = QtWidgets.QLineEdit(self.widget_4) self.lineEdit_6.setGeometry(QtCore.QRect(70, 10, 350, 50)) self.lineEdit_6.setStyleSheet("font: 16pt \"宋體\";") self.lineEdit_6.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit_6.setObjectName("lineEdit_6") self.widget_4.raise_() self.widget_3.raise_() self.label2.raise_() self.pushButton.raise_() self.comboBox.raise_() self.pushButton_3.raise_() self.label1.raise_() self.textEdit.raise_() self.textEdit_2.raise_() self.tableWidget.raise_() self.lineEdit_3.raise_() self.lineEdit_4.raise_() self.pushButton_2.raise_() self.pushButton_5.raise_() self.pushButton_6.raise_() self.pushButton_7.raise_() self.lineEdit_2.raise_() self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "YOLOV5檢測")) self.pushButton.setText(_translate("Form", "選擇文件")) self.pushButton_7.setText(_translate("Form", "是否結束")) self.comboBox.setItemText(0, _translate("Form", "檢測方式")) self.comboBox.setItemText(1, _translate("Form", "圖片檢測")) self.comboBox.setItemText(2, _translate("Form", "視頻檢測")) self.comboBox.setItemText(3, _translate("Form", "攝像頭檢測")) self.pushButton_2.setText(_translate("Form", "開始檢測")) self.pushButton_5.setText(_translate("Form", "確定")) self.pushButton_6.setText(_translate("Form", "結束程序")) self.pushButton_3.setText(_translate("Form", "模型路徑")) self.textEdit.setText(_translate("Form", "\n原\n始\n圖\n片\n/\n視\n頻")) self.textEdit_2.setText(_translate("Form", "\n\n\n測\n試\n結\n果")) item = self.tableWidget.verticalHeaderItem(0) item.setText(_translate("Form", "imgsize")) item = self.tableWidget.verticalHeaderItem(1) item.setText(_translate("Form", "conf")) item = self.tableWidget.verticalHeaderItem(2) item.setText(_translate("Form", "iou")) item = self.tableWidget.verticalHeaderItem(3) item.setText(_translate("Form", "dnn")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("Form", "數值")) self.tableWidget.setItem(0,0,QtWidgets.QTableWidgetItem("640")) #圖片大小默認值 self.tableWidget.setItem(0,1,QtWidgets.QTableWidgetItem("0.25")) #置信度閾值默認值 self.tableWidget.setItem(0,2,QtWidgets.QTableWidgetItem("0.45")) #IOU閾值默認值 self.tableWidget.setItem(0,3,QtWidgets.QTableWidgetItem("False")) #IOU閾值默認值 self.lineEdit_3.setPlaceholderText(_translate("Form", "模型的路徑")) self.lineEdit_4.setPlaceholderText(_translate("Form", "圖片或視頻檢測及攝像頭檢測")) self.lineEdit_5.setText(_translate("Form", "參數設置及可視化")) self.lineEdit_7.setPlaceholderText(_translate("Form", "圖片或視頻路徑")) self.pushButton_4.setText(_translate("Form", "其他參數")) self.lineEdit_8.setPlaceholderText(_translate("Form", "運行設備(CPU或GPU)")) self.comboBox_2.setItemText(0, _translate("Form", "設備選擇")) self.comboBox_2.setItemText(1, _translate("Form", "CPU")) self.comboBox_2.setItemText(2, _translate("Form", "GPU")) self.lineEdit_6.setText(_translate("Form", "圖片及測試結果可視化")) self.lineEdit_2.setPlaceholderText(_translate("Form", "是否關閉視頻或者攝像頭"))
三、效果展示
1、圖片效果展示如下:
2、攝像頭或視頻檢測
四、整體代碼:
若界面太大或太小,就自己添加些代碼,將界面自適應電腦,或者手動修改代碼33行。
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file "det.ui"## Created by: PyQt5 UI code generator 5.15.4## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again. Do not edit this file unless you know what you are doing.import sysimport osroot_path=os.path.abspath(os.path.join(os.path.dirname(__file__),".."))sys.path.append(root_path)from PyQt5 import QtCore, QtGui, QtWidgetsimport torchimport cv2from PIL import Image,ImageQtimport numpy as npfrom utils.general import non_max_suppressionfrom utils.general import check_img_size,scale_coordsfrom utils.augmentations import letterboximport osfrom pathlib import Pathfrom utils.plots import Annotator,colorsfrom models.experimental import attempt_loadclass Ui_Form(QtWidgets.QWidget): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(1130, 730) self.stride=64 #檢測結果展示區 self.label2 = QtWidgets.QLabel(Form) self.label2.setGeometry(QtCore.QRect(650, 410, 300, 300)) self.label2.setAlignment(QtCore.Qt.AlignCenter) self.label2.setStyleSheet("border: 1px solid black;") self.label2.setObjectName("label2") #圖片或視頻路徑選擇 self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(50, 310, 160, 30)) self.pushButton.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton.setChecked(False) # 設置開始時的狀態為未選中 self.pushButton.clicked.connect(lambda :self.select_file()) self.pushButton.setObjectName("pushButton") #圖片選擇按鈕 #模式選擇 self.comboBox = QtWidgets.QComboBox(Form) self.comboBox.setGeometry(QtCore.QRect(50, 260, 160, 30)) self.comboBox.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.comboBox.setPlaceholderText("") self.comboBox.setObjectName("comboBox") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.currentIndexChanged.connect(lambda :self.select_mode()) #開始檢測按鈕 self.pushButton_2 = QtWidgets.QPushButton(Form) self.pushButton_2.setGeometry(QtCore.QRect(190, 610, 100, 70)) self.pushButton_2.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.setChecked(False) self.pushButton_2.clicked.connect(lambda :self.vim_show()) self.pushButton_3 = QtWidgets.QPushButton(Form) self.pushButton_3.setGeometry(QtCore.QRect(50, 210, 160, 30)) self.pushButton_3.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.setChecked(False) # 設置開始時的狀態為未選中 self.pushButton_3.clicked.connect(lambda :self.select_modelfile()) self.pushButton_7 = QtWidgets.QPushButton(Form) self.pushButton_7.setGeometry(QtCore.QRect(50, 550, 160, 30)) self.pushButton_7.setStyleSheet("font: 15pt \"宋體\";\n" "border:1px solid black;\n" "background-color:#e1e1e1;") self.pushButton_7.setObjectName("pushButton_7") self.lineEdit_2=QtWidgets.QLineEdit(Form) self.lineEdit_2.setGeometry(QtCore.QRect(230, 550, 220, 30)) self.lineEdit_2.setStyleSheet("border: 1px solid black;") self.lineEdit_2.setObjectName("lineEdit_2") self.label1=QtWidgets.QLabel(Form) self.label1.setGeometry(QtCore.QRect(650, 100, 300, 300)) self.label2.setAlignment(QtCore.Qt.AlignCenter) self.label1.setStyleSheet("border: 1px solid black;") self.label1.setObjectName("label1") self.textEdit = QtWidgets.QTextEdit(Form) self.textEdit.setGeometry(QtCore.QRect(600, 100, 40, 300)) self.textEdit.setLayoutDirection(QtCore.Qt.LeftToRight) self.textEdit.setStyleSheet("border: 1px solid black;\n""font: 15pt \"宋體\";") self.textEdit.setObjectName("textEdit") self.textEdit_2 = QtWidgets.QTextEdit(Form) self.textEdit_2.setGeometry(QtCore.QRect(600, 410, 40, 300)) self.textEdit_2.setStyleSheet("border: 1px solid black;\n""font: 15pt \"宋體\";") self.textEdit_2.setAlignment(QtCore.Qt.AlignHCenter) self.textEdit_2.setObjectName("textEdit_2") self.tableWidget = QtWidgets.QTableWidget(Form) self.tableWidget.setGeometry(QtCore.QRect(230, 370, 221, 170)) self.tableWidget.setStyleSheet("font: 15pt \"宋體\";\n""") self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(1) self.tableWidget.setRowCount(4) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) self.tableWidget.horizontalHeader().setDefaultSectionSize(100) self.tableWidget.horizontalHeader().setMinimumSectionSize(100) self.tableWidget.verticalHeader().setDefaultSectionSize(30) self.lineEdit_3 = QtWidgets.QLineEdit(Form) self.lineEdit_3.setGeometry(QtCore.QRect(230, 210, 220, 30)) self.lineEdit_3.setStyleSheet("border: 1px solid black;") self.lineEdit_3.setObjectName("lineEdit_3") self.lineEdit_4 = QtWidgets.QLineEdit(Form) self.lineEdit_4.setGeometry(QtCore.QRect(230, 260, 220, 30)) self.lineEdit_4.setStyleSheet("border: 1px solid black;") self.lineEdit_4.setObjectName("lineEdit_4") self.widget_3 = QtWidgets.QWidget(Form) self.widget_3.setGeometry(QtCore.QRect(20, 30, 460, 690)) self.widget_3.setStyleSheet("border : 1px solid black;") self.widget_3.setObjectName("widget_3") self.lineEdit_5 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_5.setGeometry(QtCore.QRect(90, 20, 261, 51)) self.lineEdit_5.setStyleSheet("font: 16pt \"宋體\";") self.lineEdit_5.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit_5.setObjectName("lineEdit_5") self.lineEdit_7 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_7.setGeometry(QtCore.QRect(210, 280, 220, 30)) self.lineEdit_7.setStyleSheet("border: 1px solid black;") self.lineEdit_7.setObjectName("lineEdit_7") self.pushButton_4 = QtWidgets.QPushButton(self.widget_3) self.pushButton_4.setGeometry(QtCore.QRect(30, 410, 160, 61)) self.pushButton_4.setStyleSheet("font: 15pt \"宋體\";\n""background-color:#e1e1e1;") self.pushButton_4.setObjectName("pushButton_4") #參數確認按鈕 self.pushButton_5 = QtWidgets.QPushButton(Form) self.pushButton_5.setGeometry(QtCore.QRect(50, 610, 100, 70)) self.pushButton_5.setStyleSheet("font: 15pt \"宋體\";\n""border:1px solid black;\n""background-color:#e1e1e1;") self.pushButton_5.setObjectName("pushButton_5") self.pushButton_5.setChecked(False) self.pushButton_5.clicked.connect(lambda: self.param_show()) #結束檢測按鈕 self.pushButton_6 = QtWidgets.QPushButton(Form) self.pushButton_6.setGeometry(QtCore.QRect(330, 610, 100, 70)) self.pushButton_6.setStyleSheet("font: 15pt \"宋體\";\n" "border:1px solid black;\n" "background-color:#e1e1e1;") self.pushButton_6.setObjectName("pushButton_6") self.pushButton_6.setChecked(False) self.pushButton_6.clicked.connect(lambda: self.end_detect()) self.lineEdit_8 = QtWidgets.QLineEdit(self.widget_3) self.lineEdit_8.setGeometry(QtCore.QRect(210, 120, 220, 30)) self.lineEdit_8.setStyleSheet("border: 1px solid black;") self.lineEdit_8.setObjectName("lineEdit_8") self.comboBox_2 = QtWidgets.QComboBox(self.widget_3) self.comboBox_2.setGeometry(QtCore.QRect(30, 120, 160, 30)) self.comboBox_2.setStyleSheet("font: 15pt \"宋體\";\n""background-color:#e1e1e1;") self.comboBox_2.setPlaceholderText("") self.comboBox_2.setObjectName("comboBox_2") self.comboBox_2.currentIndexChanged.connect(lambda : self.select_device()) self.comboBox_2.addItem("") self.comboBox_2.addItem("") self.comboBox_2.addItem("") self.lineEdit_5.raise_() self.lineEdit_7.raise_() self.lineEdit_8.raise_() self.comboBox_2.raise_() self.pushButton_4.raise_() self.widget_4 = QtWidgets.QWidget(Form) self.widget_4.setGeometry(QtCore.QRect(530, 30, 510, 690)) self.widget_4.setStyleSheet("border:1px solid black;") self.widget_4.setObjectName("widget_4") self.lineEdit_6 = QtWidgets.QLineEdit(self.widget_4) self.lineEdit_6.setGeometry(QtCore.QRect(70, 10, 350, 50)) self.lineEdit_6.setStyleSheet("font: 16pt \"宋體\";") self.lineEdit_6.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit_6.setObjectName("lineEdit_6") self.widget_4.raise_() self.widget_3.raise_() self.label2.raise_() self.pushButton.raise_() self.comboBox.raise_() self.pushButton_3.raise_() self.label1.raise_() self.textEdit.raise_() self.textEdit_2.raise_() self.tableWidget.raise_() self.lineEdit_3.raise_() self.lineEdit_4.raise_() self.pushButton_2.raise_() self.pushButton_5.raise_() self.pushButton_6.raise_() self.pushButton_7.raise_() self.lineEdit_2.raise_() self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "YOLOV5檢測")) self.pushButton.setText(_translate("Form", "選擇文件")) self.pushButton_7.setText(_translate("Form", "是否結束")) self.comboBox.setItemText(0, _translate("Form", "檢測方式")) self.comboBox.setItemText(1, _translate("Form", "圖片檢測")) self.comboBox.setItemText(2, _translate("Form", "視頻檢測")) self.comboBox.setItemText(3, _translate("Form", "攝像頭檢測")) self.pushButton_2.setText(_translate("Form", "開始檢測")) self.pushButton_5.setText(_translate("Form", "確定")) self.pushButton_6.setText(_translate("Form", "結束程序")) self.pushButton_3.setText(_translate("Form", "模型路徑")) self.textEdit.setText(_translate("Form", "\n原\n始\n圖\n片\n/\n視\n頻")) self.textEdit_2.setText(_translate("Form", "\n\n\n測\n試\n結\n果")) item = self.tableWidget.verticalHeaderItem(0) item.setText(_translate("Form", "imgsize")) item = self.tableWidget.verticalHeaderItem(1) item.setText(_translate("Form", "conf")) item = self.tableWidget.verticalHeaderItem(2) item.setText(_translate("Form", "iou")) item = self.tableWidget.verticalHeaderItem(3) item.setText(_translate("Form", "dnn")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("Form", "數值")) self.tableWidget.setItem(0,0,QtWidgets.QTableWidgetItem("640")) #圖片大小默認值 self.tableWidget.setItem(0,1,QtWidgets.QTableWidgetItem("0.25")) #置信度閾值默認值 self.tableWidget.setItem(0,2,QtWidgets.QTableWidgetItem("0.45")) #IOU閾值默認值 self.tableWidget.setItem(0,3,QtWidgets.QTableWidgetItem("False")) #IOU閾值默認值 self.lineEdit_3.setPlaceholderText(_translate("Form", "模型的路徑")) self.lineEdit_4.setPlaceholderText(_translate("Form", "圖片或視頻檢測及攝像頭檢測")) self.lineEdit_5.setText(_translate("Form", "參數設置及可視化")) self.lineEdit_7.setPlaceholderText(_translate("Form", "圖片或視頻路徑")) self.pushButton_4.setText(_translate("Form", "其他參數")) self.lineEdit_8.setPlaceholderText(_translate("Form", "運行設備(CPU或GPU)")) self.comboBox_2.setItemText(0, _translate("Form", "設備選擇")) self.comboBox_2.setItemText(1, _translate("Form", "CPU")) self.comboBox_2.setItemText(2, _translate("Form", "GPU")) self.lineEdit_6.setText(_translate("Form", "圖片及測試結果可視化")) self.lineEdit_2.setPlaceholderText(_translate("Form", "是否關閉視頻或者攝像頭")) #選擇圖片或視頻路徑 def select_file(self): file,_=QtWidgets.QFileDialog.getOpenFileName(None,"選擇文件",os.getcwd(),"All Files(*.jpg;*.png;*.jpeg;*.mp4;*.flv;*.avi;);;Text Files (*.txt)") self.lineEdit_7.setText(file) #選擇模型路徑 def select_modelfile(self): file,_=QtWidgets.QFileDialog.getOpenFileName(None,"選擇文件",os.getcwd(),"All Files(*.pt;*.onnx;*.pth);;") self.lineEdit_3.setText(file) #設備選擇 def select_device(self): device=self.comboBox_2.currentText() #獲取下拉框的信息 self.lineEdit_8.setText(device) #模式選擇 def select_mode(self): mode=self.comboBox.currentText() self.lineEdit_4.setText(mode) #模型初始化 def param_show(self): device = torch.device("cpu" if self.lineEdit_8.text()=="CPU" else "cuda") #設備 modelpath = self.lineEdit_3.text() #模型路徑 self.suffix = Path(modelpath).suffix[1:] if self.suffix == "pt": self.flag=True self.model = attempt_load(modelpath if isinstance(modelpath, list) else modelpath, map_location=device) self.stride = int(self.model.stride.max()) # model stride self.names = self.model.module.names if hasattr(self.model, "module") else self.model.names # get class names if self.lineEdit_8.text() == "GPU": self.model.half() elif self.suffix == "onnx": self.dnn = False self.flag=False if self.dnn: # check_requirements(("opencv-python>=4.5.4",)) self.model = cv2.dnn.readNetFromONNX(modelpath) else: # check_requirements(("onnx", "onnxruntime-gpu" if torch.has_cuda else "onnxruntime")) import onnxruntime self.model = onnxruntime.InferenceSession(modelpath, None) # 后兩項分別為按鈕(以|隔開,共有7種按鈕類型,見示例后)、默認按鈕(省略則默認為第一個按鈕) msg=QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,"消息框", "模型初始化完成,請開始檢測") msg.exec_() #檢測 def vim_show(self): filepath=self.lineEdit_7.text() #文件路徑 detect_mode=self.lineEdit_4.text()#檢測模式 imgsize = int(self.tableWidget.item(0, 0).text()) # 圖片尺寸 conf_thres = float(self.tableWidget.item(1, 0).text()) # 置信度閾值 iou_thres = float(self.tableWidget.item(2, 0).text()) # iou閾值 device = self.lineEdit_8.text() # 設備 if detect_mode=="圖片檢測": #opencv讀圖展示 origin_img=cv2.imread(filepath) if origin_img.shape[0] > origin_img.shape[1]: # h>w orgin_img1 = cv2.resize(origin_img, (int(origin_img.shape[1] * (300 / origin_img.shape[0])-1), 300), cv2.INTER_LINEAR) else: # w>=h orgin_img1 = cv2.resize(origin_img, (300, int(origin_img.shape[0] * (300 / origin_img.shape[1]))-1), cv2.INTER_LINEAR) #圖片預處理 input_img=self.process_img(origin_img,device,imgsize) #推理 result=self.process_inference(origin_img,input_img,conf_thres,iou_thres) #結果展示 if result.shape[0] > result.shape[1]: # h>w img1 = cv2.resize(result, (int(result.shape[1] * (300 / result.shape[0]))-1, 300), cv2.INTER_LINEAR) else: # w>=h img1 = cv2.resize(result, (300, int(result.shape[0] * (300 / result.shape[1]))-1), cv2.INTER_LINEAR) #原圖展示 rgb_img = cv2.cvtColor(orgin_img1, cv2.COLOR_BGR2RGB) qimg = QtGui.QImage(rgb_img.data, rgb_img.shape[1], rgb_img.shape[0], QtGui.QImage.Format_RGB888) self.label1.setPixmap(QtGui.QPixmap.fromImage(qimg)) #結果展示 rgb_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) qimg1 = QtGui.QImage(rgb_img1.data, rgb_img1.shape[1], rgb_img1.shape[0], QtGui.QImage.Format_RGB888) self.label2.setPixmap(QtGui.QPixmap.fromImage(qimg1)) elif detect_mode=="視頻檢測": cap = cv2.VideoCapture(filepath) count = 1 while cap.isOpened(): if count % 2 == 0: ret, frame = cap.read() if ret: if frame.shape[0] > frame.shape[1]: # h>w img = cv2.resize(frame, (int(frame.shape[1] * (300 / frame.shape[0])), 300), cv2.INTER_LINEAR) else: # w>=h img = cv2.resize(frame, (300, int(frame.shape[0] * (300 / frame.shape[1]))), cv2.INTER_LINEAR) input_img = self.process_img(frame, device, imgsize) result = self.process_inference(frame, input_img, conf_thres, iou_thres) if result.shape[0] > result.shape[1]: # h>w img1 = cv2.resize(result, (int(result.shape[1] * (300 / result.shape[0])) - 1, 300), cv2.INTER_LINEAR) else: # h<=w 1="" 2="=" 300="" img1="cv2.resize(result," -="" img="cv2.cvtColor(img," qimg="QtGui.QImage(img.data," rgb1="cv2.cvtColor(img1," qimg1="QtGui.QImage(rgb1.data," else:="" break="" count="" self.cap="cv2.VideoCapture(0)" while="" true:="" if="" 0:="" frame="self.cap.read()" ret:=""> frame.shape[1]: # h>w img = cv2.resize(frame, (int(frame.shape[1] * (300 / frame.shape[0])), 300), cv2.INTER_LINEAR) else: # w>=h img = cv2.resize(frame, (300, int(frame.shape[0] * (300 / frame.shape[1]))), cv2.INTER_LINEAR) input_img=self.process_img(frame,device,imgsize) result=self.process_inference(frame,input_img,conf_thres,iou_thres) if result.shape[0]>result.shape[1]: #h>w img1=cv2.resize(result,(int(result.shape[1]*(300/result.shape[0]))-1,300),cv2.INTER_LINEAR) else: #h<=w img1=cv2.resize(result,(300,int(result.shape[0]*(300/result.shape[1]))-1), cv2.INTER_LINEAR) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) cv2.waitKey(1) qimg = QtGui.QImage(img.data, img.shape[1], img.shape[0], QtGui.QImage.Format_RGB888) self.label1.setPixmap(QtGui.QPixmap.fromImage(qimg)) #結果展示 rgb1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB) qimg1=QtGui.QImage(rgb1.data,rgb1.shape[1],rgb1.shape[0],QtGui.QImage.Format_RGB888) self.label2.setPixmap(QtGui.QPixmap.fromImage(qimg1)) #復位 count=1 if self.lineEdit_2.text()=="是": break else: count += 1 self.cap.release() cv2.destroyAllWindows() #退出程序 def end_detect(self): sys.exit(1) #圖片處理 def process_img(self,org_img,device,imgsize): """ Args: org_img: 原圖 device: 設備 imgsize: 圖片尺寸 Returns: """ # 查看圖片尺寸是否能別stride整除 imgsz = check_img_size(imgsize, s=self.stride) # resize_padding img = letterbox(org_img, imgsz, self.stride, auto=self.flag)[0] img = img.transpose((2, 0, 1))[::-1] # HWC to CHW, BGR to RGB img = np.ascontiguousarray(img) if self.suffix == "onnx": img = img.astype("float32") else: img = torch.from_numpy(img).to(device.lower()) # 設置是否為半精度測試 if device == "GPU": img = img.half() else: img=img.float() img /= 255.0 # 歸一化 if len(img.shape) == 3: img = img[None] return img #推理進程 def process_inference(self,org_img,img,conf_thres,iou_thres): """ Args: org_img: 原圖 img: 縮放后的圖 conf_thres: 置信度閾值 iou_thres: IOU閾值 Returns: """ if self.suffix == "pt": pred = self.model(img)[0] elif self.suffix == "onnx": if self.dnn: self.model.setInput(img) pred = torch.tensor(self.model.forward()) else: pred = torch.tensor(self.model.run([self.model.get_outputs()[0].name], {self.model.get_inputs()[0].name: img})) pred = non_max_suppression(pred, conf_thres, iou_thres, classes=None, agnostic=False, max_det=1000) dt, seen = [0.0, 0.0, 0.0], 0 for i, det in enumerate(pred): seen += 1 im0 = org_img.copy() # 繪制預測框 annotator = Annotator(im0, line_width=3, example=str(1)) # 檢測到目標時 if len(det): det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # 寫結果 for *xyxy, conf, cls in reversed(det): c = int(cls) # label = f"{conf:.2f}" label = f"{self.names[c]} {conf:.2f}" annotator.box_label(xyxy, label, color=colors(c, True)) im0 = annotator.result() # cv2.imwrite(save_path + os.sep + Path(img_path).name, im0) return im0if __name__ == "__main__": import sys QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) # 解決了Qtdesigner設計的界面與實際運行界面不一致的問題 app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(widget) widget.show() sys.exit(app.exec_())
總結
以上就是本篇文章的全部內容,歡迎評論區指正錯誤,也可加入QQ群:995760755交流。
標簽:
相關推薦:
精彩放送:
- []廣西文旅產業簽約6個重大項目 計劃總投資額達113.6億元
- []今日看點:五礦地產獲授7.8億港元循環貸款額度
- []千紅制藥:公司臨床階段新藥各項工作均在正常推進中,請關注公司定期報告與臨時公告
- []世界信息:三湘印象擬非公開發行股票,募集資金總額不超16億元
- []天天速遞!12月LPR連續4個月維持不變:1年期3.65%、5年期4.30%
- []利民股份:公司子公司江蘇卓邦新能源科技有限公司擬投資建設新能源電池用電解質鹽、功能添加劑及電解液項目
- []每日視點!華夏幸福:相關債務置換議案獲董事會通過
- []當前看點!三木集團:公司的經營一切正常
- []旅游年票發行大勢所趨,專家:要體現出誠意
- []【新要聞】重慶九龍坡區落戶13個重點項目 總投資139.23億元
- []環球聚焦:住建部:1-10月老舊小區改造開工率已達101.7%
- []旭輝將配售8.4億股現有股份 所得款凈額約9.46億港元
- []大消息!500強金融巨頭罕見出手,50億拿下上海外灘核心地塊
- []全球熱點評!廣東肇慶1宗商住地將于2023年1月5日出讓 起價1.2億元
- []世界百事通!深圳機場啟動物流設施建設項目 總投資超50億元
- []天天訊息:新致軟件:本次可轉債的募投項目正在按既定計劃推進,具體進度請關注公司相關公告
- []天天速讀:首都機場:尤為艱難
- []公攤面積內衛生間“消失”,業主起訴房地產公司獲賠償
- []房產中介推銷“添油加醋” 購房者需提高警惕
- []焦點短訊!塔里木油田向新疆南部累計供氣500億立方米
- []今日熱聞!道通科技數字能源中國區產品發布會擬于12月22日舉行
- []動態:新疆為何能成為中國電力新高地?
- []環球信息:上海實業控股46.08億出售上海實森90%股權及相關債權予友邦人壽
- []全球快播:車損包括哪些險種
- []不買交強險上路會怎樣 上路車輛不買交強險會怎樣
- []賦能電力數字化多樣場景 ——深信服云邊安一體化建設方案助力發電行業數字化轉型
- []要聞:網上交車保險怎么辦理 如何在網上交車險
- []儲能電池主要應用在哪些地方?
- []世界快消息!棗莊99元的惠民保險在哪里買 在哪里買棗莊99元的惠民保險
- []實時:怎么查詢自己車輛保險是哪個公司 自己車輛保險是哪個公司怎么查詢
- []滾動:因現行市況 達美樂中國特許經營商達勢股份延遲全球發售
- []華發股份選舉李偉杰為第十屆監事會監事長?
- []今頭條!美股盤前:特斯拉升逾3% 中概股輕微上升 阿里升逾3%
- []拓新藥業:12月16日公司高管蔡玉瑛、渠桂榮、董春紅減持公司股份合計11.14萬股
- []今日聚焦!土地周報 | 重點城市土地供應“斷檔”,市場熱度繼續下行(12.12-12.18)
- []快報:遠洋集團與郵儲銀行簽署全面戰略合作協議 獲180億元授信額度
- []全球觀焦點:房地產逆周期之下,貝殼如何詮釋“堅持難而正確的事”?
- []環球快報:道道全:12月16日公司高管張軍減持公司股份合計6.5萬股
- []九典制藥:12月16日公司高管段立新減持公司股份合計15.51萬股
- []中國建筑1-11月地產業務合約銷售額3484億元
- []全球今熱點:三湘印象擬非公開發行股票 募集資金總額不超過16億
- []全球最資訊丨璞泰來:12月16日至12月19日公司高管陳衛增持公司股份合計3.25萬股
- []全球微動態丨廣東東莞4宗地塊56億成交,華潤聯合體29億斬獲交椅灣地塊
- []當前消息!萬科董事會審議通過發行境外上市外資股(H股)方案
- []【全球報資訊】統聯精密:12月16日公司高管楊虎增持公司股份合計5000股
- []龍軟科技:12月15日公司高管任永智減持公司股份合計1.24萬股
- []中交地產:3個交易日收盤價漲幅累計20%,無應披未披重大事項
- []焦點關注:天津第四批供地收官:24宗地收金99.8億元,僅2宗溢價成交
- []直播預告|一起來看旅游業“神仙打架”名場面!
- []今日報丨南都電源:公司股東人數請參見公司定期報告
- []當前快訊:快訊丨華發股份:選舉李偉杰任監事長
- []前11個月上海商品房銷售面積約1526萬平方米
- []世界今頭條!家居丨奧普家居:回購注銷限制性股票合計279.8萬股
- []財面兒丨大悅城完成發行15億元公司債券 票面利率為4.27%
- []【世界新要聞】昊華能源虛假陳述案開庭 投資者索賠金額已超億元
- []名臣健康:12月16日公司高管彭小青減持公司股份合計27.9萬股
- []簡訊:招商局蛇口36.4億元公司債將上市 利率分別為2.40%、2.80%
- []世界觀點:首開股份:完成發行10億元中期票據 票面利率5%
- []全球報道:金逸影視: 公司暫未涉及上述業務。 祝您生活愉快,投資順利!
- []天天視訊!新希望地產累計獲綜合授信超480億元
- []實時:北上廣深等13市共同發布《城市治理現代化北京宣言》
- []當前簡訊:洲明科技:公司具體產量、銷量及投產情況詳見公司于巨潮資訊網披露的定期報告及相關公告
- []當前視訊!金科股份:截至 2022年11月末,公司已到期未支付的債務本金合計金額90.91億元
- []徽商期貨榮獲和訊第20屆中國財經風云榜“2022年度品牌影響力期貨公司”
- []2元20片退燒藥沖上熱搜第一 股價一字漲停!東北制藥的背后是...?
- []嶺南控股:截至目前,公司的控股子公司廣州廣之旅國際旅行社股份有限公司的出入境旅游組團業務尚未恢復
- []每日觀點:金融街威斯汀酒店30.01億元資產支持ABS已獲受理
- []每日視訊:中鐵建設創業大廈6.7億元資產支持ABS(類REITs)已獲受理
- []深圳南山將再發2億元消費券,推出近百場線上線下促消費活動
- []通訊!中海企業發展30億元公司債券票面利率為2.7%
- []全球熱頭條丨襄陽住房投資10億元公司債券已獲受理
- []【環球播資訊】【券商聚焦】中信證券指地產市場拐點有望顯現 推薦萬科企業(02202)等優秀開發企業
- []ST三圣:百康藥業暫無擴產計劃,將全力保障生產經營,滿足目前市場需求
- []至純科技:公司8寸涂膠顯影設備正在驗證中
- []世界簡訊:天津四批次集中供地收官,全年總成交額315億元
- []迪馬股份:陳涵辭任公司副總裁職務
- []環球觀點:上周樓市整體環比略有上漲,同比持續下降,土地供求環比走高,宅地成交量增近三成
- []得利斯:今年以來,預制菜產品銷量較去年同期有較大幅度增長
- []每日熱文:夢潔股份:公司實施高端品牌戰略,為顧客提供高品質的家居生活方式,傳導充滿愛的家居生活態度
- []全球熱推薦:通行寶:公司近日暫無資產出售和收購重組等的計劃,后續信息請以公司公告為準
- []達安基因:公司全資子公司中山生物工程有限公司已進入24小時持續生產狀態中,已經面向國內市場銷售
- []【天天快播報】市場看漲情緒高漲,2022年黃金有望強勁收官!
- []環球即時:美原油交易策略:下行趨勢線壓制明顯,提防進一步下探風險
- []當前時訊:12月19日匯市觀潮:歐元、英鎊和日元技術分析
- []環球熱點!蜂巢能源第三屆電池日發布超300Ah大容量儲能電池引領新風向
- []熱點評!現貨黃金交易策略:美聯儲進一步加息前景抵消美元走軟影響,金價仍有見頂風險
- []【華安期貨】貴金屬12月18日周報:12月加息落地,金價延續偏強態勢
- []每日播報!國產客機再入印尼,能否雪恥撲朔迷離
- []信息:北京大部分酒店已恢復承辦婚宴、公司年會,接受年夜飯預訂
- []當前通訊!長三角鐵路多地客流增幅明顯,加開多個方向旅客列車保障出行
- []天天速看:民航:明年1月初先恢復到疫情前七成航班量
- []當前熱文:上千條魚涌入柏林市中心,麗笙酒店內世界最大圓柱水族箱炸裂
- []全球頭條:12月19日海源復材漲停分析:蔚來汽車概念股,寧德時代概念股,碳纖維概念熱股
- []全球熱點!12月19日全 聚 德漲停分析:餐飲,預制菜,休閑食品概念熱股
- []天天速讀:上海松江今年推出1701套公租房
- []博眾精工:牽手蜂巢能源 疊片機設備領域將極具競爭優勢
- []每日熱門:中交地產:10億元公司債券票面利率為5.9%
- []阿根廷斬獲大力神杯 海信電視見證梅西圓夢卡塔爾
- []全球速看:浙江義烏3宗地塊40.9億元成交
- []天天快消息!合景泰富擬配售2.35億股 籌資4.67億港元
- B站注冊資本增幅400%至5億 目前由陳睿全資持股
- 光源資本出任獨家財務顧問 沐曦集成電路10億元A輪融資宣告完成
- 巨輪智能2021年上半年營收11.24億元 期內研發費用投入增長19.05%
- 紅棗期貨尾盤拉升大漲近6% 目前紅棗市場總庫存約30萬噸
- 嘉銀金科發布2021年Q2財報 期內凈利潤達1.27億元同比增長208%
- 成都銀行2021上半年凈利33.89億元 期內實現營收同比增長17.27億元
- 汽車之家發布2021年第二季度業績 期內新能源汽車品牌收入增長238%
- 中信銀行上半年實現凈利潤290.31億元 期末不良貸款余額706.82億元
- 光伏概念掀起漲停潮交易價格創新高 全天成交額達1.29億元
- 上半年生物藥大增45% 關鍵財務指標好轉營收賬款持續下降
- 越秀地產上市30年,高質量發展再謀新篇
- 環球資訊:12月19日悅心健康漲停分析:養老產業,裝修裝飾,口腔概念熱股
- 全球信息:12月19日黑芝麻漲停分析:鋰電池,新能源汽車,休閑食品概念熱股
- 利德治療儀 多年良心價格回報客戶
- 梅西加冕!海信電視為潘帕斯雄鷹喝彩
- 觀速訊丨install安裝命令的常見用法 install有哪些優點?
- 天天快看點丨vue怎么引入阿里巴巴圖標?引入的方法教程
- 世界熱頭條丨英偉達開發板中的編譯系統 能否在ZC706的板子上執行?
- 全球今亮點!sprintf函數是什么?sprintf函數用法的詳解
- 全球快播:什么是黑蘋果系統?黑蘋果Mac系統安裝教程
- 今日精選:Linux命令之restore命令 使用語法及參數說明
- 報道:ICMP是什么意思?ICMP的詳解
- 世界消息!Steam賬號怎么注冊?Steam賬號注冊流程
- 【世界快播報】深入理解BootStrap--面板panel BootStrap的原理分析
- 【環球熱聞】杳無音信拼音怎么讀?杳無音信的含義
- 送嬰兒選什么禮物好?送嬰兒禮物排行榜
- 當前報道:什么是audit? audit可以用來干什么?
- 當前熱議!什么是 “云”?云的最后形成
- group by是什么意思?關于group by的用法和原理
- 全球消息!好萊塢十大最可愛的女演員是誰?瑪麗昂歌迪亞僅排末尾
- 天天熱議:【音頻】syntax How to Write Custom Syntax
- JAVA的forEach用法是什么?JAVA的forEach的格式
- 【環球播資訊】大蛇丸的兒子的母親 大蛇丸的老婆是誰?
- 環球滾動:戰地4配置要求有哪些?推薦幾個戰地4配置
- 世界球精選!石家莊核酸檢測20-22號完成 24號低風險區域會讓出門嗎?
- 天天即時看!QPS是什么?QPS的計算方法
- 全球今亮點!box-shadow屬性語法 box-shadow屬性詳解
- 微頭條丨咐組詞和拼音是什么?咐怎么讀?
- linux中常用的sftp命令有哪些?sftp介紹
- 即時焦點:youbastard怎么發音?youbastard的含義
- 世界速遞!sql中的left join 查詢 left join之后的記錄有幾條?
- 全球觀點:瘦金體由誰所創?關于瘦金體由誰所創的介紹
- 如何禁用Windows期自動更新?禁用方法步驟
- 全球信息:乘風破浪的姐姐四公淘汰了誰?乘風破浪的姐姐復活名單
- 環球報道:泰山門票多少錢一張2022 泰山門票價格
- 環球速遞!Windows 10怎么重新安裝微軟商店Microsoft Store?方法步驟
- 天天熱訊:《愛的厘米》好看嗎?佟麗婭佟大為撒狗糧 郭家銘與男主再續兄弟情
- 世界熱議:林丹的個人資料曝光 林丹是誰?
- 視焦點訊!索愛手機w800c怎么樣?索愛手機w800c綜合評測與最新報價
- 環球熱資訊!王力宏被娃哈哈解約后 看到他隨身攜帶的水太佩服
- 環球實時:長絲巾有哪些系法?長絲巾的系法圖解
- 世界通訊!捷安特770d怎么樣?捷安特770d詳細評測
- 硬盤s.m.a.r.t指標數據異常修復工具 硬盤的s m a r t指標數據異常怎么修復?
- 311是什么意思?關于311的詳情介紹
- 世界簡訊:HTC One X Recovery一鍵刷入步驟介紹 HTC One X Recovery一鍵刷入教程
- 當前快報:htc是什么牌子?htc手機的評測
- 環球熱資訊!臺式機硬盤報價如何?臺式機硬盤尺寸
- 世界報道:羽毛球奧運冠軍都有誰?國羽男子奧運冠軍排名
- 全球球精選!諾亞舟np360學習機怎么樣?諾亞舟np360性能介紹
- 定位賽10連勝什么段位?LOL S5定位賽勝率高為什么沒有上段?
- 即時焦點:三星9050好不好?三星9050如何刷機?
- 世界時訊:純甲類功放價格參考及其介紹 純甲類功放的價格
- 世界快看點丨聯想S890支持什么視頻格式?聯想S890支持RMVB播放嗎?
- 操作系統有哪些類型?操作系統的特點是什么?
- 世界熱文:手機鋼化膜哪個品牌質量好?手機鋼化膜的優缺點是什么?
- 死或生5最后一戰怎么反擊?死或生5最后一戰反擊技巧攻略
- 環球視點!諧波減速機優點是什么?齒輪式怎么滾動?
- 焦點快報!計算機主板結構你了解多少?計算機主板的分類
- 報道:計算機撥號連接無法建立連接怎么辦?電信撥號上網連接不上的解決方法
- 怎么用電腦攝像頭錄像?電腦攝像頭錄像的使用方法
- APP(ios、Android)實現充值的方案 ios中充值功能的2種方案
- 暴風影音如何倍速播放?暴風影音倍數播放的方法
- Cubase延音踏板怎么設置?Cubase延音踏板設置延音效果
- 瀏覽器市場占有率排行表 2020年8月國內瀏覽器排行
- 【環球新要聞】人工智能算法是什么?簡化圖形文件
- 環球微動態丨光電耦合器是什么?光電耦合器工作原理詳解
- 焦點簡訊:百度云盒怎么預約購買?電視應用購買教程
- 全球微頭條丨vice versa是什么意思?vice versa通常翻譯
- 【環球報資訊】咸魚Maya筆記 Maya界面是怎么組成的?
- 520還在畫玫瑰?教你用MATLAB畫個玫瑰花球
- 賓得鏡頭簡介 鏡頭術語都有哪些?
- 世界熱門:百度如何清除搜索框內的搜索歷史記錄?清除歷史記錄
- 小米與華為手機哪個好些?小米與華為手機詳細評測
- 華為榮耀4C詳細評測 再次刷新安卓手機性價比
- 世界新動態:人生中的第一個Java程序:HelloWorld
- 世界視點!arp防火墻哪個最好?風云arp防火墻的基本介紹
- 聯想服務器linux系統raid驅動 IntelRAID 6.12版RAID卡驅動官方正式版下載
- 環球觀速訊丨有哪些好看的電影推薦?吐血推薦250部必看電影
- 微動態丨我們為什么要上學?奧巴馬開學演講稿
- 環球熱點!我的世界android制作教程 我的世界怎么去月球?
- 當前滾動:安卓怎么開啟啟動模式?Android四種啟動模式
- 當前速讀:南陽五中2021年高考成績查詢時間 南陽市五中舉行2021年春期開學典禮
- 世界訊息:E. Border是什么?拓展歐幾里得+mod分析
- 世界微資訊!電阻式觸摸屏好用嗎?電阻式觸摸屏工作原理
- 實時:AssemblyInfo.cs文件的作用是什么?AssemblyInfo.cs文件詳情
- 焦點熱訊:小眾國度酒店,如何異國生長?
- 世界時訊:中國鐵建轉讓蘇州京發地產30%股權 廣州新鐵鑫建接盤
- 今日播報!富臨運業:截至2022年12月9日,公司股東人數為24,367人
- 華盛昌:公司正在積極推進呼吸機產品的國內醫療注冊認證相關事宜
- 焦點播報:南雄長和物業擬轉讓南雄市壹城物業30%股權 底價30萬元
- 全球信息:全國畜牧總站掛牌北京元立物業100%股權 轉讓底價為165萬元
- 普利制藥:當前公司生產及產能利用率情況正常,在建產能達到GMP標準的可使用狀態后公司將進行商業化產投
- 每日快報!長株潭煙草物流園100%股權及2.32億債權被掛牌 底價3.67億
- 重點聚焦!上海茶葉進出口公司掛牌渠晨地產20%股權 底價1095萬元
- 環球快播:三立期貨12月19日早間內參——宏觀
- 濟南城建集團擬發7億元公司債 利率詢價區間為3%-4.8%
- 偉創電氣:公司今年1-9月海外收入同比增長149.19%,后期數據敬請關注公司定期報告
- 最新快訊!華紡股份:公司嚴格遵照中國證監會、上海證券交易所對信息披露的要求披露公司相關信息,請,敬請諒解
- 天天看熱訊:眾泰要把車賣到中東!計劃銷售10000臺,總價近7億
- 世界最資訊丨衡水保衡房地產16.81億摘得常山北明旗下原棉二分公司廠區用地