You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包YOLOv8工具后界面重影问题求助

问题描述

使用PyInstaller 5.13.2打包基于YOLOv8和ultralytics库的GUI工具,本地运行代码完全正常,但生成的exe文件运行时出现界面重影问题,经定位问题触发于模型推理阶段,切换为ONNX模型后问题仍未解决。

打包命令如下:

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"

YOLO检测器核心代码:

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]
            result = result.cpu()
            result = result.numpy()
            df_result = results_to_dataframe(result, self.names)
        return df_result
解决方案

针对PyInstaller打包YOLOv8后GUI重影的问题,从线程冲突、渲染优化、打包参数三个方向入手解决:

1. 把模型推理放到单独线程执行

GUI重影大概率是推理任务阻塞主线程,导致界面渲染不及时。给推理逻辑做线程隔离:

# 引入线程池
from concurrent.futures import ThreadPoolExecutor

# 在GUI初始化时创建单线程池
self.infer_executor = ThreadPoolExecutor(max_workers=1)

# 异步调用推理
def trigger_inference(self, img):
    future = self.infer_executor.submit(self.detector.inference, img)
    future.add_done_callback(self.handle_inference_result)

# 推理完成后回到主线程更新GUI
def handle_inference_result(self, future):
    df_result = future.result()
    # 以PyQt为例,需通过主线程更新界面
    # QMetaObject.invokeMethod(self, "update_ui_with_result", Qt.QueuedConnection, Q_ARG(pd.DataFrame, df_result))

2. 禁用PyTorch多线程优化

PyTorch默认多线程推理可能和GUI线程调度冲突,强制单线程测试:

# 在YoloRegionTextDetector的__init__开头添加
import torch
torch.set_num_threads(1)
torch.set_num_interop_threads(1)

先验证单线程是否解决问题,再根据情况调整线程数。

3. 优化PyInstaller打包参数

补充关键参数避免资源缺失或压缩异常:

  • 加--noupx:UPX压缩可能破坏CV类库的运行完整性
  • 新增--hidden-import ultralytics.utils和--hidden-import ultralytics.nn,确保ultralytics依赖完全打包
  • 替换--windowed为--noconsole:两者功能相近,但底层渲染处理有差异,可规避部分兼容问题

修改后的打包命令片段:

pyinstaller --noconfirm --onedir --noconsole --clean --noupx \
--collect-all ultralytics \
--hidden-import ultralytics.utils --hidden-import ultralytics.nn \
# 其余原参数保持不变

4. 临时切换到CPU推理验证

若当前配置使用GPU推理,先强制改为CPU测试:

# 在YoloRegionTextDetector的__init__中强制设置
self.device = "cpu"

GPU显存调度可能和GUI渲染冲突,先缩小问题范围,确认是否是硬件加速导致的异常。


内容的提问来源于stack exchange,提问作者Thịnh Đỗ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:57:44