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 Đỗ
相关产品推荐
相关产品推荐

