こんな方におすすめの記事です

最新の物体検出システムを動かしてみたい!という技術職の方

この記事を読み終えるのに必要な時間

3分(手元で動かすには20分かかります。)

はじめに

こんにちは!マクニカ AIリサーチセンターの土屋です!

第一弾のテックブログ:PeleeをJetson TX2に実装する 第一弾では、最新物体検出システムPeleeを実装しましたが、今回はそれをリアルタイムで動かすところまで実装していきます。
なお、第一弾の実装がお済みでない場合、リアルタイムでの実装はできませんので、ご注意ください。

Caffeのウェブカメラ入力処理をPeleeに移植

https://github.com/Robert-JunWang/Peleeのリポジトリには、物体検出の情報をテキスト出力するだけのスクリプトしかないため、リアルタイムに物体検知状況を見ることができません。
そこで、Caffeのexamplesに入っているssd_pascal_webcam.pyをベースに、Peleeで同じようにWEBカメラ入力動画で物体検出している様子をリアルタイムに出力するスクリプトを作成し、動作させてみました。
実行すると下記のような出力になるかと思います。

 

写真は一枚目が人の物体検出で、二枚目がペットボトルの物体検出です。
ペットボトルの物体検出は難しいことで有名ですが、うまく物体検出ができていないことがわかります。

性能を検証する

十分速いように思えるのですが、ここで性能比較を行いたいと思います。

同じ要領で、WEBカメラによる他のリアルタイム物体検出システムVGGNetを比較すると、予想に反してPeleeNetはVGGNetのSSDの約半分程度のフレームレートにとどまっていることが確認できます。
しかし、これだけでPeleeNetの方が性能が劣っていると判断するのは早計です。
VGGNet・PeleeNetによる物体検出を実施しているときの Jetson TX2 のCPU/GPU使用率を見てみましょう。

まずは、VGGNetからです。

nvidia@tegra-ubuntu:~$ sudo ./tegrastats
RAM 2312/7851MB (lfb 1125x4MB) cpu [0%@2013,0%@2035,0%@2034,0%@2013,0%@2012,0%@2015] EMC 14%@1866 APE 150 GR3D 0%@1300
RAM 2323/7851MB (lfb 1125x4MB) cpu [34%@2000,6%@2035,0%@2034,7%@2015,10%@2051,9%@2043] EMC 30%@1866 APE 150 GR3D 0%@1300
RAM 2323/7851MB (lfb 1125x4MB) cpu [19%@1996,0%@2035,0%@2034,14%@1996,25%@1995,19%@1997] EMC 38%@1866 APE 150 GR3D 0%@1300
RAM 2323/7851MB (lfb 1125x4MB) cpu [19%@2036,0%@2034,0%@2036,5%@2035,29%@2034,20%@2035] EMC 40%@1866 APE 150 GR3D 9%@1300
RAM 2323/7851MB (lfb 1125x4MB) cpu [23%@2034,0%@2035,0%@2035,11%@2036,9%@2035,33%@2035] EMC 42%@1866 APE 150 GR3D 98%@1300
・・・省略・・・
RAM 2323/7851MB (lfb 1125x4MB) cpu [18%@1996,0%@2035,0%@2036,31%@1996,13%@1997,10%@1997] EMC 43%@1866 APE 150 GR3D 0%@1300
RAM 2323/7851MB (lfb 1125x4MB) cpu [22%@2035,0%@2035,0%@2035,27%@2035,16%@2035,8%@2034] EMC 44%@1866 APE 150 GR3D 0%@13000
RAM 2323/7851MB (lfb 1125x4MB) cpu [20%@2019,0%@2035,0%@2036,21%@2010,20%@2020,18%@2016] EMC 43%@1866 APE 150 GR3D 78%@1300
RAM 2324/7851MB (lfb 1125x4MB) cpu [13%@2035,0%@2035,0%@2035,22%@2034,15%@2035,20%@2035] EMC 43%@1866 APE 150 GR3D 99%@1300
RAM 2324/7851MB (lfb 1125x4MB) cpu [10%@2034,0%@2034,0%@2036,20%@2036,21%@2033,20%@2034] EMC 44%@1866 APE 150 GR3D 99%@1300
RAM 2324/7851MB (lfb 1125x4MB) cpu [31%@1996,0%@2034,0%@2035,28%@1996,3%@1996,13%@1996] EMC 44%@1866 APE 150 GR3D 99%@1300

