Python
RaspberryPi
RealSense
Movidius
MobileNetSSD

Intelさんがまた褒めてくれたヽ(゚∀゚)ノ イエァ RaspberryPi3でMobileNet-SSD(MobileNetSSD)物体検出とRealSense測距(640x480) 再生フレームレート25FPS以上 + 予測レート12FPSを達成したよ

画像サイズが大きいため、Wi-Fi環境下での閲覧を推奨

◆ 前回記事

デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(1) with Ubuntu16.04

デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(2) with RaspberryPi3 (Raspbian Stretch)

RaspberryPi3 (Raspbian Stretch) + Intel Movidius Neural Compute Stick(NCS) + RealSenseD435 + MobileNet-SSD で高速に物体検出しつつ悟空やモニタまでの距離を測る

の続き

◆ はじめに

つまんない? そうですね。 しつこくてすみません。
きっと驚くと思うので、まぁそう言わずに軽く寄り道していってください。

エモい記事 を書かないと 「いいね」 は、ほとんどもらえない傾向が強いが、体力が無いので適当に書き流す。
世間は厳しい、いや、日本人は変に厳しい。。。
情け深い方は、どうか ポチッ てあげてくださいw

これなら使えるレベルじゃね? という程度に更にゴリゴリにパフォーマンスアップした。
ARM Quad Core と Pythonナメんなよ。
RealSense D435利用前提のプログラムだが、一般的なUSBカメラのロジックに変更するのは難しいことではない。
2018/07/23 USBカメラモードを追加

入力解像度を4倍にしたうえで、下記記事の2倍以上のパフォーマンスが出る。
当然ながら、プレディクションレートはスティックの限界性能以上には上がらない。
プレディクションレートを欲張るなら、TX2 や UP Board2 を素直に購入しよう。
あるいは、距離を測る必要がなければ、普通の安物USBカメラで 320x240 の低解像度でトライしよう。
YoloV2 より超速 MobileNetSSD+Neural Compute Stick(NCS)+Raspberry Piによる爆速・高精度の複数動体検知

カメラ映像の再生レート: 25FPS 〜 30FPS (カメラ本体のRealSenseは30FPSで撮像)
プレディクションレート: 8FPS 〜 12FPS
入力解像度: 640x480 (前回の4倍の解像度←ココ重要、RealSenseだとこれ以上解像度を落とせない)

25FPS 達成報告をした公式フォーラムへの投稿 【Intel Movidius Neural Network Community】
RealSense D435 + Neural Compute Stick + MobileNet-SSD + RaspberryPi3

では、まわりくどいことは置いておいて、実際にモノを見ていただこうと思う。
ARMクアッドコアをフル稼働させるとこうなる。
非同期なのでカメラを素早く動かし過ぎると枠がズレる。
今度はカメラ撮影レートが早すぎてプレディクションが追いつかず、前回よりズレが大きくなった。
速さ至上主義ではなく小綺麗に見せたいなら、前回程度のバランスが良いかもしれない。
【Youtube動画 生の再生スピード】 https://youtu.be/tAf1u9DKkh4
【GIF画像 10FPSまで劣化させてある、TV Monitorの検出と測距スピードがエグい】
ezgif.com-gif-maker (1).gif
※右上に表示されているフレームレートは15フレーム分の平均をとって表示している。

【USBカメラモード 640x480 MultiStick x4 (日本ではコレを4倍界王拳と呼ぶ、気持ち悪い、何故か犬判定が混じる)】
【Youtube動画 生の再生スピード】 https://youtu.be/GedDpAc0JyQ
ezgif.com-optimize (25).gif

Githubに公開したプログラムソースはこちら
PINTO0309/MobileNet-SSD-RealSense

◆ 環境

1.RaspberryPi3 + Raspbian Stretch (USB2.0 Port)
2.Intel RealSense D435 (640x480) or USBカメラ
3.Intel Movidius Neural Compute Stick 1本 ← 【注意】マルチスティック(MultiStick)もOKだけどレンダリングが引きずられて逆に遅くなる
4.OpenCV3.4.2
5.VFPV3
6.Numpy
7.Python3.5 + MultiProcessing
8.NCSDK v2.05.00.02
9.Intel TBB ← 今回は無効にした
10.OpenGL Driver ← 今回は無効にした
11.HDMIディスプレイ

◆ 参考にさせていただいた記事、謝辞

【くろのてさん】 [Python] multiprocessing 備忘録
http://note.crohaco.net/2017/python-multiprocessing/

【Python公式チュートリアル】
https://docs.python.jp/3/library/multiprocessing.html

◆ 作業に着手する前の前提条件

下記記事を参考に、NCSDK v2.xx や RealSenseSDK や OpenCV3.4、そのほか諸々が導入済みであること。

(1) デプスカメラRealSenseD435で "紫色のイカ" や "オレンジ色の玉ねぎ" を切り取ったり "金髪の人" を追っかけて距離を測る(2) with RaspberryPi3 (Raspbian Stretch)

(2) RaspberryPi3 (Raspbian Stretch) + Intel Movidius Neural Compute Stick NCSDK v2.00.05.02 のインストール

◆ レシピ

1.Git Clone する。

リソース一式のクローン
$ cd ~
$ git clone https://github.com/PINTO0309/MobileNet-SSD-RealSense.git

2.Neural Compute Stick 1本 と RealSense をUSBポートにぶっ刺す。

3.実行する。いじょ。

プレディクションの実行
$ sudo raspi-config
"7.Advanced Options" - "A7 GL Driver" - "G3 Legacy"

$ cd ~/MobileNet-SSD-RealSense
$ python3 MultiStickSSDwithRealSense.py

◆ まとめ

  • RaspberryPi3 Model B (プラス無し) をナメちゃダメ
  • ARM 4Core ナメちゃダメ
  • Python ナメちゃダメ
  • Python の MultiThread はゴミ "Global Interpreter Lock" (通称:GIL)
  • 消費電力を気にしないなら multiprocessing
  • OpenVINOの推論エンジンが NCSDK と同じ という情報を得たため、テンションが上がり気味
  • あらためて OpenVINO の調査を再開する見込み
  • OpenVINOについては こちら の一番下のところを参照
  • 暇な人、320x240のカメラ解像度で試してみてください ← Git Clone で試せます。RealSenseより何故か検出が速くてキモいです。
  • RaspberryPi3 Model B+ 欲しいなぁ。。。
  • TX2 欲しいなぁ。。。
  • 無言でCaffe超軽量モデルを量産してくださる、そんな神が降臨することを願って止まない
  • "ディープラーニングおじさん" ではないので、流行りモノに手を出して勝てるとも思わないし、勝とうとも思わない、安価・実用・実装に特化したコトにしか興味が沸かない悪いクセ