pyqt5+yolo模型+多线程

界面开发

开发主窗口界面


from PyQt5 import QtWidgets
from PyQt5 import QtCore,QtGui
import sys

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.toolbar()
        
        # 创建菜单栏
    def initUI(self):
        menubar = self.menuBar()
        file_menu = menubar.addMenu('文件')
        open_action = QtWidgets.QAction('打开', self)
        file_menu.addAction(open_action)
        save_action = QtWidgets.QAction('保存', self)
        file_menu.addAction(save_action)
        open_action.triggered.connect(self.click_word_file)
        
        self.setWindowTitle("人脸识别系统")
        from main_panel import Mean_tool_demo
        self.myPanel = Mean_tool_demo()
        self.setCentralWidget(self.myPanel)
        self.setMinimumSize(900,720)

    	# 创建工具栏
    def toolbar(self):
        toolbal = QtWidgets.QToolBar("快捷窗口")
        self.addToolBar(toolbal)
        cricle_btn = QtWidgets.QAction("画圆",self)
        cricle_btn.setStatusTip("画圆")
        cricle_btn.setShortcut("Ctrl+C")
        cricle_btn.triggered.connect(self.print_c)
        toolbal.addAction(cricle_btn)
    
    def print_c(self):  # 快捷键的使用
        print(111111)

    def click_word_file(self):
        fileinfo = QtWidgets.QFileDialog.getOpenFileName(self,"打开文件",".","Image files(*.jpg *.png *.bmp)")
        file_name = fileinfo[0]
        if file_name != '':
            # main_win1 = Mean_tool_demo()
            self.myPanel.image_path = file_name
            self.myPanel.image_path_label.setText("当前图像路径:"+file_name)
            new_pixmap = QtGui.QPixmap(file_name)
            pix = new_pixmap.scaled(QtCore.QSize(800,800),QtCore.Qt.KeepAspectRatio) 
            self.myPanel.image_label.setAlignment(QtCore.Qt.AlignCenter)
            self.myPanel.image_label.setPixmap(pix)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_win = MainWindow()
    main_win.setStyleSheet("background - color: lightblue;")
    main_win.show()
    app.exec_()

pannel界面展示

from PyQt5 import QtWidgets
from PyQt5 import QtCore,QtGui
import sys
import os,time
import cv2
# 创建视频处理的独立线程
# TODO: 处理视频时,将视频添加到表格中 出现线程报错为问题,需要解决!!!!!
from threading import Thread

os.environ['KMP_DUPLICATE_LIB_OK']='True'
from ultralytics import YOLO
from table_view import Mydata_model

head1 = ["序号","文件路径","目标编号","类别","置信度","位置坐标"]
data1 = [['示例:1',15,15,4,8,1]]

