Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

今年もMaker Faire Tokyo 2018に出ます!!

 今年もメイカーフェア東京(Maker Faire Tokyo 2018)に出展することになりました。

f:id:TAKEsan:20180704201130j:plain

 今まで、格安WIFI付きプロセッサ(ESP8266)とFLIR LEPTON赤外線センサーで、どれだけ本格的・実用的なiPhoneアプリが作れるかどうか追求してきました。

f:id:TAKEsan:20180705100857p:plain

 昨年に引き続き今年も赤外線カメラ(FLIR LEPTON1,3,3.5)を使います。もちろん小型ドローンへの搭載も着々とバージョンアップが進んでいます。

 今年は大きく分けて3つの内容になります。今までは、開発時間に追われてブログ更新をしてませんでしたが、公開できる面白い材料がずいぶんそろってきましたので、頑張って今後紹介して行きたいと思ってます。

今年はメンバーが3人になりました

 東北と関西の共同作品です。こんな感じのロゴにしました。WT&Dに名称変更。

              f:id:TAKEsan:20180705101320p:plain

 

1.小型ドローンへのLEPTON搭載?

 確実に進化しています。成果のお話は会場で!!

f:id:TAKEsan:20180705102508p:plain            えっドビー軽量化?

2.小型サーモグラフィ画像2個で立体表示可能か?

 前回の記事で最後の方に動画を付けましたが、こんな感じです。

    

 ステレオメガネやスマホゴーグルで立体画像が確認できます。これはコンピューターで遠近を認識できることを意味しますが、この動画のDepth画像や3Dメッシュ画像で確実に距離を認識していることが分かると思います。

f:id:TAKEsan:20180705104206p:plain

3.小型サーモグラフィ画像で画像認識は可能か?

 画素の少ないサーモグラフィで、ジャンケンの手の形がどれだけ正確に認識できるかどうかトライしてみました。熱を発する人間の手のひらを画像認識できます。一種のフィルターですね。それもTX2じゃなくてiPhoneで!!(画像はiPhone7 plusです)どう思います?

    

  f:id:TAKEsan:20180705105004p:plain

そして、応用。2種類のジャンケン画像を読み取ってf:id:TAKEsan:20180524102209j:plain (Juneチャン)が、歌います。高齢者の脳トレに最適!!。

    

今回のアプリは、

  すでにアプリ登録しているThermal Cam3を利用して作りましたが、マルチスレッド化してるのでアプリストアから配布ができません。ただしテストフライトという形なら配布が可能ですので、希望する方は会場で声をかけて下さい!!

      f:id:TAKEsan:20180704191549j:plain

ジュンちゃん手術をする!!

 我が家のアイドルトイプードルのJUNEですが、1才にも満たない頃フローリングですってんころりん。右後ろ足の膝のお皿が外れ安くなりました。グルコサミンを飲ませたりしてだましだまし散歩を続けましたが、今年獣医さんに連れて行ったら、外れた膝のお皿がずれたままくっついてしまったとか....。膝蓋骨脱臼のグレード4だそうです。道理で散歩の途中で座り込んでしまうことが多くなったわけだ。

 このままでは左足もおかしくなってしまうと言うことで即手術命令!!。最悪歩けなくなるかもしれないと思い。いくらか歩けているうちに毎日少しずつお散歩をさせ(今から思えば考えすぎでした)、

f:id:TAKEsan:20180524143650j:plain

 我が家から車で2.5時間。盛岡の岩手大学動物病院を紹介してもらって連れて行くことに..。

 前日は心配して友人から送ってもらったお守りを付けて、夕ご飯以降絶食絶水。僕の作ったご飯しか食べないというような悪いしつけをしたので、冷凍にして持参。ついでに事前にトリミングして、狂犬病やワクチンの注射をしてから手術に挑ませることにしました。

f:id:TAKEsan:20180524102209j:plain

岩手山がとても素晴らしかった!!

f:id:TAKEsan:20180524102350j:plain

後ろ姿が泣ける。

