STM32マイクロコントローラで「Hello World」機械学習モデルを実行する方法

著者 Jacob Beningo

DigiKeyの北米担当編集者の提供

機械学習(ML)は、サーバや携帯アプリで何年も前から大流行していますが、今では移行して、エッジデバイスでも重要になっています。エッジデバイスはエネルギー効率を高める必要があるため、開発者はMLモデルをマイクロコントローラベースのシステムに展開する方法を学び、理解する必要があります。マイクロコントローラ上で動作するMLモデルは、しばしばtinyMLと呼ばれます。残念ながら、モデルをマイクロコントローラに展開するのは簡単なことではありません。それでも、徐々に簡単になってきており、専門的なトレーニングを受けていない開発者でも、すぐに展開できるようになるでしょう。

この記事では、STMicroelectronicsのSTM32マイクロコントローラを使用して、組み込み開発者がMLを開始する方法について考察します。そのために、X-CUBE-AIを使用してTensorFlow Lite for MicrocontrollersのモデルをSTM32CubeIDEで使用できるように変換することで、「Hello World」アプリケーションを作成する方法を紹介します。

tinyMLのユースケースの紹介

TinyMLは、マイクロコントローラのようなリソースや電力に制約のあるデバイスにMLのパワーをもたらす成長分野であり、通常はディープニューラルネットワークを使用します。これらのマイクロコントローラデバイスは、MLモデルを実行し、エッジで価値ある作業を行うことができます。現在、tinyMLが非常に魅力的なユースケースはいくつかあります。

まず、多くのモバイル機器やホームオートメーション装置に見られるユースケースとして、キーワードスポッティングがあります。キーワードスポッティングでは、組み込みデバイスがマイクロフォンを使用して音声を取り込み、事前学習済みのキーワードを検出します。tinyMLモデルは、音声を表す時系列入力を使用して、音声特徴(通常はスペクトログラム)に変換します。スペクトログラムには、時間の経過に伴う周波数情報が含まれます。このスペクトログラムを、特定の単語を検出するように学習させたニューラルネットワークに入力します。その結果、特定の単語が検出される可能性があります。図1は、このプロセスがどのように見えるかという例を示しています。

