当前vscode环境下 多进程多线程运行情况探究
我的代码
其中在“打开图片时”、“进入子进程之前”、“子进程join前”、“进入子进程区域后”,“子进程join后”、“进入子线程区域后”分别打印了进程线程的编号和数量。
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'test2.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.
'''
这个文件用于显示PyQt,无需输入正确的账号和密码就可以登录进去
选择图片的时候只能选择28*28像素的图片,也就是TestDigitImgs的第一张图片
'''
'''PyQt'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QFileDialog, QMessageBox
from PyQt5.Qt import Qt, QIcon
from PyQt5 import QtCore, QtGui, QtWidgets
'''调用类'''
import os
from multiprocessing import Process
from multiprocessing import Process, Queue
import threading
# from Docx import GenerateDocx
# import cv2
# import math
# import utils
# import numpy as np
# from docx2pdf import convert# from mmdeploy_runtime import Detector, Classifier
# from datetime import datetime
# 获取当前日期和时间INFER_WINDOW_SIZE = [1024, 1024]
INFER_WINDOW_STRIDES = (960, 960)
OVERLAP_NMS_THRESHOLD = 0.5
BBOX_DISPLAY_CONFIDENCE = 0.5CATEGORY_COLOR = { 'papule':(140,240,255),'nevus':(162,247,223),'nodule':(152,192,250),'open_comedo':(86,143,128),'closed_comedo':(60,57,166),'atrophic_scar':(103,49,132),'hypertrophic_scar':(249,233,160),'melasma':(164,93,222),'pustule':(235,177,161),'other':(233,222,252)}CATEGORY_INDEX = {0:'papule',1:'nevus',2:'nodule',3:'open_comedo',4:'closed_comedo',5:'atrophic_scar',6:'hypertrophic_scar',7:'melasma',8:'pustule',9:'other'}CLASSIFICATION_DRUG = {1:"无需治疗",2:"BPO或弱效维A酸类外用",3:"BPO联合维A酸类外用",4:"BPO联合维A酸,考虑口服抗生素",5:"BPO联合维A酸,口服抗生素",6:"BPO联合维A酸,口服抗生素,并开始考虑异维A酸",7:"BPO联合维A酸,口服抗生素,推荐异维A酸",8:"异维A酸"
}QApplication.processEvents()class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1410, 902)MainWindow.setWindowIcon(QIcon('./icon/main.ico'))self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)self.verticalLayout.setObjectName("verticalLayout")self.groupBox_main = QtWidgets.QGroupBox(self.centralwidget)self.groupBox_main.setTitle("")self.groupBox_main.setObjectName("groupBox_main")self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_main)self.verticalLayout_2.setObjectName("verticalLayout_2")self.horizontalLayout_largest = QtWidgets.QHBoxLayout()self.horizontalLayout_largest.setObjectName("horizontalLayout_largest")self.groupBox_left = QtWidgets.QGroupBox(self.groupBox_main)self.groupBox_left.setMinimumSize(QtCore.QSize(320, 0))self.groupBox_left.setMaximumSize(QtCore.QSize(320, 16777215))self.groupBox_left.setTitle("")self.groupBox_left.setObjectName("groupBox_left")self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.groupBox_left)self.verticalLayout_8.setObjectName("verticalLayout_8")self.groupBox_menu = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_menu.setMinimumSize(QtCore.QSize(300, 40))self.groupBox_menu.setMaximumSize(QtCore.QSize(16777215, 40))self.groupBox_menu.setTitle("")self.groupBox_menu.setObjectName("groupBox_menu")self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.groupBox_menu)self.horizontalLayout_6.setObjectName("horizontalLayout_6")self.label_menu = QtWidgets.QLabel(self.groupBox_menu)self.label_menu.setStyleSheet("font-size: 22px;")self.label_menu.setObjectName("label_menu")self.horizontalLayout_6.addWidget(self.label_menu)spacerItem = QtWidgets.QSpacerItem(205, 17, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_6.addItem(spacerItem)self.verticalLayout_8.addWidget(self.groupBox_menu)self.groupBox_startAction = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_startAction.setMaximumSize(QtCore.QSize(16777215, 130))self.groupBox_startAction.setTitle("")self.groupBox_startAction.setObjectName("groupBox_startAction")self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_startAction)self.verticalLayout_4.setObjectName("verticalLayout_4")self.horizontalLayout_imgAndDir = QtWidgets.QHBoxLayout()self.horizontalLayout_imgAndDir.setObjectName("horizontalLayout_imgAndDir")self.pushButton_selectImg = QtWidgets.QPushButton(self.groupBox_startAction)self.pushButton_selectImg.setMinimumSize(QtCore.QSize(20, 40))self.pushButton_selectImg.setStyleSheet("font-size: 18px;")self.pushButton_selectImg.setObjectName("pushButton_selectImg")self.horizontalLayout_imgAndDir.addWidget(self.pushButton_selectImg)self.pushButton_selectDir = QtWidgets.QPushButton(self.groupBox_startAction)self.pushButton_selectDir.setMinimumSize(QtCore.QSize(0, 40))self.pushButton_selectDir.setStyleSheet("font-size: 18px;")self.pushButton_selectDir.setObjectName("pushButton_selectDir")self.horizontalLayout_imgAndDir.addWidget(self.pushButton_selectDir)self.verticalLayout_4.addLayout(self.horizontalLayout_imgAndDir)self.pushButton_startAction = QtWidgets.QPushButton(self.groupBox_startAction)self.pushButton_startAction.setMinimumSize(QtCore.QSize(50, 40))self.pushButton_startAction.setStyleSheet("font-size: 18px;")self.pushButton_startAction.setObjectName("pushButton_startAction")self.verticalLayout_4.addWidget(self.pushButton_startAction)self.verticalLayout_8.addWidget(self.groupBox_startAction)self.groupBox = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox.setMinimumSize(QtCore.QSize(0, 62))self.groupBox.setTitle("")self.groupBox.setObjectName("groupBox")self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox)self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.pushButton_save = QtWidgets.QPushButton(self.groupBox)self.pushButton_save.setMinimumSize(QtCore.QSize(0, 40))self.pushButton_save.setStyleSheet("font-size: 18px;")self.pushButton_save.setObjectName("pushButton_save")self.horizontalLayout.addWidget(self.pushButton_save)self.lineEdit_savePath = QtWidgets.QLineEdit(self.groupBox)self.lineEdit_savePath.setMinimumSize(QtCore.QSize(0, 40))self.lineEdit_savePath.setObjectName("lineEdit_savePath")self.horizontalLayout.addWidget(self.lineEdit_savePath)self.horizontalLayout_3.addLayout(self.horizontalLayout)self.verticalLayout_8.addWidget(self.groupBox)self.groupBox_showDir = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_showDir.setMinimumSize(QtCore.QSize(0, 50))self.groupBox_showDir.setMaximumSize(QtCore.QSize(16777215, 55))self.groupBox_showDir.setTitle("")self.groupBox_showDir.setObjectName("groupBox_showDir")self.horizontalLayout_10 = QtWidgets.QHBoxLayout(self.groupBox_showDir)self.horizontalLayout_10.setObjectName("horizontalLayout_10")self.pushButton_showPDF = QtWidgets.QPushButton(self.groupBox_showDir)self.pushButton_showPDF.setMinimumSize(QtCore.QSize(0, 40))self.pushButton_showPDF.setStyleSheet("font-size: 18px;")self.pushButton_showPDF.setObjectName("pushButton_showPDF")self.horizontalLayout_10.addWidget(self.pushButton_showPDF)self.verticalLayout_8.addWidget(self.groupBox_showDir)self.verticalLayout_result = QtWidgets.QVBoxLayout()self.verticalLayout_result.setObjectName("verticalLayout_result")self.groupBox_resultTitle = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_resultTitle.setMinimumSize(QtCore.QSize(0, 50))self.groupBox_resultTitle.setMaximumSize(QtCore.QSize(16777215, 50))self.groupBox_resultTitle.setTitle("")self.groupBox_resultTitle.setObjectName("groupBox_resultTitle")self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.groupBox_resultTitle)self.horizontalLayout_8.setObjectName("horizontalLayout_8")self.label_resultTitle = QtWidgets.QLabel(self.groupBox_resultTitle)self.label_resultTitle.setStyleSheet("font-size: 22px;")self.label_resultTitle.setObjectName("label_resultTitle")self.horizontalLayout_8.addWidget(self.label_resultTitle)spacerItem1 = QtWidgets.QSpacerItem(181, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_8.addItem(spacerItem1)self.verticalLayout_result.addWidget(self.groupBox_resultTitle)self.groupBox_resultContent = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_resultContent.setMinimumSize(QtCore.QSize(0, 50))self.groupBox_resultContent.setTitle("")self.groupBox_resultContent.setObjectName("groupBox_resultContent")self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.groupBox_resultContent)self.horizontalLayout_9.setObjectName("horizontalLayout_9")self.listWidget = QtWidgets.QListWidget(self.groupBox_resultContent)self.listWidget.setLayoutDirection(QtCore.Qt.LeftToRight)self.listWidget.setStyleSheet("font-size: 14px;")self.listWidget.setIconSize(QtCore.QSize(7, 7))self.listWidget.setObjectName("listWidget")item = QtWidgets.QListWidgetItem()self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap("./icon/closed_comedo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon1 = QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap("./icon/opend_comedo.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon1)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon2 = QtGui.QIcon()icon2.addPixmap(QtGui.QPixmap("./icon/papule.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon2)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon3 = QtGui.QIcon()icon3.addPixmap(QtGui.QPixmap("./icon/pustule.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon3)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon4 = QtGui.QIcon()icon4.addPixmap(QtGui.QPixmap("./icon/nodule.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon4)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon5 = QtGui.QIcon()icon5.addPixmap(QtGui.QPixmap("./icon/atrophic_scar.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon5)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon6 = QtGui.QIcon()icon6.addPixmap(QtGui.QPixmap("./icon/hypertrophic_scar.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon6)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon7 = QtGui.QIcon()icon7.addPixmap(QtGui.QPixmap("./icon/melasma.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon7)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon8 = QtGui.QIcon()icon8.addPixmap(QtGui.QPixmap("./icon/nevus.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon8)self.listWidget.addItem(item)item = QtWidgets.QListWidgetItem()icon9 = QtGui.QIcon()icon9.addPixmap(QtGui.QPixmap("./icon/other.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)item.setIcon(icon9)self.listWidget.addItem(item)self.horizontalLayout_9.addWidget(self.listWidget)self.verticalLayout_result.addWidget(self.groupBox_resultContent)self.verticalLayout_8.addLayout(self.verticalLayout_result)self.verticalLayout_advice = QtWidgets.QVBoxLayout()self.verticalLayout_advice.setObjectName("verticalLayout_advice")self.groupBox_10 = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_10.setMinimumSize(QtCore.QSize(0, 50))self.groupBox_10.setMaximumSize(QtCore.QSize(16777215, 50))self.groupBox_10.setTitle("")self.groupBox_10.setObjectName("groupBox_10")self.horizontalLayout_12 = QtWidgets.QHBoxLayout(self.groupBox_10)self.horizontalLayout_12.setObjectName("horizontalLayout_12")self.label_adviceTitle = QtWidgets.QLabel(self.groupBox_10)self.label_adviceTitle.setMinimumSize(QtCore.QSize(0, 30))self.label_adviceTitle.setStyleSheet("font-size: 22px;")self.label_adviceTitle.setObjectName("label_adviceTitle")self.horizontalLayout_12.addWidget(self.label_adviceTitle)spacerItem2 = QtWidgets.QSpacerItem(137, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_12.addItem(spacerItem2)self.verticalLayout_advice.addWidget(self.groupBox_10)self.groupBox_12 = QtWidgets.QGroupBox(self.groupBox_left)self.groupBox_12.setMinimumSize(QtCore.QSize(0, 70))self.groupBox_12.setMaximumSize(QtCore.QSize(16777215, 120))self.groupBox_12.setTitle("")self.groupBox_12.setObjectName("groupBox_12")self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.groupBox_12)self.horizontalLayout_13.setObjectName("horizontalLayout_13")self.label_adviceResult = QtWidgets.QLabel(self.groupBox_12)self.label_adviceResult.setMinimumSize(QtCore.QSize(0, 50))self.label_adviceResult.setMaximumSize(QtCore.QSize(16777215, 120))self.label_adviceResult.setStyleSheet("font-size: 16px;")self.label_adviceResult.setAlignment(QtCore.Qt.AlignCenter)self.label_adviceResult.setObjectName("label_adviceResult")self.horizontalLayout_13.addWidget(self.label_adviceResult)self.verticalLayout_advice.addWidget(self.groupBox_12)self.verticalLayout_8.addLayout(self.verticalLayout_advice)self.horizontalLayout_largest.addWidget(self.groupBox_left)self.groupBox_right = QtWidgets.QGroupBox(self.groupBox_main)self.groupBox_right.setTitle("")self.groupBox_right.setObjectName("groupBox_right")self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_right)self.verticalLayout_3.setObjectName("verticalLayout_3")self.groupBox_selectImg = QtWidgets.QGroupBox(self.groupBox_right)self.groupBox_selectImg.setMinimumSize(QtCore.QSize(0, 40))self.groupBox_selectImg.setMaximumSize(QtCore.QSize(16777215, 40))self.groupBox_selectImg.setTitle("")self.groupBox_selectImg.setObjectName("groupBox_selectImg")self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.groupBox_selectImg)self.horizontalLayout_5.setObjectName("horizontalLayout_5")self.label_imgTitle = QtWidgets.QLabel(self.groupBox_selectImg)self.label_imgTitle.setMinimumSize(QtCore.QSize(0, 20))self.label_imgTitle.setStyleSheet("font-size: 20px;")self.label_imgTitle.setObjectName("label_imgTitle")self.horizontalLayout_5.addWidget(self.label_imgTitle)self.lineEdit_imgPath = QtWidgets.QLineEdit(self.groupBox_selectImg)self.lineEdit_imgPath.setMinimumSize(QtCore.QSize(0, 25))self.lineEdit_imgPath.setMaximumSize(QtCore.QSize(300, 16777215))self.lineEdit_imgPath.setObjectName("lineEdit_imgPath")self.horizontalLayout_5.addWidget(self.lineEdit_imgPath)spacerItem3 = QtWidgets.QSpacerItem(287, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.horizontalLayout_5.addItem(spacerItem3)self.label_5 = QtWidgets.QLabel(self.groupBox_selectImg)self.label_5.setText("")self.label_5.setObjectName("label_5")self.horizontalLayout_5.addWidget(self.label_5)self.verticalLayout_3.addWidget(self.groupBox_selectImg)self.horizontalLayout_imgs = QtWidgets.QHBoxLayout()self.horizontalLayout_imgs.setObjectName("horizontalLayout_imgs")self.label_showImg = QtWidgets.QLabel(self.groupBox_right)self.label_showImg.setMinimumSize(QtCore.QSize(500, 0))self.label_showImg.setText("")self.label_showImg.setAlignment(QtCore.Qt.AlignCenter)self.label_showImg.setObjectName("label_showImg")self.horizontalLayout_imgs.addWidget(self.label_showImg)spacerItem4 = QtWidgets.QSpacerItem(10, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.horizontalLayout_imgs.addItem(spacerItem4)self.label_showImg2 = QtWidgets.QLabel(self.groupBox_right)self.label_showImg2.setMinimumSize(QtCore.QSize(500, 0))self.label_showImg2.setText("")self.label_showImg2.setAlignment(QtCore.Qt.AlignCenter)self.label_showImg2.setObjectName("label_showImg2")self.horizontalLayout_imgs.addWidget(self.label_showImg2)self.verticalLayout_3.addLayout(self.horizontalLayout_imgs)self.horizontalLayout_pageTurning = QtWidgets.QHBoxLayout()self.horizontalLayout_pageTurning.setObjectName("horizontalLayout_pageTurning")self.prev_image_button = QtWidgets.QPushButton(self.groupBox_right)self.prev_image_button.setMinimumSize(QtCore.QSize(0, 30))self.prev_image_button.setObjectName("prev_image_button")self.horizontalLayout_pageTurning.addWidget(self.prev_image_button)self.label_pageNum = QtWidgets.QLabel(self.groupBox_right)self.label_pageNum.setMinimumSize(QtCore.QSize(80, 0))self.label_pageNum.setMaximumSize(QtCore.QSize(50, 16777215))self.label_pageNum.setAlignment(QtCore.Qt.AlignCenter)self.label_pageNum.setObjectName("label_pageNum")self.horizontalLayout_pageTurning.addWidget(self.label_pageNum)self.next_image_button = QtWidgets.QPushButton(self.groupBox_right)self.next_image_button.setMinimumSize(QtCore.QSize(0, 30))self.next_image_button.setObjectName("next_image_button")self.horizontalLayout_pageTurning.addWidget(self.next_image_button)self.verticalLayout_3.addLayout(self.horizontalLayout_pageTurning)self.horizontalLayout_largest.addWidget(self.groupBox_right)self.verticalLayout_2.addLayout(self.horizontalLayout_largest)self.groupBox_botton = QtWidgets.QGroupBox(self.groupBox_main)self.groupBox_botton.setMinimumSize(QtCore.QSize(0, 32))self.groupBox_botton.setTitle("")self.groupBox_botton.setObjectName("groupBox_botton")self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.groupBox_botton)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.label_condition = QtWidgets.QLabel(self.groupBox_botton)self.label_condition.setMinimumSize(QtCore.QSize(0, 12))self.label_condition.setObjectName("label_condition")self.horizontalLayout_2.addWidget(self.label_condition)self.verticalLayout_2.addWidget(self.groupBox_botton)self.verticalLayout.addWidget(self.groupBox_main)MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "痤疮检测"))self.label_menu.setText(_translate("MainWindow", "菜单栏"))self.pushButton_selectImg.setText(_translate("MainWindow", "选择图片"))self.pushButton_selectDir.setText(_translate("MainWindow", "选择文件夹"))self.pushButton_startAction.setText(_translate("MainWindow", "开始检测"))self.pushButton_save.setText(_translate("MainWindow", "保存报告"))self.pushButton_showPDF.setText(_translate("MainWindow", "显示输出文件夹"))self.label_resultTitle.setText(_translate("MainWindow", "检测结果"))__sortingEnabled = self.listWidget.isSortingEnabled()self.listWidget.setSortingEnabled(False)item = self.listWidget.item(0)item.setText(_translate("MainWindow", "痤疮分级结果:待检测"))item = self.listWidget.item(2)item.setText(_translate("MainWindow", "各类别痤疮检测数量:"))item = self.listWidget.item(4)item.setText(_translate("MainWindow", " 闭口粉刺:待检测"))item = self.listWidget.item(5)item.setText(_translate("MainWindow", " 开口粉刺:待检测"))item = self.listWidget.item(6)item.setText(_translate("MainWindow", " 丘疹:待检测"))item = self.listWidget.item(7)item.setText(_translate("MainWindow", " 脓疱:待检测"))item = self.listWidget.item(8)item.setText(_translate("MainWindow", " 结节:待检测"))item = self.listWidget.item(9)item.setText(_translate("MainWindow", " 萎缩性瘢痕:待检测"))item = self.listWidget.item(10)item.setText(_translate("MainWindow", " 增生性瘢痕刺:待检测"))item = self.listWidget.item(11)item.setText(_translate("MainWindow", " 斑:待检测"))item = self.listWidget.item(12)item.setText(_translate("MainWindow", " 色素痣:待检测"))item = self.listWidget.item(13)item.setText(_translate("MainWindow", " 其他:待检测"))self.listWidget.setSortingEnabled(__sortingEnabled)self.label_adviceTitle.setText(_translate("MainWindow", "推荐治疗方案"))self.label_adviceResult.setText(_translate("MainWindow", "用药指南"))self.label_imgTitle.setText(_translate("MainWindow", "所选图片"))self.prev_image_button.setText(_translate("MainWindow", "上一页"))self.label_pageNum.setText(_translate("MainWindow", "共 0 页"))self.next_image_button.setText(_translate("MainWindow", "下一页"))self.label_condition.setText(_translate("MainWindow", "系统运行情况"))# 按钮关联函数self.pushButton_selectDir.clicked.connect(self.openImageFolder)# self.pushButton_startAction.clicked.connect(self.startAction)self.pushButton_selectImg.clicked.connect(self.openImage)self.pushButton_startAction.clicked.connect(self.start_work)# self.worker_thread.finished.connect(self.on_worker_finished)self.pushButton_save.clicked.connect(self.start_work_pdf)# self.worker_thread_pdf.finished.connect(self.on_worker_finished_pdf)self.pushButton_showPDF.clicked.connect(self.button_show_dir)self.prev_image_button.clicked.connect(self.showPrevImage)self.next_image_button.clicked.connect(self.showNextImage)QApplication.processEvents()def start_work(self):def run_child_process():QApplication.processEvents()self.pushButton_startAction.setEnabled(False) # 禁用按钮self.pushButton_selectImg.setEnabled(False) # 禁用按钮self.pushButton_save.setEnabled(False) # 禁用按钮self.pushButton_showPDF.setEnabled(False) # 禁用按钮self.pushButton_selectDir.setEnabled(False) # 禁用按钮self.prev_image_button.setEnabled(False)self.next_image_button.setEnabled(False)self.label_condition.setText('正在检测,请耐心等待')import multiprocessingprint("主线程join前:")process_info = multiprocessing.current_process()print(f"当前进程数量: {multiprocessing.cpu_count()}")print(f"当前进程编号: {process_info.name}")# 打印当前线程数量和编号thread_info = threading.current_thread()print(f"当前线程数量: {threading.active_count()}")print(f"当前线程编号: {thread_info.name}")print("启动进程")p = Worker(self.q, self.selected_imgPaths,self.now)p.daemon = Truep.start()p.join()import multiprocessingprint("主线程join后:")process_info = multiprocessing.current_process()print(f"当前进程数量: {multiprocessing.cpu_count()}")print(f"当前进程编号: {process_info.name}")# 打印当前线程数量和编号thread_info = threading.current_thread()print(f"当前线程数量: {threading.active_count()}")print(f"当前线程编号: {thread_info.name}")self.generated_image_paths = self.q.get()self.generated_docxFilePath_List = self.q.get()self.text = self.q.get()print("我得到啦")self.label_condition.setText('检测完毕,请点击保存图片')self.pushButton_startAction.setEnabled(True) # 启动之前被禁用的按钮self.pushButton_selectImg.setEnabled(True)self.pushButton_save.setEnabled(True) self.pushButton_showPDF.setEnabled(True) self.pushButton_selectDir.setEnabled(True)self.prev_image_button.setEnabled(True)self.next_image_button.setEnabled(True)img_path = self.selected_imgPaths[0]img_name = os.path.splitext(os.path.basename(img_path))[0]grading_result = self.text[img_name]["grading_result"]item = self.listWidget.item(0)item.setText(f"痤疮分级结果:{grading_result}") item = self.listWidget.item(2)item.setText("各类别痤疮检测数量:")item = self.listWidget.item(4)closed_comedo_count = self.text[img_name]["category_count"]["closed_comedo"]item.setText(f" 闭口粉刺:{closed_comedo_count}")item = self.listWidget.item(5)open_comedo_count = self.text[img_name]["category_count"]["open_comedo"]item.setText(f" 开口粉刺:{open_comedo_count}")item = self.listWidget.item(6)papule_count = self.text[img_name]["category_count"]["papule"]item.setText(f" 丘疹:{papule_count}")item = self.listWidget.item(7)pustule_count = self.text[img_name]["category_count"]["pustule"]item.setText(f" 脓疱:{pustule_count}")item = self.listWidget.item(8)nodule_count = self.text[img_name]["category_count"]["nodule"]item.setText(f" 结节:{nodule_count}")item = self.listWidget.item(9)atrophic_scar_count = self.text[img_name]["category_count"]["atrophic_scar"]item.setText(f" 萎缩性瘢痕:{atrophic_scar_count}")item = self.listWidget.item(10)hypertrophic_scar_count = self.text[img_name]["category_count"]["hypertrophic_scar"]item.setText(f" 增生性瘢痕刺:{hypertrophic_scar_count}")item = self.listWidget.item(11)melasma_count = self.text[img_name]["category_count"]["melasma"]item.setText(f" 斑:{melasma_count}")item = self.listWidget.item(12)nevus_count = self.text[img_name]["category_count"]["nevus"]item.setText(f" 色素痣:{nevus_count}")item = self.listWidget.item(13)other_count = self.text[img_name]["category_count"]["other"]item.setText(f" 其他:{other_count}")img_path = self.generated_image_paths[0]# 通过文件路径获取图片文件,并设置图片长宽为label控件的长、宽img = QtGui.QPixmap(img_path).scaled(self.label_showImg2.width(), self.label_showImg2.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)# 在label控件上显示选择的图片self.label_showImg2.setPixmap(img)#显示用药指南self.label_adviceResult.setText(CLASSIFICATION_DRUG[grading_result])# if self.thread.is_alive():# self.thread.join() # 等待子线程完成self.thread = threading.Thread(target=run_child_process)self.thread.setDaemon(True)self.thread.start()# self.thread.join()# print("ok")def start_work_pdf(self):import multiprocessingprint("进入子线程区域后:")process_info = multiprocessing.current_process()print(f"当前进程数量: {multiprocessing.cpu_count()}")print(f"当前进程编号: {process_info.name}")# 打印当前线程数量和编号thread_info = threading.current_thread()print(f"当前线程数量: {threading.active_count()}")print(f"当前线程编号: {thread_info.name}")if len(self.generated_image_paths) == 0:returnself.dir_choose = QFileDialog.getExistingDirectory(self.centralwidget, "选取文件夹", "./report_pdf")if self.dir_choose == '':print("未生成报告,保存无效")self.label_condition.setText('未生成报告,保存无效')returnelse:# f=open(fd,'w')import queuefor i in range(len(self.generated_image_paths)):QApplication.processEvents()img_name = os.path.splitext(os.path.basename(self.generated_docxFilePath_List[i]))[0]self.label_condition.setText(f"正在生成{img_name}.pdf报告")# 创建队列对象data_queue = queue.Queue()data_queue.put(self.generated_docxFilePath_List[i])data_queue.put(self.dir_choose)# 启动工作线程self.worker_pdf = threading.Thread(target=self.my_thread_pdf,args=(data_queue,))self.worker_pdf.setDaemon(True)self.worker_pdf.start()def my_thread_pdf(self,data_queue_in):from docx2pdf import convert# 执行耗时的任务generated_docxFilePath = data_queue_in.get()dir_choose = data_queue_in.get()img_name = os.path.splitext(os.path.basename(generated_docxFilePath))[0]convert(generated_docxFilePath, dir_choose+f"/{img_name}.pdf")print("pdf报告全部转换完毕")self.label_condition.setText(f"pdf报告生成完毕")self.lineEdit_savePath.setText(self.dir_choose)self.label_condition.setText('已保存所有报告')def showNextImage(self):if len(self.selected_imgPaths) == 0:returnself.current_image_index += 1if self.current_image_index >= len(self.selected_imgPaths):self.current_image_index = 0img_path = self.selected_imgPaths[self.current_image_index]img = QtGui.QPixmap(img_path).scaled(self.label_showImg.width(), self.label_showImg.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)self.label_showImg.setPixmap(img)self.lineEdit_imgPath.setText(img_path)pageNum = len(self.selected_imgPaths)current_image_index_fact = self.current_image_index + 1self.label_pageNum.setText(f"{current_image_index_fact} / {pageNum} ")if len(self.text) == len(self.selected_imgPaths):img_name = os.path.splitext(os.path.basename(img_path))[0]# self.label_showResult.setText(self.text[img_name])# print(self.text[img_name])grading_result = self.text[img_name]["grading_result"]self.label_adviceResult.setText(CLASSIFICATION_DRUG[grading_result])item = self.listWidget.item(0)item.setText(f"痤疮分级结果:{grading_result}")item = self.listWidget.item(2)item.setText("各类别痤疮检测数量:")item = self.listWidget.item(4)closed_comedo_count = self.text[img_name]["category_count"]["closed_comedo"]item.setText(f" 闭口粉刺:{closed_comedo_count}")item = self.listWidget.item(5)open_comedo_count = self.text[img_name]["category_count"]["open_comedo"]item.setText(f" 开口粉刺:{open_comedo_count}")item = self.listWidget.item(6)papule_count = self.text[img_name]["category_count"]["papule"]item.setText(f" 丘疹:{papule_count}")item = self.listWidget.item(7)pustule_count = self.text[img_name]["category_count"]["pustule"]item.setText(f" 脓疱:{pustule_count}")item = self.listWidget.item(8)nodule_count = self.text[img_name]["category_count"]["nodule"]item.setText(f" 结节:{nodule_count}")item = self.listWidget.item(9)atrophic_scar_count = self.text[img_name]["category_count"]["atrophic_scar"]item.setText(f" 萎缩性瘢痕:{atrophic_scar_count}")item = self.listWidget.item(10)hypertrophic_scar_count = self.text[img_name]["category_count"]["hypertrophic_scar"]item.setText(f" 增生性瘢痕刺:{hypertrophic_scar_count}")item = self.listWidget.item(11)melasma_count = self.text[img_name]["category_count"]["melasma"]item.setText(f" 斑:{melasma_count}")item = self.listWidget.item(12)nevus_count = self.text[img_name]["category_count"]["nevus"]item.setText(f" 色素痣:{nevus_count}")item = self.listWidget.item(13)other_count = self.text[img_name]["category_count"]["other"]item.setText(f" 其他:{other_count}")img_path2 = self.generated_image_paths[self.current_image_index]img2 = QtGui.QPixmap(img_path2).scaled(self.label_showImg2.width(), self.label_showImg2.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)self.label_showImg2.setPixmap(img2)def showPrevImage(self):if len(self.selected_imgPaths) == 0:returnself.current_image_index -= 1if self.current_image_index < 0:self.current_image_index = len(self.selected_imgPaths) - 1img_path = self.selected_imgPaths[self.current_image_index]img = QtGui.QPixmap(img_path).scaled(self.label_showImg.width(), self.label_showImg.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)self.label_showImg.setPixmap(img)self.lineEdit_imgPath.setText(img_path)pageNum = len(self.selected_imgPaths)current_image_index_fact = self.current_image_index + 1self.label_pageNum.setText(f"{current_image_index_fact} / {pageNum} ")img_path = self.selected_imgPaths[self.current_image_index]img_name = os.path.splitext(os.path.basename(img_path))[0]grading_result = self.text[img_name]["grading_result"]if len(self.text) == len(self.selected_imgPaths):img_name = os.path.splitext(os.path.basename(img_path))[0]# self.label_showResult.setText(self.text[img_name])# print(self.text[img_name])grading_result = self.text[img_name]["grading_result"]self.label_adviceResult.setText(CLASSIFICATION_DRUG[grading_result])item = self.listWidget.item(0)item.setText(f"痤疮分级结果:{grading_result}")item = self.listWidget.item(2)item.setText("各类别痤疮检测数量:")item = self.listWidget.item(4)closed_comedo_count = self.text[img_name]["category_count"]["closed_comedo"]item.setText(f" 闭口粉刺:{closed_comedo_count}")item = self.listWidget.item(5)open_comedo_count = self.text[img_name]["category_count"]["open_comedo"]item.setText(f" 开口粉刺:{open_comedo_count}")item = self.listWidget.item(6)papule_count = self.text[img_name]["category_count"]["papule"]item.setText(f" 丘疹:{papule_count}")item = self.listWidget.item(7)pustule_count = self.text[img_name]["category_count"]["pustule"]item.setText(f" 脓疱:{pustule_count}")item = self.listWidget.item(8)nodule_count = self.text[img_name]["category_count"]["nodule"]item.setText(f" 结节:{nodule_count}")item = self.listWidget.item(9)atrophic_scar_count = self.text[img_name]["category_count"]["atrophic_scar"]item.setText(f" 萎缩性瘢痕:{atrophic_scar_count}")item = self.listWidget.item(10)hypertrophic_scar_count = self.text[img_name]["category_count"]["hypertrophic_scar"]item.setText(f" 增生性瘢痕刺:{hypertrophic_scar_count}")item = self.listWidget.item(11)melasma_count = self.text[img_name]["category_count"]["melasma"]item.setText(f" 斑:{melasma_count}")item = self.listWidget.item(12)nevus_count = self.text[img_name]["category_count"]["nevus"]item.setText(f" 色素痣:{nevus_count}")item = self.listWidget.item(13)other_count = self.text[img_name]["category_count"]["other"]item.setText(f" 其他:{other_count}")img_path2 = self.generated_image_paths[self.current_image_index]img2 = QtGui.QPixmap(img_path2).scaled(self.label_showImg2.width(), self.label_showImg2.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)self.label_showImg2.setPixmap(img2)def button_show_dir(self):default_dir = "./report_pdf"show_dirPath = 0if self.dir_choose == '':show_dirPath = default_direlse:show_dirPath = self.dir_chooseurl = QUrl.fromLocalFile(show_dirPath)if url:print("选择的文件夹路径:", show_dirPath)else:print("未选择文件夹")QDesktopServices.openUrl(url)# 选择本地图片上传def openImage(self):import multiprocessingprint("打开图片时:")process_info = multiprocessing.current_process()print(f"当前进程数量: {multiprocessing.cpu_count()}")print(f"当前进程编号: {process_info.name}")# 打印当前线程数量和编号thread_info = threading.current_thread()print(f"当前线程数量: {threading.active_count()}")print(f"当前线程编号: {thread_info.name}")self.selected_imgPaths = [] # 清空之前选择的所有图片self.generated_image_paths = [] # 清空之前推理生成的所有图片empty_pixmap = QPixmap()self.label_showImg.setPixmap(empty_pixmap)self.label_showImg2.setPixmap(empty_pixmap)# 弹出一个文件选择框,第一个返回值imgName记录选中的文件路径+文件名,第二个返回值imgType记录文件的类型# QFileDialog就是系统对话框的那个类第一个参数是上下文,第二个参数是弹框的名字,第三个参数是默认打开的路径,第四个参数是需要的格式self.selected_imgPaths, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "打开图片", "./pending_images", "*.jpg;;*.JPG;;*.png;;*.png;;All Files(*)")if len(self.selected_imgPaths) == 0:print('没有选择图片!')self.label_condition.setText("没有选择图片!") # 点击选择图片按钮后不选择图片会将存放图片路径的列表置为空# 创建一个空的QPixmap对象empty_pixmap = QPixmap()self.label_showImg.setPixmap(empty_pixmap)pageNum = 0self.label_pageNum.setText(f"共 {pageNum} 页")return# 通过文件路径获取图片文件,并设置图片长宽为label控件的长、宽img = QtGui.QPixmap(self.selected_imgPaths[0]).scaled(self.label_showImg.width(), self.label_showImg.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)# 提示点击生成self.label_condition.setText("请点击 开始检测")# 在label控件上显示选择的图片self.label_showImg.setPixmap(img)# 显示所选图片的路径self.lineEdit_imgPath.setText(self.selected_imgPaths[0])pageNum = len(self.selected_imgPaths)self.label_pageNum.setText(f"共 {pageNum} 页")# 选择图片文件夹上传def openImageFolder(self):self.selected_imgPaths = [] # 清空之前选择的所有图片self.generated_image_paths = [] # 清空之前推理生成的所有图片empty_pixmap = QPixmap()self.label_showImg.setPixmap(empty_pixmap)self.label_showImg2.setPixmap(empty_pixmap)# 弹出一个文件夹选择框,返回选中的文件夹路径selected_folder = QtWidgets.QFileDialog.getExistingDirectory(self, "选择文件夹", "./pending_images")if selected_folder:# 获取文件夹中的所有图片文件路径for file_name in os.listdir(selected_folder):if file_name.lower().endswith((".jpg", ".png")):self.selected_imgPaths.append(os.path.join(selected_folder, file_name))# 通过第一个图片文件路径获取图片,并设置图片长宽为label控件的长、宽img = QtGui.QPixmap(self.selected_imgPaths[0]).scaled(self.label_showImg.width(), self.label_showImg.height(), Qt.KeepAspectRatio,Qt.SmoothTransformation)# 提示点击开始检测self.label_condition.setText("请点击 开始检测")# 在label控件上显示第一张图片self.label_showImg.setPixmap(img)# 显示所选图片的路径self.lineEdit_imgPath.setText(self.selected_imgPaths[0])pageNum = len(self.selected_imgPaths)self.label_pageNum.setText(f"共 {pageNum} 页")else:print('没有选择图片!')self.label_condition.setText("没有选择图片!")empty_pixmap = QPixmap()self.label_showImg.setPixmap(empty_pixmap)pageNum = 0self.label_pageNum.setText(f"共 {pageNum} 页")returndef closeEvent(self, event):# 在这里执行你的函数self.delete_files_in_current_folder()if self.thread.is_alive():self.thread.join() # 等待子线程完成# self.p.terminate()event.accept()# 删除中途产生的图片和docx文件def delete_files_in_current_folder(self):# 获取当前文件夹路径# current_folder = os.path.dirname(self.generated_docxFilePath)current_folder = "./result"# 获取当前文件夹中的所有文件if len(current_folder) == 0:print('没有报告生成')returnfile_list = os.listdir(current_folder)# 遍历文件列表for file_name in file_list:# 构建文件的绝对路径file_path = os.path.join(current_folder, file_name)# 判断是否是文件if os.path.isfile(file_path):# 删除文件os.remove(file_path)# 自定义的工作线程类
class Worker(Process):# 生成对应预测的数字# 定义一个信号,用于在工作完成后发送通知# on_result = pyqtSignal(object,object,object)QApplication.processEvents()def __init__(self, q, selected_imgPaths,now):super().__init__()self.q = qself.selected_imgPaths = selected_imgPathsself.generated_image_paths = []self.text = {}self.generated_docxFilePath_List = []self.now = now# self.detector, self.classifier = self.create_acne_inference(acne_infer_config)def run(self):import multiprocessingprint("进入子进程区域后:")process_info = multiprocessing.current_process()print(f"当前进程数量: {multiprocessing.cpu_count()}")print(f"当前进程编号: {process_info.name}")# 打印当前线程数量和编号thread_info = threading.current_thread()print(f"当前线程数量: {threading.active_count()}")print(f"当前线程编号: {thread_info.name}")from Docx import GenerateDocximport osimport cv2import mathimport utilsimport numpy as npfrom docx2pdf import convertfrom mmdeploy_runtime import Detector, Classifierfrom infer_config import acne_infer_configdef create_acne_inference(cfg):QApplication.processEvents()self.detector = Detector(model_path=cfg['detector']['model_path'],device_name=cfg['detector']['device_name'],device_id=cfg['detector']['device_id'])QApplication.processEvents()self.classifier = Classifier(model_path=cfg['classifier']['model_path'],device_name=cfg['classifier']['device_name'],device_id=cfg['classifier']['device_id'])QApplication.processEvents()return self.detector, self.classifierdef acne_instance_seg(img: np.ndarray, detector: Detector):QApplication.processEvents()win_gen = utils.WindowGenerator(img.shape[0], img.shape[1],INFER_WINDOW_SIZE[0], INFER_WINDOW_SIZE[1],INFER_WINDOW_STRIDES[0], INFER_WINDOW_STRIDES[1])QApplication.processEvents()p_bboxes, p_labels, p_masks = [], [], []for h_slice, w_slice in win_gen:QApplication.processEvents()img_patch = img[h_slice, w_slice, :]offset_x, offset_y = w_slice.start, h_slice.startb, l, m = detector(img_patch)b[:, [0, 2]] += offset_xb[:, [1, 3]] += offset_yp_bboxes.append(b)p_labels.append(l)p_masks.extend(m)p_bboxes = np.concatenate(p_bboxes, axis=0)p_labels = np.concatenate(p_labels, axis=0)p_masks = np.array(p_masks, dtype=object)bboxes, labels, masks = [], [], []cls = np.unique(p_labels)for c in cls:QApplication.processEvents()idx = p_labels == cb = p_bboxes[idx]l = p_labels[idx]m = p_masks[idx]keep = utils.nms(b, OVERLAP_NMS_THRESHOLD)bboxes.append(b[keep])labels.append(l[keep])masks.append(m[keep])bboxes = np.concatenate(bboxes, axis=0)labels = np.concatenate(labels, axis=0)masks = np.concatenate(masks, axis=0)return bboxes, labels, masksdef acne_severity_grading(img: np.ndarray, classifier: Classifier):result = classifier(img)return resultfrom infer_config import acne_infer_configdetector, classifier = create_acne_inference(acne_infer_config)# 执行耗时的任务print("开始处理图片")QApplication.processEvents()# 模拟耗时的任务# '''人脸严重程度分级'''grading_result = 0 # 从1开始的痤疮等级# count = 0# 判断是否选择了图片if len(self.selected_imgPaths)== 0:print("未选择图片")returnfor i in range(len(self.selected_imgPaths)):QApplication.processEvents()# count = i+1# self.label_showResult.setText(f'正在检测第{count}张图片')# self.label_condition.setText(f'请耐心等待,正在检测第{count}张图片')image = cv2.imread(self.selected_imgPaths[i])QApplication.processEvents()# self.detector, self.classifier = self.create_acne_inference(acne_infer_config)QApplication.processEvents()bboxes, labels, masks = acne_instance_seg(image, detector)QApplication.processEvents()cls_result = acne_severity_grading(image, classifier)QApplication.processEvents()grading_result = cls_result[0][0]+1indices = [i for i in range(len(bboxes))]QApplication.processEvents()category_count = { 'papule':0,'nevus':0,'nodule':0,'open_comedo':0,'closed_comedo':0,'atrophic_scar':0,'hypertrophic_scar':0,'melasma':0,'pustule':0,'other':0}for index, bbox, label_id in zip(indices, bboxes, labels):QApplication.processEvents()# print(count,index,bbox,label_id)[left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]if score < BBOX_DISPLAY_CONFIDENCE:continuecolor = CATEGORY_COLOR[CATEGORY_INDEX[label_id]]cv2.rectangle(image, (left, top), (right, bottom), color)label_text = f"{CATEGORY_INDEX[label_id]} | {int(100 * score)}%" # 使用痤疮的标签作为标注信息cv2.putText(image, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) # 添加标注信息if masks[index].size:mask = masks[index]if mask.shape == image.shape[:2]: # rtmdet-instmask_img = image.copy()else: # maskrcnnx0 = int(max(math.floor(bbox[0]) - 1, 0))y0 = int(max(math.floor(bbox[1]) - 1, 0))mask_img = image[y0:y0 + mask.shape[0], x0:x0 + mask.shape[1]]mask_img[mask.astype(bool)] = colorcategory_count[CATEGORY_INDEX[label_id]] += 1text = f'Prediction: {cls_result[0][0]}, {cls_result[0][1]:.4f} ' \f'({acne_infer_config["classifier"]["classes"][cls_result[0][0]]})'cv2.putText(image, text, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 2)img_name = os.path.splitext(os.path.basename(self.selected_imgPaths[i]))[0]# from datetime import datetime# # 获取当前日期和时间# now = datetime.now()# 提取年、月和日year = self.now.yearmonth = self.now.monthday = self.now.daygenerated_image_path = f"./result/{img_name}_report_{year}_{month}_{day}.jpg"cv2.imwrite(generated_image_path , image)self.generated_image_paths.append(generated_image_path)closed_comedo_count = category_count['closed_comedo']open_comedo_count = category_count['open_comedo']papule_count = category_count['papule']pustule_count = category_count['pustule']nodule_count = category_count['nodule']atrophic_scar_count = category_count['atrophic_scar']hypertrophic_scar_count = category_count['hypertrophic_scar']melasma_count = category_count['melasma']nevus_count = category_count['nevus']other_count = category_count['other']self.text[img_name] = {"grading_result":grading_result,"category_count":{"closed_comedo":closed_comedo_count,"open_comedo":open_comedo_count,"papule":papule_count,"pustule":pustule_count,"nodule":nodule_count,"atrophic_scar":atrophic_scar_count,"hypertrophic_scar":hypertrophic_scar_count,"melasma":melasma_count,"nevus":nevus_count,"other":other_count}}'''生成报告'''#必须先生成docx文件再生成pdf文件,我的docx文件和产生的结果图片保存在同一个位置的grading_result = self.text[img_name]["grading_result"]category_count = self.text[img_name]["category_count"]docx_generate = GenerateDocx(generated_image_path,'./result',grading_result,category_count)generated_docxFilePath = docx_generate.predict()self.generated_docxFilePath_List.append(generated_docxFilePath)self.q.put(self.generated_image_paths)self.q.put(self.generated_docxFilePath_List)self.q.put(self.text)
运行截图
“打开图片时”:
“进入子进程前”:

“子进程join前”:

“进入子进程区域后”:

“子进程join后”:

“进入子线程区域后”:

实验感悟
当前环境进程本来就有8个,在创建进程的时候没有增添多的进程的数量,说明我自己在创建子进程知识激活了当前环境下休闲的进程。
当切换进程时,进程的编号从“MainProcess”变为“Workler-1”,当前线程的编号没有变,还是“MainThread”,当启动当前进程的第二个线程的时候,子线程的编号变为“Thread-1”。
当第二次、第三次打开图片并运行的时候,实验运行结果为:

当第四次打开图片比选哪个运行的时候,GUI程序退出,但是子进程仍然在执行
当前线程的编号变的很大,为“Thread-8”,说明进程线程开启的太多了,超过了负荷。
但是后续实验好像证明:子进程、子线程执行完任务会自动退出,只是创建的进程线程的编号变了,并没有创建新的进程线程
GUI自动退出后,再次启动程序
运行结果和初步试验的结果相同,说明主进程退出后,子进程、子线程同步退出

后续实验展望:
在使用第二个进程,和第二个线程的时候,应该采取什么办法来使得销毁或者释放当前进程和线程,使得第三次使用子进程,子线程的时候还是第二个进程和线程。
后续实验证明:子进程、子线程执行完任务后会自动退出。
相关文章:
当前vscode环境下 多进程多线程运行情况探究
我的代码 其中在“打开图片时”、“进入子进程之前”、“子进程join前”、“进入子进程区域后”,“子进程join后”、“进入子线程区域后”分别打印了进程线程的编号和数量。 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file test2.…...
使用WAF防御网络上的隐蔽威胁之命令注入攻击
命令注入攻击是网络安全领域的一种严重威胁,它允许攻击者在易受攻击的应用程序上执行恶意命令。 这种攻击通常发生在应用程序将用户输入错误地处理为操作系统命令的情况下。 什么是命令注入攻击 定义:命令注入攻击发生在攻击者能够在易受攻击的应用程…...
blender 导入到 Marvelous Designer
1) 将模型的所有部分合并为一个单独的mesh 2) 先调整计量单位: 3)等比缩放,身高调整到180cm左右 4)应用当前scale 首先,选中你要修改的物体,然后按下Ctrl-A键,打开应用…...
【Redis】AOF 源码
在上篇, 我们已经从使用 / 机制 / AOF 过程中涉及的辅助功能等方面简单了解了 Redis AOF。 这篇将从源码的形式, 进行深入的了解。 1 Redis 整个 AOF 主要功能 Redis 的 AOF 功能概括起来就 2 个功能 AOF 同步: 将客户端发送的变更命令, 保存到 AOF 文件中AOF 重写: 随着 Red…...
【小笔记】算法训练基础超参数调优思路
【学而不思则罔,思维不学则怠】 本文总结一下常见的一些算法训练超参数调优思路(陆续总结更新),包括: batchsize学习率epochsdropout(待添加) Batch_size 2023.9.29 简单来说,较…...
Blender——将模型及其所有纹理与材质导入unity
前期准备 参考视频:7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址:Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接: 【免费】Blender三维模型-古代房屋模型ÿ…...
docker-compose和docker compose的区别
在docker实际使用中,经常会搭配Compose,用来定义和运行多个 Docker 容器。使用时会发现,有时候的指令是docker-compose,有时候是docker compose,下面给出解释。 docker官方文档:https://docs.docker.com/c…...
Android NDK Crash信息收集捕获和日志异常定位分析(addr2line)
Android NDK 闪退日志收集与分析 我们在开发过程中,Android JNI层Crash问题或者我们引用的第三方.so库文件报错,都是一个比较头疼的问题。相对Java层来说,由于c/c++造成的crash没有输出如同Java的Exception Strace堆栈信息,所以定位问题也是个比较艰难的事情。 Google Br…...
5、NumPy 高级索引和切片
目录 一、切片(Slicing) 二、NumPy 高级索引详解 1. 布尔型索引 2. 列表/数组索引 3. 花式索引 (Fancy Indexing) 4. 元组索引 三、结合切片与高级索引 一、切片(Slicing) 切片操作允许访问数组的子集。在 NumPy 中…...
.Net 全局过滤,防止SQL注入
问题背景:由于公司需要整改的老系统的漏洞检查,而系统就是没有使用参数化SQL即拼接查询语句开发的程序,导致漏洞扫描出现大量SQL注入问题。 解决方法:最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目…...
string 模拟实现
string的数据结构 char* _str; size_t _size; size_t _capacity; _str 是用来存储字符串的数组,采用new在堆上开辟空间; _size 是用来表示字符串的长度,数组大小strlen(_str); _capacity 是用来表示_str的空间大小, _capacity…...
医院网络安全建设:三网整体设计和云数据中心架构设计
医院网络安全问题涉及到医院日常管理多个方面,一旦医院信息管理系统在正常运行过程中受到外部恶意攻击,或者出现意外中断等情况,都会造成海量医疗数据信息的丢失。由于医院信息管理系统中存储了大量患者个人信息和治疗方案信息等,…...
Cloudflare cdn 基本使用
个人版免费试用,一个邮箱账号只能缓存一个网站cdn。 地址:cloudflare.com 创建站点 在网站创建站点,填上你的域名 点击进入网站 缓存全局配置 可清除缓存,设置浏览器缓存时间 我设置了always online,防止服务器经常不稳定 缓…...
Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版
一、Oracle21C PLSQL Developer 15 Oracle客户端文件下载 1、Oracl21C下载地址:Database Software Downloads | Oracle 中国 2、 PLSQL Developer 15下载地址:Registered download PL/SQL Developer - Allround Automations 3、 Oracle 客户端下载地址…...
编程笔记 html5cssjs 038 CSS背景
编程笔记 html5&css&js 038 CSS背景 一、CSS 背景属性二、CSS background-color三、不透明度 / 透明度四、使用 RGBA 的透明度五、CSS 背景图像六、CSS 背景重复CSS background-repeatCSS background-repeat: no-repeatCSS background-position 七、练习小结࿱…...
springmvc上传与下载
文件上传 结构图 导入依赖 <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId…...
论文阅读笔记AI篇 —— Transformer模型理论+实战 (一)
资源地址Attention is all you need.pdf(0积分) - CSDN 第一遍阅读(Abstract Introduction Conclusion) Abstract中强调Transformer摒弃了循环和卷积网络结构,在English-to-German翻译任务中,BLEU得分为28.4, 在En…...
Linux之shell编程(BASH)
Shell编程概述(THE bourne-again shell) Shell名词解释(外壳,贝壳) Kernel Linux内核主要是为了和硬件打交道 Shell 命令解释器(command interperter) Shell是一个用C语言编写的程序,他是用户使用Lin…...
HarmonyOS—声明式UI描述
ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 说明 创建组件时不需要new运算…...
实验笔记之——基于TUM-RGBD数据集的SplaTAM测试
之前博客对SplaTAM进行了配置,并对其源码进行解读。 学习笔记之——3D Gaussian SLAM,SplaTAM配置(Linux)与源码解读-CSDN博客SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》,…...
Boss-Key:职场隐私保护与效率提升的开源解决方案
Boss-Key:职场隐私保护与效率提升的开源解决方案 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中ÿ…...
OpenClaw智能截图:nanobot自动识别图片中的文字信息
OpenClaw智能截图:nanobot自动识别图片中的文字信息 1. 为什么需要智能截图工具 在日常工作和学习中,我们经常遇到需要从图片中提取文字的场景。比如截取网页上的技术文档片段、保存会议白板上的讨论要点、或者整理纸质书籍中的关键段落。传统做法是手…...
保姆级教程:在RK3568开发板上配置RK809-5 PMIC的Android设备树(附完整代码)
RK3568开发板实战:RK809-5 PMIC设备树配置全流程解析 当你在RK3568开发板上第一次按下电源键,却只看到一片黑屏时,作为嵌入式工程师的直觉会告诉你:PMIC配置出了问题。RK809-5这颗电源管理芯片就像系统的"心脏"…...
立知-lychee-rerank-mm效果展示:汽车配置单与实拍图一致性验证
立知-lychee-rerank-mm效果展示:汽车配置单与实拍图一致性验证 1. 引言:多模态重排序的实用价值 在日常工作和生活中,我们经常遇到这样的场景:看到一份产品配置单,但不确定实际产品是否真的符合描述;或者…...
MVC / MVVM 和 Vue3、React18 到底啥关系?
MVC / MVVM 和 Vue3、React18 到底啥关系? 我用最直白、最贴合你日常写代码的方式讲清楚,保证你瞬间通透。一、先给结论(最重要) Vue3 标准的 MVVM 框架(官方自己定义的)React18 借鉴 MVVM 思想ÿ…...
HSTracker:精准追踪炉石传说对战数据的macOS智能辅助工具
HSTracker:精准追踪炉石传说对战数据的macOS智能辅助工具 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker HSTracker是一款专为macOS平台设计的开源炉石传说辅…...
NaViL-9B效果展示:电商主图自动提取卖点文案+竞品对比分析
NaViL-9B效果展示:电商主图自动提取卖点文案竞品对比分析 1. 多模态大模型惊艳登场 想象一下,当你上传一张商品图片,AI不仅能准确识别图片内容,还能自动生成吸引人的卖点文案——这就是NaViL-9B带来的革命性体验。作为原生多模态…...
零基础玩转OpenClaw:借助GLM-4.7-Flash实现首个自动化脚本
零基础玩转OpenClaw:借助GLM-4.7-Flash实现首个自动化脚本 1. 为什么选择OpenClaw作为个人自动化助手 去年夏天,当我第三次因为忘记定时发送周报而被领导提醒时,终于下定决心寻找一个能24小时待命的数字助手。在尝试了各种RPA工具后&#x…...
生成式AI欺诈来袭,什么样的IP数据接口才能筑起防线?
某电商平台的风控系统发出预警:一个“新用户”正在批量下单高价商品,收货地址遍布全国,支付方式各不相同。但奇怪的是,这些订单的浏览行为、停留时间、点击轨迹几乎完全一致——这不是真人,而是生成式AI模拟的虚假用户…...
【Godot】【整活】用 50 行代码做一个“抖音同款解压小游戏”(附源码)
最近短视频平台上经常能看到一种“解压小游戏”: 点一下 → 爆炸特效 💥 滑一下 → 连锁反应 🎯 满屏粒子 → 爽感拉满 😎 这些游戏的核心特点只有三个字: 👉 简单、直接、上头 今天我们就用 Godot 4,只用 约 50 行代码,实现一个“点击爆炸”的解压小游戏。 精…...
