pyinstaller + YOLOv8 でEXEがうまく起動できなかった。
こんなエラーが出て起動できない。
スクロールして一番最後を見てみると、default.yaml
ファイルが見つからないとのこと。
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\WoLNamesBlackedOut\\dist\\WoLNamesBlackedOut\\_internal\\ultralytics\\cfg\\default.yaml'
こんなこともあろうかと、既にQiitaの記事をストックしておいた!
ただ私のspecの書き方が悪いのか、すぱっと解決しませんでした。
学習させた重みファイルを参照したいので、
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
model = YOLO(resource_path("my_yolov8n.yaml"))
model = YOLO(resource_path("my_yolov8n.pt"))
とし、pyinstallerのスペックでは、
datas=[('my_yolov8n.pt','.'),('my_yolov8n.yaml','.'),]
としていたので、参考としたQiita記事のように、うまくultralyticsを追加できませんでした。
よろしい。ならば検索だ!
眺めていると、
Find yolo/utils/init.py, in about line34 change DEFAULT_CFG_PATH to absolute path above, official value
start with ‘ROOT / ...’.
という記述を見つけ、YOLOv8がパスを見失っていることが原因らしい・・・
そういえば最近そんなことあったな!
手前味噌ですが、自分の投稿が役に立ちました。
この時は、MMCV対応でしたが、同じ方法でうまく対応できました。
具体的には、
1.hook-ultralytics.py を作成
from PyInstaller.utils.hooks import collect_data_files
datas = collect_data_files("ultralytics")
2.hook-ultralytics.py をhooks
というフォルダに保存
3. main.specを次のように記述
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('my_yolov8n.pt','.'),('my_yolov8n.yaml','.'),],
hiddenimports=[],
hookspath=['./hooks'], #こちら
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
このようにすることで、pyinstallerはhooksを参照し、hook-ultralytics.pyを実行してくれるようです。
結局、参考とさせていただいた記事と同じ内容を実施しているのではないかと思います。
めでたし、めでたし。