ラズパイのカメラに写った映像をリアルタイムでTensorFlow Liteで推測する
Contents
はじめに
ラズパイ(RaspberryPi 3 B+)にカメラを接続してカメラに写った物体をTensorFlow Liteで分類して物体名を画面に表示するCoral USB Acceleratorのサンプルプログラムを試した時の備忘録。
機械学習をさせるにはパワーが不足気味なラズパイの様なマシンであってもCoral USB AcceleratorをUSB接続すれば実用に耐えうる速度で動画(リアルタイムで)の画像分類が可能という事なので試してみることにした。
尚、記事の最後に動画を載せているので参考までに見て欲しい。
大まかな構成は下記の図の通り。
事前設定
Coral USB Accelerator関連
事前に
- Edge TPUランタイムのインストール
- 最大クロック周波数で動作させる為のランタイムをインストール(オプション)
- TensorFlow Liteインタープリターのインストール
を行う。
これらの設定については以前の記事の「ラズパイとCoral USB Acceleratorで機械学習による画像の分類」を参照の事。
カメラ関連
次にラズパイにカメラを接続して設定を行うのだが、以前の記事の「RaspberryPi 3 Model B+でIoT監視カメラをつくる(その1ハードウェア関連)」を参照の事。
サンプルプログラム類のダウンロード
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
/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
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(ミリ秒)
デジタル時計
89%の確率でdigital clock(デジタル時計)と判定。
時間は9.9ms(ミリ秒)
ミニキーボード
35%の確率でsafe(金庫)と判定。
時間は10.3ms(ミリ秒)
1001種類のモノしか学習していないので一番近いモノを表示したのだと思われる。
時間はいずれも10ms前後で判定しており非常に高速な判定を行っている事が分かる。
Coral USB Acceleratorを使わないで判定
同じくペットボトルをCoral USB Acceleratorを使用しないで判定した時の秒数は291.3ms。
約30倍の処理速度の違いがでている。
動画
この記事の内容を動画にしている。
実際にパーツをカメラで写して判定する様子を動画にしいてるので参考にして欲しい。
コメント失礼致します。
本日から画像認識について学習し始めました大学生です。
こちらの手順アクセラレーターというものを使わなければどのようにコードを書き換えれば良いのでしょうか?手順通りに行うと見たことないエラーでかなり手こずっています…
とにかく画像認識というものを体験してみたく参考にさせていただきました。よろしくお願いします。
haruさん こんちは
このプログラムはアクセラレーターを使用する様に変更しています。
使用しないのであれば逆に修正をしなければOK(のはず)です。
※今、手元に無いので検証はしていません
つまり21行目に、
を追加せずに、71行目もコメントアウトはせずに、
この行も追加しません。
experimental_delegates で EdgeTPU(Coral USB Accelerator)を使用する指定をしています。
ありがとうございます!
python3 classify_picamera.py \
–model /tmp/mobilenet_v1_1.0_224_quant_edgetpu.tflite \ ←edgetpuを消去するのを忘れていました!
–labels /tmp/labels_mobilenet_quant_v1_224.txt
こちらはコードを実行しても画面が表示されるわけではないのですか?
エラーは無くなったのですが画面が表示されないので画像認識できないです。
何度もすみません。
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
このようなエラーが出ます!
haruさん
PiCameraが認識していないようですね。
記事中の「カメラ関連」の章に、「ラズパイとカメラの接続」と「カメラを有効化」のリンクがありますがリンク先の手順は行いましたか?
また「カメラを有効化」の後に試し撮りのコマンドがありますが、こちらの結果はいかがでしょうか。
静止画、動画ともに撮れていますか?
modelの指定でedgetpuの所はご指摘の通りですね(失念していました)
Coral USB Acceleratorを使用しないのであれば、edgetpu 無しのmodelを使います。
プログラムが正常に起動すればカメラに写ったWindowが表示されます(動画の方を見て下さい)
ご指摘ありがとうございます!
tensorflowを入れてしまっていてtensorflow lite がうまく使えていなかったのが最終的な原因でした!
親切なご返事本当にありがとうございました!