看热讯: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亿摘得常山北明旗下原棉二分公司厂区用地