今回は、Intel Joule でこんなことをやってみました。
そう....ディープラーニングの学習ではなく実行環境です。Joule単体で同じようなことを同様のスピードで処理することはまず無理です。今回は Intelが販売しているMovidius Neural Compute Stickを使ってTiny YOLO で人体を認識させています。
フルセットのデータでは無いので、普通はもっと他の物も認識するはずなのですが、ちょっとイマイチでした。もう少し中身を修正すると良くなるかもしれません。スピードは動画のように遅めですが、結構使えるようです。
これをJetson TX2(当然Movidiusは付けてません) でTiny YOLOじゃ無いやつ(Real-Time Detection)を実行するとこうなります。スピードは同じくらいですが、認識の精度が格段に違うことがわかります。
さらにTX2でTiny YOLOを実行すると、最高Joule+Movidiusの6倍くらいになります。客観的に見るとMovidiusを取り付けたPI3やJouleで、ディープラーニングを使った複雑な物体の特定を行うにはかなり工夫が必要のようです。(一般的なものは後述のようにかなり早い)
Intel Jouleが製造ストップ
あんなに苦労してUbuntuを入れたのに(今は簡単だけど)OpenCLまで動かしたのに..。と言ってもLEPTON3やTX2にうつつを抜かして、Jouleをほっといたのも事実ですけど、とにかくIntel Jouleは現在製造中止みたいです。
確かにIntel JouleはGPU(GPUって呼ぶのはNVIDIAだけ。でも直感的に伝わる)環境が弱い。JouleでOpenCLができてもOpenCV環境じゃさほど早くならない。当然CaffeだってCPUだけじゃーな。って考えてたところにこんな魅力的なスティックが販売されました。しかもIntelから?。簡単に言えばUSBで接続できる外付けGPUです。
巷にはびこってるブログではPI3の記事だけ。Python自体のスピードを比べれば、圧倒的にJouleに軍配があがることは前のテストで認識してました。今までの経験上、Pythonがディープラーニングのカギを握っているのは事実。CPUもそこそこの環境でUSB3.0があって、GPUが弱くて、UBUNTU16.04が動くボードって、そうなんです。Intel Jouleが再浮上してきます。こりゃー試さずにはいられないわけです。
かなり苦労したインストール
MovidiusはIntelが買収してるから、Jouleで簡単に動くんじゃないかって思ったのが大間違い。Intel JouleのOS環境は何もかも最新のものに変更する必要があります。つまり最新BIOS、最新のubuntu16.04.3 。
おまけにディバイス名称が出てきません
take-joule@takejoule-570x-DVT2:~/workspace/ncsdk/examples/caffe/AlexNet/cpp$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0a2b Intel Corp.
Bus 001 Device 010: ID 03e7:2150
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
2150が該当ですがディバイス名が表示できていない!!。Macでは表示できてます。
このMovideius。製造ロットによって不具合があるような気がします。私の手に入れたスティックがどうやらビンゴ。Jouleダイレクト接続しか正常に動きません。
これじゃーねー?マウスも何もかも動かせないし、Web Cameraですら接続できません。SSH接続したMacから操作できるのみ。
USB3.0対応ハブを2、3種類試して見ましたが、なかなか認識できませんでした。ここで言う認識できないとは、lsusbではディバイスとして認識してるのですがMovidiusのサンプルアプリを動かすと途端にディバイスエラー!!その後lsusbで確認するとMovidiusディバイスが消えているといった症状です。なんとなく電圧が不足している感じですが、電源付きのUSBハブでもダメ。それでもたまたま認識できる場合があるので、ゆっくり差し込んだりそうでもなかったり、差し込んでからブニュブニュ動かしたり、最後まで差し込んでから少し引っ張ったり。その中で安定して接続できる場合があるので、その環境で実行した動画が最初のものです。これはコミュニティーでも記事がありますので、
[Error 7] Toolkit Error: USB Failure. Code: Error opening device - Movidius Neural Network Community
どうやら私だけではなかったようです。
このスティックのUSBアダプタは、規格ギリギリのいわゆる粗悪品が混じっていて、これが私の手元に来た感じになりますが、Joule側にも問題があるような無いような...。
SDKのインストールは簡単ですが
SDK自体のインストールは、とっても簡単で、クイックスタート通りでインストールできました(前バージョンはダメだったけど)。途中、サンプルのコンパイルの時エラーが出ますが、Movidiusを接続しなくてもOKでした。インストールは様々なライブラリの他にCaffeもソースからコンパイルするので、結構時間がかかります。(全部で40分ぐらいだったでしょうか)ただし、PythonのOpenCV環境に関して(いわゆるCV2)、標準のインストール方法ではWebカメラが普通に動きません。つまりOpenCVでvideo0が認識できません。最終的結論は以下の通り
- 普通にSDKをインストール。
- Opencv3.2.0をソースからコンパイル(以下参照。簡単にインストールできました)Install OpenCV on Ubuntu or Debian - Manuel Ignacio López Quintero
- この後が問題。なぜか以下のコマンドを実行します。
sudo pip3 uninstall opencv
普通OpenCV Python版をインストールする場合、pip3 listを実行してもリストされないのですが、なぜかリストされます。Movidiusの標準SDKでインストールされたOpenCV関連のライブラリが悪さをしているようで、pipでOpenCVライブラリを抜くと元に戻るというような、極めてマニアックなことをしないとダメでした。
スイッチサイエンスさんではPi3で動画認識させてますが、少し高度なやつ
GitHub - gudovskiy/yoloNCS: YOLO object detector for Movidius Neural Compute Stick (NCS)
をWEB上で見つけて、実行させたのが最初の動画です。(関係フォルダをダウンロードしたら、そのフォルダの中にYOLO tinyをダウンロード。新しくweightsフォルダを作ってその中に入れ、Camera input Scriptを実行するだけです。(ファイル名が違っているので注意))
このスティック、C++でも動くみたいなので、ROSやOpenFrameworksに移植したら面白そうですね。時間できたらやってみます。
結論的にいうと
今回は、少しひねくれたものを動かしていますが、標準SDKに入っているサンプルを動かすと、MovidiusはJouleのために作られたんじゃないかって勘違いするくらい、するする動きます。
標準SDKに入っているサンプルstream_inferをJouke+Movidiusで動かしているところ。ちゃんとマウスやトイプードルを認識してます。この通り単純な画像認識だけなら実用スピードです!!。Pythonで動かしてるなんて信じられませんよねー。
僕のようにJouleを折角買って何もしないでいる皆さん!!「復活の時」です。案外また製造ラインが動くかもしれませんね。ただしステック側のコネクタが悪いのか、Joule側が悪いのか様子を見てからの方が良さそうです。(この記事書き終わる頃は接続もいくらか良くなって来た?)