Raspberry Pi4にIntel Neural Compute Stick 2(NCS2)を挿してエッジで機械学習の推論をする環境を整える #RaspberryPi #OpenVINO #NCS2

2020.03.19

せーのでございます。

今回は機械学習のモデルをラズパイ4上でも動かすためにIntelのNeural Compute Stick 2(NCS2)を用意したので、環境を整えてみたいと思います。

NCS2とは

NCS2とはいわゆるアクセラレーター(接続したコンピュータの性能を上げるデバイス)で、NCS2はIntelが機械学習の推論性能を上げることに特化して作成したスティック型の外付けデバイスです。

見た目にトランスフォーマー感があって、非常にワクワクします。

ラズパイのCPUだけでは機械学習の推論をさせるには少し物足りないので、このNCS2を取り付けます。

まだ自己責任

といってもNCS2を挿したらすぐに使えるのか、と言うとそういうわけではなく、専用のツールキットをインストールする必要があります。Raspbean OS用のツールキットはまだベータの段階で、IntelのオープンソーステクノロジーセンターというところにOpenVINOというAIツール用SDKが上がっています。今回はそれを使って試してみたいと思います。

やってみた

それではやってみましょう。ラズパイのOSはRaspbeanを使います。今は公式の書き込みツールがあるのでこちらを参考になさってください。

Raspberry Piに公式のイメージ書き込みツール「Raspberry Pi Imager」がリリースされてセットアップが超便利に #RaspberryPi

まずはダウンロードセンターより最新のツールキットをダウンロードします。

このパッケージの中には「推論エンジン」「OpenCV」「サンプルアプリケーション」が入っています。ですのでOpenCVを事前にインストールする必要はありません。

ツールキットのインストール

インストール用のフォルダを作り、ダウンロードしたツールキットを解凍します。

cd ~/Downloads/
sudo mkdir -p /opt/intel/openvino
sudo tar -xf  l_openvino_toolkit_runtime_raspbian_p_<version>.tgz --strip 1 -C /opt/intel/openvino

ビルドの準備

サンプルアプリケーションを動かすためのビルドツールとしてCMAKEをインストールして環境変数を設定します。
CMAKEは3.7.2以上が必要です。環境変数はセットするシェルが用意されているのでそれを叩くだけです。

sudo apt install cmake
source /opt/intel/openvino/bin/setupvars.sh

環境変数をセットしたら、このシェルごとbashに入れておきます。そうすることでリブート後も環境変数がセットされます。

echo "source /opt/intel/openvino/bin/setupvars.sh" >> ~/.bashrc

USBルールの追加

NCS2スティックで機械学習の推論を実行するにはUSBルールを追加する必要があるので、必要なシェルを叩きます。
まずユーザーを[users]というグループに追加し、一度再起動します。

sudo usermod -a -G users "$(whoami)"
sudo reboot

上にあるbashへ環境変数のセットシェルを追加していない人はここで環境変数が解除されているので、追加し直しておきましょう。
次にUSBルールを追加します。

sh /opt/intel/openvino/install_dependencies/install_NCS_udev_rules.sh

全てがシェルにまとまっているのが使いやすくていいですね。
ここでNCS2をラズパイ4に接続します。ここで注意したいのは、NCS2はUSBの口周りが広く他のUSBポートも塞いでしまうので、USBの延長ケーブルを通してつなぐと他のUSBポートも使えるようになります。

これで環境の構築ができました。いよいよ動かしてみましょう。

サンプルアプリをビルドする

サンプルアプリをビルドしたいと思います。今回使うサンプルは「face detection」顔認識ですね。ではまずビルド用のフォルダを作って、そこに上で解凍したファイルの中に入っているサンプルアプリをビルドしましょう。

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" /opt/intel/openvino/deployment_tools/inference_engine/samples/cpp
make -j2 object_detection_sample_ssd

モデルをダウンロードしてサンプルアプリを実行してみる

ここまで来たらあとはアプリを動かすだけです。
アプリを動かすには学習の終わったモデルをダウンロードしてアプリに食わしてあげればいいのですが、現在最新のモデルをダウンロードするとaxisエラーが出てしまいます。これは最新のツールキットでの変更点(ngraphとかモデルオプティマイザーとか)に起因するIR v10フォーマットのエラーだそうで、少し前のモデルを使ってあげると動きました。

wget --no-check-certificate https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/face-detection-retail-0004/FP16/face-detection-retail-0004.bin
https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/face-detection-retail-0004/FP16/face-detection-retail-0004.xml

ダウンロードしたモデルを使ってサンプルを動かします。
対象となる画像を用意してサンプルを叩きます。

./armv7l/Release/object_detection_sample_ssd -m face-detection-retail-0004.xml -d MYRIAD -i <対象となる画像のパス>

成功すると同じディレクトリにout_0.bmpという結果ファイルが作成され、認識した顔が四角に囲まれています。

まとめ

以上、NCS2をラズパイ4上で動かしてみました。環境設定には少しコツが必要なので色々試したりしましたが、環境さえできてしまえば、あとは画像とモデルを使って動かすだけなので簡単かと思います。
OpenVINOにはたくさんのサンプルがあるので、色々なパターンの推論モデルを動かしてコツを掴んでいきましょう。

参考リンク