f:id:TAKEsan:20180524102430j:plain

 手術内容は、右膝の皮膚をタテに5cmくらい切って、お皿がずれないように足膝部分の骨を削る。横にくっついてしまった膝のお皿を外し、所定の部分まで引っ張ってピンで固定。なんていう飼い主としては身の毛もよだつような内容。

 5/8入院、5/9夕方手術、5/10病院で安静、5/11退院という強行スケジュールでした。5/9の手術後、先生から無事終了の連絡が来て一安心して見たものの、こんなに早く退院して良いのと思いながら迎えに行きました。

 うちのワンコは病院が大嫌いなのですが、岩手大学動物病院では先生を初め皆さんに優しくしていただいたようで、別れ際に先生へお礼(ペロペロ)をしてました。でも帰ってきたときは、こんな痛々しい姿に....。 飼い主としては不安です。

f:id:TAKEsan:20180524103914j:plain

  家の中では飛び跳ねないようにケージ入り命令が出たのですが、なにせしつけが悪く野放し状態で育てたので、ケージに入る訳もなく、

f:id:TAKEsan:20180524103308j:plain

 入れると暴れるだけなので、かえって悪くなると思って、部屋を小さく仕切り様子を見ることにしました。寝るときも一緒でないと本人は気が済まないので、ベッドから飛び降りないようリードを付けて一緒にご就寝することに..。

 1週間目でこちらのお医者さんに行って包帯を取っ替えて、2週間目で再びこちらのお医者さんで抜糸。

f:id:TAKEsan:20180524105221j:plain

 平気で歩いてます。まだ、かさぶたを噛む可能性があるので、エリザベスカラーを付けたままです。術後1ヶ月でCTを撮りに又岩手大学へ行くことになりますが、飛び跳ねないような環境を作れば、なんとか大丈夫そうです。やれやれ。

 

iPhone とOFとOpenCV3.4でcontribが実行できないのか?

ご存じの通り

 OpenCVのiOS版にはcontribが付いていません!!。このライブラリは面白そうなものがたくさんあって、どうしても実行したくなるわけです。でも、iPhoneのカメラを使うだけでもテクニックが必要なSwiftやオブジェクティブCから利用するんじゃなかなか難しいのが私の課題。OF(めんどくさいから今後Openframeworksの略)だったら全然問題ないところから、発想が展開していくことになります。

 まず、iOS用の最新OpenCVが存在するって事を知りませんでした。XcodeでのiOS開発はちまたで言うところのクロスコンパイルなんですね。iPhoneじゃ開発能力不足だから母艦iMacでコンパイルしてバイナルファイルをiPhoneに転送するって発想です。これが大きな障害になるポイント。はたして無事インストールできて、OFで使えるのか?でした。

f:id:TAKEsan:20180417212245j:plain

今回はLEPTON3の立体画像をiPhoneで楽しめる上にOpenCVで距離深度を確認、そしてメッシュ変換までです。こんなことやってる方はいないと思うので結構ワクワクでした。なんつったって無線がキクー!!

で、OpenCV for iOSをインストールして見ると

 終わってみるとほんとに簡単でした。標準インストールするだけです。以下はMacでの場合だけなのであしからず。まず標準OpenCV3.4.1のソースコードを

GitHub - opencv/opencv: Open Source Computer Vision Library

そしてこっちのiOS版3.4.1 contribのソースコードを

Releases · opencv/opencv_contrib · GitHub

つまりiOS版の同じバージョンのソースコードをダウンロードします。

 この2つのファイルをダウンロードして解凍した後、自分のMacの作業フォルダにコピーします。まずは、OpenCV iOS版のコンパイルから。これはOpenCV iOS版の標準インストールドキュメント通りです。

  cd /

  sudo ln -s /Applications/Xcode.app/Contents/Developer Developer

  cd ~/<my_working_directory>

  python opencv/platforms/ios/build_framework.py ios

 iOS版の特定ソースはなくて、OpenCV標準ソースファイルでインストールできます。

インストールに使用するpython は2.7.12で、brewCmakeなど私の環境ではインストール済み。つまずいた場合は、自分でなんとかして下さい。コンパイルは私のiMacで30分以上必要でした。

 結果的に自分の作業フォルダにiosってディレクトリができるので、フォルダの中に以下のようにopencv2.frameworkってディレクトリができれば一応完成です。

f:id:TAKEsan:20180319204754p:plain

OFで普通に使えるようにするには

OFは0.9.8です。うまくいけば2ステップで完了。

 まずこんな感じで作ろうとしてプロジェクトに、ビルドしたopencv2.frameworkを追加します。さっきどこにopencv2.frameworkを作ったかを忘れずに!!

f:id:TAKEsan:20180319210148p:plain

