2019インターン紹介: Edge TPU向けPoseNetのリアルタイム姿勢推定

R&D チームの量子化警察こと徳田(@dakuton)です。 7月のEdge TPUアップデートにあわせて、7/30にPoseNetのEdge TPU版が公開されていた(作者Twitter動画はこちら)ため、今夏初のインターンとしてチャレンジしてもらいました。

Edge TPUアップデート内容については過去記事を参照ください。

tech-blog.optim.co.jp

PoseNetとは?

TensorFlow.js(TensorFlowのJavaScript版)で動作する姿勢推定モデルです。Webブラウザで人の姿勢がリアルタイムに検出できる(15FPS以上)のが特徴です。

参考記事: Real-time Human Pose Estimation in the Browser with TensorFlow.js | by TensorFlow | TensorFlow | Medium

検証結果

モデルは解像度480x360, 640x480, 1280x720の3種類あって、今回は640x480について調べています。
Edge TPUをはじめとした小型で安価なデバイス向けの推論モデルは、GPUと比較したときに環境上の制約を受けやすくなります。よって下記に示すような情報をおさえておくことは、実利用に持ち込むうえでとても重要と考えています。(参考: 世界一、AIを実用化する企業について)

実行スクリーンショット

f:id:optim-tech:20190802192654p:plain

利点

  1. とにかく速い
    • USB3.0接続だと推論速度100FPS程度(10ms)で、使用したUSBカメラ(30FPS)がボトルネックになる程度には高速です。
    • USB2.0接続だと速度は落ちますが、25FPS程度は出ています。
      • Raspberry Pi 4以前のデバイス(USB3.0非対応)でもリアルタイム処理は可能かもしれません(※要検証)
  2. TensorFlow.js版よりもリソース調整しやすい
    • 複数モデルを使いたい場合(同時推論)や複数Edge TPUを使いたい場合(分散推論)もtwo_models_inference(サンプルコード)にあるようにEngineを指定することで可能です。
      1. 分類: ClassificationEngine.ClassifyWithInputTensorを使う
      2. 物体検出: DetectionEngine.DetectWithInputTensorを使う
      3. それ以外: BasicEngine.RunInferenceを利用したカスタム推論を使う
    • 複数モデル実行時は、別途Co-compiling multiple modelslinkによるメモリ利用効率化をはかることで高速化できる場合があります。

欠点

  1. 回転に弱い
    • まっすぐ立っている状態からおよそ25度傾いたあたりから検出点の減少がみられはじめ、40度以上だとまったく検出しなくなります。
  2. 多人数検出は非対応
    • 検出人数は3名程度、カメラの歪みを補正すると10名程度
    • 左上から優先検出されます。
  3. 顔(頭部)を隠すと見落とす
  4. 人物ではない真っ直ぐな黒いものを人物として誤検出する
    • 誰も座っていない椅子などに反応することがあります。

あとがき

当初、2週間で実施予定のつもりでいたインターン内容が半分以下の時間で終わってしまいました。Edge TPUと同様に爆速です。

  • 1週目で対応したこと
    • 動画・画像ファイルを使えるようにした(OpenCV利用)
    • TensorFlow.jsのように、ブラウザ経由でのカメラアクセスに対応した
    • 物体検出と姿勢推定の同時実行に対応した
    • 複数Edge TPUの同時利用に対応した
  • 2週目で対応したこと
    • Coming Soon

インターン受け入れは今週始まったばかりで、2週目どうなるか?や今後来る学生たちとどういったことができるか?今後も楽しみです。

夏季インターンについては若干名募集していますので、もし興味がありましたらご応募ください。(R&Dコースは応募者多数につき2次にて締め切らせていただきました)

www.optim.co.jp

インターン以外でも募集中です。

www.optim.co.jp