序文
この記事を書いた理由は、labelImg を pyinstaller でパッケージ化する過程で、たくさんの落とし穴を踏み、何度も涙を流したからです。
とても簡単なことだと思いましたが、インターネットでさまざまな情報を検索し、さまざまな方法を試し、数日間悩んだ後、ついに完成しました。
この間、pyqtの問題かと思い別途デモを書いたところ、テストでは問題ありませんでした。pyinstallerの公式サイトも調べましたが、問題は解決しませんでした。
本当に理解できません。インターネット上には非常に多くのチュートリアルがありますが、どれも正常にパッケージ化できません。私が何か間違ったことをしたからでしょうか?それでも、多くの人はパッケージ化コマンドをまったく実行したことがなく、実際、一部のチュートリアルのパッケージ化コマンドではエラーが報告されます。。。
この記事では主に、pyinstallerを使用してlabelImgをパッケージ化する方法について説明します。pyinstallerのインストール方法と使い方、labelImgの環境設定についてはここでは説明しません。
1. labelImg の概要
labelImg は、深層学習オブジェクト検出によく使用されるラベル付けツールです。ソース コードは、github
公式 Web サイト ( labelImg
) からダウンロードできます。対応するページで Download ZIP を見つけてダウンロードします。
2、梱包
2.1 従来の梱包方法
私は Python 関連の開発には pycharm を使用することを好むため、以下の手順はすべて pycharm で行われます。
パッケージ化する際は、端末内の仮想環境(venv)に切り替えます。
1. パッケージ化コマンドを実行します。
pyinstaller -D -w labelImg.py
dist
2.フォルダー内でモジュール/ライブラリを見つけlabelImg.exe
、ダブルクリックして実行すると、モジュール/ライブラリが見つからないことを示すエラーが報告されますlibs
。
従来のパッケージ化方法は失敗します。
2.2 正式な梱包方法
1.github
上に移動して梱包手順を見つけます。
2. 梱包
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "labelImg" -c labelImg.py -p ./libs -p ./
単一の exe が生成され、ファイルが見つからないというメッセージが表示されますpredefined_classes.txt
。
理由は、単一の exe を実行すると、最初に一時的に特定のディレクトリに解析され、パスが変更され、元のファイルが見つからなくなるためです。具体的な解決策については、Baidu または pyinstaller の公式 Web サイトに自分でアクセスしてください。
3. 簡易包装説明書
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -D labelImg.py -p ./libs -p ./
解凍後、元のフォルダーを同じディレクトリdata
にコピーします。ダブルクリックして実行します(黒枠の消し方がわかりません)。labelImg.exe
[付録] pyinstallerの共通オプション
-h、--ヘルプ | このモジュールのヘルプ情報を表示する |
---|---|
-F,–1ファイル | 実行可能プログラムとしてディレクトリ (複数のファイルを含む) を生成します。 |
-d,–デバッグ | 実行可能ファイルのデバッグ バージョンを生成する |
-w、–ウィンドウ、–noconsolc | プログラムの実行中にコマンド ライン ウィンドウを表示しないように指定します (Windows のみ有効) |
-c、–ウィンドウなし、–コンソール | コマンド ライン ウィンドウを使用してプログラムを実行するように指定します (Windows でのみ有効) |
-o あなた、-out=あなたの | スペックファイルが生成されるディレクトリを指定します。指定しない場合、デフォルトで現在のディレクトリが仕様ファイルの生成に使用されます。 |
-p DIR,–path=DIR | Python インポートされたモジュールのパスを設定します (PYTHONPATH 環境変数の設定と同様)。複数のパスは、パス区切り文字 (Windows の場合はセミコロン、Linux の場合はコロン) を使用して区切ることもできます。 |
-n 名前、–name=名前 | プロジェクト (生成された仕様) 名を指定します。このオプションを省略した場合、最初のスクリプトのメイン ファイルの名前が仕様の名前として使用されます。 |