で、ofxiOS_Prefix.pch にopencv.hppをインクルード文他を追加します。使いやすいようにこの段階でnamespaceを追加します。#import <Foundation/Foundation>の前に挿入することが重要だったような...。

f:id:TAKEsan:20180319210207p:plain

 試しにこのままビルドしてみてエラーがなければ成功ですが、もしエラーが出ればダメ押しで、以下のようにHeader Search Pathsにopencv2.frameworkの存在する場所を指定してみます。大概この段階で実行可能環境ができてしまいます。

f:id:TAKEsan:20180319210223p:plain

 ビルドエラー無しでここまでできれば、問題はofImageとMatとの変換だけになります。OpenCVとOpenFrameworks間のデータで問題になるのはimgeとMatの相互変換だけで、例えばL_image っていうofImageをOpenCVのimgRっていうMatに変換する場合は、

  cv::Mat imgR = cv::Mat(L_img1.getHeight(),L_img1.getWidth(), CV_8UC3, L_img1.getPixels().getData());

 Matを使ってOpenCVで画像処理を加えた後、ここではtakeっていうofImageに変換すればすぐDrawできちゃいます。

 

   take.setFromPixels( imgR.ptr(),  imgR.cols,  imgR.rows, OF_IMAGE_COLOR, false);

 両者にはRGB BGR変換とかいろいろ中間処理の必要な場合がありますが、基本ポインタ+αなので、実行時は高速変換できてしまいます。(forの二重ループを使うよりはです)

 キーポイントはCV_8UC3 OF_IMAGE_COLORでした。内容は私が説明するより先人がたくさん書いていますので、そちらを参考にして下さい。

じゃーofxOpencvやofxCVはどうなるんだろー

 はっきり言って必要性は感じない。データの変換作業だけが一見やっかいなだけでこつを飲み込めばこっちの物です。なんつったってこっちは最新のOpenCVでーす。

今回の目玉contribはどのようにして実行できるようになるのか?

 肝心のcontrib導入方法です。またまた時間がかかっちゃいますが、今までの処理が無事終わっていれば、再コンパイルするだけで済みます。

 バージョンを合わせたmoduilesの必要なcontribのモジュールフォルダをopencvフォルダにコピーして再度コンパイルし直すだけ!!。私の場合ximgprocが必要だったのでximgprocフォルダをコピーして、OpenCVを再コンパイルするだけでした。少し前はインストールがかなりめんどくさかったようですが、今はぜーんぜん。

f:id:TAKEsan:20180417203036p:plain

                           contribのなかのmoduilesフォルダの中の各ライブラリフォルダを......

f:id:TAKEsan:20180417203006p:plain

                              OpenCVのなかのmoduilesにコピーして再コンパイルするだけ!!

じゃー何ができるの? 

  iOSの場合、C++の方がSwiftより実行スピードが速いって事が経験的に分かってたのですが、OF+Opencv+contribで去年の今頃は、こんなのできるとは思ってませんでした。

              www.youtube.com

今までの集大成です。Swiftなし。OFだけです。Appleのアプリ審査が通れば皆さん簡単に実行できると思うんですが、無料で申請すれば簡単に通ったりして......。

 

 

                           では、また。

 

 

openFrameworks でCoreML (YOLO)!!

openFrameworks for iOSでYOLOを動かしてみました。

前回紹介したGitHub - hollance/YOLO-CoreML-MPSNNGraph: Tiny YOLO for iOS implemented using CoreML but also using the new MPS graph API. iOSでのYOLO実行環境はSwiftでした。SwiftはUI環境を整備しなくてはいけないので、私にはとてもやっかいです。これをOpenframeworksで実行させたら、簡単に画像を加工できるはず。この記事には、YOLO標準データをCoreML専用に変換するPythonスクリプトも入っているので再学習も可能のはずです。結果、ソースの変更でopenFrameworksでもCoreMLが実行できました。肝心の画像認識部分の実行速度は、Swift版より今回移植したC++版の方がかなり早くなっているようです。画像加工が簡単なので少し表示内容を変更しています。画像認識部分はマルチスレッドにしているので、画像を加工しても画像表示はCoreML(物体認識部分)に影響されません。ただし実行時iPhoneがかなり熱くなるので、連続して実行する場合は1分前後が目安です。iPhone7以降で実行可能。

f:id:TAKEsan:20180102224325p:plain

openFrameworksはdownload | openFrameworksからiOS版をダウンロードしてインストールして下さい。

