本日は前回の記事に引き続き、jetson nanoを用いた様々なdemoについて書いていきます。
紹介するdemo
本記事で紹介するdemoは私が特に面白いと感じたものを紹介しようと思います。試すのも簡単なので、ぜひ挑戦してみてください。紹介するdemoは、jetson nanoに標準で入っているVision worksとjetson用の画像処理リポジトリであるjetson-inferenceです。
Vision works
まずはVision worksです。
Vision worksではすでに入っているデータを使ってdemoをしていますが、自身で用意したデータでも同様の推論が可能なようなので、興味のある人はぜひ試してみてください。
実装方法に関しては、とても参考になる"Jetson Nano超入門"という本があるので、こちらを参考にしていただきたいです。
私が試したdemoはFeature tracking, Object tracking, Motion estimation, Stereo matchingです。
feature tracking
feature trackingやobject trackingは自動運転に使用されているような技術です。
正面の自動車に追従する,周辺の認識,動作の予測をするのに重要な技術です。もちろんこれだけでは自動車を走らせることはできませんが、このレベルの推論がjetson nanoで動作するというのはとても驚きです。
以下,feature trackingとobject trackingのデモ写真です。
feature trackingでは取得した特徴量がどのように遷移しているかベクトル化しているようです。
これを見ることでこの学習器ではどこを特徴として着目しているのか、なにを重視しているのかが見て取れます。
object tracking
object trackingでは、バウンディングボックスで囲われたものを追跡するといったdemoです。これは、feature trackingのように特徴に着目してバウンディングボックス内の特徴をトラッキングしているようなのですが、時折ボックスがずれてうまくいかなくなります。これは特徴の取り方が最適ではなく、自動車でも他の自動車にあるような特徴を見ていたりとか、電柱にあるような特徴なんかも見ているためうまくいっていないのではないかと考察しています。
motion estimation
次に、motion estimationです。これもfeature trackingとやっていることは似ているのですが、おそらく動体認識をしていると思います。そして、1フレーム前とかを使って推論しているといったところではないかと思います。これも30FPS以上で動いているので、監視カメラとかにも使えそうですし、自動ドアなんかにもつけるといいかもしれないですね。
stereo matching
最後にstereo matchingなのですが、これは正直よくわからなかったです。おそらく、2つの単眼カメラがある想定で、三角法とかを使用した時のステレオカメラを想定していて、距離を算出できるということだとは思うのですが、リアルタイム実装とかができるのかもよくわからないです。
ここまでで、Vision worksのdemoの紹介は終わりです。ほかにもスタビライザーなどで手振れ補正をしているdemoなんかもありましたので興味があったらすべて試してみるといいかと思います。
jetson-inference
次にjetson-inferenceについてです。こちらは実際にカメラを使用してDeep Learningによる推論を体験することができます。
私が使用したカメラは以下のモノです。
このカメラではなく、raspi cameraでも可能なのですが、その場合v2を買う必要があるので注意が必要です。
それでは、 実際にgitからリポジトリをクローンするところから説明します。
まず、terminalを起動して以下のコードを実行します。
$ git clone https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ git submodule update --init
これで、リポジトリをクローンしてきました。また、サブモジュールも使用可能にすることを忘れないでください。サブモジュールについては以下の文献あたりを見るとわかるかと思います。
次に落としてきたリポジトリをビルドして実行可能状態にします。
$ mkdir build
$ cd build
$ cmake ../
$ cd jetson-inference/build
$ make
$ sudo make install
これでサンプルが実行できるようになります。
以下を実行することで、googlenetを用いた物体認識ができます。
$ cd jetson-inference/build/aarch64/bin
$ ./imagenet-camera googlenet
私の場合、実行結果が以下のようになっています。
コップやキーボードが正確に認識できています。
複数の認識も可能なのですが、出力の表示が荒れるので一つずつ撮ってます。
このgitリポジトリは以下のモノなのですが、この物体認識とは別に、物体検出、セグメンテーションなどもできます。
物体検出やセグメンテーションをやった結果は以下のようになりました。
人、イス、ベッドと一部しか撮影できていなくても割と性格に推論できていることがわかります。
一方で、以下のような失敗例もあります。
イスに服をかけると、93.3%personであると推論しました。
これは、服のかかったイスを学習していないからというのと、背景画像の影響かと思います。
また、屋外での写真に関しては、単純に解像度が悪いというのと、手前にある電線などが悪影響を及ぼしているのだと思いました。
また、セグメンテーションに関しては以下のようになったのですが、これはうまくいっているのかわかりませんね…
私が光ってます…
まあ、サンプルを実装しただけなので、この程度かな…というのが所感ですね。
実際に使用する場合には、データセットを作り直して、転移学習をするのがいいのかなとは思います。
また、rosの導入も進めているので、それも実現出来たら、記事にします。
機械学習に関しても、追加で記事を書くと思うので、その時は、是非読んでください。
以上です。