Neural Compute Stick 2でリアルタイムオブジェクト検出 (2) ~ インストールとサンプル実行
前回の続きでNCS2の話。今回インストールからサンプル実行のあたりまでレポ。サンプルは顔検出、YOLOv3、MobileNet SSDなど試してみたがどれも非常におもしろい!最終的にドローンで使うには特に高速なMobileNet SSDを採用。
インストール
公式ドキュメントに沿って行なえばよし。"Step 4: Test the Installation" まで成功すればインストールは完了。
Notes:
- Ubuntu 16.04 + Intel x64が前提。
- rootでインストールする必要がある。
- ドキュメントに
~/intel/computer_vision_sdk/
と書いてあったらそれは/opt/intel/computer_vision_sdk/
の間違いなので注意。
なお筆者はこの環境をWindows 10デスクトップPC + VMware Workstation 14 Player上のVMとして作った。ハマりは幾つかあったものの、一応成功裏に動作している。
- USB 3.0デバイスをVMに認識させるためのVMware設定はちゃんとしておくこと。
- ときどきNCS2がVMに認識されなかったり勝手に切断されることがある。プログラム再実行・(仮想的な)デバイス抜き差し・リセット等あの手この手でなんとかする。デバイス名に"Movidius MyriadX"と出る場合と"VSC Loopback Device"と出る場合があり、最終的に前者になるのが正解っぽい。
ちなみに別のラップトップPC(Thinkpad)にOracle VirtualBoxを使って同様のVM環境を構築しようとしたところ、どうしてもNCS2を認識させられず断念した。USB 2.0デバイスと認識されているように見えるのだが、ホスト側の問題なのかVirtualBox側の問題なのかは不明である。
テスト1: 顔検出
SDKについてくるサンプルは画像を入力とするものと動画を入力とするものとに大別されるが、今回ドローンのカメラ映像を食わせるのがゴールなので後者を中心に試してみた。WebCam, HTTP, ファイル等から動画ストリームを直接食わせることができ(内部でOpenCVのVideoCaptureを使っている)、結果も動画で確認できるので手っ取り早い。
まずはこの↓顔検出サンプルを試してみる。顔検出から性別推定・表情推定・顔の向き推定までやってくれる。
Interactive Face Detection Demo | Inference Engine Samples | Intel® Software
自分の顔を撮るだけではあまりおもしろくないので、人がたくさん出て来るYouTube動画を再生してディスプレイをWebCamで撮ってみた。下記の動画がその結果であるが、およそ10FPS程度で動いており、なかなか大したものである。
実行方法は上記のドキュメントのRunningのセクションに書いてあるが、筆者のスクリプトもここ(GIST)に公開しておくのでご参考に。
- 最初に
. /opt/intel/computer_vision_sdk/bin/setupvars.sh
を実行してパスや環境変数を設定しておくこと。 - 実行ファイルやデータファイルがあちこちのディレクトリにばらばらになっており非常に扱いづらいので、筆者はひとつ作業用ディレクトリを作り、そこから必要な場所にはシンボリックリンクでショートカットを張っている。上のGISTの
setup.sh
参照。 - -d系オプションに
MYRIAD
の代わりにCPU
を指定するとCPUを使って計算するようになる。この場合は16ビットではなく32ビットのモデルを使う必要があるので、-m系オプション(モデルのパス)に含まれるディレクトリ名FP16
をFP32
に変えること。 - どのサンプルもNCS2とCPUの両方で動いて欲しいのだが実際にはそうでもない。NCS2で動かすと対応してませんほにゃららとエラーになったり、逆にCPUで動かすとillegal instructionで落ちたり、よくわからない。顔検出は両方で動くラッキーな例。
テスト2: YOLOv3によるオブジェクト検出
YOLO(You Only Look Once)というこの世界では高名なリアルタイムオブジェクト検出モデルがあるらしく、そのサンプルがあった↓ので試してみた。
Object Detection YOLO* V3 Demo | Inference Engine Samples | Intel® Software
サンプルプログラムはインストール時に自動ビルドされるのだが、モデルデータは手動でインストールしないといけない。次のページを見て作業する。けっこうめんどくさいが、まぁなんとかなるものだ。
なお記憶によれば、この手順だけだとラベルファイルが自動で生成されず、検出されたオブジェクトの番号だけが表示される(それが何だかはわからない)寂しい状態になったので、追加で手で入れてやる必要があった。どこから持ってきたか忘れたのでこのGISTに置いておく。このyolo_v3.labels
をモデルのxmlファイルと同じ所に置いておけばよい。
さて、上記のお膳立てを整えていざNCS2でサンプルを実行しようとすると、"unsupported layer type Resample" というエラーが出てしまった。どうやら既知の問題(というか仕様)で、そのうちサポートされるかもしれないらしい。
MYRIAD loader not accepting Model Optimizer output - "unsupported layer type Resample"
ちょっと残念だがせっかくなのでCPUで実行してみる。結構重くて1FPS程度の速度しか出ないが、確かに精度は高いようで、街中をドライブする動画を画面上で再生し先ほどと同様WebCamで撮ってみると通行人や車をわらわら捉えて気分が良い。自動運転システムの中でこういうのが動くのか、なるほど、という気分になる。GPUを使えばもっとリアルタイムになるのだと思うが、VMからだとちょっと無理なのでまたの機会に。
テスト3: MobileNet SSDによるオブジェクト検出
似たようなオブジェクト検出モデルにMobileNet SSDというのがある。検出できるオブジェクトの種類や精度はYOLOv3に対して見劣りするものの、なんでこんなに?と思うくらい、とにかく速い!
MobileNet SSDのモデルもデフォルトではインストールされないので、model_downloaderでモデルをダウンロードし、model_optimizerでサンプルが食える形に変換する必要がある。このやり方が自明ではなくハマるので、このGISTのgenerate-mobilenet-ssd-model.sh
これらのツールの呼び出し方を書いておいた。
- カレントディレクトリにテスト1で紹介したシンボリックリンクがあることが前提。
- カレントディレクトリの
mobilenet-ssd/{FP32|FP16}
ディレクトリにファイルを生成する。 - テスト2と同じくラベルファイルは生成されないので、同じGISTに置いてある
mobilenet-ssd.labels
を他のファイルと一緒に置くこと。 - model_optimizerの呼び出しパラメタがわからなくてハマるのだが、なんとSDKのmodel_downloaderのフォルダに一緒に置いてある
list_topologies.yml
のとある属性に書いてあった。ymlに書いてあるんだから自動的に使われるのかと思いきや、そういう気配がない(単なるドキュメントっぽい)ので自分でコマンド呼び出しに張り付けたらなんか動いたって感じ。
使うサンプルプログラムはこれ。-mオプションに上で生成したxmlファイルを渡す。
Object Detection SSD Demo | Inference Engine Samples | Intel® Software
同じGISTに実行コマンド例(mobilenet-ssd-{myriad|cpu}.sh
)も置いてあるのでどうぞ。
下記の実行例は30FPSの動画ファイルを食わせたものである。同期なしに処理してもとのスピードと同等か少し速いくらいの再生速度になっているので、30FPS以上の処理速度が出てることになる。これはなかなかすごい。検出精度が大雑把なのも許せる速度である。