Cyclone® V SoC＋インテル® Movidius™ Myriad™ X＋OpenVINO™ ツールキットを使用したエッジAI開発環境

# はじめに
CPU、GPU、FPGA、ASIC等エッジAIを実現するためのプラットフォームは数ありますが、それぞれに対してメリットやデメリットが存在します。詳細については他の文献に譲りますが、高フレキシビリティ・低レイテンシに定評があるのがFPGAというデバイスで、うまく使いこなせれば他のデバイスとは違った特徴を持つエッジAIを構築することができます。

本稿ではFPGAとしてインテルの低コスト・低消費電力SoC FPGAデバイスであるCyclone® V SoC FPGAを使用し、同じインテルのディープラーニング推論用のASICであるインテル® Movidius™ Myriad™ X VPUを組み合わせてエッジAI開発環境を構築する方法をご紹介したいと思います。


# 評価環境
- ハードウェア
    - Cyclone® V SoC FPGA : [KEIm-CVSoC 開発キット](#keim-cvsoc-開発キット)
    - インテル® Movidius™ Myriad™ X VPU : [Mustang-M2BM](#mustang-m2bm)
- 開発キットBSP
    - Linux kernel : 5.4.114
    - Rootfs : Debian 9.13
    - Desktop : LXDE
- OpenVINO™ ツールキット : l_openvino_toolkit_runtime_raspbian_p_2020.3.34

## KEIm-CVSoC 開発キット

Cyclone® V SoC FPGAを搭載した小型モジュール KEIm-CVSoC用の開発キットです。この開発キットは、ビジョン系のエッジAIを意識したつくりになっており、カメラ入力やディスプレイ出力がコントローラを介さずに直接FPGAに接続されています。これによって映像パスに対するインターフェース遅延を最小な状態にして評価が可能で、エッジAIの重要なファクタである低レイテンシを実現することが可能です。


キット内の基板はM.2インターフェースを備えていて、これに後述するIEI製 Mustang-M2BMを接続することにより、今回の評価環境を構築します。

https://kd-group.co.jp/product/keim-cvsoc/



## Mustang-M2BM
インテル® Movidius™ Myriad™ X VPUを2つ搭載したM.2プラットフォームのモジュールです。このモジュールはディープラーニング推論のアクセラレータとして機能し、CPUがベースのシステムでもこのモジュールにAIの推論処理をオフロードすることにより、エッジAIを実現することが出来ます。

今回の評価環境はホストCPUとしてCyclone® V SoC FPGAに内蔵されているデュアルコアARM® Cortex™-A9 MPCore™プロセッサを使用しますので、推論処理にはなんらかのアクセラレータが必要となります。FPGAドメインに処理を組み込むのが合理的ですが、そのためにはAIに関する専門知識と開発に要する多くの時間が必要となります。手っ取り早くAIがどのようなものか、どのようなふるまいをするのかを確認するためには、こういったアクセラレータを使用するのが早道です。


https://www.ieiworld.com/en/product/model.php?II=662


# 作業の流れ
開発キットへMustang-M2BMを接続する方法はインストールマニュアルが準備されているのでここでは割愛します。
Linux立ち上げまでの作業手順も、開発キットのスタートアップガイドに任せてここでは割愛しますが、大枠の流れは他のボードコンピュータ等と同じように、サイトに用意してあるSDイメージダウンロードして、SDカードに書き込めばOKという形になっています。

本稿ではそれ以降の手順（下記）について説明しようと思います。

1. [OpenVINO™ ツールキットのセットアップ](#openvino-ツールキットのセットアップ)
- [Open Model Zooのインストール](#open-model-zooのインストール)
- [サンプルプログラムのビルド](#サンプルプログラムのビルド)
- [プログラムの実行](#プログラムの実行)


## OpenVINO™ ツールキットのセットアップ
下記のサイトを参考にOpenVINO™ ツールキットのインストールとセットアップを進めます。
参考：[Install OpenVINO™ toolkit for Raspbian* OS](https://docs.openvinotoolkit.org/latest/openvino_docs_install_guides_installing_openvino_raspbian.html
)

### OpenVINO™ ツールキットのインストール
OpenVINO™ ツールキットのフルパッケージはインテルのサイトから無償でダウンロードできるのですが、ここからダウンロード可能なバージョンはCyclone® V SoC FPGAには対応していません。代わりに同じARMv7-AアーキテクチャのCPUを搭載しているRaspberry Pi版が01.orgというサイトにアップされていますので、これを改良し使用します。ちなみに、01.orgはインテルのエンジニアが関与しているオープンソースのテクノロジーセンターで、OpenVINO™ ツールキットやデモアプリに使用する学習済みモデルなどがダウンロードできます。

まずは下記のコマンドを実行し、OpenVINO™ ツールキットのインストールとセットアップを行います。

```:OpenVINO™ツールキットインストール
$ sudo apt update
$ sudo apt upgrade
$ cd ~/Download
$ wget　https://download.01.org/opencv/2020/openvinotoolkit/2020.3/l_openvino_toolkit_runtime_raspbian_p_2020.3.341.tgz
$ sudo mkdir -p /opt/intel/openvino
$ sudo tar -xf l_openvino_toolkit_runtime_raspbian_p_2020.3.341.tgz --strip 1 -C /opt/intel/openvino/
```

Raspberry Pi版のOpenVINO™ ツールキットにはインストーラーがついてないので、ダウンロードして任意のフォルダに展開するだけです。ここでは2020.3.341バージョンをダウンロードして使用していますが、01.orgにはもっと新しいバージョンもアップされていますが、Pythonやcmakeのバージョンアップが必要となり使用に際してひと工夫必要になります。

### 環境変数設定スクリプトsetupvars.shの編集
OpenVINO™ ツールキットを使用する際に必要な環境変数の設定をしてくれるスクリプト setupvars.sh の中のOSの指定を書き換えます。

```:setupvars.shの編集
$ cd /opt/intel/openvino/
$ sudo sed -i "s/Raspbian/Debian/" bin/setupvars.sh
```

### setupvars.shの実行と.bashrcへの登録
sourceコマンドによりsetupvars.shを実行します。


```:setupvars.shの実行
$ source /opt/intel/openvino/bin/setupvars.sh
```


正常に実行できると下記のメッセージが表示されます。

```:setupvars.sh実行結果
[setupvars.sh] OpenVINO environment initialized
```


環境変数の設定はターミナルを閉じてしまうと消えてしまうので、ターミナルを立ち上げるたびに上記のコマンドを実行する必要があります。下記の様に.bashrcに登録しておけば、ターミナルの立ち上げと同時にsetupvar.shが実行されますので、設定忘れが無くて便利です。

```:.bashrcへの登録
$ echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc
```

### NCSのudevルール追加
インテル® Movidius™ Myriad™ X VPUのデバイス管理のため、udevルールを追加します。

```:udevルールの追加
$ sudo usermod -a -G users "$(whoami)"
$ sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh
$ sudo sed -i "s/660/666/" /etc/udev/rules.d/97-myriad-usbboot.rules
```

一旦再起動した後、lsusbでUSBデバイス一覧を表示します。
正常に組み込めていればKEIm-CVSoC 開発キットに接続されているデバイス一覧の中にIntel Movidius Myriad Xが2つ表示されます。

```:lsusb
$ lsusb
Bus 002 Device 011: ID 03e7:2485 Intel Movidius MyriadX
Bus 002 Device 012: ID 03e7:2485 Intel Movidius MyriadX
```


## Open Model Zooのインストール
Open Model ZooにはOpenVINO™ ツールキットでの開発に有用な複数のデモアプリケーションやモデルダウンローダ等のスクリプト等がパッケージされています。今回実行するデモはOpen Model Zooに収録されている物体検出デモObject Detection C++ Demoを流用して構築しており、ビルド環境もOpen Model Zooのものを使用します。下記に従いOpen Model Zooをインストールします。

```:OpenModelZooのインストール
$ git clone https://github.com/opencv/open_model_zoo.git
$ cd open_model_zoo
$ git tag
$ git checkout 2020.3
```

上記ではGitHubにあるOpen Model Zooのリポジトリからクローンを作成後、インストールしたOpenVINOとバージョンを合わせるため、2020.3のタグをチェックアウトしています。


## サンプルプログラムのビルド
次に、実際に動かすサンプルプログラムをダウンロードしてビルドする手順になります。このサンプルは先ほども少し触れましたが、Open Model Zooの物体検出のデモアプリObject Detection C++ Demo（フォルダ名はobject_detection_demo_ssd_async） に下記の追加変更を加えています。

- KEIm-CVSoCの搭載しているカメラモジュールの制御コードの追加
- 2個のインテル® Movidius™ Myriad™ X VPUを使用するための変更

Object Detection C++ Demoの詳細に関しては、下記サイトを参考にしてください。
参考サイト : [Object Detection C++ Demo](https://docs.openvino.ai/2021.2/omz_demos_object_detection_demo_ssd_async_README.html)

まずは、サンプルプログラムのダウンロードと展開を下記の手順で行います。

```:サンプルプログラムのダウンロード
$ cd ~/Downloads/
$ wget https://kd-group.co.jp/download-data/keim-cvsoc/ai_app/keim-cvsoc-b_devkit_openvino_objectdetection-demo.tgz
$ tar -xzvf keim-cvsoc-b_devkit_openvino_object-detection-demo.tgz -C ~/open_model_zoo/demos/
```

続いて、サンプルプログラムのビルドを行います。

```:サンプルプログラムのビルド
$ cd ~/open_model_zoo/demos/
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ..
$ make -j2 object_detection_demo_ssd_async_cam_scaler_multi
```


## プログラムの実行
下記の通り引数を設定し実行すると、カメラから入力された映像がウインドウ表示され、物体を検出すると赤い四角で囲われて、上部に検出した物体名が表示されます。このデモではVGAの入力画像に対して同期モードで16.48fpsの処理速度を記録しています。画像サイズを小さくしたり非同期モードで実行すれば、もっと高速に動作しますので実際に試してみていただければと思います。

```:プログラムの実行
$ cd ~/open_model_zoo/demos/object_detection_demo_ssd_async_cam_scaler_multi
$ ../build/armv7l/Release/object_detection_demo_ssd_async_cam_scaler_multi -i FPD -d MYRIAD -m mobilenet-ssd.xml
```


![物体検出デモ画面_20200831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721171/9d3bf74c-d1f9-f471-e524-6ed57203ef89.png)


# まとめ
Cyclone® V SoC FPGAとインテル® Movidius™ Myriad™ X VPUとOpenVINO™ ツールキットを組み合わせることにより簡単にるエッジAI開発環境を構築することが出来ました。上記では最低限の動作するところまでしか構築していませんが、これを起点としてAIに対する知見を深めていくのも良いと思います。

実際のシステムを構築する上では、カメラの映像に対して補正が必要になったり、特殊なインターフェースのセンサを接続する必要があったり、ハードウェアの変更を要する様々な課題が出てくると思います。その様なケースでもFPGAを使ったシステムでは、ソフトウェアによるロジックの追加や変更でシステムのアップグレードが柔軟に対応できて便利です。

本稿に記載されている会社名、製品名、サービス名、ロゴ等は各社の商標または登録商標です。