Tensorrt を使用して YOLOv5 ターゲット検出のコードを高速化する

1 はじめに

  • 最近はYOLOv5をapexアシスタントとして使っています トレーニングコードは完成しました トレーニング場で禁断のダミーを使うのはいいのですが、移動するターゲットの場合は常にフレームロスや追いつけない問題が発生します。FPS を測定したところ、RTX2060 の FPS はわずか 3 ~ 5 で、基本的に PPT のレベルと同等であることがわかりました。ハードウェアはしばらくアップグレードできませんが、APEX のサポートをどうしても終了したいと思っていますしたがって、国を救うにはコード アクセラレーションの方法を使用する必要がありました。Tensorrt はコードの高速化に非常に優れた効果があることをインターネットで知りましたので、試してみましょう。
  • まず現在の補助認識効果を入れます
  • (言っておきますが、TensorRT を使用して YOLOv5 を高速化すると、FPS は 100 以上に達する可能性があります。すごいですね~)

2.公式サイト

3. 依存関係をインストールする

3.1. OpenCVのインストール

  • 「リリース - OpenCV」ダウンロード ページに移動し、対応する OpenCV プラットフォームとバージョンを選択します。

3.1.1. インストール

インストール パッケージの内容を抽出します。
このインストールは通常のソフトウェアのインストールと変わりません。EXE インストール パッケージをクリックし、次の手順に進んで完了します。
インストール場所を選択してください。


  • インストール中

  • インストールが完了すると、インストールディレクトリにbuildとsourceの2つのフォルダが生成され、今後使用するファイルは主にbuildフォルダに配置されます。

3.1.2. 環境変数の追加

次の環境変数を追加します

D:\Program\OpenCV\build\x64\vc16\bin
D:\Program\OpenCV\build\x64\vc16\lib
D:\Program\OpenCV\build\include
D:\Program\OpenCV\build\include\opencv2

コンピュータを再起動した後

3.1.3. バージョンの表示

コマンドラインに次のコード opencv_version を入力して、OpenCV のバージョンを表示します。

3.2. TensorRT のインストール

3.2.1. ダウンロード

まず、Nvidia tensorRT の公式 Web サイトにアクセスして、Windows プラットフォームに適したバージョンをダウンロードします。

3.2.2. インストール

この TensorRT は本質的に、一連の lib ライブラリと一連の .h ファイルです。

ファイルをコピーする

  • TensorRT/ libの下にあるすべての lib をcuda v11.1/lib/ x64ディレクトリにコピーします。
  • TensorRT/ includeの下にあるすべての .h ファイルをcuda/v11.1/ includeディレクトリにコピーします。

3.2.3. 環境変数の追加

TensorRT/lib のパスを path 環境変数に入力します。

  • このようにして、TensorRT のインストールが完了しても、

4. プロジェクトのダウンロード

5. WTS モデルの生成

  • ウェアハウス内の gen_wts.py とダウンロードした yolov5s.pt 重みファイルを yolov5 6.0 ディレクトリにコピーします。
  • 次のコマンドを実行してモデルを変換します
  • python gen_wts.py -w yolov5s.pt -o yolov5s.wts
  • w パラメーターは入力 pt モデルのパスであり、-o パラメーターは出力 wts モデルのパスです。
  • 操作が完了すると、現在のディレクトリに yolov5s.wts の重みモデルが生成されます。このモデルは、後で tensorrt に変換するための専用のシリアル化モデルです。

6.cmake

6.1. メイクファイルの生成

  • 現在のウェアハウスの下に新しいビルド フォルダーを作成します

  • Cmake を開き、ソース ファイル用にこのウェアハウスのディレクトリを選択し、ビルド用に新しく作成したビルド ディレクトリを選択します。

  • 構成を変更して

    、必要な Visual Studio のバージョンとコンパイル プラットフォームを選択し、[完了] をクリックします。

  • しばらくすると完成します

6.1.1. CMakeLists.txt の設定

6.1.1.1. コンパイル依存関係のパスを変更する

CMakeLists.txt を開き、OpenCV、TensorRT、および dirent.h のディレクトリを変更します。Dirent.h は、こ​​のウェアハウスのインクルードに含まれています。これらのパスは絶対パスを使用する必要があり、パスを分割するには \ を使用する必要があることに注意してください。

6.1.1.2. 計算能力の変更

具体的な値については、
CUDA GPU | NVIDIA 開発者
developer.nvidia.com/zh cn/cuda gpus#computeを参照してください。私の RTX 2060 の計算能力は 75 なので、arch=compute_75;code=sm_75 を変更します。




7. コンパイル

7.1. ソースコードの変更

  • Visual Studio を使用してプロジェクト ビルド フォルダー内の sln ファイルを開き、

    yololayer.h ファイルを検索して変更します。
  • ファイル内のこれらのパラメータを独自のモデル カテゴリ番号、入力サイズ、
  • 公式の事前トレーニングされた重みを使用している場合は、それらを変更する必要はありません。ただし、自分で学習させたモデルを変更しないと後からエラーが報告されます
