Loading [MathJax]/extensions/Safe.js
MENU

Edge Impulse Studio + Pi Pico + MPU6050 でTinyMLのモーション推論をやってみるーチュートリアル編


Edge Impulse Studio + Pi Pico + MPU6050の組み合わせは、TinyMLで動作認識をやる場合の定番(?)みたいなもんです。

MPU6050 に代えて別の3軸や6軸などのセンサーを使う場合もありますがベースは同じです。

ただ機械学習の世界はどこも同じですが、良い結果を得るには「良質なデータ」が必要です。

これが結構難しいです。センサーの当たりはずれもあるでしょうし、正しく正確な動作でデータを収集することも必要です。

で、どうすれば正解に近づくのかの指標になるのが先人の教えですね。

ここではEdge Impulse が提供しているチュートリアルでデータセットが揃っているものを使って、Motion Recognition(Inference) がどういうものなのかまず追体験してみます。

元ネタ Running Edge Impulse on Multicore MCUs

 

全体の構成

 

 

 

 

 

 

 

 

Raspberry Pi 4 Model B

Raspberry Pi Pico

MPU 6050

Edge Impulse Studio

 

こういう動き(Snake)を推測します。これ以外にもUpdownWave、何もしていない状態(Idle)など。


まずは、Edge Impulse にアカウントを作っておきます(Sign up)。

アカウント作成後Log In

このアカウントにプロジェクトをクローンします。

 

 

 

 

 

 

 

 

 


Tutorial では左のメニュからプロジェクトの全体像を見ることができます。

 

 

 

 

 

 

 

 

 

 

 

 

AのData acquisition ではどういうデータを収集したのかが分かります。

Tutorial を見ると10秒ほどの短い動作のデータをずいぶんたくさんサンプリングしているのが分かります。アンバランスなほどWave のデータが多いです、なんで?

BのCreate impulse ではモデル作成のパイプラインが分かります。

なんでAnomaly detection が追加されているのか分かりません。

CのSpectral features ではデータをスペクトル変換して特徴抽出します。

FFTを使った前処理をしているそうです。

DのNN Classifier では分類を実行。

EのAnomaly detection では異常検出をするそうですが、よくわかりません。

Fではリアルタイムでデータ収集しながらモデルのテストを実行。

Gでデプロイ用のC++Library を作成し、アーカイブしてローカルにダウンロードします。

 


途中経過はすべて飛ばして、GのDeployment を実行してみます。

オプションはデフォルトのままで、即ビルドします。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

終了するとアーカイブファイルがダウンロードされます。

中身はこんな感じです。

 

 

 

 

 

 

 


Pico にデプロイするためにファームウェアを作成

作業環境は母艦であるラズパイ4に移ります。

OSイメージはRaspberry Pi OS (64-bit) Desktop です。

ファームウェアを作成するためにPico のSDK をインストールしておきます。

pico ディレクトリにプロジェクト用のフォルダーを作成。

このフォルダーに必要ないろいろをコピーしていきます。

結果的にこんな構造になります(LICENSEやREADME.mdなどは端折っています)。

~/pico/
├── example-multicore-inferencing-pico/
│ ├─ edge-impulse-sdk/
│ ├─ model-parameters/
│ ├─ tflite-model/
│ ├─ source/
│ ├─ build/
│ ├─ CMakeLists.txt
│ └─ pico_sdk_import.cmake

├── pico-sdk/
│ ├── cmake

 


Multicore Pico Example repository をダウンロードするかクローンしておきます。

 

 

 

 

 

 

 

 

 

 

or

この中から以下のフォルダーとファイルを上で作成したexample-multicore-inferencing-picoフォルダーにコピーしておきます。

sourceフォルダー
CMakeLists.txt
pico_sdk_import.cmake

 

デフォルトのままだとコンパイル実行した場合リンクエラーになります。

以下を修正

source/ei_classifier_porting.cppを開いて、以下の2つの関数をコメントアウトしておきます。

/*
uint64_t ei_read_timer_ms()
{
return to_ms_since_boot(get_absolute_time());
}

uint64_t ei_read_timer_us()
{
return to_us_since_boot(get_absolute_time());
}
*/

 


