Linux系統使用pyinstaller打包pytorch模型瘋狂踩坑記(含權重文件和圖片等)

整了一天半,整到心態爆炸,終於整好了,哭了。

首先,先自學了pyqt5編寫界面,編寫的過程就下次再說吧。

編寫完之後,文件夾中包括權重文件和兩張圖片。作爲小白,咱也不知道這個打包竟然不能打包圖片和權重文件,百度了好幾圈終於知道了,/(ㄒoㄒ)/~~

然後這些圖片咋整啊,後來看到了大佬寫的代碼,把圖片先轉成py文件,再從py文件中解碼出來。代碼如下:

1.圖片轉py文件代碼:

import base64


def pic2py(picture_name):
    """
    將圖像文件轉換爲py文件
    :param picture_name:
    :return:
    """
    open_pic = open("%s" % picture_name, 'rb')
    b64str = base64.b64encode(open_pic.read())
    open_pic.close()
    # 注意這邊b64str一定要加上.decode()
    write_data = 'img = "%s"' % b64str.decode()
    f = open('%s.py' % picture_name.replace('.', '_'), 'w+')
    f.write(write_data)
    f.close()


if __name__ == '__main__':
    pics = ["background.tif", "single_back.tif"]
    for i in pics:
        pic2py(i)
        print("ok")

接下來,在你使用圖片的py文件中加入如下:

from single_back_tif import img as single_back
from background_tif import img as background
tmp = open('single_back.tif', 'wb')  # 創建臨時的文件
tmp.write(base64.b64decode(single_back))  ##把這個one圖片解碼出來,寫入文件中去。
tmp.close()

ok,圖片解決了~~~

接下來權重文件怎麼辦呢,開動機智的大腦,使用最笨滴方法,在界面中加一個按鍵,自己選擇權重文件路徑進行加載哈哈哈。d

比如,我定義了一個按鍵功能,如下:

def openpth(self):
        global openfile_name_pth
        openfile_name_pth, _ = QFileDialog.getOpenFileName(self.open_pth, '選擇權重文件', '/home/',
                                                           'pb_files(*.pth)')

 

終於把這些摸清楚了,往下走,就是生成exe文件~~

但是!又出現了問題,這玩意兒就是顯示成功生成,但是打不開啊打不開。並且在dist文件夾下還有一個文件夾,這個文件夾中包含了一個exe文件,這種是不對的,dist文件夾下應該直接就是exe文件了(打包命令爲:pyinstaller -F -w 主文件.py)也不知道哪裏出錯了,爲了快點整好,我就換了一個anaconda環境,沒想到真的直接在dist下生成了exe,但是!報錯了,好多錯,也不知道是哪裏出錯了,就使用排除法

先新建一個hello.py

輸入:

from PyQt5 import QtGui, QtWidgets
print('Hello Python!')

將hello.py打包,看是不是這裏有錯,發現沒錯。

然後再寫入:

import cv2
from PyQt5 import QtGui, QtWidgets
print('Hello Python!')

再將hello.py打包,出錯!

錯誤1:

  File "site-packages/pkg_resources/__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[30130] Failed to execute script pyi_rth_pkgres


解決方法:降低setuptool的版本,降低方法自行百度~~

錯誤2:

  File "site-packages/cv2/__init__.py", line 5, in <module>
ImportError: numpy.core.multiarray failed to import
[32464] Failed to execute script hello


解決方法:降低numpy的版本,具體降低多少,大家試試吧,比你原先的降點試試~~

在這裏,雖然順利生成了exe,但在測試時,發現exe會閃退,說是有這個毛病:

AttributeError: 'list' object has no attribute 'seek'. You can only torch.load from a file that is seekable. Please pre-load the data into a buffer like io.BytesIO and try to load from it instead.
Aborted (core dumped)


但是,在加載權重文件進行下一步時,出現了閃退,爲了解決這個問題,我還是重新加了路徑:

在該文件夾下新建一個文件夾pth放置我的權重文件,然後在調用權重文件之前,加入如下命令:

if getattr(sys, 'frozen', False):
    cur_path = sys._MEIPASS
else:
    cur_path = os.path.dirname(__file__)
PATH_TO_FROZEN_PTH = os.path.join(cur_path, 'pth/039.pth')  # ui.openpb()

然後生成exe。再修改生成的.spec文件,修改爲:

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

block_cipher = None

added_files = [('/home/1/GUI/mkgui/pth', 'pth')]
a = Analysis(['recog_vis.py'],
             pathex=['/home/1/_GUI/mkgui'],
             binaries=[],
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='recog_vis',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

至此,全部問題解決!感謝之前的博友的博客,看了好多,也不記得原先的鏈接,沒法貼出來了,感謝大家!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章