pyinstaller 深度学习模型打包——带资源打包exe

一、目的

  1. 实现了用pyinstaller打包深度学习模型为exe,实现模型在不同的环境下可以运行。
  2. 主要打包的是test ,也就是测试效果,并不是到别的环境下训练
  3. 实现了带资源打包,比如.pth等

二、具体流程

1.创建虚拟环境

因为使用pyinstaller打包深度学习模型,本身就会很大,所以我们需要在虚拟环境下打包。
我用的是anaconda

conda create --name SR# SR是我这边的虚拟环境名 
conda activate SR

2.在本地运行模型

需要在虚拟环境下,先把模型运行起来,测试可行才能进行下一步

3.安装pyinstaller

pip install pyinstaller

这个是最方便的方法;
但是我在具体操作时出现了pyinstaller报错的情况。

(1)本地环境python3.7,pyinstaller出现报错

原因:,现在我们pip install pyinstaller的版本,只支持python3.8以上。
解决方案1: 要想办法下载更低版本的pyinstaller ,maybe是 pip install pyinstaller=xx?没试过
解决方案2: 我这边是直接把环境换成了python3.8,丝滑~

4.打包多文件、带资源项目

由于我需要打包的是多个.py文件,以及包含了.pth权重资源文件的项目,所以我不能用许多博客里描述的直接用

pyinstaller -F xx.py#哒咩!!!

会出现千奇百怪的问题,就算打包完了也不能用
所以我们需要通过.spec来进行打包,这个.spec文件在我看来,有点像是Cmakelist.txt起到的作用。

step1:生成.spec文件

pyi-makespec test.py

这个test.py就是我们的测试的那个主要的文件。通过这个命令可以在本地生成同名的.spec文件。生成成功会显示:

Wrote C:\..\ESRGAN.spec.
Now run pyinstaller.py to build the executable.

step2:修改spec文件

因为是多文件、带资源打包,我们需要修改spec文件,不然会打包失败。

spec文件里的具体参数的设置可以找其他的博客,我这里主要写一下一些用到的参数,以及在设置中我遇到的错误:

我们主要修改的是spec的下面这个部分

a = Analysis(
    ['inference_realbasicvsr.py',
    "D:\\..\\models\\builde.py",#这里写项目里所有用到的.py文件的绝对路径
    "D:\\..\\configs\\xx.py"
    ],
    pathex=['D:\\documents\\work\\RealBasicVSR-master'],#这里写项目所在位置的绝对路径
    binaries=[],#这里是二进制文件,我试过把.pth写在这里,会报错
    datas=[('D:\\documents\\work\\xx.py','configs'),
    ("D:\\documents\\work\\xx.pth",".weights"),
    ("D:\\documents\\work\\xx2.pth",".weights" )],#这里写所有的资源文件,格式为('资源文件的绝对路径\\xx.pth','生成位置')
    hiddenimports=['mmcv','mmcv._ext'],#需要引入的库,可以在打包报错后一个个引入
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

其中datas=[]是引入资源文件的关键!!!
我们需要把所有的资源文件写到这个里,按照元组的格式(),()…
里面参数的含义:(‘D:\documents\work\xx.py’,‘weights’)前面表示的是本地的资源文件的绝对路径。后面的参数表示:在项目打包后,会在exe的那个同级路径下面生成一个".weights"的文件夹,在打包过程中会把这些资源文件放在这个文件夹下面。
所以exe在找资源文件的时候,也需要到这个路径".weights/xx.pth"下找。

注意!!所以在test.py中,读取资源文件的地方也要改成’.weights/xx.pth’,虽然当下在pycharm编译不会成功,但是打包后可以运行

step3:项目打包

完成上面工作后,可以开始打包了,我是用pycharm在这个虚拟环境下打包的:

pyinstaller test.spec

注意:输入这个命令就行,加别的命令会报错,如果有–add data参数的需求,直接在spec里改datas就行,–hidden什么的直接在spec里改就行了,我在上面写了。

打包成功会显示:

...
96931 INFO: Building EXE from EXE-00.toc completed successfully.
96995 INFO: checking COLLECT
96995 INFO: Building COLLECT because COLLECT-00.toc is non existent
96996 INFO: Building COLLECT COLLECT-00.toc
133736 INFO: Building COLLECT COLLECT-00.toc completed successfully.

step4:打包成功!

打包成功后,会在你的项目下面出现两个文件夹:build和dist。我们需要的打包后的lib库以及exe文件就在这个dist下面。
进入这个exe路径下,进入cmd,直接运行就行

D:\..\dist\XX>XX.exe data/demo_001 TEST

不用加python,参数设置也和之前在pycharm下一样就行

(1)错误1:出现xx.dll找不到或者别的什么

原因1: 这个可能是因为这个dll没有
解决方法: 如果是常见库的dll,就在自己电脑上用everything扒拉一下,复制过来就行
原因2: 这个可能是因为这个dll依赖的别的dll没有
解决方法: 我们用Dependence找一下这个dll依赖了什么dll,如果是常见库的dll,就在自己电脑上用everything扒拉一下,复制过来就行。

注:dependence用法,直接把dll拉到那个界面就行,标红的库就是没有的

(2)错误2:迁移到别的电脑后,出现NoneType …write

这个问题的原因有很多,我这里只写我遇到的:
在这里插入图片描述
这是我遇到的问题,这个问题是因为项目中的VGG19预训练模型是从网上下载的,之后再运行,代码会直接在迁移后的电脑的./cache/torch/hub/checkpoints/下找这个下载的预训练模型。
但是在别的机子上可能没有这个.pth,所以我们只要复制过去就行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值