LoginSignup
8
6

More than 1 year has passed since last update.

mediapipeを含んだファイルをexe化するときに発生するエラーの原因とその対策

Last updated at Posted at 2021-08-02

エラーの発生

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\\modulesmediapipe\\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での、参照フォルダの指定する方法のご存知の方は、メモを残していただければと思います。

8
6
1

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
8
6