エラーの発生
Google Mediapipeを使うプロジェクトをEXE化するとき、下記のようなエラーが発生します。
EXE化するときに、pyinstaller, py2exeのどれを使っても、同様なエラーが発生します。
# 実行
pyinstaller --onefile GUI-mediapipe-app.py
# エラー
Traceback (most recent call last):
File "GUI-mediapipe-app.py", line 26, in <module>
File "mediapipe/python/solutions/selfie_segmentation.py", line 54, in __init__
File "mediapipe/python/solution_base.py", line 229, in __init__
FileNotFoundError: The path does not exist.
[36342] Failed to execute script pose_edge
エラーの原因
Mediapipeライブラリーは、プログラムが実行するとき、特定のファイルを必要とします。特定のファイルとは、主にTensorflowファイルで .tflite拡張子を持っているファイルです。これらのファイルは動的に読み込まれるため(Dynamically loaded
)、PyinstallerなどのEXE化ソフトが、EXE化のコンパイル過程で、これらのファイルをdist フォルダに持ってくることも認識していませんん。
従って、上記のようにFileNotFoundError: The path does not exist.
のエラーが必ず発生します。
エラーの対策
この問題を解決するためには Pyinsatllerの spec fileのdata属性に、参照するフォルダを指定します。
Python環境(ここではvenv)フォルダ下にある\\Lib\\site-packages\\mediapipe\\modules
がmediapipe\\modules
であることを教えます。
datas=[(venv\\Lib\\site-packages\\mediapipe\\modules', 'mediapipe\\modules'),]
ここで私が作成したspec fileを掲載します。
これで問題が解決します。
# -*- mode: python ; coding: utf-8 -*-
# https://github.com/google/mediapipe/issues/2162
block_cipher = None
a = Analysis(['GUI-mediapipe-app.py'],
pathex=['.'],
binaries=[],
datas=[(venv\\Lib\\site-packages\\mediapipe\\modules', 'mediapipe\\modules'),],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += [('favicon.ico', '.\\image\\favicon.ico', 'DATA')]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='Tokyo2020_pictogram_GUI',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True,
disable_windowed_traceback=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='Tokyo2020_pictogram_GUI')
実行結果
mediapipeを利用し、自分のWebCamで、東京2020オリンピックのピクトグラムを生成するプログラムを作ってみました。
下記の動画のページに、プログラムダウンロードリンクもありますので、ご興味のある方は、ぜひご覧ください。
課題
Pyinstallerの場合、spec fileのdata属性に参照フォルダの情報を入れることで問題を解決しました。
しかし、py2exeの場合は、どうすればいいかまだ未確認です。py2exeでの、参照フォルダの指定する方法のご存知の方は、メモを残していただければと思います。