Pyinstaller:打包脚本后加载 openvino 模型时出错

问题描述 投票:0回答:1

问题

我已经设置了一个简单的项目,它在 python 脚本中从 xml 导入 openvino 模型。当我直接运行脚本时,一切正常,但是当我打包项目后运行 exe 时,脚本无法正确加载模型。 我已经更新了导入,以确保当脚本在冻结或未冻结状态下运行时正确加载数据文件。

详情

这是项目目录结构

.
├── cleanup.sh
├── model_assets
│   ├── v1
│   │   ├── ir_aip.py
│   │   ├── new_frcnn.bin
│   │   └── new_frcnn.xml
│   └── v2
│       ├── classifier_model.bin
│       ├── classifier_model.xml
│       ├── ir_aip.py
│       └── localization.png
├── models
│   ├── v1.py
│   └── v2.py
├── run.py
└── setup.py

这里是run.py

from PIL import Image
import numpy as np
from models.v2 import process_image

if __name__ == '__main__':
  image = Image.open("./model_assets/v2/localization.png")

  image_pil = image.convert("RGB")
  process_image(image_pil)
  print("processed")

这是 v2.py

from torchvision import transforms
from PIL import Image
import glob
import random
import openvino as ov
import torch 
import time
import os
import sys

if getattr(sys, 'frozen', False):
    print("in frozen")
    # application_path = os.path.dirname(sys.executable) # if bundled using cx freeze
    application_path = sys._MEIPASS  # if bundled using pyinstaller
else:
    print("not frozen", os.getcwd())
    application_path = os.getcwd()

def process_image(original_img):
    try:
        device = torch.device("cpu")

        script_dir = os.path.dirname(os.path.abspath(__file__))
        iropt_model01 = application_path +  "/model_assets/v2/classifier_model.xml"
        iropt_weights01 = application_path + "/model_assets/v2/classifier_model.bin"
        print('__file__', __file__)
        print("root list", os.listdir(os.path.dirname(application_path)))
        print('iropt_model01', iropt_model01)

        if os.path.exists(iropt_model01):
            print(f"The file {iropt_model01} exists.")
        else:
            print(f"The file {iropt_model01} does not exist.")


        ie = ov.Core()
        model = ie.read_model(model=iropt_model01, weights=iropt_weights01)
        compiled_model = ie.compile_model(model=model, device_name="CPU")


        data_transform = transforms.Compose([transforms.ToTensor()])
        original_img = original_img.resize((224, 224))
        img = data_transform(original_img)
        # expand batch dimension
        img = torch.unsqueeze(img, dim=0)

        final_result = compiled_model(img)
        return original_img, final_result
    except Exception as e:
        print("exception occured in model", e)
        return None, None, None

脚本输出日志

not frozen /home/azureuser/repos/testing/model_tests
__file__ /home/azureuser/repos/testing/model_tests/models/v2.py
root list ['exe_tests', 'readme.md', 'model_tests']
iropt_model01 /home/azureuser/repos/testing/model_tests/model_assets/v2/classifier_model.xml
The file /home/azureuser/repos/testing/model_tests/model_assets/v2/classifier_model.xml exists.
processed

我用来生成exe的命令

pyinstaller --onefile --add-data="./model_assets/:model_assets" --add-data="./models/:models" run.py

规格文件

# -*- mode: python ; coding: utf-8 -*-


a = Analysis(
    ['run.py'],
    pathex=[],
    binaries=[],
    datas=[('./model_assets/', 'model_assets'), ('./models/', 'models')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='run',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

Exe输出日志

torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: ''If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?
torch/_jit_internal.py:857: UserWarning: Unable to retrieve source for @torch.jit._overload function: <function _DenseLayer.forward at 0x7f33eb09ff70>.
  warnings.warn(
torch/_jit_internal.py:857: UserWarning: Unable to retrieve source for @torch.jit._overload function: <function _DenseLayer.forward at 0x7f33eb040940>.
  warnings.warn(
in frozen
__file__ /tmp/_MEIsnn22m/models/v2.pyc
root list ['.font-unix', 'appInsights-nodeAIF-d9b70cd4-b9f9-4d70-929b-a071c400b217', '.Test-unix', 'model.model.ce94127b', 'tmux-1000', '.XIM-unix', 'snap-private-tmp', 'vscode-typescript1000', 'tmp8n5nctpl', '.ICE-unix', 'pyright-760509-fT8Zvg5wrUc0', 'python-languageserver-cancellation', 'migrate_db', 'tmppg2rdcrz', 'systemd-private-5c0adf38851c4f4db92772706bd8d827-systemd-logind.service-kYsd8h', 'hsperfdata_jenkins', '_MEIsnn22m', 'jetty-0_0_0_0-9090-war-_-any-11329012959618428727', 'systemd-private-5c0adf38851c4f4db92772706bd8d827-systemd-resolved.service-YQZQxj', '.X11-unix', 'systemd-private-5c0adf38851c4f4db92772706bd8d827-chrony.service-SHtjG9', 'winstone14475318769676059656.jar']
iropt_model01 /tmp/_MEIsnn22m/model_assets/v2/classifier_model.xml
The file /tmp/_MEIsnn22m/model_assets/v2/classifier_model.xml exists.
exception occured in model Exception from src/inference/src/core.cpp:100:
[ NETWORK_NOT_READ ] Unable to read the model: /tmp/_MEIsnn22m/model_assets/v2/classifier_model.xml Please check that model format: xml is supported and the model is correct. Available frontends: tf pytorch 

processed

从exe日志中可以看到xml文件存在,但仍然无法加载。

旁注 我也尝试使用 cx freeze 打包我的应用程序,但它只部分起作用。我在 include_files 列表中添加了 model_assets,但不是将它们添加到可执行文件中,而是将其维护在可执行文件之外。

python-3.x pytorch pyinstaller openvino
1个回答
0
投票

这个问题现在已经解决了,因为我在 GitHub 上的 pyinstaller issues 中发布了这个问题并得到了解决方案。事实证明,一些负责解析模型类型的插件没有加载。

查看this以供参考。

© www.soinside.com 2019 - 2024. All rights reserved.