基于yolov8训练推理脚本pyinstaller打包openvino报错问题

一、正常打包自定义脚本

本文基于ultralyics的yolov8和halcon的标注hdict文件,写了一个一键生成yolo数据集、训练、推理、模型导出、测试的脚本。并且将该脚本编译成traintest.pyd文件(需要可私信),使用主函数yoloit.p文件调用上面traintest.pyd动态库模块,进行训练推理等一系列操作。其中pyd编译过程可以参考:

py编译pyd

最终生成如下两个文件,其中yoloit.py为终端输入参数argparse

import argparse
import traintest

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Yoloit arguments')
    parser.add_argument('--nomkdata', action='store_false', default=True, help='if make yolodataset')
    parser.add_argument('--notrain', action='store_false', default=True, help='if train  model')
    parser.add_argument('--noexport', action='store_false', default=True, help='if exported model')
    parser.add_argument('--notest', action='store_false', default=True, help='if test model')
    parser.add_argument('--resume', action='store_true', default=False, help='if resume model')
    parser.add_argument('--alldir', type=str, default=None, help='Directory for all files')
    parser.add_argument('--jsonpath', type=str,
                        default=r'D:\ALLvision\pycharmproject\halcon2yolo\printer\data\printer2.json',help='Path to JSON file')
    parser.add_argument('--epochs', type=int, default=1, help='Number of epochs for training')
    parser.add_argument('--batch', type=int, default=1, help='Batch size for training')
    parser.add_argument('--workers', type=int, default=0, help='Number of workers for data loading')
    parser.add_argument('--amp', action='store_true',default=False, help='Use mixed precision training')
    parser.add_argument('--imgsz', type=int, default=640, help='Input image size for training')
    parser.add_argument('--patience', type=int, default=0, help='Patience for early stopping during training')
    parser.add_argument('--device', type=str, default=None, help='Device for training')
    parser.add_argument('--format', type=str, default='openvino', help='Export format')
    parser.add_argument('--imgsz_infer', nargs=2, type=int, default=[1024, 1024], help='Input image size for inference')
    parser.add_argument('--half', action='store_true',default=False, help='Use half precision export')
    parser.add_argument('--dynamic', action='store_true', default=False,help='Enable dynamic export')
    parser.add_argument('--simplify', action='store_true', default=True,help='Simplify exported model')
    parser.add_argument('--inferedimg', type=str,
                        default=r'D:\ALLvision\pycharmproject\pyinstallit\traintest\try2\imgsave', help='Directory to save inferred images')
    parser.add_argument('--testimg', type=str,
                        default=r'D:\ALLvision\pycharmproject\pyinstallit\traintest\try2\ori', help='Directory containing test images')
    parser.add_argument('--modelpath', type=str, default='yolov8s.yaml', help='modelpath of original yaml')
    args = parser.parse_args()

    traintest.yoloit(args)

    # python yoloit.py --jsonpath D:\ALLvision\pycharmproject\printerDetect\uniontry\printer59half.json
    #                  --testimg D:\ALLvision\pycharmproject\onechannel\printer\426\Data\imagegray428
    #                  --inferedimg D:\ALLvision\pycharmproject\printerDetect\uniontry\argsinput\imgsave

然后参照这篇文章,对自己写的python脚本进行打包

pyinstaller打包py脚本流程

生成如下文件夹,在cmd中进入文件夹dist/yoloit下,输入yoloit.exe 以及yoloit.py的参数,例如:

yoloit.exe --jsonpath D:\ALLvision\pycharmproject\halcon2yolo\printer\data\printer2.json --testimg D:\ALLvision\pycharmproject\pyinstallit\traintest\try2\ori --inferedimg D:\ALLvision\pycharmproject\halcon2yolo\pyinstaller\tryit3\dist\yoloit\imgsave

运行时报错如下,根据报错信息在D:\ALLvision\pycharmproject\halcon2yolo\pyinstaller\tryit2\dist\yoloit\_internal文件夹里添加yolov8的ultralytics/cfg/default.yaml和models/v8/yolov8.yaml文件及文件夹,然后再运行

再次运行结果

运行前面没问题,后面openvino导出模型,以及推理时,openvino报错:

该错误是由于openvino的相关包没有打入,需要在pyinstaller时使用--collect-all openvino尝试将所有子模块导入。可以先在python环境的终端命令中输入pyi-makespec xxx.py  --collect-all openvino或者pyinstaller xxx.py --collect-all openvino 生成一个Sepc文件,然后对spec文件进行编辑,加入相关hiddenimports

# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_all

datas = []
binaries = []
hiddenimports = []######在此处添加相关要引入的隐藏包,报错了再添加,不报错建议不添加######
#hiddenimports = ['tqdm','ultralytics']修改为这样
tmp_ret = collect_all('openvino')
datas += tmp_ret[0]; binaries += tmp_ret[1]; hiddenimports += tmp_ret[2]


a = Analysis(
    ['yoloit.py'],
    pathex=[],
    binaries=binaries,
    datas=datas,
    hiddenimports=hiddenimports,
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

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

然后再在python环境终端输入pyinstaller xxx.spec命令就能正确导出能成功运行的exe文件了。

再次尝试:

没有问题!!!

成功!!!

  • 46
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值