ラズパイとAI(AutoML)で映像からオブジェクトを検出してレゴEV3のモーターを制御する
レゴEV3とラズパイカメラで画像認識
教育用レゴマインドストームEV3とラズパイ(Raspberry Pi 3 B+)とラズパイカメラを使ってカメラに写ったレゴのフィギュアを見分けてEV3のモーターを制御して動作を変えるプログラムを作った時の備忘録。
レゴのフィギュアの見分け方は以前の記事を参照して欲しいのだが、GoogleのCloud AutoML(Machine Learning)のオブジェクト検出を使っている。
複数のレゴのフィギュアの画像を読み込ませて学習させて、
- Woman(レゴクリエイターの女性)
- Olivia(レゴフレンズ サマーキャンピングからオリビア)
- Rapunzel(ディズニープリンセスからラプンツェル)
- Stephanie(レゴフレンズからステファニー)
の4種類のフィギュアを検出できるようにしている。
動作
想定している動作は以下の通り。
- EV3のタッチセンサーを押す
- ラズパイカメラに写っているフィギュアを機械学習で判別する
- 識別したフィギュア名をEV3のインテリジェントブロックのモニターに表示する
- もう一度タッチセンサーを押す
- Womanなら前進、Oliveなら後退、rapunzelなら左旋回、Stephanieなら右旋回する
構成
使用している主な機器の構成は以下の通り。
- レゴマインドストームEV3で作成した本体にはラズパイ、ラズパイ用カメラ、ラズパイ用のバッテリー、機械学習用のCoral USB、ラズパイとEV3のインテリジェントブロックを接続するCosoleアダプタを搭載している
- Coral USBは必須では無いが機械学習(カメラに写った画像の分類)を高速に行う為に使用している
- ラズパイには機械学習のフレームワークとしてTensorFlow Lite、4種類のフィギュアをAutoMLで学習した学習済みモデルが搭載されている
- ラズパイ上のPythonのプログラムはパソコンのブラウザのJupyterLabで編集する
必要な機器
教育用レゴマインドストームEV3
本体は教育用レゴマインドストームEV3の基本セットで作成している。
レゴマインドストームには様々なバージョンがあるので詳しくは以前の記事を参照して欲しい。
自分は日本の正規代理店で基本セット、拡張セットを購入したが並行輸入品で手に入れる事も可能だ。
ラズパイ
EV3制御用のラズパイ。
カメラを接続してGoogleの機械学習のフレームワークのTensorFlow LiteをインストールしてPyhtonのプログラムを動作させている。
バッテリー
Ankerのバッテリー。
ラズパイを動作させるのに使用している。
カメラ
ラズパイに接続するカメラ。
このカメラで撮影したフィギュアを検出する。
Consoleアダプター
ラズパイ(Linuxマシン)とレゴEV3との接続用のアダプタ。
ラズパイ側はUSB接続、EV3側はポート1に接続している。
ロボット ショップ テクノロジアで購入した。
Coral USB Accelerator
機械学習をEdgeで高速に実行するためのGoogleのアクセラレータ。
LinuxマシンにUSB接続して使用する。
機械学習自体はラズパイ単体でも動作は遅いが実行する事ができるので必須の機器ではない。
環境の構築
学習済みモデルを用意する
4種類のレゴフィギュアを学習した学習済みモデルを構築する。
モデルはGoogleのCloud AutoML Visionを使って自分で用意したフィギュアの写真を学習させた。
その時の詳細は以前の記事を参照して欲しい。
- lego_figure_OD_dict.txt:ラベルファイル
- lego_figure_OD_model.tflite:学習済みモデル
- lego_figure_OD_tflite_metadata.json
のモデル(ファイル)を作成した。
本体の組み立て
本体は以前の「レゴEV3のディープラーニングによるライントレース」の記事で使用した本体をそのまま流用している。
上記の記事の内容をざっと説明すると、
- レゴ・マインドストームEV3とラズパイでディープラーニングによるライントレースができる
- Preferred Networks、株式会社アフレル、山梨大学が共同で開発
- 機械学習のフレームワークはChainer(今回はTensorFlowを使用した)
の内容になっている。
こちらのページから「学習する」をクリックしてIDとパスワードを登録すると(無料)教材がダウンロード可能になる。
その教材(PDF)の「付録 EV3組立図」の通りに組み立てれば良いのだが、
- 駆動はLモーターの2輪車(後輪は金属ボール)
- タッチセンサー
- ラズパイとバッテリーを積めるスペース
- 前方にカメラ
が満たされていればどのような形でも大丈夫である。
環境構築
環境も「レゴEV3のディープラーニングによるライントレース」の記事で使用した環境をそのまま流用した。
先程の教材(PDF)の「環境構築ガイド」の、
- Raspberry Pi に LinuxOS をインストール
- Raspberry Pi と PC の ssh 設定
- Raspberry Pi の環境構築
- Raspberry Pi Camera 導入と設定
- EV3 の実行環境構築(toppers 環境の EV3RT)
- JupyterLab 起動確認
- Appendix
を参考に構築した。
テキストの内容は転載禁止なのでこちらには載せないので自分でダウンロードして確認してみてほしい。
PythonでのEV3の制御
尚、上記の手順を行うとPythonでのEV3制御用のモジュールがインストールされてタッチセンサーの制御や簡単なステアリング操作、インテリジェントブロックのディスプレイへの文字の表示などがPythonで可能になる。
上記記事のリリース時は無かったのだがその後にEV3用のPython(Micro Python)がリリースされた。
こちら(Micro Python)を使用すれば、より細かいEV3の制御を行えると思うのだが今回は簡単な動作しかしないのでインストールしていない。
いずれ、より複雑なEV3の制御が必要なフィギュアの追跡(フィギュアをさ探して追跡する)とかもやりたいので試してみようと思っている。
TensorFlowのインストール
上記の手順でインストールされる機械学習のフレームワークはPFN社のChainerだが、AutoML VisionでTensorFlow Liteのモデルを用意したのでラズパイ上でTensorFlowの環境を構築する。
詳細な手順はリンク先の記事を参照して欲しいのだが、
- Edge TPUランタイムのインストール
- ラズパイとCoral USB Acceleratorを接続
- 最大クロック周波数で動作させる為のランタイムをインストール
- TensorFlow Liteインタープリターのインストール
を行った。
プログラム
ディレクトリ構成
ホーム配下のディレクトリ構成は以下の通り。
DeepChick.ipynb | プログラム本体 ソースコードは後述 |
lego_figure_OD_dict.txt
| フィギュアを学習したモデルのラベルファイル 下記を含む3つのファイルの詳細はこちらの記事を参照 |
lego_figure_OD_model.tflite | フィギュアを学習したモデル |
lego_figure_OD_tflite_metadata.json | フィギュアを学習したメタデータファイル |
プログラムソースコード
ソースコードは以下の通り。
ポイント
ソースコード中にコメントを入れているので詳しい説明は省略するがポイントだけ解説をしておく。
カメラは別スレッド
32行目からのdetect_pi_camera関数内にてPiカメラの撮影はmainの処理とは別スレッド(非同期)で行うことでステアリング操作とは別に常にカメラに写ったオブジェクトを非同期で検知するようしている。
つまりタッチセンサーを押していない時やステアリングの操作中もオブジェクトの検出を同時並行で実行している。
ストリームからオブジェクト検出
38行目からのcamera_thereadにてPiカメラのストリームからjpegを取り出して detect_objectsメソッドでjpeg画像に写っているオブジェクトの検出を行う。
ディスプレイへの表示とステアリング
117行目のget_objs()メソッドで検出されたオブジェクトの先頭(一番スコアが高かったオブジェクト)を取り出して、オブジェクトのClassIDによって処理の振り分けを行う。
以降の処理でレゴのインテリジェントブロックのディスプレイにオブジェクトの名称を表示してステアリング操作を行っている。
実行結果
動画
上記のプログラムの動いている様子。
一度目のタッチセンサーでフィギュアの種類を認識して、2度目のタッチセンサーでEV3のステアリングを操作している様を確認してみてほしい。
ブログの内容を動画にしている。
以上で今回の記事は終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
とても面白い記事なのでコメントしてしまいました。なんとか参考にしたいと思います
面白い記事とのコメントありがとうございます。
書いた甲斐がありました。
是非、参考にして試してみて下さい。