class Mean_tool_demo(QtWidgets.QWidget):   
    def __init__(self):
        super().__init__()
        # 创建文件夹
        self.root_path = self.root_path()
        self.count = 1

        self.image_ = [] 
        self.yolo_things = []
        self.cute_image_ = []
        self.run_type_control = -1
		
		# 加载yolo模型进行预测
        self.yolo_model = YOLO('./pyqt5_YOLO_model/yolov3-tinyu.pt')
        self.image_save_path = None
        self.image_path = f'D:\\images\\car.png'

        all_vbox = QtWidgets.QVBoxLayout()
        all_vbox.addWidget(self.header_format())
        all_vbox.addWidget(self.down_format())
        all_vbox.addStretch(1)
        self.setLayout(all_vbox)
        
        # 每次创建新的窗口界面,自动创建新的文件及存储路径进行文件的保存
    def root_path(self):
        name = "exp_1"
        path = "./pyqt5_YOLO_model/data"
        for root,dir,files in os.walk(path):
            # 文件夹的创建
            if root == path :
                file_path = os.path.join(root,name)
                if not os.path.exists(file_path):
                    os.mkdir(file_path)
                else:
                    n = len(dir)
                    file_path = os.path.join(root,f"exp_{n+1}")
                    if not os.path.exists(file_path):
                        os.mkdir(file_path)
        return file_path
    # 上层结构
    def header_format(self):
        self.image_label = QtWidgets.QLabel()
        image = cv2.imread(self.image_path) 
        image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) 
        h,w,c = image.shape
        img = QtGui.QImage(image.data,w,h,w*3,QtGui.QImage.Format_RGB888)  
        pixmap = QtGui.QPixmap(img)
        pix = pixmap.scaled(QtCore.QSize(600,600),QtCore.Qt.KeepAspectRatio)    
        self.image_label.setPixmap(pix)
        self.image_label.setAlignment(QtCore.Qt.AlignCenter)

        self.image_label2 = QtWidgets.QLabel()
        image1 = cv2.imread(self.image_path) 
        image1 = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) 
        h,w,c = image1.shape
        img1 = QtGui.QImage(image1.data,w,h,w*3,QtGui.QImage.Format_RGB888)  
        pixmap1 = QtGui.QPixmap(img1)
        pix1 = pixmap1.scaled(QtCore.QSize(600,600),QtCore.Qt.KeepAspectRatio)    
        self.image_label2.setPixmap(pix1)
        self.image_label2.setAlignment(QtCore.Qt.AlignCenter)

        # # 创建一个水平布局管理器
        btnPane1 = QtWidgets.QGroupBox("原图像")  
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(self.image_label)
        btnPane1.setLayout(hbox)

        # # 创建一个水平布局管理器
        btnPane2 = QtWidgets.QGroupBox("YOLO处理后图像")  
        hbox1 = QtWidgets.QHBoxLayout()
        hbox1.addWidget(self.image_label2)
        btnPane2.setLayout(hbox1)

        # # 创建一个水平布局管理器
        btnPane3 = QtWidgets.QGroupBox("图像界面显示器")  
        hbox2 = QtWidgets.QHBoxLayout()
        hbox2.addWidget(btnPane1)
        hbox2.addWidget(btnPane2)
        btnPane3.setLayout(hbox2)
        
        return btnPane3
    # 表格的参数控制
    def left_down_format(self):
        self.table_layout = QtWidgets.QTableView()
        self.model = Mydata_model(data1,head1)
        self.table_layout.setModel(self.model)
        # 对表格的size进行自动调整
        self.table_layout.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.table_layout.horizontalHeader().setVisible(True)
        self.table_layout.verticalHeader().setVisible(True)
        self.table_layout.resizeColumnsToContents()
        self.table_layout.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.table_layout.horizontalHeader().setVisible(True)
        self.table_layout.verticalHeader().setVisible(True)
        self.table_layout.resizeColumnsToContents()
        # 设置表头显示风格
        header = self.table_layout.horizontalHeader()
        header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        header.setStyleSheet("background-color:black;color:red")

        # 添加单选处理
        # self.table_layout.clicked.connect(self.on_select_row)   # 点击表格进行窗口弹出
        self.table_layout.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
        self.table_layout.setSelectionMode(QtWidgets.QTableWidget.SingleSelection)
        self.table_layout.setMinimumSize(500,500)   # 设置表格自动调整最小尺寸    

        table_view_window = QtWidgets.QGroupBox("表格显示框")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.table_layout)
        table_view_window.setLayout(vbox)

        # self.update_timer = QtCore.QTimer()  
        # self.update_timer.timeout.connect(self.on_first_table)  
        # self.update_timer.start(50)
        return table_view_window
    # 右下角的按钮
    def righr_down_format(self):
        # 设置字体
        # 设置label字体
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)   # 字体加粗
        
        btn1_open_image = QtWidgets.QPushButton("🧩打开图像")
        btn1_open_image.setFixedSize(150,50)
        btn1_open_image.setFont(font)
        btn1_open_image.clicked.connect(self.click_button_image_file)
        btn1_open_image.setStyleSheet("background-color:orgian;color:white")
        btn2_open_video = QtWidgets.QPushButton("📽️打开视频")
        btn2_open_video.setFixedSize(150,50)
        btn2_open_video.setFont(font)
        btn2_open_video.clicked.connect(self.click_button_video_file)
        btn2_open_video.setStyleSheet("background-color:orgian;color:white")
        btn3_open_came = QtWidgets.QPushButton("📽️打开摄像头")
        btn3_open_came.setFixedSize(150,50)
        btn3_open_came.setFont(font)
        btn3_open_came.clicked.connect(self.click_button_camera)
        btn3_open_came.setStyleSheet("background-color:orgian;color:white")
        btn4_cute_image = QtWidgets.QPushButton("📂图像解析")
        btn4_cute_image.setFixedSize(150,50)
        btn4_cute_image.setFont(font)
        btn4_cute_image.setStyleSheet("background-color:orgian;color:white")
        btn4_cute_image.clicked.connect(self.click_button_cute_image)
        btn5_save_image = QtWidgets.QPushButton("📴保存文件")
        btn5_save_image.setFixedSize(150,50)
        btn5_save_image.setFont(font)
        btn5_save_image.setStyleSheet("background-color:orgian;color:white")
        btn5_save_image.clicked.connect(self.click_button_save_image)  # 保存csv文件
        btn6_close = QtWidgets.QPushButton("❎退出")
        btn6_close.setFixedSize(150,50)
        btn6_close.setFont(font)
        btn6_close.clicked.connect(self.click_button_close)
        btn6_close.setStyleSheet("background-color:orgian;color:white")

        title1 = QtWidgets.QWidget()
        hboxlayouott1 = QtWidgets.QHBoxLayout()  
        hboxlayouott1.addWidget(btn1_open_image)
        hboxlayouott1.addWidget(btn2_open_video)
        title1.setLayout(hboxlayouott1)
        
        title2 = QtWidgets.QWidget()
        hboxlayouott2 = QtWidgets.QHBoxLayout()  
        hboxlayouott2.addWidget(btn3_open_came)
        hboxlayouott2.addWidget(btn4_cute_image)
        title2.setLayout(hboxlayouott2)
        
        title3 = QtWidgets.QWidget()
        hboxlayouott3 = QtWidgets.QHBoxLayout()  
        hboxlayouott3.addWidget(btn5_save_image)
        hboxlayouott3.addWidget(btn6_close)
        title3.setLayout(hboxlayouott3)

        title4 = QtWidgets.QGroupBox("操作")
        vboxlayouott = QtWidgets.QVBoxLayout()  
        vboxlayouott.addWidget(title1)
        vboxlayouott.addWidget(title2)
        vboxlayouott.addWidget(title3)
        title4.setLayout(vboxlayouott)
        
        return title4
    # 下部窗口
    def down_format(self):
        btnPane3 = QtWidgets.QWidget()
        hboxlayouott = QtWidgets.QHBoxLayout()  
        hboxlayouott.addWidget(self.left_down_format())
        hboxlayouott.addWidget(self.righr_down_format())
        btnPane3.setLayout(hboxlayouott)

        return btnPane3

    def on_select_row(self):
        QtWidgets.QMessageBox.information(self,"提示","当前行数为:"+str(self.table_layout.currentIndex().row()))
        print(self.table_layout.currentIndex())
        pass

    # 进行表格数据的保存
    def click_button_save_image(self):
        self.model.save_table_data(self.root_path)
        

    # def mousePressEvent(self, event):
    #     if event.button() == QtCore.Qt.LeftButton:
    #         self.save_csv_data = Save_image_data(self.cute_image_,self.root_path,parent=self)  # 将主页面的数据传入线程中
    #         # self.save_csv_data.py_clicked.connect(self.save_csv_data_slot)   # 信号传输后进行cute图像以及信息进行读取存储
    #         self.save_csv_data.start() 
    #         print("鼠标左键被点击")

    def click_button_image_file(self):
        self.run_type_control = 1
        self.image_.clear() 
        # 对btn1_image进行事件绑定
        path = "./pyqt5_YOLO_model"
        fileinfo = QtWidgets.QFileDialog.getOpenFileName(self,"打开文件",path,"Image files(*.jpg *.png *.bmp)")
        file_name = fileinfo[0]
        if file_name != '':
            image = cv2.imread(file_name)  # BGR 格式
            image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)  # 变换色彩通道  转换成RGB图像
            image = cv2.resize(image,(300,300))
            self.image_.append(image)    # 将图像制作成全局变量
            h,w,c = image.shape 
            img = QtGui.QImage(image.data,w,h,w*3,QtGui.QImage.Format_RGB888)   # 图像数据、w,h,字节,Format_RGB888
            new_pixmap = QtGui.QPixmap(img)
            pix = new_pixmap.scaled(QtCore.QSize(300,300),QtCore.Qt.KeepAspectRatio) 
            self.image_label.setAlignment(QtCore.Qt.AlignCenter)
            self.image_label.setPixmap(pix)
        else:
            QtWidgets.QMessageBox.warning(self,"提示","未选择文件")
            return
    def click_button_video_file(self):
        path = "./pyqt5_YOLO_model"
        self.run_type_control = 2
        # 设置一个定时器进行图像的永动循环读取
        fileinfo = QtWidgets.QFileDialog.getOpenFileName(self,"打开视频文件",path,"视频文件(*.mp4)")
        file_name = fileinfo[0]
        if file_name != '':
            self.capture = cv2.VideoCapture(file_name)
            # 设置计时器
            self.timer_id = QtCore.QTimer()
            self.timer_id.timeout.connect(self.play_video)
            self.timer_id.start(50)
        else:
            QtWidgets.QMessageBox.warning(self,"提示","未选择文件")
            return
    def click_button_camera(self):
        self.run_type_control = 3

        self.capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
        if not self.capture.isOpened():
            QtWidgets.QMessageBox.warning(self,"提示","摄像头打开失败")
            exit()
        else:
            self.capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)   # cap_dsshow 更快的打开摄像头
            # 设置计时器
            self.timer_id = QtCore.QTimer()
            self.timer_id.timeout.connect(self.play_video)
            self.timer_id.start(50)
    def play_video(self): 
        self.image_.clear() 
        index ,frame = self.capture.read()
        if not index:
            self.timer_id.stop()
            return
        frame = cv2.resize(frame,(300,300))
        frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
        h,w,c = frame.shape
        img = QtGui.QImage(frame.data,w,h,w*3,QtGui.QImage.Format_RGB888)
        new_pixmap = QtGui.QPixmap(img)
        pix = new_pixmap.scaled(QtCore.QSize(300,300),QtCore.Qt.KeepAspectRatio)
        self.image_label.setAlignment(QtCore.Qt.AlignCenter)
        self.image_label.setPixmap(pix)
        if not self.image_ :
            self.image_.append(frame)
    def click_button_cute_image(self):
        # image处理没有问题 可以实现 数据处理 并在excel中显示
        if self.run_type_control == 1:
            frame = self.image_.pop(0)
            frame1 = self.yolo_model(frame)[0]
            frame = frame1.plot(line_width = 1)
            frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
            h,w,c = frame.shape
            img = QtGui.QImage(frame.data,w,h,w*3,QtGui.QImage.Format_RGB888)
            new_pixmap = QtGui.QPixmap(img)
            pix = new_pixmap.scaled(QtCore.QSize(300,300),QtCore.Qt.KeepAspectRatio)
            self.image_label2.setAlignment(QtCore.Qt.AlignCenter)
            self.image_label2.setPixmap(pix)

            # 图像的保存
            frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
            path = os.path.join(self.root_path,"{}.jpg".format(self.count))
            cv2.imwrite(path,frame)
            self.count +=1

            # 坐标信息在excel中进行显示
            self.yolo_things.append(frame1[0].boxes.data)
            self.save_tingeg()

        elif self.run_type_control == 2 or self.run_type_control == 3:
        # 启动视频处理的独立线程
            Thread(target=self.cute_video,daemon=True).start()   # 无问题
            Thread(target=self.save_csv_data_slot,daemon=True).start()   # 无问题
            Thread(target=self.save_tingeg,daemon=True).start()  

    # 视频处理
    def cute_video(self):
        # 导入yolo模型进行图像数据的解析
        while True:
            if not self.image_:
                continue
            else:
                frame = self.image_.pop(0)
                frame1 = self.yolo_model(frame)[0]
                frame = frame1.plot(line_width = 1)
                frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
                h,w,c = frame.shape
                img = QtGui.QImage(frame.data,w,h,w*3,QtGui.QImage.Format_RGB888)
                new_pixmap = QtGui.QPixmap(img)
                pix = new_pixmap.scaled(QtCore.QSize(300,300),QtCore.Qt.KeepAspectRatio)
                self.image_label2.setAlignment(QtCore.Qt.AlignCenter)
                self.image_label2.setPixmap(pix)
                
                if not self.cute_image_ or not self.yolo_things:
                    frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
                    self.cute_image_.append(frame)
                    self.yolo_things.append(frame1[0].boxes.data)
                              
    # 将图像保存到本地
    def save_csv_data_slot(self):
        while True:
            if not self.cute_image_:
                time.sleep(0.5)
                continue
            else:
                path = os.path.join(self.root_path,"{}.jpg".format(self.count))
                cv2.imwrite(path,self.cute_image_.pop(0))
                self.count +=1
                time.sleep(1)

    def save_tingeg(self):
        if self.run_type_control == 1:
            path = os.path.join(self.root_path,"{}.csv".format(self.count))
            person = 1
            re = self.model.add_new_record(self.count,path,person,self.yolo_things.pop(0))
            if re == 2:
                self.on_first_table()
        else:
            while True:
                if not self.yolo_things:
                    time.sleep(0.5)
                    continue
                else:
                    path = os.path.join(self.root_path,"{}.csv".format(self.count))
                    person = 1
                    re = self.model.add_new_record(self.count,path,person,self.yolo_things.pop(0))
                    if re == 2:
                        self.on_first_table()
                    time.sleep(1)

    def on_first_table(self):
        self.model = Mydata_model(data1,head1)
        self.table_layout.setModel(self.model)
        head = self.table_layout.horizontalHeader()
        head.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)

    # 关闭窗口按钮
    def click_button_close(self):
        print("释放线程")
        self.timer_id.stop()
        self.capture.release()
        cv2.destroyAllWindows()    
   
            
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_win = MainWindow()
    main_win.show()
    app.exec_()