static constexpr int CLASS_NUM = 80;
static constexpr int INPUT_H = 640;  // yolov5's input height and width must be divisible by 32.
static constexpr int INPUT_W = 640;

7.2. exeファイルの生成

  • インターフェースの上部にあるデバッグを「Release」に変更し、メニューバーの「Generate」をクリックして、yolov5 を再生成します。

正常にコンパイルされました


対応するexeファイルがbuild/releaseフォルダに生成されていることが確認できます。

7.3. エンジンの生成

  • 最初に生成された yolov5s.wts モデルを exe が存在するフォルダーにコピーし、このディレクトリーで cmd 入力を開きます。
 yolov5 -s yolov5s.wts yolov5s.engine s

  • ここでは s モデルを使用し、最後に s を入力します。同様に、m モデルの場合、最後のパラメータを m に変更する必要があります。

  • この時点で、プログラムは wts をエンジン シリアル化モデルに変換しますが、これには長い時間がかかります。待ちきれないのでページを閉じないでください。閉じないと、これまでの作業がすべて無駄になります。特定の時間は、 CPUの性能 一般的には30~40分ほど待ちますが、長時間待つ必要はありません、他のことを先にしたり、動画を見たりしても大丈夫です

  • 私のコンピュータがコンパイルするのに 30 分以上かかりました


  • エンジンが生成されると、フォルダーの下に yolov5s.engine のモデルが表示されます。

8. 推論

8.1. 実行推論

  • ウェアハウス内の写真フォルダーをEXEフォルダー項目にコピーし、それが正しいかどうかを予測してみて、次のように入力します
yolov5 -d yolov5s.engine ./pictures

  • 画像が 2 枚ありますが、1 枚あたりの推論時間はわずか 4 ミリ秒、つまり 250FPS であり、この速度はかなり高速であると言えます。
  • そして推理効果も非常に優れています

8.2. Python 呼び出し DLL の推論

  • 先ほどモデルをC++としてデプロイした後、フォルダー内の画像を予測することができますが、それはこれに限られており、プログラム内の呼び出しではそれを行う方法がなく、多くの画像処理タスクを実行する場合では、実際には Python 言語を使用するため、モデルをさらに Python にデプロイする必要があります。

「プロジェクトのプロパティ」をクリックします -

  • ターゲットファイル拡張子と設定タイプをexeからdllに

    変更した後

  • 次にプロジェクトを再構築します

  • 生成が完了すると、yolov5.dll ファイルがフォルダーに表示されます。

  • Detector呼び出す DLL のパスと、予測する必要がある画像のパスを設定します。ここで、クラスのパラメーターはmodel_pathバイト型のパスで渡す必要があることに注意してください。b''つまり、文字列は次のように変換されます。バイト型。 b'' を追加しない場合、 TypeError : Expected bytes, str found エラーが発生します。

 det = Detector(model_path=b"./yolov5s.engine",dll_path="./yolov5.dll")  # b'' is needed
img = cv2.imread("./pictures/zidane.jpg")

  • ウェアハウスのルート ディレクトリにある python_trt.py を、dll ファイルが存在するフォルダーにコピーします。
  • コードを実行します。エラーが報告されなければ、次のテスト結果が表示されます。終わりです。楽しんでください。

8.3. パフォーマンステスト

  • 最後に、この TensorRT のパフォーマンスをテストしてみましょう

  • 単一の画像の検出に画像の読み取り時間を加えた場合、画像にかかる時間はわずか 0.015 秒、つまり 15 ミリ秒であり、速度は非常に高速です。

  • 100枚の写真を検出するのにかかる時間はわずか1.65秒です。

  • この以前の速度には、データの読み取り時間も含まれます。この部分の時間を削除すると、速度は大幅に速くなり、実際には 10 ミリ秒以内に画像を検出することが可能になります。

  • 100枚撮るのにかかる時間はわずか0.58秒、このまま走らせればFPSは170くらいになるはずです、つまりRTX2060Tiではこの速度は本当に速すぎて友達がいないのです~~~

  • 将来的には、Apex アシスタントがリアルタイム検出できるようになると思います

9. エラー報告

  • 構成プロセスでエラーが発生しました。プロジェクト ファイルが無効である可能性があります

  • CMakeLists.txt:3 (プロジェクト) での CMake エラー:

  • MSBuild コマンドの実行に失敗しました:

  • MSBuild.exe

  • 以下のエラー メッセージを確認して、どのファイルが見つからないかを確認してください。

  • MSBuild.exe の環境変数を追加する

D:\Program\VisualStudio2022\MSBuild\Current\Bin\amd64

コンピュータを再起動した後

  • Windows SDKのインストールは
    確実です

  • CUDA ツールセットが見つかりません。

説明

構成プロセスでエラーが発生しました。プロジェクト ファイルが無効である可能性があります

