Win11 での CUDA を使用した OpenCV の構成

先日、BilibiliでOpenCVを使ってCUDAを呼び出してターゲット検出とキーポイント検出を高速化するチュートリアルを見かけました。Pytorchに比べて推論速度が大幅に向上しました。最近RTX4070を導入したので試してみたいと思いました。パソコンを変えたばかりで環境が整っていないため、設定中に落とし穴に遭遇したので記録記事を書きました。

基本構成

  1. システム: Windows11-22H2
  2. グラフィックカード:RTX4070
  3. ドライバー: CUDA-11.8、cudnn-windows-x86_64-8.9.2.26
  4. コンパイルソフト:CMake、Visual Studio 2019
  5. バージョン: OpenCV 4.7.0、Contrib 4.7.0

前提条件

Visual Studio2019、CMake、CUDA、cuDNNをインストールする

  1. Visual Studio のダウンロード アドレス
  2. CMakeのダウンロードリンク
  3. CUDAのダウンロードリンク
  4. cuDNN のダウンロード リンク
    VS と CMake のインストールは、通常のソフトウェアと同様に非常に簡単です。CUDA と cuDNN のダウンロードとインストールについては、この前の記事を参照してください。

OpenCVをダウンロードして変更する

ダウンロード

住所

  1. OpenCV
  2. 投稿パッケージ

なお、ダウンロードするOpenCV本体パッケージとContribパッケージのバージョンは一致している必要があり、今回はバージョン4.7.0を使用しました。

ダウンロード後、検索しやすいように 2 つのパッケージを同じディレクトリに解凍します。同時に、コンパイル済みの CUDA をサポートする OpenCV ライブラリを保存するために、新しいフォルダーを作成する必要がありますが、ここでは、図 1 に示すように、同じディレクトリに opencv_cuda_build という名前のフォルダーを作成しまし

図 1 - 目次
ダウンロードした OpenCV コンパイル済みパッケージには CUDA および contrib パッケージでの関連サポートがないため、Contrib および CUDA をサポートするカスタマイズされた OpenCV ライブラリを生成するにはソース コードをコンパイルする必要があります。ダウンロードした OpenCV ソース コードと、推論を高速化するために必要なライブラリ ファイルの間には、次の手順が必要です。

  1. CMake を使用して OpenCV ソース コード プロジェクトを構成し、VS コンパイルに必要なプロジェクト ファイルを生成します。
  2. VS を使用してソース コードを対応するライブラリ ファイルにコンパイルします。
  3. VS プロジェクト内の独自のコンパイル済みライブラリにリンクする前に、VS へのコンパイルによって生成された OpenCV ライブラリ ファイルを構成します。

設定変更

客観的な理由により、OpenCV および contrib のコンパイルに必要な一部のライブラリは中国ではダウンロードできません。そのため、特定のライブラリの欠如によるコンパイルの失敗を避けるために、ダウンロードしたコード構成をいくつか変更する必要があります。

具体的には、主に OpenCV の ffmpeg、ippicv、contrib の face、xfeatures2d ライブラリです。

解決策は、これらのライブラリのダウンロード アドレスを変更し、元のダウンロード アドレスの前にエージェントを追加することです。
たとえば、ippicv の ippicv.cmake ファイル内の元のダウンロード アドレス

https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

プロキシアドレスを前に追加します

https://ghproxy.com/

このように修正するだけです

https://ghproxy.com/https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

図 2 に示すように
図 2 - ippicv ダウンロード アドレスの変更
、類推すると、ffmpeg 構成ファイルはopencv\sources\3rdparty\ffmpeg\ffmpeg.cmakeで、xfeatures2d 構成ファイルはopencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\xfeatures2d\にあります。 cmake** ディレクトリ Download_boostdesc.cmakeおよびdownload_vgg.cmake**、face の設定ファイルはF:\packages\opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\face\ CMakeListsです

OpenCVをコンパイルする

準備作業が完了したので、必要な OpenCV のコンパイルを開始します。

