今回はいよいよTensorFlow Liteのサンプルコードをビルドしてボードに書き込んでみます。
サンプルコードの内容
SparkFun Edgeボードの2つのマイクに入力される音声から「Yes」と「No」という単語を検出します。これには畳み込みニューラルネットワークによる音声検出モデルを使用します。これはSparkFun Edgeボードに出荷時に書き込み済みのファームウェアと同じものです。
TensorFlowのリポジトリのダウンロード
Gitを使うのでインストールされていないなら下記のコマンドでインストールします。
sudo apt-get install git
TensorFlowのリポジトリをクローンします。ここではホームディレクトリ直下に置くとします。
cd
git clone https://github.com/tensorflow/tensorflow.git
ビルド
以下のコマンドを実行します。前回の記事でGCC, SDK, BSPをインストールしましたが、TensorFlow Liteでは別途これらのツールをリポジトリ内のディレクトリにダウンロードして使うことに注意してください。そのため、初回のmakeには時間がかかります。
cd tensorflow # 次の1行はMacの場合のみ必要(Linuxでは不要) PATH=tensorflow/lite/experimental/micro/tools/make/downloads/gcc_embedded/bin/:$PATH # 長いパスが面倒なので変数に入れておきます MAKEPATH=tensorflow/lite/experimental/micro/tools/make SCRIPTPATH=$MAKEPATH/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts # 諸事情によりファイルコピー cp $SCRIPTPATH/keys_info0.py $SCRIPTPATH/keys_info.py # ビルド make -f $MAKEPATH/Makefile TARGET=sparkfun_edge micro_speech_bin # 下記を実行して "Success!" と表示されればビルド成功です。 test -f $MAKEPATH/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin; \ if [ $? -eq 0 ]; then echo "Success!"; else echo "No binary file!"; fi # マイコンに書き込むためにファイルに変換 python3 $SCRIPTPATH/create_cust_image_blob.py \ --bin $MAKEPATH/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \ --load-address 0xC000 --magic-num 0xCB \ -o main_nonsecure_ota --version 0x0 python3 $SCRIPTPATH/create_cust_wireupdate_blob.py \ --load-address 0x20000 \ --bin main_nonsecure_ota.bin -i 6 \ -o main_nonsecure_wire --options 0x1
シリアルポートの接続とシリアルポート名の確認
前回の記事と同じ要領でSparkFun FTDI Basic Breakoutを介してSparkFun EdgeボードをPCのUSBポートに接続し、シリアルポートのデバイスノードを確認します。
プログラム書き込み
前回の記事と同じ要領で、SparkFun Edgeボードのボタン14を押したままリセットボタンを押して離し、そのままボタン14を押し続けます。そして下記のコマンドを実行します。(シリアルポートが/dev/ttyUSB0の場合の例です。) 「Sending Data Packet of length 8180」というメッセージが出たらボタン14を離します。
sudo python3 $SCRIPTPATH/uart_wired_update.py -b 921600 \ /dev/ttyUSB0 -r 1 -f main_nonsecure_wire.bin -i 6
出荷時に書き込み済みのファームウェアと同じ動作をすることを確認します。「Yes」と言ったら黄色のLEDが点灯しますか? まあ、もともとめったに反応しないんですが。
コードを読んでみる
まず、下記のソースファイルを読んでみましょう。
tensorflow/lite/experimental/micro/examples/micro_speech/sparkfun_edge/command_responder.cc
RespondToCommand()メソッドは音声が検出されたときに呼ばれ、「Yes」か「No」かまたは不明な音声が聞こえた場合に異なるLEDを点灯させます。
下記のページにもう少し詳しい説明があります。適当に変更してリビルドしてボードに書き込んでみましょう。
参考URL
この記事は下記のページをもとに書きました。
codelabs.developers.google.com