OpenVINO 2022.1 ランタイムを  Raspberry Pi OS 64bit 向けに x86_64 ホストでクロスコンパイルする

# Raspberry Pi OS (64bit Debian 11 bullseye) 用 OpenVINO 2022.1 ランタイム

OpenVINO 2022.1.0 は、[公式ダウンロードサイト](https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html) に Raspberry Pi OS 用バイナリが提供されていません。[openvinotoolkit.org](https://storage.openvinotoolkit.org/repositories/openvino/packages/) には 2022.1.1 以降 Debian 9 armv7l 32bit バイナリが提供されていますが 64bit版はありません。
ここでは、github からソースをクローンし、x86_64 ホストでクロスコンパイルします。

（2022年9月23日に [2022.2 がリリース](https://community.intel.com/t5/Intel-Distribution-of-OpenVINO/NEW-RELEASE-Intel-Distribution-of-OpenVINO-toolkit-2022-2/td-p/1416920)されていますが、同 9月末時点で対応する [OpenCV のバージョン](https://github.com/opencv/opencv/tags)が不明のため 2022.1 のままとします）

## x86_64 ホストのクロスコンパイル環境
ホストには、古い Xeon ワークステーション HP Z230 SFF (E3-1271v3, 16GB DDR3-1600 メモリ) を使っています。

ホスト OS は Ubuntu 20.04 x86_64 ですが、クロスコンパイルでは、ディストリビューション，リリースをターゲットに合わせることが無難（主にホスト・ターゲット間の glibc2, gcc/g++ バージョン差異の関係）ですので、docker で Raspberry Pi OS と同じ Debian 11 bullseys を動かします。

### Docker イメージ
Docker Hub の公式イメージ debian:11 を基に、以下のコンパイラ関連，python 関連パッケージをインストールしたイメージを使います。
```
make cmake pkg-config git scons shellcheck g++-aarch64-linux-gnu python2 python3-dev python3-pip cython3
```
### ターゲット Raspberry Pi OS のライブラリとヘッダー
ターゲットの Raspberry Pi OS のライブラリとヘッダーの写しを、ホスト環境につくります。
まず、OpenCV, OpenVINO のビルドに要するライブラリパッケージをインストールします。openvino ソースをクローンした中に含まれる [openvino/install_build_dependencies.sh](https://github.com/openvinotoolkit/openvino/blob/2022.1.0/install_build_dependencies.sh) の raspbian の項を参考にしています。
ターゲットの OS は with desktop 版にしましたので、画像関連ライブラリなどはインストール済の状態、python3-dev  python3-numpy も必要ですがおそらくインストール済と思います。また、blas, lapack はデフォルトの Netlib ではなく、OpenBLAS を使うようにします。

```
libusb-1.0-0-dev 
libopenblas-dev liblapacke-dev 
libglib2.0-dev libcairo2-dev libpango1.0-dev libgtk2.0-dev libgtkglext1-dev
libdc1394-dev 
libavcodec-dev libavformat-dev libavresample-dev libavutil-dev libswresample-dev libswscale-dev
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev liborc-0.4-dev 
```
Raspberry Pi OS に *-dev パッケージをインストールするなら、そのまま Raspberry Pi 上でビルドすればいいのでは、と言われそうですね。実際にビルドして、コンパイル時間を比較しました。（後述）

ターゲットの /lib （usr/lib へのシンボリックリンク）, /usr/lib, /usr/include, /usr/share/pkgconfig, /etc/alternatives (ライブラリとヘッダー関連分）を /opt/sysroot_raspi64/ （以降 \\$SYSROOT と表記）下にコピーします。
コピーした後、元のシンボリックリンクが絶対パスのものはホスト側へのリンクになってしまうので、コピーへのリンクに修正します。それぞれ \$SYSROOT をプレフィックスに付けて絶対パスにすることもできますが、後の変更を考慮し相対パスにしています。/usr/libexec/, /usr/share/ 下へのシンボリックリンクはリンク切れのまま放っています。

### pkg-config 
クロスコンパイル時の pkg-config 捜索パスの環境変数 PKG_CONFIG_LIBDIR（注：PKG_CONFIG_PATH ではないです）と pkg-config が返すパスに特定のプリフィクスを付加する環境変数 PKG_CONFIG_SYSROOT_DIR を設定します。
```bash
export SYSROOT=/opt/sysroot_raspi64
export PKG_CONFIG_LIBDIR=$SYSROOT/usr/local/lib/pkgconfig:$SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$SYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
```
opencv, openvino のビルドでは pkgconfig が生成されませんが、
pkgconfig が生成されるライブラリをクロスコンパイルして \\$SYSROOT/usr/local/ 下にインストールする場合、pkgconfig ファイルのディレクトリ記述は prefix=$SYSROOT/usr/local となります。ホスト上のクロスコンパイルで参照するにも、ターゲットへデプロイするにも、prefix=/usr/local へ修正が必要です。

## OpenCV のビルド
バージョンは[公式 x86_64 バイナリ](https://storage.openvinotoolkit.org/repositories/openvino/packages/)に合わせて、4.5.5-openvino-2022.1.0 を選択します。
```bash
git clone -b 4.5.5-openvino-2022.1.0 https://github.com/opencv/opencv.git
cd opencv
mkdir build
cd build
export SYSROOT=/opt/sysroot_raspi64
export PKG_CONFIG_LIBDIR=$SYSROOT/usr/local/lib/pkgconfig:$SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$SYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
cmake -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_TOOLCHAIN_FILE=$PWD/../../../aarch64-linux-gnu.toolchain.cmake \
    -D CMAKE_INSTALL_PREFIX=$SYSROOT/usr/local \
    -D ENABLE_NEON=ON \
    -D ENABLE_PYTHON=ON \
    -D PYTHON_EXECUTABLE=/usr/bin/python2.7 \
    -D PYTHON3_EXECUTABLE=/usr/bin/python3.9 \
    -D PYTHON3_LIBRARY=$SYSROOT/usr/lib/aarch64-linux-gnu/libpython3.9.so \
    -D PYTHON3_INCLUDE_PATH=$SYSROOT/usr/include/python3.9 \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$SYSROOT/usr/lib/python3/dist-packages/numpy/core/include \
    -D WITH_LAPACK=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_GSTREAMER=ON \
    -D BUILD_PERF_TESTS=OFF \
    -D BUILD_TESTS=OFF \
    ..
make -j 8
```
toolchain は、openvino に付属する [openvino/cmake/arm64.toolchain.cmake](https://github.com/openvinotoolkit/openvino/blob/2022.1.0/cmake/arm64.toolchain.cmake) に次の 8行を追加したものを使っています。
```bash
diff openvino/cmake/arm64.toolchain.cmake ../aarch64-linux-gnu.toolchain.cmake
10a11,18
> # sysroot
> set(CMAKE_SYSROOT $ENV{SYSROOT})
> set(CMAKE_INCLUDE_PATH ${CMAKE_SYSROOT}/usr/include)
> set(CMAKE_LIBRARY_PATH ${CMAKE_SYSROOT}/usr/lib)
> set(CMAKE_INSTALL_PREFIX ${CMAKE_SYSROOT}/usr/local)
>
> set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}/usr)
>
```

### ワークアラウンド
cmake で OpenBLAS 関連ライブラリ，ヘッダーが見つからない不具合が出ます。
[OpenCVFindOpenBLAS.cmake](https://github.com/opencv/opencv/blob/4.5.5-openvino-2022.1.0/cmake/OpenCVFindOpenBLAS.cmake) はライブラリとヘッダーのパスを拾うのに pkg-config を使っておらず、いくつか候補のパスを探しますが、Debian 11 に合っていません。以下のように cmake ファイルを修正し、明示的に指定します。
```bash
diff opencv/cmake/OpenCVFindOpenBLAS.cmake.orig opencv/cmake/OpenCVFindOpenBLAS.cmake
49c49,50
<   $ENV{OpenBLAS_HOME}/include/openblas
---
> #  $ENV{OpenBLAS_HOME}/include/openblas
>   $ENV{SYSROOT}/usr/include/aarch64-linux-gnu/openblas-pthread
63c64,65
<         $ENV{OpenBLAS_HOME}/lib
---
> #        $ENV{OpenBLAS_HOME}/lib
>       $ENV{SYSROOT}/usr/lib/aarch64-linux-gnu
```
また、liblapacke-dev パッケージは、ヘッダーファイルを /usr/include/ 下に配置しているにもかかわらず、pkgconfig の記述が includedir=/usr/include/aarch64-linux-gnu となっており、不整合があります。
lapacke_config.h lapacke.h lapacke_mangling.h  lapacke_utils.h  lapack.h について、\\$SYSROOT/usr/include/aarch64-linux-gnu/ 下にシンボリックリンクを張ります。
さらに、[OpenCVFindLAPACK.cmake](https://github.com/opencv/opencv/blob/4.5.5-openvino-2022.1.0/cmake/OpenCVFindLAPACK.cmake) は、OpenCVFindOpenBLAS.cmake で拾ったパスを参照するので、$SYSROOT/usr/include/aarch64-linux-gnu/openblas-pthread/ 下にも、シンボリックリンクを張ります。

## OpenVINO のビルド
opencv をクローンした作業ディレクトリと同じディレクトリでクローンします。openvio_contrib をクローンして arm cpu plugin も同時にビルドします。
```bash
git clone -b 2022.1.0 https://github.com/openvinotoolkit/openvino.git
cd openvino
git submodule update --init --recursive
cd ..
git clone -b 2022.1 --recurse-submodules --single-branch https://github.com/openvinotoolkit/openvino_contrib.git 
cd openvino
mkdir build
cd build
export SYSROOT=/opt/sysroot_raspi64
export PKG_CONFIG_LIBDIR=$SYSROOT/usr/local/lib/pkgconfig:$SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$SYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
cmake -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_TOOLCHAIN_FILE=$PWD/../../../aarch64-linux-gnu.toolchain.cmake \
    -D CMAKE_INSTALL_PREFIX=$SYSROOT/usr/local \
    -D ENABLE_PYTHON=ON \
    -D PYTHON_EXECUTABLE=/usr/bin/python3.9 \
    -D PYTHON_LIBRARY=$SYSROOT/usr/lib/aarch64-linux-gnu/libpython3.9.so \
    -D PYTHON_INCLUDE_PATH=$SYSROOT/usr/include/python3.9 \
    -D ENABLE_OPENCV=ON \
    -D OpenCV_DIR=$PWD/../../opencv/build/ \
    -D THREADING=SEQ \
    -D ENABLE_SSE42=OFF \
    -D ENABLE_CLDNN=OFF \
    -D IE_EXTRA_MODULES=$PWD/../../openvino_contrib/modules \
    -D BUILD_java_api=OFF \
    -D ENABLE_TESTS=OFF \
    ..
make -j 8
make install
```


### ファイル名の修正
\\$SYSROOT/usr/local/python/python3.9/ 下に python3 ライブラリがインストールされますが、以下のバイナリファイル名の "39" は python3 のバージョン、"x86_64" はプロセッサアーキテクチャを示します。
クロスコンパイルの場合、ターゲットから採られるべきと思われますが、ホストから採られてしまいます。
```
_pyngraph.cpython-39-x86_64-linux-gnu.so
openvino/pyopenvino.cpython-39-x86_64-linux-gnu.so
openvino/frontend/onnx/py_onnx_frontend.cpython-39-x86_64-linux-gnu.so
openvino/frontend/paddle/py_paddle_frontend.cpython-39-x86_64-linux-gnu.so
openvino/frontend/tensorflow/py_tensorflow_frontend.cpython-39-x86_64-linux-gnu.so
```
これらのファイルの形式は、ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked で正しく arm 64bit ELF ですが、ファイル名の python バージョンとプロセッサアーキテクチャが python3 インタープリタと合致しないと import でエラーになります。
それぞれのファイル名の cpython-39-x86_64-linux-gnu の部分を cpython-39-aarch64-linux-gnu に修正します。

## OpenCV を再びビルド
OpenCV の推論バックエンドに OpenVINO を使うよう指定して、もう一度ビルドします。先述の cmake のオプションに次の 4つのパラメータを追加します。cmake 再実行の前に、前回の cmake で生成された opencv/build/ 下の CMakeCache.txt を削除することを忘れずに。
```
WITH_INF_ENGINE=ON
InferenceEngine_DIR=$SYSROOT/usr/local/runtime/cmake
ngraph_DIR=$SYSROOT/usr/local/runtime/cmake
ENABLE_CXX11=ON
```
``` bash
cd opencv/build
rm CMakeCache.txt
export SYSROOT=/opt/sysroot_raspi64
export PKG_CONFIG_LIBDIR=$SYSROOT/usr/local/lib/pkgconfig:$SYSROOT/usr/lib/aarch64-linux-gnu/pkgconfig:$SYSROOT/usr/share/pkgconfig
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
cmake -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_TOOLCHAIN_FILE=$PWD/../../../aarch64-linux-gnu.toolchain.cmake \
    -D CMAKE_INSTALL_PREFIX=$SYSROOT/usr/local \
    -D ENABLE_NEON=ON \
    -D ENABLE_PYTHON=ON \
    -D PYTHON_EXECUTABLE=/usr/bin/python2.7 \
    -D PYTHON3_EXECUTABLE=/usr/bin/python3.9 \
    -D PYTHON3_LIBRARY=$SYSROOT/usr/lib/aarch64-linux-gnu/libpython3.9.so \
    -D PYTHON3_INCLUDE_PATH=$SYSROOT/usr/include/python3.9 \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=$SYSROOT/usr/lib/python3/dist-packages/numpy/core/include \
    -D WITH_LAPACK=ON \
    -D WITH_FFMPEG=ON \
    -D WITH_GSTREAMER=ON \
    -D WITH_INF_ENGINE=ON \
    -D InferenceEngine_DIR=$SYSROOT/usr/local/runtime/cmake \
    -D ngraph_DIR=$SYSROOT/usr/local/runtime/cmake \
    -D ENABLE_CXX11=ON \
    -D BUILD_PERF_TESTS=OFF \
    -D BUILD_TESTS=OFF \
    ..
make -j 8
make install
```
cmake 実行時のコンフィギュレーション情報を示します。デプロイ後は python3 -c "import cv2;print(cv2.getBuildInformation())" で同じ内容が出力されます。
```
--
-- General configuration for OpenCV 4.5.5-openvino =====================================
--   Version control:               4.5.5-openvino-2022.1.0-dirty
--
--   Platform:
--     Timestamp:                   2022-09-26T19:02:39Z
--     Host:                        Linux 5.4.0-126-generic x86_64
--     Target:                      Linux aarch64
--     CMake:                       3.18.4
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/gmake
--     Configuration:               Release
--
--   CPU/HW features:
--     Baseline:                    NEON FP16
--       required:                  NEON
--       disabled:                  VFPV3
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ standard:                11
--     C++ Compiler:                /usr/bin/aarch64-linux-gnu-g++  (ver 10.2.1)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /usr/bin/aarch64-linux-gnu-gcc
--     C flags (Release):           -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fsigned-char -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections    -fvisibility=hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--gc-sections -Wl,--as-needed
--     Linker flags (Debug):        -Wl,--gc-sections -Wl,--as-needed
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo python3 stitching video videoio
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 java python2 ts
--     Applications:                apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:                           GTK2
--     GTK+:                        YES (ver 2.24.33)
--       GThread :                  YES (ver 2.66.8)
--       GtkGlExt:                  NO
--
--   Media I/O:
--     ZLib:                        /opt/sysroot_raspi64/usr/lib/aarch64-linux-gnu/libz.so (ver 1.2.11)
--     JPEG:                        libjpeg-turbo (ver 2.1.2-62)
--     WEBP:                        build (ver encoder: 0x020f)
--     PNG:                         /opt/sysroot_raspi64/usr/lib/aarch64-linux-gnu/libpng.so (ver 1.6.37)
--     TIFF:                        build (ver 42 - 4.2.0)
--     JPEG 2000:                   build (ver 2.4.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      YES (2.2.6)
--     FFMPEG:                      YES
--       avcodec:                   YES (58.91.100)
--       avformat:                  YES (58.45.100)
--       avutil:                    YES (56.51.100)
--       swscale:                   YES (5.7.100)
--       avresample:                YES (4.0.0)
--     GStreamer:                   YES (1.18.4)
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Lapack:                      YES (/opt/sysroot_raspi64/usr/lib/aarch64-linux-gnu/libopenblas.so)
--     Inference Engine:            YES (2022010000 / 2022.1.0)
--         * libs:                  /opt/sysroot_raspi64/usr/local/runtime/lib/aarch64/libopenvino.so
--         * includes:              /opt/sysroot_raspi64/usr/local/runtime/include /opt/sysroot_raspi64/usr/local/runtime/include/ie
--     nGraph:                      YES (2022.1.0)
--         * libs:                  /opt/sysroot_raspi64/usr/local/runtime/lib/aarch64/libopenvino.so
--         * includes:              /opt/sysroot_raspi64/usr/local/runtime/include /opt/sysroot_raspi64/usr/local/runtime/include/ie
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.19.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/hood/raspi64_build/openvino_2022.1/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3.9 (ver 3.9.2)
--     Libraries:                   /opt/sysroot_raspi64/usr/lib/aarch64-linux-gnu/libpython3.9.so (ver 3.9.2)
--     numpy:                       /opt/sysroot_raspi64/usr/lib/python3/dist-packages/numpy/core/include (ver undefined - cannot be probed because of the cross-compilation)
--     install path:                lib/python3.9/site-packages/cv2/python-3.9
--
--   Python (for build):            /usr/bin/python2.7
--
--   Install to:                    /opt/sysroot_raspi64/usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hood/raspi64_build/openvino_2022.1/opencv/build
```

### ファイル名の修正
openvino での後処理と同様、インストールされた python ライブラリ \\$SYSROOT/usr/local/lib/python3.9/site-packages/cv2/python-3.9/cv2.cpython-39-x86_64-linux-gnu.so を cv2.cpython-39-aarch64-linux-gnu.so にリネームします。

```
cd $SYSROOT/usr/local/lib/python3.9/site-packages/cv2/python-3.9/
mv cv2.cpython-39-x86_64-linux-gnu.so cv2.cpython-39-aarch64-linux-gnu.so
```

## ターゲットへのデプロイ
opencv, openvino とも、$SYSROOT/usr/local をターゲットの /usr/local に移せばよいですが、ここでは、x86_64 ホストと使い勝手を合わせるよう、公式リリースの x86_64 ランタイムのインストーラのディレクトリ構成に準拠させています。
公式インストーラは、root 権限では /opt/intel/ 下、非 root 権限では ~/intel/ 下に、以下の構成でファイルを配置します。ここでは、/opt/intel/openvino_2022.1.0/ 下へファイルを転送しました。
```
openvino_2022.1.0/
|-- docs
|-- extras
|   |-- opencv
|       |-- bin
|       |-- cmake
|       |-- include
|       |   |-- opencv2
|       |-- lib
|       |-- python
|       |   |-- cv2
|       |-- setupvars.sh
|-- python
|   |-- python3.9
|-- runtime
|   |-- 3rdparty
|   |-- cmake
|   |-- include
|   |   |-- ie
|   |   |-- ngraph
|   |   |-- openvino
|   |-- lib
|       |-- aarch64
|-- samples
|   |-- c
|   |-- cpp
|   |-- python
|-- setupvars.sh
|-- tools
    |-- compile_tool
    |-- deployment_manager
```

この際、ディレクトリ構成の違いで、openvino_2022.1.0/extras/opencv/cmake/OpenCVConfig.cmake を以下のように修正します。
```cmake:extras/opencv/cmake/OpenCVConfig.cmake
80c80
< get_filename_component(OpenCV_INSTALL_PATH "${OpenCV_CONFIG_PATH}/../../../" REALPATH)
---
> get_filename_component(OpenCV_INSTALL_PATH "${OpenCV_CONFIG_PATH}/../" REALPATH)
109c109
< set(__OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/include/opencv4")
---
> set(__OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/include")
```

## Xeon ホスト 対 Raspberry Pi でコンパイル時間の比較
Raspberry Pi 4 Model B （4GB メモリ）上でビルドした場合と、所要時間を比較しました。同時実行ジョブ数（ -j オプション）はそれぞれの論理プロセッサ数を指定しています。Xeon ワークステーションの方が、実時間でおよそ 6倍（ 8m9s 対 46m44s，26m37s 対 165m16s ）速いです。
```
# Xeon E3-1271v3, 16GB
# build OpenCV
cd opencv/build
make clean
time make -j 8

real    8m8.639s
user    50m21.640s
sys     2m18.103s

# build OpenVINO
cd ../../openvino/build
make clean
time make -j 8

real    26m37.274s
user    201m25.598s
sys     9m16.389s
```

```
# Raspberry Pi 4 B, 4GB
# build OpenCV
cd opencv/build
make clean
time make -j 4

real    44m17.350s
user    149m56.691s
sys     8m52.966s

# build OpenVINO
cd ../../openvino/build
make clean
time make -j 4

real    165m16.224s
user    612m28.596s
sys     36m43.099s
```
Raspberry Pi 4GB版にて、openvino の "-j 4" 付きビルドは、途中でメモリが枯渇しスワップ（既定の 100MB では不足で 2048MB に増やしてます）を起こす状況での時間です。
またセルフビルドでは arm_cpu_plugin のリンクで 'pthread' 未定義参照エラーになるので、cmake が生成したリンクスクリプトに暫定パッチ（-lpthread 追加）をあてて回避しています。

## Raspberry Pi でサンプルコード実行
openvino 付録のサンプルコードを実行してみます。有効な推論デバイスを調べる python コードです。
```
source setupvars.sh
samples/python/hello_query_device/hello_query_device.py
[ INFO ] Available devices:
[ INFO ] CPU :
[ INFO ]        SUPPORTED_PROPERTIES:
[ INFO ]                PERF_COUNT: YES
[ INFO ]                AVAILABLE_DEVICES: NEON
[ INFO ]                FULL_DEVICE_NAME: arm_compute::NEON
[ INFO ]                OPTIMIZATION_CAPABILITIES: FP32
[ INFO ]                RANGE_FOR_ASYNC_INFER_REQUESTS: 1, 4, 1
[ INFO ]                RANGE_FOR_STREAMS: 1, 4
[ INFO ]                CPU_THROUGHPUT_STREAMS: 1
[ INFO ]                CPU_BIND_THREAD: NO
[ INFO ]                CPU_THREADS_NUM: 0
[ INFO ]                CPU_THREADS_PER_STREAM: 4
[ INFO ]                NUM_STREAMS: 1
[ INFO ]                INFERENCE_NUM_THREADS: 0
[ INFO ]                AFFINITY: UNSUPPORTED TYPE
[ INFO ]
[ INFO ] MYRIAD :
[ INFO ]        SUPPORTED_PROPERTIES:
[ INFO ]                AVAILABLE_DEVICES: 1.1.1-ma2480
[ INFO ]                FULL_DEVICE_NAME: Intel Movidius Myriad X VPU
[ INFO ]                OPTIMIZATION_CAPABILITIES: EXPORT_IMPORT, FP16
[ INFO ]                RANGE_FOR_ASYNC_INFER_REQUESTS: 3, 6, 1
[ INFO ]                DEVICE_THERMAL: UNSUPPORTED TYPE
[ INFO ]                DEVICE_ARCHITECTURE: MYRIAD
[ INFO ]                NUM_STREAMS: AUTO
[ INFO ]                PERFORMANCE_HINT:
[ INFO ]                PERFORMANCE_HINT_NUM_REQUESTS: 0
[ INFO ]
```
CPU と MYRIAD（Intel NCS2 USB スティック）が利用可能なことを示しています。

# おわりに
クロスコンパイル環境構築の手間ひまが、短縮できるコンパイル時間に見合うか微妙ですが、今後のバージョンや他のソフトウェアのコンパイルにも環境が利用できるということで納得しましょう。

Raspberry Pi 4 Model B と NCS2 は、一昨年2020年に秋月電子通商さんで購入しました。2022年 9月現在一般流通ルートで、Raspberry Pi は納期未定欠品状態、NCS2 は販売終了です。この組み合わせは、エッジ推論プラットフォームとして使い難くなっていますが、参考メモとして。