CUDA_SDK_ROOT_DIR-NOTFOUND

  • Windows CMake コンパイル エラー: CUDA ツールセットが見つかりません solution_cuda ツールセットが見つかりません。_Zirong. のブログ-CSDN ブログ

  • cuda を自分でインストールしたときに CUDA ツールセットがチェックされなかった可能性があります。もう一度再インストールして


    、コンピュータを再起動してください。

  • それでもエラーが報告される場合は、次の手順を実行します。

  • C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\visual_studio_integration**MSBuildExtensions にある 4 つのファイル* をD:\Program\VisualStudio2022\MSBuild\Microsoft\VC\v170* BuildCustomizationsに手動でコピーし

    ます。 20秒ほどで成功

  • 他の戦略を試しましたが機能しませんでした。
    古いバージョンの cmake を使用してください。

  • WindowsでのCUDAコンパイルの問題、Cmakeエラー:CUDAツールセットが見つかりません - コードログ

  • 3.17.1

  • バージョンは関係なく、設定が正しければ上位バージョンのcmakeでも正常にコンパイルできます。


  • cuda をアンインストールしてから再インストールするには、CUDA_SDK_ROOT_DIR を手動で指定します。
    このコンパイルには Ubuntu を使用します。cmake
    ですべての関連ファイルを再インストールするには、Visual Studio を使用します。

  • cudnn64_8.dll が見つからなかったため、コードの実行を続行できませんでした。プログラムを再インストールすると、この問題が解決される可能性があります。

  • このエラーは、ダウンロードした cudnn ファイルの解凍場所が間違っているはずです。再インストールしてください

  • TensorRT は cuBLAS/cuBLAS LT 11.3.0 に対してリンクされていましたが、cuBLAS/cuBLAS LT 11.2.1 がロードされました

  • これはエラーではなく警告です。最終的には正常にコンパイルされる可能性がありますが、精度は影響を受けます。

  • したがって、他の人の要件に従って、完全に正直に対応するバージョン、cuda11.3、cuDNN 8.1.0を選択してください。

  • 正しい cudnn を変更すると、エラー レポートが 1 つ減ります

  • cuda を 11.3 に変更すると、すべてのエラーがなくなり、


    一定の時間が経過するとコンパイルできるようになります

  • CUDA 遅延ロードが有効になっていません。これを有効にすると、デバイスのメモリ使用量を大幅に削減できます。https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.htmlenv-varsCUDA_MODULE_LOADING参照してください。

  • TensorRT の別のバージョンに変更するだけです

  • FileNotFoundError: モジュール 'E:\Documents\Desktop\Yolov5_Tensorrt_Win10-master\build\Release\yolov5.dll' (またはその依存関係の 1 つ) が見つかりませんでした。コンストラクター構文でフルパスを使用してみてください。

絶対パスを使用する

解決しませんでした

  • Python のバージョンが高すぎます。Python3.7 の下位バージョンを使用してください。
    通常、python3.7 より前のバージョンではエラーが報告されませんが、python3.8 ではエラーが報告されます。エラーの理由は python3.8 であるためです。具体的な原則については、このブログiyn.me/i/post 40.html
    をご覧ください。

  • Python 3.8 では、Windows でのダイナミック リンク ライブラリ (DLL) の読み込みルールが変更されます。

  • 新しいルールによりセキュリティが向上し、デフォルトでは、DLL の依存関係は信頼できる場所からのみロードできるため、 DLL ハイジャックなどのセキュリティ リスクがある程度回避されます。

  • 信頼できる場所には次のようなものがあります。

  • DLL が配置されているパス (DLL をロードするときに DLL の完全パスまたは部分パスを指定します。ファイルが存在する場合、そのパスは信頼されます)。

  • add_dll_directory() で追加されたパス。

  • (システムが信頼できる場所)

  • OSエラー: [WinError -529697949] Windows エラー 0xe06d7363

  • github.com/Monday Leo/Yolov5 Tensorrt Win10/issues/8

バージョンの互換性がないため

コンパイル プロセスで使用される Python のバージョンが、最終的な推論で使用される Python のバージョンと同じであることを確認する必要があります。そうでない場合、このエラーが発生する可能性があります。

  • コンパイル後、ビルドフォルダーに sln ファイルが存在しないのはなぜですか


  • 実行するのはconfigureだけであり、 slnファイルを生成するgenerateは実行しないためです。
  • 実行中のプロセスをよく見てください。「
    テストの実行 CMAKE_HAVE_LIBC_PTHREAD がエラーで失敗しました」となっているはずです。

  • Visual Studio が DLL ファイルを生成しない

  • 必要な依存ライブラリまたはヘッダー ファイルが欠落している

  • 前の手順で生成された sln ファイルに問題がある可能性があります

  • OSError: 例外: アクセス違反読み取り 0x0000000000000000

  • Win10 TensorRT-**8.4.3.1 **+ CUDA 11.7 + cudnn8.6.0.163

バージョンの不一致

  • 解を一度再生成すれば十分かもしれません。
    非常に形而上学的ですが、確かにこんな感じです


10. 参考文献

この場合に使用されるさまざまなリソース

おすすめ

転載: blog.csdn.net/u014723479/article/details/130967449