tinyMLの魅力的なユースケースであるキーワードスポッティングの画像(クリックして拡大)図1:キーワードスポッティングは、tinyMLの魅力的なユースケースです。入力音声はスペクトログラムに変換された後、学習済みのニューラルネットワークに入力され、事前学習済みの単語が存在するかどうかが判断されます。(画像提供:Arm®

多くの組み込み開発者が関心を寄せるtinyMLの次のユースケースは、画像認識です。マイクロコントローラがカメラから画像を取り込み、事前に学習させたモデルに入力します。このモデルは、画像に写っているものを識別できます。たとえば、猫がいるか、犬がいるか、魚がいるか、などを判断することができます。画像認識がエッジで使用されている好例としては、モニタ付きインターホンがあります。多くの場合、モニタ付きインターホンは、ドアの前に人がいるか、荷物が置かれているかどうかを検知します。

最後に、普及率の高いユースケースとして、tinyMLを使用した予知保全が挙げられます。予知保全ではMLを使用し、異常検知、分類アルゴリズム、予測モデルに基づいて装置の状態を予測します。ここでも、HVACシステムから工場現場の装置まで、さまざまなアプリケーションが用意されています。

現在、tinyMLでは上記3つのユースケースが一般的ですが、開発者が見つけられる潜在的なユースケースは、間違いなく数多く存在します。ざっと挙げてみましょう。

  • ジェスチャ分類
  • 異常検出
  • アナログメータリーダ
  • ガイダンスおよび制御(GNC)
  • パッケージ検出

どのようなユースケースであっても、tinyMLに慣れ親しむには、「Hello World」アプリケーションから始めるのが最適です。これは、開発者が最小限のシステムを可動させるための基本的なプロセスを学び、理解するのに役立ちます。STM32マイクロコントローラ上でtinyMLモデルを実行するには、以下5つのステップが必要です。

  1. データを取り込む
  2. データをラベル付けする
  3. ニューラルネットワークをトレーニングする
  4. モデルを変換する
  5. マイクロコントローラ上でモデルを実行する

「Hello World」モデルの取り込み、ラベル付け、トレーニング

開発者は一般的に、モデルのトレーニングに必要なデータをどのように取り込み、ラベル付けするかについて、多くの選択肢を利用できます。まず、オンライントレーニングデータベースが数多くあります。開発者は、誰かが収集およびラベル付けしたデータを検索することができます。たとえば、基本的な画像検出であれば、CIFAR-10やImageNetがあります。写真から笑顔を検出するようにモデルをトレーニングする際は、そのための画像コレクションも用意されています。オンラインデータリポジトリは、手始めとして間違いなく最適な場所です。

必要なデータがインターネット上で公開されていない場合は、開発者自身のデータを生成することも選択肢の1つです。Matlabなどのツールを使用すれば、データセットを生成できます。データの自動生成が困難な場合は、手動で行うことも可能です。最後に、これらすべてに時間がかかりすぎるようであれば、インターネット上で購入できるデータセットもあります。データを収集することは、とても刺激的で興味深い選択ですが、最も手間がかかる作業でもあります。

ここで考察している「Hello World」のサンプルでは、正弦波を生成するモデルをトレーニングし、STM32に展開する方法を説明します。このサンプルは、GoogleでのTensorFlow Lite for Microcontrollersに関する研究の一環として、ピート・ワーデン氏とダニエル・シトゥナヤケ氏によってまとめられました。彼らはモデルの取り込み、ラベル付け、トレーニングについて簡単な公開チュートリアルをまとめてくれているため、作業が楽になります。このチュートリアルは、GitHubのこちらで公開されています。そこから「Run in Google Colab」ボタンをクリックしてください。Google Colab(Google Collaboratoryの略)により、設定なしでブラウザ上でPythonを記述および実行し、Google GPUへ無料でアクセスできます。

トレーニングサンプルからの出力には、マイクロコントローラ用に量子化されたmodel.tflite TensorFlowモデルと、量子化されていないmodel_no_quant.tfliteモデルという、2つの異なるモデルファイルが含まれます。量子化により、モデルのアクティブ化とバイアスをどのように数値的に保存するかが示されます。量子化されたバージョンは、よりマイクロコントローラに適した小さなモデルを生成します。図2は、好奇心旺盛な読者のために、学習済みモデルの結果と実際の正弦波の結果を比較したものです。モデルの出力は、赤色で表示されています。正弦波出力は完璧ではありませんが、「Hello World」プログラムでは十分に機能します。

正弦波に対するTensorFlowモデルの予測値と実測値を比較したグラフ図2:正弦波に対するTensorFlowモデルの予測値と実測値の比較。(画像提供:Beningo Embedded Group)

開発ボードの選択

TensorFlowモデルをマイクロコントローラ上で動作するように変換する方法を見る前に、モデルで展開するマイクロコントローラを選択する必要があります。STMicroelectronicsには、モデルの変換や実行に適したtinyML/MLツールが多数あるため、この記事ではSTM32マイクロコントローラを中心に説明します。また、STMicroelectronicsは、同社のMLツールに対応する部品も豊富に取り揃えています(図3)。

STMicroelectronicsのAIエコシステムの表(クリックして拡大)図3: STMicroelectronicsのAIエコシステムが現在サポートしているマイクロコントローラとマイクロプロセッサユニット(MPU)を示します。(画像提供:STMicroelectronics)

これらのボードのうち1つがオフィスに転がっているなら、それは「Hello World」アプリケーションを稼働させるのに最適です。しかし、このサンプルにとどまらず、ジェスチャコントロールやキーワードスポッティングにも興味があるなら、STM32 B-L4S5I-IOT01AディスカバリIoTノードを選択してください(図4)。

このボードには、STM32L4+シリーズをベースとしたArm Cortex®-M4プロセッサが搭載されています。このプロセッサは2Mバイトのフラッシュメモリと640KバイトのRAMを搭載し、tinyMLモデル用に十分なスペースを提供します。このモジュールは、キーワードスポッティングアプリケーションの開発に利用できるSTMicroelectronicsのMP34DT01マイクロエレクトロメカニカルシステム(MEMS)マイクロフォンも搭載しているため、tinyMLのユースケース実験に適応します。加えて、tinyMLベースのジェスチャ検出には、同じくSTMicroelectronicsのオンボードLIS3MDLTR3軸加速度計を使用できます。

STMicroelectronicsのSTM32 B-L4S5I-IOT01AディスカバリIoTノードの画像図4:STM32 B-L4S5I-IOT01AディスカバリIoTノードは、Arm Cortex-M4プロセッサ、MEMSマイクロフォン、3軸加速度計が搭載されているため、tinyMLの実験用プラットフォームとして適応できます。(画像提供:STMicroelectronics)

STM32Cube.AIを使用したTensorFlow Liteモデルの変換と実行

tinyMLモデルを実行するのに使用可能な開発ボードを手に入れた開発者は、TensorFlow Liteモデルをマイクロコントローラ上で実行できるものに変換する作業に取りかかれるようになります。TensorFlow Liteモデルはマイクロコントローラ上で直接実行できますが、それを処理するためのランタイム環境が必要です。

モデルを実行する際には、一連の機能を実行する必要があります。これらの機能には、センサデータの収集に始まり、フィルタリング、必要な特徴の抽出、モデルへの投入が含まれます。モデルが出力した結果は、さらにフィルタリングされ、通常は何らかのアクションが実行されます。図5は、このプロセスがどのように見えるかという概要を示しています。

センサからランタイム、そして出力に至るデータの流れを示す図図5:tinyMLアプリケーションにおけるセンサからランタイム、そして出力に至るデータの流れ。(画像提供:Beningo Embedded Group)

STM32CubeMxへのX-CUBE-AIプラグインは、TensorFlow Liteモデルを解釈するランタイム環境および、開発者が活用できる代替ランタイムと変換ツールを提供します。X-CUBE-AIプラグインは、プロジェクトにおいてデフォルトで有効になっていません。しかし、新規プロジェクトを作成し、ボードを初期化した後、[Software Packs] -> [Select Components]の下に、AIランタイムを有効にするオプションがあります。ここには、いくつかのオプションがあります。このサンプルでは、図6に示すように、アプリケーションテンプレートを使用するようにしてください。

有効にする必要があるX-CUBE-AIプラグインの画像図6:このサンプルでは、アプリケーションテンプレートを使用してX-CUBE-AIプラグインを有効にする必要があります。(画像提供:Beningo Embedded Group)

X-CUBE-AIを有効にすると、ツールチェーンにSTMicroelectronicsのX-CUBE-AIカテゴリが表示されるようになります。カテゴリをクリックすると、図7に示すように、開発者が作成したモデルファイルを選択し、モデルのパラメータを設定する機能が付与されます。また、解析ボタンでモデルを解析し、RAM、ROM、実行サイクルの情報を提供することもできます。開発者はKerasとTFLiteのモデルオプションを比較することを強くお勧めします。正弦波モデルのサンプルは小さいため、大きな差は出ませんが、はっきりわかります。その後、[Generate code]をクリックすると、プロジェクトが生成されます。

RAM、ROM、実行サイクルの情報を示す画像図7:解析ボタンを押すと、RAM、ROM、実行サイクルの情報を得ることができます。(画像提供:Beningo Embedded Group)

コード発生器は、プロジェクトを初期化し、tinyMLモデルのランタイム環境で構築します。しかし、デフォルトでは、モデルに何も供給されません。開発者は、コードを追加して、モデルの入力値であるx値を提供する必要があります。モデルは正弦のy値を生成するために、この入力値を解釈して使用します。図8に示すように、acquire_and_process_data関数とpost_process関数にいくつかのコードを追加する必要があります。

偽の入力センサ値を接続するコードの画像図8:表示されているコードは、偽の入力センサ値を正弦波モデルに接続します。(画像提供:Beningo Embedded Group)

この時点で、サンプルは実行可能な状態になりました。注:簡単な検証を行うために、モデルの出力を得るためのprintfステートメントをいくつか追加してください。高速のコンパイルと展開により、「Hello World」のtinyMLモデルが実行されます。モデル出力を1サイクル引っ張ると、図9に示すような正弦波が得られます。完璧とは言えませんが、最初のtinyMLアプリケーションとしては優秀です。ここから、出力をパルス幅変調器(PWM)に結びつけ、正弦波を発生させることができます。

「Hello World」正弦波モデル出力の画像(クリックして拡大)図9:STM32で実行した場合の「Hello World」正弦波モデル出力。(画像提供:Beningo Embedded Group)

組み込みシステムのMLに関するヒントとコツ

マイクロコントローラベースのシステムでMLを開始しようとする開発者は、最初のtinyMLアプリケーションを稼働させるためにかなりの負担を強いられるでしょう。しかし、開発の簡素化とスピードアップを可能にする留意すべき「ヒントとコツ」がいくつかあります。

  • Google Colabファイルを含む、TensorFlow Lite for Microcontrollersの「Hello World」サンプルを確認します。時間をかけてパラメータを調整し、それが学習済みモデルにどのような影響を与えるかを理解します。
  • マイクロコントローラアプリケーションには、量子化されたモデルを使用します。量子化されたモデルは、32ビット浮動小数点数ではなく、uint8_tで動作するように圧縮されています。その結果、モデルのサイズが小さくなり、実行速度も速くなります。
  • TensorFlow Lite for Microcontrollersリポジトリにある追加のサンプルを参照します。その他のサンプルには、ジェスチャ検出やキーワード検出などがあります。
  • 「Hello World」のサンプルでは、モデルの出力をPWMとローパスフィルタに接続し、結果の正弦波を確認します。正弦波の周波数を上げたり下げたりして、ランタイムを実験してください。
  • 幅広いMLアプリケーションを試せるよう、「追加」のセンサを搭載した開発ボードを選択します。
  • データ収集は楽しいものですが、一般的には、オープンソースデータベースを購入または使用してモデルをトレーニングする方が簡単です。

これらの「ヒントとコツ」に従えば、アプリケーションのセキュリティを確保する際に、大幅に時間を節約でき、悩み事も減るでしょう。

まとめ

MLがネットワークエッジに登場し、リソースに制約のあるマイクロコントローラベースのシステムが格好のターゲットになりました。最新のツールを使用することで、MLモデルをリアルタイムシステム上で動作するように変換および最適化できます。このように、STM32開発ボードでモデルを稼働させることは、複雑な作業にもかかわらず、比較的簡単です。この記事では正弦波を生成するシンプルなモデルについて考察しましたが、ジェスチャ検出やキーワードスポッティングなど、はるかに複雑なモデルも実現可能です。

DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

著者について

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo氏は組み込みソフトウェアコンサルタントで、現在、製品の品質、コスト、市場投入までの時間を改善することで、ビジネスを劇的に変革するために数十か国以上のお客様と作業しています。同氏は、組み込みソフトウェア開発技術に関する200以上の記事を発表しており、引っ張りだこのスピーカーでありテクニカルトレーナです。ミシガン大学のエンジニアリングマスターを含む3つの学位を取得しています。気楽にjacob@beningo.comにメールするか、彼のウェブサイトwww.beningo.comから連絡してみてください。そして毎月のEmbedded Bytes Newsletterにサインアップしましょう。

出版者について

DigiKeyの北米担当編集者