以下iPhone 7plusで動かした場合

               

以下iPhone Xで動かした場合

               

前回のSwift版より認識スピードが倍近く速くなっているので(計測ポイントは同じ)ハードの実力はすごいの一言。ただ、画像のフレームレートが下がっていますが、カメラ画像の大きさに影響するようです(今回は1280X720としたので遅くなっている)-->1/27修正 今はiPhoneXで29~30FPS、iPhone +で20FPS位になってます。-->1/28修正 画素を元々のswift版と同じ640x480として、内部を少し変えたらiPhoneXで45~60FPS、iPhone +で30FPS位になりました。動画画像は60Fpsでも認識スピードは変わらないのであしからず。マルチスレットにするとiPhoneXだとまだまだ+αが可能ですなー。(肝心な部分を抜かしているような気もしないではありませんが...)

                

1/28修正 最終的にこのくらい。iPhoneXで動画が最高60Fpsいってました。640x480だと認識率が落ちるようですが、これで文句言う人あんまりいないでしょ。

やはりiPhone7の倍くらいスピードが違いました。

ソースは以下に公開しました。

実機でないと実行できないので注意。(Yoro_of2.zipをダウンロード)

https://drive.google.com/drive/folders/0BzqxnYlVMv6uRUtMb2pRXzdsNlU?usp=sharing

急いで作ったので、グローバル変数が多いですが、addonにすれば、かなり簡単に応用できると思います。YOLOの学習済みCoreMLファイル「TinyYOLO.mlmodel」は、プロジェクトにコピーすると、自動的にobjectiv-Cのヘッダーファイル(TinyYOLO.h)が作成されます。画像の変換に利用しているだけですが、ofxCVアドオンをダウンロードして追加してください。1/27修正 結構頻繁にハングアップしていましたが、修正済み。oF上の画像部分取得コマンドofImage.cropFromに少しバグがあるようです。1/28修正 解像度変更とマルチスレッド見直しでスピードが大幅に上がった。

多分Signing系のエラーが出ますので、赤矢印部分を自分の環境に設定して下さい。

f:id:TAKEsan:20180102223102p:plain

                             では、また。

 

 

iPhone X ..........。

前回

 ディープラーニングの学習済みデータを使って、iPhoneXやJetson TX2を使っていろいろ試してみましたが、Tiny YOLO単一環境では一体どのくらいの差があるかどうかざっとテストしてみました。

f:id:TAKEsan:20171213214635j:plain

 Tiny YOLOを使った理由は、iPhone環境でYOLOを使ったサンプルはTiny YOLOしかないからなんですが、同じデータセットを使って実際認識試験をしたら一体どのくらいの差があるんでしょうか?非常に興味深いところです。TX2の方はDARKNETの標準インストールです。

Installing Darknet

当然GPUはON、CUDNNもONです。Tiny YOLOは20クラス同時に認識しますが

まずはTX2から。

YOLO: Real-Time Object Detection

で、Tiny YOLOをインストールしてdarknetフォルダの中で次のコマンドを実行します。当然クロックを最大にする./jetson_clock.sh を実行させてから。

./darknet detector demo cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights -c 0

     youtu.be

大体15~16FPSってとこでしょうか。ちなみにGPUもCUDNNも外してmakeした実行結果は0.4FPSなので、GPU環境じゃないと動画の認識は不可能でした。つまりCPU単独実行の場合の38倍ぐらい早くなってます。

次にiPhone7 plus

GitHub - hollance/YOLO-CoreML-MPSNNGraph: Tiny YOLO for iOS implemented using CoreML but also using the new MPS graph API.

をダウンロードして、この中の「TinyYOLO-CoreML」をビルドします。すでにTineYOLOデータが入っていますのですぐにビルドできます。このサンプルはiPhone のカメラを使うので実機でしかテストできませんが、現状のXCODE9.2は簡単に実機テストできます。詳しくは他の記事を参考にしてください。エラーが出るとすればSigningの設定変更だけです。

     youtu.be

11~13FPSです。やはりTX2よりはいくらか遅い。

そしてiPhoneX

     youtu.be

