Take’s diary

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

Jetson TX1+Openframeworks + ZED で人物認識しながら距離を測定する。

今回の表題は、

 何が何だかわからないと思いますが、次の動画と写真を見て下さい。

          

f:id:TAKEsan:20170111212738j:plain

左がZEDの左側のカメラから取り出した画面。右側がその画像の深度(グレースケールからカラーマップに変えてみた)。キーボードでHキーを打ち込むと、左下にHOG!!が表示されて、人物認識とカメラから人物までの距離測定のはじまりはじまりー。

f:id:TAKEsan:20170111212731p:plain

試しにiMacに表示させた人物写真をZEDに見せると.....認識している!!(距離が0.6m以下だと距離は表示されません)前回と比べるとスピードも内容も格段に進化しました。

 私の姿を認識して、距離を表示してます。TX1上のOpenframeworks、GPU を利用したHogOpenCVの人物認識職別器)で人を検出しながら、ZEDステレオカメラで人物までの距離を認識させるという、何かに役立つような役立たないような実験結果です。

 OpenCVHOGは、GPUを使ってもかなり重い処理。これにZEDの深度認識を組み合わせるのですから、TX1では、持ち前のGPUを最大限使っても悲鳴を上げそう。いつものようにかなり苦労して、やっと13fpsくらいまでになりました。13fpsで遅いって?。いえいえ。この前Intel JouleOpenCL(GPU)を利用して実行した結果が4.4fpsintel i7 6700K CPUオンリー環境で9fps前後ですから、そのスピードに驚嘆!!。しかも対象物までの距離なんか認識させないでですよー。

前回は、

 ofxKuZedアドオンを利用して、TX1上のOpenframeworksでZED カメラを動かして見ました。でも、かなり遅い。ZED SDK に入っているOpenCVサンプルの半分くらいのスピードでした。「面白くない」。原因がZED SDKマトリックスデータをいちいちOpenframeworksのピクセルデータに変換しているからとは分かっていたのですが、ソースを解析するには、このアドオン、あまりにも複雑過ぎます。そこで、もっと簡単なZEDアドオンを探して見ました。それがofxZED https://github.com/andsynchrony/ofxZEDofxKuZEDの作者が参考にしたアドオンだそうです。但し、最新版のZED SDKでは全く動きません。本人が正誤表を作っていますが、これでもダメ。さらに私なりに修正してやっと動きましたが、やはりピクセルデータ変換が災いしてofxKuZedより多少早い程度でした。

 今回はOpenCV のcv::Mat とofPixels間のポインタ受け渡しを利用して、高速にデータ変換が可能なことが分かったopenFrameworksでOpenCV3を使う - Qiitaので、これを利用。ofxZEDアドオンを大幅に変更したものを作りました。

結果は以下の通りです。

f:id:TAKEsan:20170111212813j:plain

ofxKuZed改良版。VGA(672x376)、深度は詳細モード(下に半分写っている白黒画面)で16.49fpsでしたが...。

f:id:TAKEsan:20170111212848j:plain

ofxZED改良版。ofxKuZedと同条件の上に、深度は白黒ではなくOpenCVのカラーマップでマッピングしてかなり負担があるにもかかわらず(3fpsくらい落ちる)、なんと約29fps出てます!!。深度画像なんか必要ない場合は、60fps超えで、HD720(1080x720)の場合は3020fps出ますぞー。

ofxZED改良版について。

 いちいちプログラムを説明してもなんだかなーですので、以下からダウンロード可能にしときました。

   ofxZED.zip

 興味のある方は、中のコメントを確認してみてください(私の理解できている範囲で結構詳細に書いときました)。コンパイル中ofConstants.hやEigenがらみのエラーが出る時は、前回の記事を参考に修正が必要です。

TX1の環境ですが。

  • JetPac 2.3.0以上がインストールしてあること。
  • Openframeworksがインストールしてあること。(以前の記事参照、TX1専用のOF-->ダウンロード可能にしときました!!
  • TX1には通常Openframeworksはインストールできません。インストールするには手順が必要です。最短で実行したい場合は以下の記事を参考に!!

takesan.hatenablog.com

  • Opencv2.4.13以上がインストールしてあること。(以前の記事参照)
  • ZED SDK 1.2.0がインストールしてあること。(以前の記事参照)2017/5/12現在ZED SDKが 2.0になってここで紹介しているプログラムは動きません。修正するつもりですが、バージョンを1.2.0に下げてインストールしてください。
  • ZED ステレオカメラが手元にあること。(当然!!)

※TX1以外のUbuntuマシンでもこのまま動くと思うが未確認。

 ダウンロードしたら解凍して、ofxZEDフォルダをTX1にインストールしたOpenframeworksの中のaddonsフォルダに入れるだけです。コピーが終わったら、ofxZED-->exampleに入って make -j4   でビルド。その後make run で実行です。

 今回は、動くだけです。精度をあまり重視していないので、ZEDのキャリブレーションファイル等は読み込んでいません。

 ofxZED-->srcの中にリンクフォルダzedが存在します。これはZED SDKの中にあるincludeに存在するzedフォルダへのリンクです。このままで良いと思いますがビルド中リンクエラーが出るときは確認して下さい。

HogDescriptorについて。

 OpenCVのHogDescriptorは、細部係数の調整が必要です。調整方法は以下を参考にさせていただきました。

OpenCVとVisual C++による画像処理と認識(13A)----- HOGDescriptorとSVMで人(歩行者)を検出する ----- -----

 この記事中で、検出ウインドウサイズ32x64はOpenCV2.4.13には存在しません。結果的に64x128が一番無難でした。記事の中ではあまり重視していませんがHOGDescriptor::detectMultiScale関数中のscaleの変更は、認識率やスピードの点で、かなり重要でした。参考ソースはCPUだけで実行していますが、今回はGPUライブラリを使っています。

やはり

 Hogは、py-faster-runやCaffeのObjectDetectionと比較すると、認識率ではかなりの開き(背景によって認識率が下がる)があります。次はこれらとZEDの組み合わせでしょうか?どうすればいいんでしょう。誰か教えて。