次に、PeleeNetです。

nvidia@tegra-ubuntu:~$ sudo ./tegrastats
[sudo] password for nvidia:
RAM 2218/7851MB (lfb 1137x4MB) cpu [0%@2021,0%@2036,0%@2035,0%@2015,0%@2014,0%@2009] EMC 15%@1866 APE 150 GR3D 98%@1300
RAM 2218/7851MB (lfb 1137x4MB) cpu [2%@2035,0%@2034,97%@2035,10%@2034,13%@2035,11%@2035] EMC 16%@1866 APE 150 GR3D 0%@1300
RAM 2218/7851MB (lfb 1137x4MB) cpu [6%@2035,0%@2035,96%@2036,1%@2035,26%@2035,8%@2035] EMC 16%@1866 APE 150 GR3D 92%@1300
RAM 2218/7851MB (lfb 1137x4MB) cpu [3%@2034,0%@2035,98%@2036,1%@2035,21%@2035,10%@2035] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2218/7851MB (lfb 1137x4MB) cpu [5%@1997,0%@2035,98%@2035,8%@1996,10%@1996,22%@1997] EMC 16%@1866 APE 150 GR3D 61%@1300
RAM 2218/7851MB (lfb 1137x4MB) cpu [2%@1998,0%@2035,98%@2033,10%@2007,14%@2012,11%@2012] EMC 16%@1866 APE 150 GR3D 0%@1300
・・・省略・・・
RAM 2219/7851MB (lfb 1137x4MB) cpu [6%@2001,97%@2035,0%@2036,8%@2007,5%@2009,19%@2010] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2219/7851MB (lfb 1137x4MB) cpu [5%@1997,97%@2035,0%@2034,14%@2010,6%@2008,13%@2010] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2220/7851MB (lfb 1137x4MB) cpu [7%@2012,97%@2035,0%@2035,12%@2012,10%@2016,10%@2027] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2219/7851MB (lfb 1137x4MB) cpu [3%@2018,97%@2035,0%@2035,17%@2010,14%@2008,12%@2015] EMC 15%@1866 APE 150 GR3D 97%@1300
RAM 2219/7851MB (lfb 1137x4MB) cpu [7%@2001,97%@2034,0%@2034,5%@2012,13%@2012,12%@2014] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2219/7851MB (lfb 1137x4MB) cpu [6%@2000,98%@2035,0%@2035,8%@2014,2%@2012,21%@2017] EMC 15%@1866 APE 150 GR3D 0%@1300
RAM 2219/7851MB (lfb 1137x4MB) cpu [6%@1998,98%@2034,0%@2034,9%@2011,1%@2012,21%@2011] EMC 15%@1866 APE 150 GR3D 0%@1300

Webカメラを使用してリアルタイム推論をしている際の使用率を見ると、VGGNetとPeleeNetのGPU使用率が大きく異なっていることが確認できます。

考察

VGGNetではGPUがほぼ100%使い切れているのに対し、PeleeNetは特定CPUコアの使用率が100%に上がっており、
GPUコアの使用率が上がっていないタイミングが多くみられました。

このことからPeleeNetには、CPUを使う処理で何らかのボトルネックがあり、Jetson TX2 の性能を引き出せていないということがわかりました。
よって、残念ですが、Peleeによるリアルタイム推論を高速で行うためには、単純にリポジトリにある物を動かすだけでなく、このボトルネックの解消が必要であるということがわかりました。
本当はボトルネックを探索したいところなのですが、これ以上の深追いは、泥沼の匂いがするのでやめておき、論文の著者が追記をしてくれるのを待つのが良いでしょう。

まとめ

第一弾に続き、Peleeの実装を行いました。第一弾では非常に高速な推論が行えていることが確認できたのですが、リアルタイムで推論を実装する際にはボトルネックがあることが発見できました。

「論文の実装をする系は、コードが例えあったとしても環境が違うだけでも急に至難の技になるので、注意が必要」
というのを最後の助言として、Pelee実装の記事を締めたいと思います。お付き合いいただき、ありがとうございました。

なお、少し真面目な免責事項についてですが、上記の内容を利用するにあたって、弊社マクニカは一切の責任を負いませんのでご注意ください。