28FPS前後!!なんてこっちゃ。早すぎる。iPhone8でも同じくらいのスピードってことですね。1/30追記:このソフトはマルチスレッドで動いているようで、28FPSはどうやらカメラ画像のみのスピードのようです。実際の認識スピードは0.07秒=14.3FPSってところです。この後openFrameworksに移植したところ20〜22FPSまで上げることができました。

 Nvidia Jetson TX2は、ディープラーニングに特化していて、一般的なこの種のボードでは最上位のはずです。しかもNvidia公表では単精度の浮動小数点演算で2Tflopsを達成してることになっています。それでも画像の学習には能力不足で、母艦の最速GPUが必要。TX2は学習結果の認識に特化してるはずです。この結果は何を意味するんでしょうか?。方やCUDA+CUDNN、方やMETAL。同じデータセットを使って同数の20クラスを同時認識。結果はiPhoneXが圧倒的に早い。METALなんか発展途上で....なんて考え方は捨てた方が良さそうです。

 また、いくらTiny YOLOでも、前述の通りGPU無しでは実用に耐えるスピードまでは行き着きません。問題は開発環境だけって事になります。性能についてAppleはかなり控えめに報道してるって感覚。

 アプリを使う側は、プログラムの過程なんかどうでも良いわけで、この結果から見る限りiPhoneXはTX2の遙か上を行ってるって事になりますが、どう思います?

 

                                                                                                     では、また。 

Ai実行環境で、最近びっくりしたこと

この頃プログラムをじっくり作ってる暇が無くなったので、率直に最近素晴らしいと思ったことを書くことにしました。

Pythonista3のスピードが素晴らしい。

          f:id:TAKEsan:20171130211721p:plain

 知る人ぞ知るiPhone、iPad開発環境のPytonista3ですが、いったいどのくらいのスピードで動くんでしょう?。使用ディバイスの金額から考えて、並のスピードならぜったいゆるせない....。過去iMac27インチとかPi3とかTX2でCPUのメインコアスピードの目安として使わせていただいた簡単なPythonのテストプログラムを実行してみました。

         f:id:TAKEsan:20171130212040p:plain

 実行結果はiMac4.776秒。Pi3で32秒。ゲーミングパソコンi7 6600Kで3.2秒。これに対しNvidia  TX2では7.8秒。intel Jouleでは12秒前後でした。まーCPUを考えたら納得の結果です。これを試しにPytonista3をインストールしたiPhone7 Plusで実行するとなんと5秒ジャスト!!。こりゃーiMacなみのスピード!!。さらにiPhone Xで実行すると4.5秒。エ~~ひと昔前のカスタマイズしたiMacより早い。ほかのスピードテストプログラムを実行してもほぼ同じ結果です。Pythonでこれだけ早くて、iPhoneのObjectiv-Cのクラスが使えるし、簡単なShell環境でsshもpipも使えるんですから、必要のものは何なんでしょうか?頭とキーボードだけです。どうりでサンプルが早いはずだ....。

 このアプリの開発環境は非常にスマートだし、何でもできる(この何でもの範囲が無限に近いってのもすごい!!)。UIだって精錬されたスイッチ類が使える。っていうのが率直な感想です。OSのマルチタスクと、疑似マルチタスクの差がプラスに働くとは思いますが、こんなに早いとは思いませんでした。numpyとmatplotlibが標準実装なので、AIを勉強するには環境的にも整っています(Tensorflowやpycaffe等は今のところインストールできない)。これからはメインがiMacからiPhoneになるかもしれない....。ってことは無いか。

