I built the tool using pyinstaller=5.13.2. i use yolov8 and ultralytics lib. pyqt5

110 Views Asked by At

I built the tool using pyinstaller=5.13.2. i use yolov8 and ultralytics lib. When running the exe file, the interface is double. And running regular code is fine. I discovered that when debugging, I discovered that when the model was inferred, the same thing happened

pyinstaller --noconfirm --onedir --windowed --clean --add-data "C:/Users/KNT21818/AppData/Roaming/Python/Python39/site-packages/ultralytics;ultralytics/" --add-data "C:/Users/KNT21818/.conda/envs/Ocr/Lib/site-packages/paddleocr;paddleocr/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/OCR_tool/mklml_win_2018.0.3.20180406/lib/mklml.dll;." --hidden-import "imgaug" --hidden-import "pyclipper" --hidden-import "imghdr" --hidden-import "shapely" --hidden-import "skimage" --hidden-import "onnxruntime" --hidden-import "unidecode" --hidden-import "pandas" --hidden-import "torch" --hidden-import "cv2" --hidden-import "PIL" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/common_utils;common_utils/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/config;config/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/data;data/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/log;log/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/mapper;mapper/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/object_models;object_models/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/Ocr;Ocr/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/pipeline;pipeline/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/Templates;Templates/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/yolo_detector;yolo_detector/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/__init__.py;." --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/dconfig.py;." --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/extract_info.py;." --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/log.py;." --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/envs;envs/" --add-data "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/Templates/WindowMain_.ui;." --collect-all "ultralytics"  "C:/Users/KNT21818/Documents/WorkSpace/Tool_hyouka_consult_v1/app/main.py"
class YoloRegionTextDetector(BaseDetector):
    def __init__(self, config):
        self.config = config
        self.yolo_model_path = self.choose_model_path()
        self.device = self.config["devices"]
        self.num_torch_threads = self.config["num_torch_threads"]
        self.model = YOLO(self.yolo_model_path, task='detect')
        self.conf = self.config["confidence_threshold"]
        self.iou = self.config["iou_threshold"]
        self.names = self.model.names

    def choose_model_path(self):
        if self.config["yolo_model_type"] == 'onnx':
            yolo_model_path = os.path.join(self.config["model_dir"], "yolo", "best.onnx")
        else:
            yolo_model_path = os.path.join(self.config["model_dir"], "yolo", "best.pt")
        return yolo_model_path

    def inference(self, img):
        results = self.model.predict(img, imgsz=[640, 640], conf=self.conf, iou=self.iou, device=self.device)
        df_result = None
        if results:
            result = results[0]
            # print(result)
            result = result.cpu()
            result = result.numpy()
            df_result = results_to_dataframe(result, self.names)
        return df_result

i tried the onnx model. but still the same

1

There are 1 best solutions below

0
Thịnh Đỗ On

This error is a thread conflict error between model yolo and gui .I found a way to fix it by freezing the stream similar to #3997 . but the program will take a little more time the first time it runs. add multiprocessing.freeze_support() exmp:

from PyQt5.QtWidgets import QApplication
import sys

from Templates.window_main import WindowsTool
import multiprocessing


def main():
    apps = QApplication(sys.argv)
    window = WindowsTool()
    window.show()
    sys.exit(apps.exec_())


if __name__ == "__main__":
    multiprocessing.freeze_support()
    main()