ラズパイカメラの映像をObject Detection(物体検出)する
Contents
カメラの映像のObject Detection(物体検出)
前回の記事では画像ファイルからのObject Detection(物体検出)を行った。
今回はラズパイカメラの映像をリアルタイムでObject Detectionした時の備忘録。
基本的な考え方は前回の画像ファイル(静止画)からのObject Detectionと同様だがカメラからの映像(ストリーム)を随時画像に変換して物体を検出している所が若干異なっている。
また以前の記事で「ラズパイのカメラに写った映像をリアルタイムでTensorFlow Liteで推測する」を書いたが、前回は映像から1つの物体の名称を推測してラベルを画面上部に表示するプログラム。
今回は複数の物体を同時に検知してバウンディングボックス(四角い枠)で物体を囲んでそれぞれ名称を表示させるところが異なっている。
自動運転車のカメラが道路上の複数の物体を検知してバウンディングボックスで囲んで表示する映像を見たことがある人がいるかも知れないがそれと同様の事をしたいイメージ。
またラズパイにはCoral USB Acceleratorを接続して(必須ではない)高速なObject Detectionを試みた。
尚、モデルは事前学習済みのモデル(独自画像は学習していない)を使用している。
事前設定
ラズパイにカメラを接続する
まずはRaspberryPi 3 B+にカメラモジュールを接続して初期設定を行う。
接続方法については以下の記事を参照。
Tensor Flowに関する設定
事前にラズパイにTensorFlow関連のインストールを行う。
インストール方法は以下の過去記事を参照。
※2.は必須ではない
サンプルプログラムのダウンロード
次にサンプルプログラムのダウンロードを行う。
これも過去記事のサンプルプログラム類のダウンロードを参考にしてgit cloneコマンドでダウンロードする。
git clone https://github.com/tensorflow/examples --depth 1
以下のファイル類がダウンロードされる、今回使用するのはobject_detection以下のディレクトリ。
├─examples
│ │
│ ├─lite
│ │ │
│ │ ├──examples
│ │ │ │
│ │ │ ├──image_classification
│ │ │ │ │
│ │ │ │ └──raspberry_pi
│ │ │ │ README.md
│ │ │ │ classify_picamera.py
│ │ │ │ download.sh
│ │ │ │ requirements.txt
│ │ │ │
│ │ │ ├──object_detection
│ │ │ │ │
│ │ │ │ └──raspberry_pi
│ │ │ │ README.md
│ │ │ │ annotation.py
│ │ │ │ detect_picamera.py
│ │ │ │ download.sh
│ │ │ │ requirements.txt
モデル・ラベルのダウンロード
ディレクトリを移動する。
cd /home/pi/examples/lite/examples/object_detection/raspberry_pi
モデルとラベルをダウンロードするディレクトリを作成する。
mkdir downloads
シェルを実行して先程作成したディレクトリにモデルとラベルをダウンロードする。
bash download.sh ./downloads
downloadsディレクトリ配下に以下のファイルが作成される。
├─examples
│ │
│ ├─lite
│ │ │
│ │ ├──examples
│ │ │ │
│ │ │ ├──object_detection
│ │ │ │ │
│ │ │ │ ├──raspberry_pi
│ │ │ │ │ │
│ │ │ │ │ └downloads
│ │ │ │ │ coco_labels.txt
│ │ │ │ │ mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite
coco_labels.txt | ラベル 80種類のラベルが登録されていた |
mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite | モバイル向けトレーニング済みモデル |
プログラムの修正
Coral USB Acceleratorを使って高速でObject Detectionをしたいのでプログラムに以下の修正を加える。
TensorFlow Liteの実行をEdge TPUにデリゲート(移譲)するためのモジュールを読みこむ。
33行目に”,load_delegate”を追加する。
インタプリターを構成時にload_delegate(Edge TPUに処理を移譲)する。
具体的には123行目をコメントアウトして代わりに以下の行を加える。
interpreter = Interpreter(args.model,experimental_delegates=[load_delegate('libedgetpu.so.1.0')])
プログラムの実行
以下のコマンドでプログラムを実行する。
python3 detect_picamera.py \
--model ./downloads/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
--label ./downloads/coco_labels.txt
実行の様子。
手前にラズパイとカメラとCoral USB Accelerator、ペットボトルとデジタル時計、レゴのフィギュアを撮影した。
左のモニターにObject Detectionの結果を表示している。
ディスプレイの様子
ペットボトルは66%の予測スコアでbottleと予測されている。
デジタル時計は残念ながら検出されなかった。
また時々低いスコアでMicrowave(電子レンジ)と誤検出されていた。
これは機械学習でデジタル時計を物体検出できないという訳では無くて今回使用したモデル(mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite)では写真の様なデジタル時計を学習していないだけと思われる。
またレゴのフィギュアは共にpersonと検出された。
※左側はレゴフレンズのOlivia(オリビア)、右側はレゴ クリエイター・ファミリーハウス#31012の女性
左側のOliviaの方がよりリアルな形状のためか常に若干高めのスコアが表示されていたのは興味深い。
尚、今回のPythonのスクリプトはデフォルト(未指定)では予測スコアが40%以上のモノだけを検出している。
起動時のパラメータで–thresholdで最低予測スコアを指定することができる。
python3 detect_picamera.py \
--model ./downloads/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
--label ./downloads/coco_labels.txt \
--threshold 0.3
※予測スコアが30%以上の物体を検出する
以上で今回の記事を終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント