マイコンでTensorFlow!? (4)

今回はいよいよ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