OpenVINOをインストールしてからサンプルを動かすまでのメモ

基本的には以下公式サイトの「Get started」に従っていけば良い。

https://docs.openvino.ai/2023.1/home.html

### 諸元

- Ubuntu 20.04
- OpenVINO 2023.1

# OpenVINO本体

## インストール

以下サイトで要件を選択するとインストールの方法が表示されるので、それに従う。

https://docs.openvino.ai/2023.1/openvino_docs_install_guides_overview.html

自分の場合はC++のAPIも利用したいので、「OpenVINO Archives」を選択。PythonのAPIだけ利用する場合は「PIP」でよいかと。そういえば、前までアカウントの登録を要求された思うんですけどいつの間にか不要になったんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302427/25ec3aea-49ad-fe9d-9360-453d5d9fddc2.png)

インストールは以下の手順に従う。他のOSやDistributionの場合もそれぞれ別ページに手順が乗っているので、それを参考にする。

https://docs.openvino.ai/2023.1/openvino_docs_install_guides_installing_openvino_from_archive_linux.html

以下、コマンドのみ抽出したもの。

```sh
# /opt/intelにインストールする
sudo mkdir /opt/intel

# パッケージをダウンロードして/opt/intelに移動
cd <user_home>/Downloads
curl -L https://storage.openvinotoolkit.org/repositories/openvino/packages/2023.1/linux/l_openvino_toolkit_ubuntu20_2023.1.0.12185.47b736f63ed_x86_64.tgz --output openvino_2023.1.0.tgz
tar -xf openvino_2023.1.0.tgz
sudo mv l_openvino_toolkit_ubuntu20_2023.1.0.12185.47b736f63ed_x86_64 /opt/intel/openvino_2023.1.0

# 依存パッケージをインストール
cd /opt/intel/openvino_2023.1.0
sudo -E ./install_dependencies/install_openvino_dependencies.sh
```

## デモプログラムのビルド

以下手順でデモプログラムをビルドできる。

https://docs.openvino.ai/2023.1/openvino_docs_OV_UG_Samples_Overview.html

全デモプログラムをビルドする場合は`build_samples.sh`を使えば早い。`<user_home>/openvino_cpp_samples_build/intel64/Release`にインストールされる。

```sh
cd /opt/intel/openvino_2023.1.0
source setupvars.sh
cd samples/cpp
./build_samples.sh
```

# Open Model Zoo（OMZ）

OMZをインストールすることで、より多くのサンプルプログラムも動かすことができます。

## インストール

https://docs.openvino.ai/2023.0/omz_demos.html

```sh
# OMZのリポジトリをクローン
cd <user_home>/
git clone --recurse-submodules https://github.com/openvinotoolkit/open_model_zoo.git
```

OMZのモデルがダウンロードできるツール`omz_downloader`を使いたい場合は、pipで`openvino-dev`をインストールしておきます。

```sh
# 適当な場所にvenv環境を作る
cd <user_home>/open_model_zoo
python3 -m venv venv
source venv/bin/activate
pip install openvino-dev
```

また、デモプログラムの一部でOpenCVを使って動画の読み込みを行うので、OpenCVをビルドインストールしておきます。今回はVideoIOのバックエンドにFFmpegを使います。

