先日、BilibiliでOpenCVを使ってCUDAを呼び出してターゲット検出とキーポイント検出を高速化するチュートリアルを見かけました。Pytorchに比べて推論速度が大幅に向上しました。最近RTX4070を導入したので試してみたいと思いました。パソコンを変えたばかりで環境が整っていないため、設定中に落とし穴に遭遇したので記録記事を書きました。
目次
基本構成
- システム: Windows11-22H2
- グラフィックカード:RTX4070
- ドライバー: CUDA-11.8、cudnn-windows-x86_64-8.9.2.26
- コンパイルソフト:CMake、Visual Studio 2019
- バージョン: OpenCV 4.7.0、Contrib 4.7.0
前提条件
Visual Studio2019、CMake、CUDA、cuDNNをインストールする
- Visual Studio のダウンロード アドレス
- CMakeのダウンロードリンク
- CUDAのダウンロードリンク
- cuDNN のダウンロード リンク
VS と CMake のインストールは、通常のソフトウェアと同様に非常に簡単です。CUDA と cuDNN のダウンロードとインストールについては、この前の記事を参照してください。
OpenCVをダウンロードして変更する
ダウンロード
住所
なお、ダウンロードするOpenCV本体パッケージとContribパッケージのバージョンは一致している必要があり、今回はバージョン4.7.0を使用しました。
ダウンロード後、検索しやすいように 2 つのパッケージを同じディレクトリに解凍します。同時に、コンパイル済みの CUDA をサポートする OpenCV ライブラリを保存するために、新しいフォルダーを作成する必要がありますが、ここでは、図 1 に示すように、同じディレクトリに opencv_cuda_build という名前のフォルダーを作成しました。
ダウンロードした OpenCV コンパイル済みパッケージには CUDA および contrib パッケージでの関連サポートがないため、Contrib および CUDA をサポートするカスタマイズされた OpenCV ライブラリを生成するにはソース コードをコンパイルする必要があります。ダウンロードした OpenCV ソース コードと、推論を高速化するために必要なライブラリ ファイルの間には、次の手順が必要です。
- CMake を使用して OpenCV ソース コード プロジェクトを構成し、VS コンパイルに必要なプロジェクト ファイルを生成します。
- VS を使用してソース コードを対応するライブラリ ファイルにコンパイルします。
- 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 に示すように
、類推すると、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 を選択し、[完了] をクリックします。
実行が完了すると、インターフェイスは次のようになります。
-
次に、CMake 検索ボックスで CUDA を検索し、ポップアップ CUDA オプションをチェックします。
-
数学関連の検索と確認
-
非無料の検索とチェック
-
BUILD_opencv_world を検索して確認します
-
GENERATE_SETUPVARS を検索してチェックを外します
-
最後に、MODULES を検索し、contrib パッケージへのパスを追加します。
この時点で、このステップの構成の選択を完了します。次に示すように、もう一度「configure」をクリックして、構成が完了するまで待ちます。
-
構成が完了したら、CUDA_ARCH_BIN を検索し、独自の GPU コンピューティング能力に基づいて対応する値を保持することを選択します。特定の GPU に対応する値は、Nvidia 公式 Web サイトで確認できます。40 シリーズ グラフィックス カードの計算能力は 8.9 で、OpenCV の 4.7 バージョンでサポートされる最大計算能力は 8.6 であるため、ここでは 8.6 を選択しました。
次に、 [configure]を 3 回クリックします. 完了を待った後、以下に示すように[generate]をクリックします:
次に、[Open Project] をクリックして Visual Studio 2019 を開きます。この時点で、CMake はその使命を完了しました。
2.Visual Studio 2019 OpenCVソースコードをコンパイルする
- VS プロジェクトを開いた後、リリース x64 バージョンを選択し、 Solution Manager の CMakeTargets ディレクトリにあるALL_BUILD を右クリックし、 Generate を選択してコンパイルを開始します。(この処理には時間がかかります。13600K のコンパイルには約 50 分かかります)
- ALL_BUILD コンパイルが完了したら、INSTALL を選択し、右クリックして生成操作を実行します
。この手順が完了すると、opencv_cuda_build/ フォルダーの下にインストール フォルダーが生成されます。
生成されたインストール フォルダー内のファイルは、この時点で、OpenCV のコンパイルは完了です。
Visual Studio 2019 の構成
OpenCV をコンパイルした後、プロジェクト内でコンパイルされた OpenCV ライブラリを参照するために VS を構成する必要があります。具体的には主に以下のようなものがあります
- インクルードディレクトリを追加
- ライブラリディレクトリを追加
- 追加の依存関係を追加する
- 環境変数を追加する
- まず、空の VS C++ プロジェクトを作成し、ソース ファイル main.cpp を追加します。次に、[ Release x64 ] を選択し、 [Release]を右クリックし、インクルード ディレクトリの下に次の 2 つのインクルード パスを追加します。
F:\packages\opencv_cuda_build\install\include
F:\packages\opencv_cuda_build\install\include\opencv2
- 次に、以下のライブラリ ディレクトリに lib パスを追加します。
F:\packages\opencv_cuda_build\install\x64\vc16\lib
- 最後に、opencv_cuda_build\install\x64\vc16\lib フォルダー内のすべての lib ファイル名を、リンカー -> 入力 -> 追加の依存関係オプションに追加します。ここには、opencv_img_hash470.lib と opencv_world470.lib のみがあります。
- 最後に、コンパイルされたバイナリ ファイルのパスを環境変数に追加し、システムの検索バーで環境変数を検索して編集し、 [パス] 列に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が正しく表示されればインストール成功です!