Edge Impulse Studio のDeployment でダウンロードした中から以下のフォルダのみをexample-multicore-inferencing-picoフォルダーにコピーしておきます。

edge-impulse-sdk
model-parameters
tflite-model

 


コンパイル実行

 

buildフォルダーにexample_multicore.uf2が生成されているのを確認。

 

 

 

 

 

 

 

 

 

 


Pico とMPU 6050 をWiring (配線)

example-multicore-inferencing-pico/source/accelerometer.cpp を参照して結線は以下のようにしておきます。

 

 

 

 

 

 

 

 

 

 

*GP4 , GP5 をSDA、SCL 用に使う場合は以下のAppendix4 を参照

 


uf2ファイルをpicoにFlashしてデプロイ実行

Pico のBOOTSEL ボタンを押したまま、micro-USB ケーブルを使用して Raspberry Pi Pico をラズパイ4に接続します。

 

 

 

 

 

 

 

 

 

 

 

 

build/example_multicore.uf2 ファイルをファイル エクスプローラーの RPI-RP2 ディスクにドラッグ アンド ・ドロップします。

ドロップ後、Pico は再起動してプログラムが実行されます。

 


確認

シリアルポートをモニターして動作を確認します。

モニターはラズパイ4にArduino IDE がインストールされていていれば、ツールのシリアルモニタが使えます。

また、一般的にはminicomがよく使われるようです。

インストール

シリアル モニターを開きます。

以下のように、センサーをクネクネ動かせば、なかなかの正確性で認識されます。

 

 

 

 

 

 

 

 

何もしなければidleが1に近い値を示しています。

 

 

 

 

 

センサーを上下に振ればupdownの値が上がります。

 

 

 

 

 

waveがどういう動きなのかよく分かっていません。

 

 

 

 

 

データを見ると、X軸の変動は大きいですがY軸・Z軸はあまり動いていない、どうもGの方向に強く関係しているっぽいですが……。

X軸、Y軸に沿って真っすぐ動かしたり、蛇行したりすればSnake

Z軸方向に動かせばUpdown

 

 

 

 

 

 

 

地面に対して上下に動かせばWave

 

 

 

 

 

 

でも、実際のところデータ収集時にどんな動かし方をしたのかはわかりません。ただ、Edge Impulse Studio のData Acquisition を見るとWave のデータは他より圧倒的に多いので、差別化の難しかった動きのようです。

どうもここにあるのがそれっぽいですね。

Snake

Updown

Wave

Waveはセンサーを地面に対して平行にして、こういう動きをしてるようですね。

 

 

 

 

 

 

 

SnakeもUpdownもセンサーは地面に対して平行のようです。

 

 

 

動作確認に納得すれば、Tutorial で途中を飛ばさずに、一個一個を丁寧に学習しましょう。

以上

 


Appendix1

MPU 6050 でデータ収集する場合は以下のページを参照

マイコンボードで6軸センサーのMPU-6050を使ってみる

 


Appendix2

Edge Impulse Studio でデータセットを作る場合は以下のページの中段のPreparing the project environment(プロジェクト環境の準備)以降を参照

Pi Pico でエッジAI を試してみる(4-1/3)TinyML – Raspberry Pi Pico を使ったモーション分類(抜粋)- データ収集編

:ここでの眼目のedge-impulse-data-forwarderはシリアルポートから出てるデータを採取しているだけなので、センサーは何でもかまいません。

 


Appendix3

Edge Impulse Studio でモデルを作る場合は以下のページを参照

Pi Pico でエッジAI を試してみる(4-2/3)TinyML – Raspberry Pi Pico を使ったモーション分類(抜粋)- モデル作成編

 


Appendix4

参考までに、MPU6050 のデプロイ用のコードは上記sourceフォルダー内のmain.cppを参照。

:Appendix1 とは結線のGPIOピン番号が異なっているので御注意を!

Appendix1 と同様にGP4 , GP5 を使う場合はsource/accelerometer.cppを以下のように変更

#define I2C_INTERFACE i2c0

#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 5

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*