今回はマイコン等に組込可能な機械学習ライブラリを調査してみました。マイコン等の組込系で使用するため、C/C++で利用可能な代表的なライブラリの特徴を調べてみました。
最も良く使用される組込系機械学習ライブラリです。ただ、組込系の場合、ARMのライブラリと依存関係があるため、ARM以外のPICやAVRといったCPUではそのままでは利用できません。RISCV等をターゲットにしたARM以外に実装した例もありますが、ライブラリが非常に大きく、ポーティングに難ありなようです。
STM32マイコンに実装する場合にCubeMXと統合されたUIで利用できる機械学習ライブラリです。KerasやTensorFlow等の学習結果を簡単に組み込むことが可能です。また、学習結果の圧縮やテスト等が容易にできるため、STM32マイコンであれば非常に便利です。一方でSTM32マイコン以外では使用できなく、昨今の半導体不足の影響をモロに受けているため、当面は安定した入手が難しい可能性があります。
scikit-learnもしくはKerasの学習結果をC/C++に変換することができます。Pythonで学習結果を読み込ませると自動的にC言語でヘッダーファイルが生成され、そのままマイコンのプロジェクトソースに組み込むことが可能です。1つのヘッダーファイルをプロジェクトソースに組み込むだけて利用できるため、他のライブラリのように複数のソースコードをプロジェクトに追加する必要もなく、非常に簡単に組み込むことが可能です。また、ライブラリ自体非常に軽量なため、小規模なモデルであれば8ビットマイコン等にも組込可能です。ただし、利用可能なモデルに制約があります。
・ELL
マイクロソフトが提供する組込向けの機械学習ライブラリです。主にC++で実装されています。組込向けといってもマイコン等ではなく、raspberry piといったSBC等をターゲットにしているようです。ここ数年の開発ペースは落ちているようです。
その他
・DLib
・FANN
実際にSTM32 Cube AI、Tensorflow Lite、emlearnを使ってみました。印象として、ターゲットとなるマイコンでサンプルがあれば、Tensorflow Liteはネット上に情報が多く、利用しやすいと思いました。初心者でも簡単に効率よく、推論結果を評価したりできる点ではSTM32 Cube AIがお勧めです。また、利用可能な機械学習モデルに制約があるものの、どのようなマイコンにも簡単に組み込むことができ、C言語で移植性が高いという面ではemlearnがお勧めでです。個人的にはSTM32、RP2040、PIC32マイコン等の様々な環境で利用することを想定し、今後はemlearnをより使ってみたいと思いました。