1. CMake を使用して OpenCV ソース コード プロジェクトを構成する

  • CMake ソフトウェアを開き、「ソース コードの場所」列で解凍した OpenCV ソース コードのパスを選択します(私の場合は、F:/packages/opencv/sources)。「バイナリをビルドする場所」列で、作成した opencv_cuda_build フォルダーを選択します。次に、[構成]をクリックして初めて構成を実行し、ポップアップ ダイアログ ボックスで VS 2019 と x64 を選択し、[完了] をクリックします。
    図 3 - CMake の構成
    実行が完了すると、インターフェイスは次のようになります。
    図 4 - 最初の構成の完了

  • 次に、CMake 検索ボックスで CUDA を検索し、ポップアップ CUDA オプションをチェックします。
    図 5-CUDA

  • 数学関連の検索と確認
    図 6 - 数学サポートの追加

  • 非無料の検索とチェック
    図 7 - 非フリー

  • BUILD_opencv_world を検索して確認します
    図 8-BUILD_opencv_world

  • GENERATE_SETUPVARS を検索してチェックを外します
    図 9 - GENERATE_SETUPVARS のキャンセル

  • 最後に、MODULES を検索し、contrib パッケージへのパスを追加します。
    図 10 - contrib パッケージ パスの追加
    この時点で、このステップの構成の選択を完了します。次に示すように、もう一度「configure」をクリックして、構成が完了するまで待ちます。
    図 11 - 2 番目の構成が完了しました

  • 構成が完了したら、CUDA_ARCH_BIN を検索し、独自の GPU コンピューティング能力に基づいて対応する値を保持することを選択します。特定の GPU に対応する値は、Nvidia 公式 Web サイトで確認できます40 シリーズ グラフィックス カードの計算能力は 8.9 で、OpenCV の 4.7 バージョンでサポートされる最大計算能力は 8.6 であるため、ここでは 8.6 を選択しました。

図 12 - GPU の計算能力
次に、 [configure]を 3 回クリックします. 完了を待った後、以下に示すように[generate]をクリックします:
図 13 - 構成が完了し、生成が成功した
次に、[Open Project] をクリックして Visual Studio 2019 を開きます。この時点で、CMake はその使命を完了しました。

2.Visual Studio 2019 OpenCVソースコードをコンパイルする

  • VS プロジェクトを開いた後、リリース x64 バージョンを選択し、 Solution Manager の CMakeTargets ディレクトリにあるALL_BUILD を右クリックし、 Generate を選択してコンパイルを開始します。(この処理には時間がかかります。13600K のコンパイルには約 50 分かかります)

図 14 - ALL_BUILD のコンパイル

  • ALL_BUILD コンパイルが完了したら、INSTALL を選択し、右クリックして生成操作を実行します
    図 14 - INSTALL の生成
    。この手順が完了すると、opencv_cuda_build/ フォルダーの下にインストール フォルダーが生成されます。
    図 15 - 生成されたインストール フォルダー
    生成されたインストール フォルダー内のファイルは、この時点で、OpenCV のコンパイルは完了です。

Visual Studio 2019 の構成

OpenCV をコンパイルした後、プロジェクト内でコンパイルされた OpenCV ライブラリを参照するために VS を構成する必要があります。具体的には主に以下のようなものがあります

  1. インクルードディレクトリを追加
  2. ライブラリディレクトリを追加
  3. 追加の依存関係を追加する
  4. 環境変数を追加する
  • まず、空の VS C++ プロジェクトを作成し、ソース ファイル main.cpp を追加します。次に、[ Release x64 ] を選択し、 [Release]を右クリックしインクルード ディレクトリの下に次の 2 つのインクルード パスを追加します。
F:\packages\opencv_cuda_build\install\include
F:\packages\opencv_cuda_build\install\include\opencv2

図 16 - インクルード ディレクトリの追加
図 17 - インクルード ディレクトリの追加

  • 次に、以下のライブラリ ディレクトリに lib パスを追加します。
F:\packages\opencv_cuda_build\install\x64\vc16\lib

図 18 - ライブラリ ディレクトリの追加

  • 最後に、opencv_cuda_build\install\x64\vc16\lib フォルダー内のすべての lib ファイル名を、リンカー -> 入力 -> 追加の依存関係オプションに追加します。ここには、opencv_img_hash470.lib と opencv_world470.lib のみがあります。
    図 19 - 追加の依存関係の追加
  • 最後に、コンパイルされたバイナリ ファイルのパスを環境変数に追加し、システムの検索バーで環境変数を検索して編集し、 [パス] 列にbin パスを追加する必要があります。
F:\packages\opencv_cuda_build\install\x64\vc16\bin

ここに画像の説明を挿入します

この時点で、VS の構成は完了し、VS でコンパイルしたばかりの CUDA サポートの OpenCV を呼び出すことができます。

テストプログラム

作成した main.cpp に次のサンプル プログラムを追加します。

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::cuda;

int main()
{
    
    
    // OpenCV版本号
    cout << "OpenCV_Version: " << CV_VERSION << endl;
    // CUDA
    int num_devices = getCudaEnabledDeviceCount();
    if (num_devices)
        cout << "CUDA is available, num_devices:" << num_devices << endl;
    else
        cout << "CUDA is not available." << endl;
    //读取图片
    Mat img = imread("D:/CUDA_ARCH_BIN.png");

    imshow("picture", img);
    waitKey(0);
    return 0;
}

画像とCUDAが正しく表示されればインストール成功です!
図 20 - テスト結果

リファレンスチュートリアル

  1. ippicv などのダウンロードの問題を解決する
  2. OpenCVのインストールチュートリアル
  3. 以前のインストール記事

おすすめ

転載: blog.csdn.net/weixin_40313940/article/details/131265058