まずは、実際の映像から
リモコン忍者の(なんだかぎこちない)仕事っぷりをどうぞ。
system全体図
上空からの図です。
回路
Arduino nano 33 ble senseでedge impulseからのモデル(ライブラリ)を動かし、単語の判定結果をコード化してserialでArduino UNO側に送っています。Servoの制御と赤外線信号の送信はUNO側で行っています。赤外線信号の取得と送信については一つ前の記事、『リモコン忍者kikuzoのリモコン部分を作る』をご覧ください。
edge impulseからArduino libraryを得る
記事『edge impulseで機械学習』ではきくぞう、さがってよい、のキーワードと、てれび、えあこん、の合計4つでスタートしましたが、その後あれこれ構想や試行錯誤を重ねていくうちに、せんぷうきもコントロールしたいと思うようになり、さらに、ちがう、での訂正、はなて、と言われてから赤外線信号を飛ばすようにしたため、合計7つ、プラスunknownとnoiseで、総計9つのラベル分類にまで膨れ上がりました。
データの分割(80% training – 20% test)やNNの層の構築はすべてedge impulseにおまかせで、何ら工夫を加えていません。
NNの構造は以下の通りでした。
Confusion matrixはこんな感じになりました。
トレーニング完了後、edge impulseのページの左下にある項目からDeploymentをクリックし、Arduino libraryを選択してBuildボタンをクリックしました。
私の場合、ei-kikuzo-arduino-1.0.13.zipという名前のzipファイルとしてArduino libraryが得られました。あとはArduino IDEからlibraryに追加するだけです。
Arduino IDEを開き、Sketch > Include Library > Add .ZIP Libraryとたどって、今得たzipファイルを指定するだけです。kikuzo_inferencingという名前でlibraryおよびexampleが追加されます。
File > Examples > kikuzo_inferencingとたどると、対応board用のexampleがずらりと並びます。
今回の私のedge impulse上でのkikuzo projectは音声を対象としたもので、デバイス上にon boardのmicrophoneがついていることが前提になっています(私はArduino nano 33 ble senseをデバイスとして登録しています)。Exampleにはいくつか項目が並ぶのですが、on board microphoneがないものでは試してみることができませんので、注意が必要です。
今回はexampleにあったnano_ble33_sense_microphone_countinuousをもとにして、Arduino nano 33側のコードを書きました。
result.classification[idx].value
でinference probabilityがとれますので、目的の単語の確率に閾値を設定し、ledをつけたり消したり、コード化した結果をシリアルからUNO側に送ったりする、というからくりです。
まとめ
edge impulseはすごい、です。以前の記事にも書きましたが、データの取得から単語部分の切り出し、MFCCを得てNNを構築し、トレーニングをしてArduinoなどのライブラリとしてダウンロードできるところまでやってくれるわけですから、頭があがりません。各ステップを自力で行おうとすると、相当の力業と試行錯誤や経験が必要です。ひとまず、こんなんでどうかな、という例が得られることは大変重要で貴重です。なければ手さえつけられないところですが、試行錯誤の手がかりが与えられるわけですから。まさに0から1が得られるので、あとは1を2にするか、100にできるかは自分次第というわけです。
Neural Network settingsのところでvertical ellipsisをクリックしてKeras modeに切り替えると、tensorflowを使ったtraining scriptを見ることができます。(以前の記事にも書きましたね、これ)
さて、実際に単語の認識をさせて何かするもの、を作ってみてわかったことは、誤認識の壁です。きくぞう、といっていないのに、とつぜんkikuzoが立ち上がる、はなて、といった後、何も言っていないのにせんぷうきLEDがついてしまう(上の動画でもこれがおこっていますね)、などなど。こう考えると、Ok, googleがいかにすぐれものか、よくわかります。
キモはnoiseやunknownを用いたトレーニングにあると思っています。ことばを正確に認識するということは、そうでないことばや音をそうでないと認識することでもあるんですね。今回はこれで当初の目的は達成したと思っています。家の外側へ情報を送り出すことなく、ことば認識が完了しています。こんなに小さなArduino boardで音拾いと判定ができているなんてすごいですね!edge computingを実感します。
noiseとunknownを増やすなどの工夫をして、また続けてみるかもしれません。とにかくオモシロイ技術なので、勉強を続けます。
今後の課題(自分向け)
Pythonでできる程度には、C++を使えるようになりたい。これまでなんとなくできればいいや、で進んで来たのですが、もう少し自在にできないと、やりたいことがでできない、試すことすらできない。
edge impulseから得られるC++のlibraryを使って、使いたいボードにマイクを付けて、今回やったようなことができるようになること、それがこれからの目標です。