Table界面独立开发,将panel与table进行分离开发,降低后期运维成本

from PyQt5 import QtWidgets
from PyQt5 import QtCore,QtGui
import sys
from PyQt5.QtCore import Qt
import os
import csv,time

# 数据集来源
# head1 = ["序号","文件路径","目标编号","类别","置信度","位置坐标"]
# data1 = [
#     ['wzg',15,15,4,8,1],
#     ['wzg',15,1,8,5,1],
#     ['wzg',15,1,8,5,1],
#     ['wzg',15,1,5,9,1],
# ]

# head2 = ["姓名","年龄","性别","地址"]
# data2 = [
#     ['wzg',15,1,'中国'],
#     ['wzg',15,1,'中国'],
#     ['wzg',15,1,'中国'],
#     ['wzg',15,1,'中国']
# ]

import sys
sys.path.append("./pyqt5_YOLO_model")

class Mydata_model(QtCore.QAbstractTableModel):
    def __init__(self,data,head):
        super(Mydata_model,self).__init__()
        self._data = data
        self._head = head
    def data(self,index,role):
        if role ==  Qt.DisplayRole:
            # 如果是int类型的数据需要转换为str数据类型==才能填充到表格中
            if isinstance(self._data[index.row()][index.column()],int):
                return str(self._data[index.row()][index.column()])
            return self._data[index.row()][index.column()]
        if role == Qt.TextAlignmentRole:
            if isinstance(self._data[index.row()][index.column()],int):
                return Qt.AlignCenter+Qt.AlignLeft   # 左对齐
            if isinstance(self._data[index.row()][index.column()],str):
                return Qt.AlignCenter  # 居中
        if role == Qt.BackgroundRole and index.column() == 2:
            return QtGui.QColor('deeppink')
        if role == Qt.ForegroundRole and index.column() == 2:
            return QtGui.QColor('yellow')
        if role == Qt.DecorationRole and index.column() == 0:
            return QtGui.QIcon('check-icon.png')   # 添加的行第一列前增加选中的icon标识符
        
    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        if len(self._data ) == 0:
            return 0
        return len(self._head)
    
    def headerData(self, section:int, orientation:Qt.Orientation, role: int=...):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal and role == Qt.DisplayRole:
                return self._head[section]
            if role == Qt.DisplayRole and orientation == Qt.Vertical:
                return str(section+1)
    
	# 在表格中添加数据
    def add_new_record(self,count,path,person,data):
        # 传入的数据为tensor 需要转换为numpy
        person = person
        data = data.to('cpu').numpy()[0].tolist()
        loc = data[0:4]
        index = count
        image_path = path
        record = data[4]
        self._data.append([index,image_path,person,person,record,loc])
        
        return 2


    def delete_row(self,row_list):
        pass 
        return num
    
    # table数据的存储本地csv文件夹
    def save_table_data(self,path):
        file_path = os.path.join(path,f"1.csv")
        # csv文件的保存
        with open(file_path,'w',encoding='utf-8') as f:
            writer = csv.writer(f)
            # 将表头写入csv中
            writer.writerow(self._head)
            # 将数据内容写入csv中
            for row in self._data:
                writer.writerow(row)

                   