iPhoneXがすばらしい。

 f:id:TAKEsan:20171130212919j:plain     f:id:TAKEsan:20171130211245j:plain 

  ついこの前までLEPTON3を使ったThermal Cam3W&T Thermal Cam3 for FLIR LEPTON3 - Take’s diaryにすべてをつぎ込んできました。開発ディバイスはiPhone 7 Plus。やっぱり最新機器で試してみたくなって、早速iPhone Xを手に入れ、アプリストアへのバージョンアップ申請をかねて試してみました。

           f:id:TAKEsan:20171130211220j:plain

                     Thermal Cam3はiPhone Xに完全対応してます。Thermal Cam3 on the App Store

 過去iPhone7 Plusで何十回もテストを続けた経験で、まず驚くのがWiFiのつながりがとても良くなっていること。グラスボディーが電波の改善に貢献してるんでしょうか?アンテナが2つになっているのが原因でしょうか?感覚が全然違います。そしてCPUスピード。これも大きく貢献しているようで、これらの相乗効果からか、全く別のソフトのようにサクサク動きます。Pythonista3での検証でも確認しましたが、単独アプリではひょっとしてi7を使ってるノートパソコンより早いかもしれません。iPhone 7 Plusで気になっていたBlueToothの悪さもあまり問題なくなりました。

 ネット上ではボタンがなくなったとか、カメラが普通とか、顔認証が気にくわないとか外に出てマスクをするとドーとかコーとかいろいろ言われてみますが、開発から見たら7とは別物です。こりゃーこの方たちは、あくまでも現在実行できるアプリを試して感想を伝えてるだけだと感じてます。何かを作ってみたい人はiPhoneX絶対に買いです。

 Metalを中心としたAIに関する将来性や、表示機器の明らかな優位性(これも7とXじゃ全く違います。音で言うとCDとSACDの差っていう感覚です)、なんと言ってもCPUやGPUの能力。擬似マルチタスクの優位性。さらには基本Kinectと思想が同じセンサ類の構成や、今回認識したWiFiの性能を考えると、開発者の能力次第で今後が決まってくる素晴らしいハードだと感じました。

 私のような趣味の人は、GPIOを使ってセンサーや外部機器を使ってみたくなるわけですが、Pythonista3やOpenFrameworksがあれば、ESP8266とのWiFi接続で完結します。精錬されたiPhoneのUI環境で、反応の早いソフトを何でも作れることになります。

 ためしにネット上で公開しているiOS11で実行できるMetalを使ったYOLOの実行環境を試してみました。ここでは認識対象(クラス)が人物の1種類だけですが、どう感じますか?

                           tiny Yoloで20クラスの内、人体だけを認識させている。スピードは問題なくなっている!!

TX2がいい。

  f:id:TAKEsan:20171130212959j:plain

OrbittyボードにWiwaoさんに作って頂いた、バッテリーボードを合体。TX2がバッテリーで動くようになりました。

f:id:TAKEsan:20171203230607j:plain

Wiwaoさんのバッテリーボードは、2個のバッテリー切り替え可能。ラジコン用のLiPoバッテリー(11.1V)を使い、TX2の最高スペックスピード設定で、2時間以上稼働します。しかもバッテリーの使用状況も写真のようにLEDで表示します。Orbittyボードと組み合わせると、超小型パソコンに変身します。デモにぴったり!!

 私にとってIPhoneXがカリスマ性を帯びてきている昨今。なんかTX2は自分的に影が薄くなった感じがしてましたが、この前に紹介した全体的に小型化できるOrbittyボードが使い物になったとき、全く別物に変身しました。(今までTX2ではUSB3.0が接続できなかった)

 TX2のいいところはなんつったってUbuntuがサクサクなことです。この開発環境はiPhoneのAppleに縛られた不自由さとは違って、霧が晴れたような使い勝手と潜在能力が最大の魅力。アマチュアでGPIOを触りたい人はこれ以上の環境は無いと思います。

                  

TX2で標準YOLOデータを使ってREAL-Time Object Detectionを実行しているところ。ただしスピードアップするためにyolo.cfg中 widthを608から448、heightをwidthを608から448に変更。以前試してみたPy-Fastere-RCNNとはスピード的に雲泥の差!!

                  

さらにスピードアップするためにyolo.cfg中 widthを228、heightをwidthを228に変更。このくらいだと、かなり早くなるが認識率がいくらか悪くなる。                  

                 

これはThermal Camで録画した動画を以前作ったOpenFrameworks+Jetson-Inferenceで人体認識させたもの。Jetson-InferenceではNvidiaでオススメのTentorRTを使って認識させていますが、Yoloが20クラス認識することを考えれば、ソフト作成に手間取った割には何だかなーっと言う結果です。でも、サーマル画像で人が認識できるってすごいと思いません?夜間での動物認識はお手の物ってことになります。

 やっぱESP8266が.....

GPIOを操作するには、母艦がTX2やiPhone Xだと言うことなし!!

 

                                では、また。

 

いまさらIntel Joule で Movidius!!

今回は、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です。

               f:id:TAKEsan:20171113214807j:plain

 巷にはびこってるブログでは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ダイレクト接続しか正常に動きません。

f:id:TAKEsan:20171113214906j:plain

 これじゃーねー?マウスも何もかも動かせないし、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が認識できません。最終的結論は以下の通り

  • この後が問題。なぜか以下のコマンドを実行します。

    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側が悪いのか様子を見てからの方が良さそうです。(この記事書き終わる頃は接続もいくらか良くなって来た?)