OpenCVのInference Engine backendとしてOpenVINOを使用する
概要
OpenCVのDNNモジュールのbackendとしてIntel Inference Engineを使用するときの設定手順です。
C++のOpenCVから、YuNetによるdetectionを行う際に、ONNXではなくOpenVINO形式のモデルを使用します。
環境
本記事の実行環境です。
Windows 10
準備
以下のリンクからOpenCV 4.5.5(relase binaries)のpackageをダウンロードします。
Intel's Deep Learning Inference Engine backend
ダウンロード後、任意の場所に展開します。今回は、\C:直下に展開します。
同様に以下のリンクからOpenVINOのRuntimeもダウンロード&インストールします。
Intel® Distribution of OpenVINO™ Toolkitへのリンク
手順
C++での呼び出し
今回はFaceDetectorYNに対して、OpenVINO形式のbinとxmlファイルを指定します。基本的に以下の引数の設定だけです。FaceDetectorYNは内部でreadNetを呼んでいるので、readNetへの引数と同じものが渡せます。当然ながらyunetの公式?として公開されているONNX形式も渡せます。
以下のように第1・2引数にそれぞれのファイルのパスを渡します。第7引数のbackend_idを2に指定するとIntel's Inference Engineを指定できます。デフォルトは0(CPU)です。
cv::FaceDetectorYN::create(
"</path/to/bin_file>",
"</path/to/xml_file>",
<DETECT_IMAGE_SIZE>,
<score_threshold>,
<nms_threshold>,
<top_k>,
<backend_id>,
<target_id>
)
CMakeLists.txtの設定
今回対象の部分としては、以下になります。既存のCMakeLists.txtに以下を部分的に追加するだけで動作すると思います。
set(OpenCV_DIR "C:\\opencv\\build\\cmake")
find_package(OpenCV REQUIRED)
set(InferenceEngine_DIR "C:\\Program Files (x86)\\Intel\\openvino_2022.1.0.643\\runtime\\cmake")
find_package(InferenceEngine REQUIRED)
target_link_libraries(<bin_name> PRIVATE ${OpenCV_LIBS} ${InferenceEngine_LIBRARIES})
最後に
OpenVINO形式のモデルをOpenCVで実行するのに、OpenVINO形式へのモデル変換を事前にやっていたのですが、Unknown model format!というエラーが出てモデル読み込みができない状態でした。原因としては、OpenVINOのバージョンが揃っていなかったというものでした。現時点では、OpenCV 4.5.5のOpenVINOと同じバージョンのOpenVINOでモデル変換を行う必要があると思います。OpenCV 4.6を使用する場合は、ビルドする必要があると思います。OpenCV 4.6でOPENCV_DNN_OPENVINOとWITH_OPENVINOオプションを有効にしてビルドしてみましたが、うまく動作しませんでした。もっとよくわからなかったのがInferenceEngineで指定するOpenVINOは最新版(2022)で問題なく動作したいう点。まだまだ、OpenVINOへの理解が必要なんだと思いました。
Discussion