ラズパイカメラの映像をObject Detection(物体検出)する | そう備忘録

ラズパイカメラの映像をObject Detection(物体検出)する

カメラの映像のObject Detection(物体検出)

前回の記事では画像ファイルからのObject Detection(物体検出)を行った。

今回はラズパイカメラの映像をリアルタイムでObject Detectionした時の備忘録。

基本的な考え方は前回の画像ファイル(静止画)からのObject Detectionと同様だがカメラからの映像(ストリーム)を随時画像に変換して物体を検出している所が若干異なっている。

また以前の記事で「ラズパイのカメラに写った映像をリアルタイムでTensorFlow Liteで推測する」を書いたが、前回は映像から1つの物体の名称を推測してラベルを画面上部に表示するプログラム。

今回は複数の物体を同時に検知してバウンディングボックス(四角い枠)で物体を囲んでそれぞれ名称を表示させるところが異なっている。

自動運転車のカメラが道路上の複数の物体を検知してバウンディングボックスで囲んで表示する映像を見たことがある人がいるかも知れないがそれと同様の事をしたいイメージ。

またラズパイにはCoral USB Acceleratorを接続して(必須ではない)高速なObject Detectionを試みた。

尚、モデルは事前学習済みのモデル(独自画像は学習していない)を使用している。

ラズパイカメラの映像をリアルタイムでObject Detection

構成イメージ図

ラズパイとカメラとCoral USB Accelerator

事前設定

ラズパイにカメラを接続する

まずはRaspberryPi 3 B+にカメラモジュールを接続して初期設定を行う。

接続方法については以下の記事を参照。

  1. ラズパイとカメラの接続
  2. カメラの有効化と試し撮り

Tensor Flowに関する設定

事前にラズパイにTensorFlow関連のインストールを行う。

インストール方法は以下の過去記事を参照。

※2.は必須ではない

  1. Edge TPUランタイムのインストール
  2. 最大クロック周波数で動作させる為のランタイムをインストール(オプション)
  3. TensorFlow Liteインタープリターのインストール

サンプルプログラムのダウンロード

次にサンプルプログラムのダウンロードを行う。

これも過去記事のサンプルプログラム類のダウンロードを参考にして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を追加

インタプリターを構成時にload_delegate(Edge TPUに処理を移譲)する。

具体的には123行目をコメントアウトして代わりに以下の行を加える。

  interpreter = Interpreter(args.model,experimental_delegates=[load_delegate('libedgetpu.so.1.0')])

load_delegateへの変更

プログラムの実行

以下のコマンドでプログラムを実行する。

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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。