今回のお題の内容は、
TX1にインストールしたOpenframeworks(以後OF)で、以前チラッと紹介したTensorRTを実現させようという試みです。やっとディープラーニングに戻りました。
今回の最終画像。TX1+OF+TensorRTで認識した人物をリアルタイムで表示している。前回のOpenCV+HOGと比べて認識率と反応が全く違う。すごい。さすが最新ディープラーニング技術!!
左がTX1+OF+TensorRTで認識させたディスプレイ画面(緑の四角で認識した人物を特定してる)。iMacの人物画像と奥のテレビに映った「さんまさん」も認識してる。
TensorRTはここに紹介されています。
未だにTensorRTって分かってませんが、インストール中にCaffeライブラリをダウンロードしてるんで、多分Caffeの16bit版(例のrun test がうまくいかないやつ)を使ってるだけじゃないか?なんて、今思ってます。結果が良好なんで、使う側にとってはどうでも良いことですけど。
この中で、Object Detection の学習済みデータを使い、TX1に接続したカメラ画像で、リアルタイムにいろいろ認識させてみるというアプリをOFで実現させてしまいした。
Object Detectionについては、この記事を見ると大体理解できると思います。
この方のブログに注目してるんですが、応援方法がわからない....。
Object Detectionの学習は、非常に時間のかかることが分かると思いますが、今回は、Object Detectionの学習済みデータを利用して、実用的に使うみたいなコンセプト。TX1は、GPUに関して最新のものと比較すると完全に見劣りしますが、本体が非常に小さく、ほどほどのスピードなので、現場で使うには非常に実用的。メーカーが本来考えていたことが実現できたことになります。
Jetson-inferrenceのOF化について
Jetson-inferrenceをインストールすると、数種類のアプリが実行できますが、この中でも実用的かつ一番面白いと思われるdetectnet-cameraをOF化してみました。
このアプリの欠点と思われる部分は、
- カメラ部分と表示部分にCUDAがらみの処理が多く、私ではちんぷんかんぷん。
- 表示画像が逆なのに直す「すべ」が分からない(カメラとOpenGL部分の座標の違いか?)。こんな感じ!!。
カメラは普通に設置してるのに、画像が逆さま。青い四角で人物を確実に認識してるが......。
- このソース利用しようとしても、入出力が特殊なので応用が非常に難しい
OFに移植なんて無理かなと思ってたのですが、ディープラーニングのエンジン部分がとても単純であることが判明。で、やっとできたので記事にしたいと思ったわけです。いつも書いてますがOF化によって、応用範囲がぐんと広がることが約束されます。この画面のMjpeg配信なんか簡単にできちゃいます。
できたものは、本家アプリの場合6.1fpsに対して、同条件で今回は7.8fpsになりました。早くなったんです!!。早くなったのはなぜ? 感覚的に本家の方は、変換作業が多すぎるような気配があるのですが、この辺りかもしれません。でも私の作ったものの方が早いなんて、とっても嬉しくなります。ソースが短い(こんなにすごいことを実行しているのに....。)のでaddonにする必要もないと思いましたので、ofApp.cppに全部入れちゃいました。ただ、config.makeが特殊(リンクオプションをたくさん追加しているため)なので、ソースダウンロード可能にしときます。--->Detect-RT.zip
今後このフォルダをコピーすれば、どんどん面白そうなものが作れそうです。感心するのは、全体のスピードは8ps前後で多少カクついていますが、カメラから画像を取り込んでから遅延がほとんどないこと。前回のOpenCV Hogは確実に1秒以上「間」を置いてからの表示なので、リアルタイムではありませんでした。また、今回1080x720と、そこそこ大きい画素数ですが、遅延がほとんどないんです(前回は640x390 HD720にすると6fpsくらいで遅延が3秒!!)これは実用的!!。
注意点は、以前ビルドしたOpenCV2.4.13の関数を使うと実行エラーが出て動かなくなること。当初の狙いは、前回作ったZEDの深度測定と組み合わせようと思ったのですが、これは不可能のようです。どうやらコンパイラオプションのGLライブラリが競合するようです。検証をしていませんが、OFに標準で入ってるアドオン「ofxOpencv」は、リンクするライブラリが違うので競合しない可能性があります。
実際の認識性能がどうか?なのですが、この前のOpenCV HOG 認識器の動画と比べれば、違いに気づくと思います。とにかく認識が安定してますし、一度に認識する数も比較になりません。断然良い!!。さすがディープラーニングの最新技術ですよね。ただし、結構誤認識してしまう欠点があります。問題は学習の仕方でしょうか?
今回のソースを最後に付けます。Jetson-inferrenceをインストールすると、学習済みデータが自動ダウンロードされます。3種類存在するので、これを利用できます。顔認識、人物認識、人物とバッグの認識です。以前は、このフォルダの中のどのデータを利用するのかわからなかったのですが、今回はっきりしたので、最後に付けたソース中に、その辺りもコメントを入れてます。次は母艦のDIGITSでデータを作って、TX1で結果を実行させたいと思っています。尚、今回のモデルはmultiped-500です。昨年の暮れには夢だったことが実現できて幸せ!!。これからは、個人でディープラーニングを活用した実用レベルのソフトが作れそうです。
実行条件
- JetPack2.3.0以降の64bit版がインストールしてあること。
- Jetson-inferrenceをダウンロードしてビルドしてあること。/home/ubuntu に入れないとOFコンパイル時、リンクエラーが出るので注意。
- TX1にOpenframeworksがインストールしてあること。
TX1には通常Openframeworksはインストールできません。インストールするには手順が必要です。最短で実行したい場合は以下の記事を参考に!!
実行手順
- USBにWebCameraをつなぐ(Logicool製品が一番安心。できればC920以上)。
- プロジェクトDetect-RT.zipを解凍したらフォルダごとOF/apps/myAppsへ突っ込む。
- Jetson-inferrence/build/aarch64/bin の中の facenet-120、multiped-500、ped-100フォルダへのリンクファイルをDetect-RT/binへ入れる。(既に解凍したファイルには同名のフォルダが入ってるので消してから)
- Jetson-inferrence/build/aarch64/include フォルダへのリンクファイルをDetect-RT/srcに入れる(既に解凍したファイルには同名のフォルダが入ってるので消してから)
- ZED SDKやOpenCV2.4.13をインストールしていない方は、Detect-RT/config.make の中身の修正が必要です。一番最後に追記した「すいません」以降を確認してください。
- includeリンクファイルの中で、修正が必要なファイルあり-->cudaUtility.h。最初の方の赤文字部分を追加。
cudaUtility.h
/*
* http://github.com/dusty-nv/jetson-inference
*/
#ifndef __CUDA_UTILITY_H_
#define __CUDA_UTILITY_H_
#include </usr/local/cuda-8.0/targets/aarch64-linux/include/cuda_runtime.h>
#include </usr/local/cuda-8.0/targets/aarch64-linux/include/cuda.h>
#include <stdio.h>
#include <string.h>
- Detect-RT に移動して いつものようにmake -j4 make run で実行。
ソース内容
はてなブログでは文字化けしちゃうんで、ダウンロードしてみてください。Detect-RT.zip (複数のクラスがあった場合、認識した部分を表す四角形の色分けをしてません)
※すいません!!解凍したフォルダ「Detect-RT」の中にあるconfig.makeの中身はZED SDKへのリンクも入ってました。このままだとZEDを所有していない方は、リンクエラーになるのでDetect-RT/config.make の80行目 PROJECT_LDFLAGS= 部分を以下に変更してください。)
PROJECT_LDFLAGS=-L/usr/lib/aarch64-linux-gnu/tegra -L/usr/local/cuda-8.0/lib64 -L/usr/local/lib -L/home/ubuntu/jetson-inference/build/aarch64/lib -rdynamic /home/ubuntu/jetson-inference/build/aarch64/lib/libjetson-inference.so -lX11 -lpthread -lGLEW -lGLU -lGL -ldl -lrt -lnvcaffe_parser -lnvinfer /usr/local/cuda-8.0/lib64/libcudart.so /usr/local/cuda-8.0/lib64/libnppc.so /usr/local/cuda-8.0/lib64/libnppi.so /usr/local/cuda-8.0/lib64/libnpps.so /usr/local/cuda-8.0/lib64/libcublas.so /usr/local/cuda-8.0/lib64/libcufft.so -ldl -lm -lpthread -lrt -Wl,-rpath,/usr/lib/aarch64-linux-gnu/tegra:/usr/local/lib:/usr/local/cuda-8.0/lib64:/home/ubuntu/jetson-inference/build/aarch64/lib
では、また。