```sh
# 必要なパッケージインストール
sudo apt install nasm libgtk2.0-dev

# OpenH264のビルドインストール
cd ~
git clone -b v2.3.1 https://github.com/cisco/openh264
cd openh264
make -j4
sudo make install
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

# FFmpegのビルドインストール
cd ~
git clone -b n4.3.5 https://github.com/FFmpeg/FFmpeg ffmpeg-n4.3.5
cd ffmpeg-n4.3.5
./configure \
    --enable-libopenh264 \
    --enable-optimizations \
    --enable-static \
    --enable-version3 \
    --enable-shared \
    --disable-gpl \
    --disable-logging \
    --disable-doc \
    --disable-htmlpages \
    --disable-manpages \
    --disable-podpages \
    --disable-txtpages \
    --disable-avdevice \
    --disable-postproc \
    --disable-bzlib \
    --disable-iconv \
    --disable-cuda \
    --disable-cuvid \
    --disable-debug \
    --extra-ldflags="-static-libgcc -static-libstdc++"
make -j4
sudo make install

# OpenCVのビルドインストール
cd ~
wget https://github.com/opencv/opencv/archive/4.6.0.zip -O opencv-4.6.0.zip
unzip opencv-4.6.0.zip
cd opencv-4.6.0
mkdir build
cd build
cmake \
    -DCMAKE_BUILD_TYPE=RELEASE \
    -DOPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
    -DBUILD_DOCS=OFF \
    -DBUILD_TESTS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_JAVA=OFF \
    -DWITH_1394=OFF \
    -DWITH_CUDA=OFF \
    -DWITH_CUFFT=OFF \
    -DWITH_FFMPEG=ON \
    -DWITH_GSTREAMERE=OFF \
    -DWITH_GTK=ON \
    -DWITH_IPP=OFF \
    -DWITH_JASPERE=OFF \
    -DWITH_JPEG=ON \
    -DWITH_OPENEXR=OFF \
    -DWITH_PNG=ON \
    -DWITH_TIFF=ON \
    -DWITH_V4L=OFF \
    -DWITH_GPHOTO2=OFF \
    -DWITH_CUBLAS=OFF \
    -DWITH_VTK=OFF \
    -DWITH_NVCUVID=OFF \
    ..
# 以下のログが出力され、FFmpegを認識していることが確認できる
# --   GUI:                           GTK2
# --     GTK+:                        YES (ver 2.24.32)
# --       GThread :                  YES (ver 2.64.6)
# --       GtkGlExt:                  NO
#   （略）
# --   Video I/O:
# --     FFMPEG:                      YES (find_package)
# --       avcodec:                   YES (58.91.100)
# --       avformat:                  YES (58.45.100)
# --       avutil:                    YES (56.51.100)
# --       swscale:                   YES (5.7.100)
# --       avresample:                NO
# --     GStreamer:                   NO
make -j4
sudo make install
```

## デモプログラムのビルド

こちらも全デモプログラムをビルドする場合は`build_samples.sh`を使えば早い。

```sh
source /opt/intel/openvino_2023.1.0/setupvars.sh
cd <user_home>/open_model_zoo/demos
./build_demos.sh
```

## OMZのサンプルプログラムを動かしてみる

デモの一覧はインストールガイドのサイトから確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302427/5d82d95e-7eda-1a0b-72bf-016c9834b045.png)

### Object Detection

物体検知のタスクを試してみます。PythonとC++がありますが、今回はC++で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302427/c78234d2-e47b-cde3-c96c-822de7e24fe2.png)

デモ個別のページには、そのデモプログラムが対応しているモデルの情報などが閲覧できます。

https://docs.openvino.ai/2023.0/omz_demos_object_detection_demo_cpp.html#doxid-omz-demos-object-detection-demo-cpp

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302427/59e8d68f-724c-59e8-0c68-8c18f8240e90.png)

今回は[person-detection-0303](https://docs.openvino.ai/2023.1/omz_models_model_person_detection_0303.html)を使います。`omz_downloader`を使ってモデルをダウンロードしておきます。

```sh
omz_downloader --name person-detection-0303
```

~~ダウンロードしたモデルは`<user_home>/open_model_zoo/intel`に保存されます。~~（2023/10/15訂正）ダウンロードしたモデルはカレントディレクトリに`intel`ディレクトリが生成され、そこに保存されるようでした。

では試しに動かしてみます。

```sh
cd <user_home>/Downloads
wget https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4
cd <user_home>/omz_demos_build/intel64/Release
./object_detection_demo -at ssd -i <user_home>/Downloads/person-bicycle-car-detection.mp4 -m <user_home>/open_model_zoo/intel/person-detection-0303/FP32/person-detection-0303.xml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3302427/524f2c72-6ef3-f88e-51e3-e99ab4cd0ce7.png)

期待どおり人を検知した結果が描画されました。

# 終わりに

次はデモプログラムを参考に自前のアプリケーション作ってみたい。