ラズパイのカメラに写った映像をリアルタイムでTensorFlow Liteで推測する | そう備忘録

ラズパイのカメラに写った映像をリアルタイムでTensorFlow Liteで推測する

はじめに

ラズパイ(RaspberryPi 3 B+)にカメラを接続してカメラに写った物体をTensorFlow Liteで分類して物体名を画面に表示するCoral USB Acceleratorのサンプルプログラムを試した時の備忘録。

機械学習をさせるにはパワーが不足気味なラズパイの様なマシンであってもCoral USB AcceleratorをUSB接続すれば実用に耐えうる速度で動画(リアルタイムで)の画像分類が可能という事なので試してみることにした。

尚、記事の最後に動画を載せているので参考までに見て欲しい。

大まかな構成は下記の図の通り。

ラズパイカメラによる画像分類 概要図

事前設定

Coral USB Accelerator関連

事前に

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

を行う。

これらの設定については以前の記事の「ラズパイとCoral USB Acceleratorで機械学習による画像の分類」を参照の事。

カメラ関連

次にラズパイにカメラを接続して設定を行うのだが、以前の記事の「RaspberryPi 3 Model B+でIoT監視カメラをつくる(その1ハードウェア関連)」を参照の事。

  1. ラズパイとカメラの接続
  2. カメラを有効化

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

git cloneコマンドでサンプルプログラム類をダウンロードする。

git clone https://github.com/tensorflow/examples --depth 1

examplesディレクトリが作成されて配下にプログラム類がダウンロードされる。

ディレクトリを移動する。

cd examples/lite/examples/image_classification/raspberry_pi

以下のファイル類が作成されている。

├─examples
│  │      
│  ├─lite
│  │  │      
│  │  ├──examples
│  │  │  │
│  │  │  ├──image_classification
│  │  │  │  │
│  │  │  │  └──raspberry_pi
│  │  │  │     README.md
│  │  │  │     classify_picamera.py
│  │  │  │     download.sh
│  │  │  │     requirements.txt
│  │  │  │

README.md

readme(説明書)

classify_picamera.py

ラズパイ・カメラからの映像を機械学習を使って分類するプログラム

download.sh

学習済みのモデルをダウンロードする為のシェルスクリプト

requirements.txt

Pythonのパッケージの設定ファイル

シェルスクリプトで機械学習の為のモデルとラベルをダウンロードする。

尚、/tmp配下にダウンロードされるのでラズパイを再起動するとファイル類は削除される。

bash download.sh /tmp
実行結果

download.sh実行結果

/tmp配下に下記のファイルがダウンロードされる。

├─tmp
│  labels_mobilenet_quant_v1_224.txt
│  mobilenet_v1_1.0_224_quant.tflite
│  mobilenet_v1_1.0_224_quant_edgetpu.tflite
│

labels_mobilenet_quant_v1_224.txt

モデルのラベル名(分類名)が書かれたファイル

1001種類のモノの名前が羅列されていた

mobilenet_v1_1.0_224_quant.tflite

学習済みのモデル

mobilenet_v1_1.0_224_quant_edgetpu.tflite

Edgeデバイス向けの学習済のモデル

サンプルの実行

プログラムの修正

プログラムを実行する前にCoral USB Acceleratorを使用して推論時間を短縮するようにプログラム修正を行う。

※処理速度に差はあるがCoral USB Acceleratorを使用しなくてもカメラ画像からの物体識別は可能。

修正は以下の2箇所

classify_picamera.pyの21行目に以下の行を追加する。

from tflite_runtime.interpreter import load_delegate

21行目に追加

71行目をコメントアウトして以下の行を追加する。

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

プログラム修正

プログラムの実行

プログラムの修正が終わったら以下のコマンドでサンプルプログラムを実行する。

python3 classify_picamera.py \
--model /tmp/mobilenet_v1_1.0_224_quant_edgetpu.tflite \
--labels /tmp/labels_mobilenet_quant_v1_224.txt

実行結果

色々なモノをラズパイ・カメラの前に置いて撮影をしながら画像分類させてみた。

ラズパイ・カメラでの撮影

ペットボトル

75%の確率でwater bottle(ウォータボトル)と判定。

時間は10ms(ミリ秒)

Water Bottleと判定

デジタル時計

89%の確率でdigital clock(デジタル時計)と判定。

