airpocket が 2022年09月08日22時50分54秒 に編集
初版
タイトルの変更
SPRESENSEで振動データのクラス分類してみる
タグの変更
spresense
AI
MPU6886
NeuralNetworkConsol
メイン画像の変更
記事種類の変更
セットアップや使用方法
ライセンスの変更
(MIT) The MIT License
本文の変更
# はじめに 少し前にSpresenseで高速振動サンプリングというお題で、[振動データをサンプリングするプロジェクトを公開しました。](https://elchika.com/article/cce6f1b8-eb70-450f-8b03-468ce1d99ffe/)このプロジェクトで取得した振動データを使った機械学習モデルでクラス分類することが(かろうじて)できましたのでご紹介します。 @[youtube] (https://www.youtube.com/watch?v=l0QN_GlSRC8) ただし、振動データの採取はなかなか難しく、限定した条件でしかうまく分類できません。データの採取方法や加工方法、AIモデルの改良など、実用的な利用にはまだまだ研究が必要です。 # 使用するモジュールと接続方法 ここにあげるモジュールに加えてUSBケーブル、Grove端子、Qiコネクタなどが必要です。 ## Spresense メインボード https://www.switch-science.com/catalog/3900/ ## Spresense 拡張ボード https://www.switch-science.com/catalog/3901/ ## Mic&LCD KIT for SPRESENSE https://www.switch-science.com/catalog/7155/ ## M5Stack用6軸IMUユニット https://www.switch-science.com/catalog/6623/ ## 接続 Spresenseのメインボード、拡張ボード、Mic & LCD KITは、それぞれのマニュアルに従って組み立ててください。 M5Stack用6軸IMUユニットは、付属のGroveコネクタ付きケーブルでSpresense拡張ボードに接続します。拡張ボードににはGrove端子がついていないため、Groveケーブルの片側を切断し、QIコネクタのオスピンを付けて拡張ボードのピンソケットに挿します。 接続先は次の通りです。 | Spresense | IMUユニット | |:---:|:---:| | 3V3 | VIN | |GND|GND| |D15|SDA| |D14|SDA| # データ採取 [データ採取用のプログラムはこちらにあります](https://github.com/airpocket-soundman/MPU6886_spresense/tree/main/src/collect_vibration_data_02)。すべてダウンロードして、SPRESENSEに書き込んでください。 ## データ採取プログラムの使い方 Spresenseを立ち上げると、データ採取用のプログラムが実行されます。 加速度センサに閾値以上の加速度がかかるとデータをRAM上に記録します。 加速度データは約3000Hzのサンプリング周期で320個採取されます。データには、保存開始前(加速度が閾値を超える前)のデータ50個を含みます。 加速データの記録が終了すると振動波形を描画し、RAM上のデータをフラッシュメモリに保存します。 保存するデータはCSV形式になっており、4桁の数値のついたファイル名になります。頭の一桁がClass番号、残る三桁が通し番号です。Class番号はボタン4で繰り上がり、0~9までの値をつけられます。 このプロジェクトでは、3クラスのデータを各200個採取して学習に用いました。 ## 振動データ採取のコツ 今回のプロジェクトでは、回転機の振動の様に定常的に発生する振動ではなく、衝撃振動の様な単発の振動を対象にしています。FFTをつかった詳細の振動解析はしておらず、加速度変化の生データをそのまま利用しています。 紹介した動画では、デスクの上に置いた工作マット上に加速度センサを貼りつけています。握りこぶしで叩く、指で叩く、ドライバーで叩くという3つの方法を用いて異なる特徴を持った振動を発生させています。 工作マットは固定せず、デスクの上に置いているだなので、比較的自由に振動できます。 この様な環境で工作マットを叩くと、握りこぶしの場合はデスクごと揺れる「ドシン」、指の場合は工作マットだけが鈍く揺れる「トン」、ドライバーの場合は硬いものが衝突した際の「コツ」と言う振動が発生します。 この振動の特長をAIに認識させることができます。 しかしながら、デスクの天板や床板など、リジットに固定された対象を振動させる場合は状況が異なります。モノには、その硬さや形、固定された状況などにより「揺れやすい」振動があります。外からの衝撃を受けて振動する際も、「揺れやすい」振動はするものの揺れにくい振動はしてくれません。つまり、「何が」衝突したかの特長はすぐに失われてしまいます。 今回、揺れるものに工作マットを選定しデスクの上に置いているだけなのは、なるべく自由に揺れる環境を作り、「何が」衝突したかによる特徴を残すためです。 このあたりの考察についてはIoTLTでも紹介しましたので興味のある方はご覧ください。 @[youtube](https://www.youtube.com/watch?v=Imh4O1Kod1M&t=4719s) # SDカードへの保存 フラッシュメモリに保存したメモリはSDカードに書き出すことで取り出せます。 SDカードへの書き出し用プログラムは[SPRESENSEではじめるローパワーエッジ](AIhttps://www.oreilly.co.jp/books/9784873119670/)に掲載されている[このプログラム](https://github.com/TE-YoshinoriOota/Spresense-LowPower-EdgeAI/blob/main/Chap11/sketches/Spresense_flash_to_sd/Spresense_flash_to_sd.ino)を利用させていただきました。 このプログラムをSpresenseに書き込んで、SDカードにデータを書き出してください。 # データの学習 SpresenseでAIを利用するにはNeural Network Consolが最適ですね。 詳しく学びたいかたは、Youtubeのチュートリアルや[SPRESENSEではじめるローパワーエッジ](AIhttps://www.oreilly.co.jp/books/9784873119670/)が便利です。 ここでは、無料で利用できるDesktop版を使って機械学習します。 ## 学習用データの準備 学習用データは3クラス、各200個採取しました3つのクラスはfist,screwdriver,finger と名付けました。 採取したデータはそれぞれ、0000.csv ~ 0199.csv、1200.csv ~ 1399.csv、2400.csv ~ 2599.csvです。 各クラスの200個のデータの内、前半の140個をトレーニング用、後半の60個をバリデーション用(AIモデルの評価用)に用います。 ここでは、任意の作業用フォルダをの中に「data」と言うフォルダを作成してすべてのデータファイルを保存しました。 続いて、トレーニング用データを指定するためのtrain.csvと、バリデーション用データを指定するvalid.csvを作成します。 train.csvには次の様にデータを入力します。 ![train.csv](https://camo.elchika.com/aeb0a39e7b4b0e2ed4e0097cbd4357683f4eca5a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f65303962393366332d343439652d343366622d383735322d343265613534396361393531/) データの1行目には、データラベルとして「x:data」「y:label」と記載します。data,labelの部分は任意に変更可能です。 2行目以降には、トレーニング用データの保存場所とクラスのラベルを記載します。 データの保存場所は絶対アドレスもしくは相対アドレスで指定できます。ここでは、train.csvを保存したフォルダからの相対アドレスを記載しています。 valid.csvも同様に準備します。 ## Neural Network Consoleの設定 Neural Network Consoleは、SONYが開発したGUIで操作できるAIフレームワークです。goolge colaboratoryをつかったtensor flowの学習などもとても便利なのですが、AIモデルの外観をより早く理解するためにはGUIは大きな助けになる気がします。 また、Youtubeには日本語の詳しい解説動画が多数アップされているのも初学者にはありがたいところです。 基本的な使い方は公式動画に譲り、ここでは今回の設定方法のみ追います。 ## 新しいプロジェクト Neural Network Consoleが立ち上がったら、新しいプロジェクトを作成します。 ![キャプションを入力できます](https://camo.elchika.com/13e831ea7aa1301d51df533ba58dc8aa9a58f039/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f62373931653832632d313665612d343866342d383432352d353132643836626365366561/) ## 初期モデルを作成 機械学習のニューラルネットワークは種々の演算を繰り返し、パラメータを調整することで機能を発現します。 Neural Network Consorl では、画面左に各種の演算がコンポーネントとしてまとめられており、ドラッグ&ドロップするだけで、新たなモデルを作成できます。 まずは次の画像のようなモデルを組み立ててます。 ![キャプションを入力できます](https://camo.elchika.com/6cb13f826b5c8f989b9745f385bfc6ff0fd71d5e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f30613132356230362d616165362d343031622d393932662d383239353734363039643366/) ## コンポーネントのパラメータを変更する。 各種の演算は、入出力するデータ数やデータタイプに合わせてパラメータを調整します。 各コンポーネントの値を次の通り変更します。 ![キャプションを入力できます](https://camo.elchika.com/31bb84fcacc9ba3b7b5dadb4e48444fe216c9bdc/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f38393563363233382d626535362d343963372d626539642d633266623730373733386366/) ![キャプションを入力できます](https://camo.elchika.com/871c3f58ecba31cb5b4bdd7e2f6f5bccce9de5a2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f33373365323939332d353365372d346162652d393938352d626262656633643936396639/) ![キャプションを入力できます](https://camo.elchika.com/b971e6c8db9bc77a7cb2765381d43e85de826186/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f31356265353563392d366635362d343038302d623233612d626436666366323162373733/) ![キャプションを入力できます](https://camo.elchika.com/19278a188137ab2e23738521268e3d3101817a6f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f39646538666231392d373135652d343265382d626638362d636637323666316163306131/) ![キャプションを入力できます](https://camo.elchika.com/7e90a2b2d4dc5e6e5c6af9194f68658784c9cc43/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f62303636666665312d643838332d346461352d623063362d326231643032643661653464/) ![キャプションを入力できます](https://camo.elchika.com/2f5b0d5a29f69f36ee35c31493240aee584c04b9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f64343333383638382d303931332d343534302d623763632d326137643264396332313336/) ![キャプションを入力できます](https://camo.elchika.com/ddfc30ae8063c98fe10582b6c8c3dc28359b9de2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f38303764666535352d386462342d343064382d613836632d333433326133616565663932/) ![キャプションを入力できます](https://camo.elchika.com/3624c5f2e414e5cbd9fff7ead9aae6dab530bbc1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f37613439353839362d326138612d346438662d393232392d663561343566343531306266/) ## データセットの指定 学習に使用するデータを指定します。下画像の①~⑤の順に選択し、先ほど作成したtrain.csvを選択します。 ![キャプションを入力できます](https://camo.elchika.com/22270202ead34fac5a5c2f25bc7a13ce0b1acc86/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f31616437323936612d636335322d343136382d396364662d643233343061363439396135/) valid.csvは、②の部分をValidationに変更して指定します。 ## コンフィグの設定 今回、適当なモデルで学習を開始しますが、おそらくあまりよい精度は得られません。Neural Network Consolにはモデル自体を自動的に改良してくれる機能が付いています。 コンフィグを開き、構造自動探索を有効にしてください。 ![キャプションを入力できます](https://camo.elchika.com/ecb30eec070c54c1f2d98c80a6562b3bb0e1491a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f32646362633931622d396366302d343935642d626430332d303639353336653163656364/) ## 学習 ここまでの設定ができたら、編集画面に戻って実行ボタンを押すと学習が開始されます。 ![キャプションを入力できます](https://camo.elchika.com/ba8c437fe9b7bc8e3fdcfa113fccd766b0c492bf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f32386666653637662d306430372d343864302d386631632d386634383933383364656437/) 学習が始まると、学習曲線が表示されます。右へ行くほどERRORが小さくなれば学習が進んでいる証拠です。 ちなみに添付画像はあまりよろしくないケースです。使おうと思っていたデータセットを間違えて消してしまったようで、あまりよくないデータをもとに学習を進めているのが原因です。 データを取り直す余裕がないので、このまま説明を進めます。時間ができたら取り直して記事も修正するかもしれません。 画面ひだりには様々な条件での学習結果が表示されています。これは、構造自動探索を有効にしているためです。 満足のいく精度の学習済みモデルができたら停止しましょう。 モデルの性能を比較したい際は、学習曲線表示をトレードオフグラフ表示に切り替えるとよいでしょう。 ![キャプションを入力できます](https://camo.elchika.com/0d3eb254ec80ddd0bc9320afbbc16f456f7a50f1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f63303336623337382d656463622d343630312d393831632d383832646561643262366232/) モデルの性能を比較したい際は、学習曲線表示をトレードオフグラフ表示に切り替えるとよいでしょう。 ![キャプションを入力できます](https://camo.elchika.com/4a1e5532ee5675262dc50f9df9b1d481e459a0d2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f32333632633230322d353439382d343536612d386665612d363434653730326632616339/) ## 学習済みモデルの保存場所 良い学習結果が得られたら、左側の学習結果リストから任意の条件をダブルクリックすると結果の保存場所が開きます。 results.nnpが学習結果ファイルです。 このファイルをマイクロSDに書き込んでSpresenseに挿すと学習結果を利用できます。 # 学習結果を利用して推論する。 加速度センサで振動を検知して推論するプログラムは[こちらにあります](https://github.com/airpocket-soundman/MPU6886_spresense/tree/main/src/inference_from_vibration_001)。Spresenseに書き込んで実行してください。 学習済みデータをmicroSDに入れて、Spresenseに挿すのも忘れない様にしてください。 実行結果は先ほどのIoTLTで報告した通りです。 @[youtube](https://www.youtube.com/watch?v=Imh4O1Kod1M&t=4719s) # まとめ 単発の衝撃振動を読み取ってクラス分類するプロジェクトですが、~~雑な~~シンプルな実装では限界がありましたが、一定の結果を得ることはできました。 IoTLTでも言っている様に、人の足音の振動からは人物特定をするには至っていません。理由としては次の様なものを想定しています。 ①振動サンプリングの分解が足りない。 ②サンプル数が少ない ③振動というより音の領域の方が良い(①に通ずる) また、足音による人の特定の次に、振動モーターで与えた振動をセンシングしてゆで卵かなま卵かを識別する。と言うプロジェクトにもトライしましたが、これもまだうまくいっていません。対象の特長をうまく引き出す振動の与え方が必要なのだと思います。できればこのあたりのネタでコンテストのエントリーしたかったのですが、このままでは難しそうです。[別ネタでエントリーしました](https://elchika.com/article/7055b4e0-b2ba-43f2-9994-85aa40dd16c7/)ので許してつかーさい。 振動データのAI利用は素人の思い付きだけでは難しい問題が多くありそうだと理解できました。もうすこし真面目に勉強してから再トライしいと思います。