0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Yolov8モデルをPyinstallerでexe化するのにハマった点

Posted at

Pyinstallerでexeアプリを作成するのに苦労したので備忘録です

pyinstaller = ver 5.6.2
python = ver 3.10.9
ultralytics = ver 8.0.47

yolov8モデルを作成する際に、作業用フォルダを作成し
pip install ultralytics
するとフォルダにultralyticsというフォルダができます。このフォルダをpyinstallerに認識させるのに苦労しました。
exe化したいpyファイル(今回はyolov8_myproject.py)まで移動して
最初は
pyinstaller --collect-data=ultralytics yolov8_myproject.py --onefile
オプションを付けて実行したが、ultralyticsあたりのmodule not foundを連発。さらに、コンソールが一瞬で消えるのでエラーの内容がわかりません。
1.コンソールが消えないようにyolov8_mypoject.pyの冒頭に
import subprocess subprocess.Popen('PAUSE', shell=True)
を付け足して、コンソールが消えないようにしておきます。
2.pyinstaller --collect-data=ultralytics yolov8_myproject.py
onefile オプションを外します。作成すると、distフォルダにyolov8_myprojectが作成され、その中にyolov8_myproject.exeファイルが作成されるのでそれを実行すると、ultralyticsのファイルが存在しないといわれます。作業用フォルダのultaralyticsフォルダが参照できないようです。そこで、作業用フォルダのultralyticsフォルダをyolov8_myproject.exeファイルと同一階層にコピーします。
3.exeファイルを実行すると、別のmodule not foundがでるので、yolov8_myproject.pyファイルと同一階層に作成されたyolov8_myproject.specファイルをエディタで編集し、hidden importにmodule を書き加えます

from PyInstaller.utils.hooks import collect_data_files

datas = []
datas += collect_data_files('ultralytics')


block_cipher = None


a = Analysis(
    ['yolov8_myproject.py'],
    pathex=[],
    binaries=[],
    datas=datas,
    hiddenimports=['charset_normalizer.md__mypyc'],
    hookspath=[],
    hooksconfig={},
    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,
    [],
    exclude_binaries=True,
    name='yolov8_myproject',
    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.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='yolov8_myproject',
)

以上がspecファイルの全体になります。
pyinstaller yolov8_ocd_20240218.spec
で再度実行すると、distファイルが空でないと怒られるので、distファイルの中身を削除して、再度実行し最後にultralyticsフォルダをもう一度コピーして、、

何とか動きました!

onefileではないので、配布するときはフォルダ事渡して、exeファイルの位置を移動させないように注意が必要です。
2024/2/19時点ですので、ultrapyticsの仕様が変わればまた変わるかもしれません。
参考サイト
pyinstaller + yolo v8
YoloV8 deploy (EXE/WINDOWS) #1356
[PyInstallerのImportErrorとModuleNotFoundErrorで躓いた話]
(https://qiita.com/__Lily__/items/b2d55965e417f2997324)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?