一、正常打包自定义脚本
本文基于ultralyics的yolov8和halcon的标注hdict文件,写了一个一键生成yolo数据集、训练、推理、模型导出、测试的脚本。并且将该脚本编译成traintest.pyd文件(需要可私信),使用主函数yoloit.p文件调用上面traintest.pyd动态库模块,进行训练推理等一系列操作。其中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脚本进行打包
生成如下文件夹,在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文件了。
再次尝试:
没有问题!!!
成功!!!