時間は9.9ms(ミリ秒)

デジタル時計と判定

ミニキーボード

35%の確率でsafe(金庫)と判定。

時間は10.3ms(ミリ秒)

1001種類のモノしか学習していないので一番近いモノを表示したのだと思われる。

safe(金庫)と判定

時間はいずれも10ms前後で判定しており非常に高速な判定を行っている事が分かる。

Coral USB Acceleratorを使わないで判定

同じくペットボトルをCoral USB Acceleratorを使用しないで判定した時の秒数は291.3ms。

約30倍の処理速度の違いがでている。

Coral USB Accelerator未使用で分類

動画

この記事の内容を動画にしている。

実際にパーツをカメラで写して判定する様子を動画にしいてるので参考にして欲しい。

 

souichirou

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

おすすめ

6件のフィードバック

  1. haru より:

    コメント失礼致します。
    本日から画像認識について学習し始めました大学生です。
    こちらの手順アクセラレーターというものを使わなければどのようにコードを書き換えれば良いのでしょうか?手順通りに行うと見たことないエラーでかなり手こずっています…
    とにかく画像認識というものを体験してみたく参考にさせていただきました。よろしくお願いします。

    • souichirou より:

      haruさん こんちは

      このプログラムはアクセラレーターを使用する様に変更しています。
      使用しないのであれば逆に修正をしなければOK(のはず)です。
      ※今、手元に無いので検証はしていません

      つまり21行目に、

      from tflite_runtime.interpreter import load_delegate

      を追加せずに、71行目もコメントアウトはせずに、

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

      この行も追加しません。
      experimental_delegates で EdgeTPU(Coral USB Accelerator)を使用する指定をしています。

      • haru より:

        ありがとうございます!
        python3 classify_picamera.py \
        –model /tmp/mobilenet_v1_1.0_224_quant_edgetpu.tflite \ ←edgetpuを消去するのを忘れていました!
        –labels /tmp/labels_mobilenet_quant_v1_224.txt

        こちらはコードを実行しても画面が表示されるわけではないのですか?
        エラーは無くなったのですが画面が表示されないので画像認識できないです。
        何度もすみません。

        • haru より:

          INFO: Initialized TensorFlow Lite runtime.
          mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
          mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0xc07f50 (ENOSPC)
          mmal: mmal_connection_enable: output port couldn’t be enabled
          Traceback (most recent call last):
          File “classify_picamera.py”, line 99, in
          main()
          File “classify_picamera.py”, line 77, in main
          with picamera.PiCamera(resolution=(640, 480), framerate=30) as camera:
          File “/usr/lib/python3/dist-packages/picamera/camera.py”, line 433, in __init__
          self._init_preview()
          File “/usr/lib/python3/dist-packages/picamera/camera.py”, line 513, in _init_preview
          self, self._camera.outputs[self.CAMERA_PREVIEW_PORT])
          File “/usr/lib/python3/dist-packages/picamera/renderers.py”, line 558, in __init__
          self.renderer.inputs[0].connect(source).enable()
          File “/usr/lib/python3/dist-packages/picamera/mmalobj.py”, line 2212, in enable
          prefix=”Failed to enable connection”)
          File “/usr/lib/python3/dist-packages/picamera/exc.py”, line 184, in mmal_check
          raise PiCameraMMALError(status, prefix)
          picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources

          このようなエラーが出ます!

          • souichirou より:

            haruさん

            PiCameraが認識していないようですね。
            記事中の「カメラ関連」の章に、「ラズパイとカメラの接続」と「カメラを有効化」のリンクがありますがリンク先の手順は行いましたか?
            また「カメラを有効化」の後に試し撮りのコマンドがありますが、こちらの結果はいかがでしょうか。
            静止画、動画ともに撮れていますか?

            modelの指定でedgetpuの所はご指摘の通りですね(失念していました)
            Coral USB Acceleratorを使用しないのであれば、edgetpu 無しのmodelを使います。
            プログラムが正常に起動すればカメラに写ったWindowが表示されます(動画の方を見て下さい)

  2. haru より:

    ご指摘ありがとうございます!
    tensorflowを入れてしまっていてtensorflow lite がうまく使えていなかったのが最終的な原因でした!
    親切なご返事本当にありがとうございました!

haru へ返信する コメントをキャンセル

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