Edge Impulse Studio + Pi Pico + MPU6050の組み合わせは、TinyMLで動作認識をやる場合の定番(?)みたいなもんです。
MPU6050 に代えて別の3軸や6軸などのセンサーを使う場合もありますがベースは同じです。
ただ機械学習の世界はどこも同じですが、良い結果を得るには「良質なデータ」が必要です。
これが結構難しいです。センサーの当たりはずれもあるでしょうし、正しく正確な動作でデータを収集することも必要です。
で、どうすれば正解に近づくのかの指標になるのが先人の教えですね。
ここではEdge Impulse が提供しているチュートリアルでデータセットが揃っているものを使って、Motion Recognition(Inference) がどういうものなのかまず追体験してみます。
元ネタ Running Edge Impulse on Multicore MCUs
全体の構成
こういう動き(Snake)を推測します。これ以外にもUpdownやWave、何もしていない状態(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 をインストールしておきます。
1 2 3 4 5 6 7 8 9 10 11 |
sudo apt update sudo apt install git cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential -y cd ~/ mkdir pico cd pico git clone -b master https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init cd .. |
pico ディレクトリにプロジェクト用のフォルダーを作成。
1 |
mkdir ~/pico/example-multicore-inferencing-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
1 |
git clone https://github.com/edgeimpulse/example-multicore-inferencing-pico.git |
この中から以下のフォルダーとファイルを上で作成した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
コンパイル実行
1 2 3 4 5 |
cd ~/pico/example-multicore-inferencing-pico mkdir build && cd build cmake .. && cmake --build . --parallel |
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がよく使われるようです。
インストール
1 |
sudo apt install minicom -y |
シリアル モニターを開きます。
1 |
minicom -b 115200 -o -D /dev/ttyACM0 |
以下のように、センサーをクネクネ動かせば、なかなかの正確性で認識されます。
何もしなければ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 でデータ収集する場合は以下のページを参照
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
Leave a Reply