最终界面展示

在这里插入图片描述

主要实现的功能,将image、video、camea数据传入后,进行数据的双屏幕显示,左边屏幕为原图像数据,右边图像为yolo模型处理后的数据。对图像进行实时处理,将结果在页面table中进行实时展示。当点击保存文件时,将Gui界面数据保存到本地创建的文件夹中。

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

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

相关文章

交通流量预测:基于交通流量数据建立模型

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

[Java]微服务配置管理

介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…

【C++】入门【三】

本节目标 一、类的6个默认成员函数 二、 构造函数 三、析构函数 四、拷贝构造函数 五、赋值运算符重载 六、const成员函数 七、取地址及const取地址操作符重载 一、类的6个默认成员函数 如果类里一个成员都没有,简称空类空类中真的什么都没有吗?并不不是…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下,发现键盘事件里根本就没有{}这两个键。 花费了一下午,终于找到解决的方法了,也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵MN3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述:文本对旋转验证码进行了突破及讲述了实现原理,代码使用纯算法 OpenCV,使用代价较小同时不用安装一大堆AI训练相关的模组,方便且能够快速上手 当前亲自验证了能够支持的网站:国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下,其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序列预测; 3.递归预测未来数据,可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍: Blender下载: Blender改进功能: Blender介绍: Blender是一款开源的跨平台全能三维动画制作软件,提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…