STM32マイコン(およびマイクロプロセッサ)へAIを実装する際(*1)、リファレンスとして利用できる事前学習済みの機械学習モデルがいくつかgithubに用意されています。今回は、STM32向けに最適化された機械学習モデルのリポジトリ・STM32 model zooをチェックしてみました。主に画像センサ(カメラ)のデータを使った機械学習モデルが大半ですが、音響センサ(マイク)および測距センサ(ToF)を使用したモデルも用意されています。
*1: STM32マイコン / マイクロプロセッサ(例:STM32H7、STM32U5、STM32MP2、STM32N6 など)で AI を動かしたい方が対象。なんらかのセンサ入力データから、高度な判断をさせたい場合など。
参考: STM32 AIのポータルページ → Products → overview
AI用のツール・ソリューションが紹介されています。
stm32ai.st.comポータル
- STM32マイコン / マイクロプロセッサ向けAIツールを利用した実装フロー(概要)
いきなりAI開発用のフローが登場しましたが、STM32 model zooとは、この中で利用できる AI用学習済みデータ(が集められたもの) です。開発用ツール環境としては、「NanoEdgeAI Studio」(図左端)と「それ以外」に分類できます。振動データなどを使うIoT系のAIの場合、現時点ではNanoEdgeAI Studioの利用がおすすめです。それ以外のAI、例えば画像データを扱うAIの場合、NanoEdgeAI Studioでは対応できないので、汎用機械学習ツールを使うことになります。このフロー中、STM32Cube.AIなど下段のツール群はあくまで「学習済みのモデルを使ってSTM32マイコン等に実装する」ためのものです。事前になんらかの学習済みモデルが必要になるので、そこでこのSTM32 model zooを活用することができます。
| ツール | 内容 | 対象デバイス |
|---|---|---|
| NanoEdgeAI STUDIO | 加速度センサや電流センサ、マイクなどのデータを利用したAI開発向け。機械学習の知識はあまり必要とせず、自分でデータを収集すれば最終的な実装用コードまで生成可能。データ収集用のコードも、各デバイス向けにこのツールの中で用意されている。 | STM32マイコン ISPU付きセンサ |
| STM32Cube.AI / X-LINUX-AI / ST EdgeAI-Developer cloud |
TensorFlowなどの汎用機械学習ツールで作成された機械学習モデルを、STM32などのデバイスへ実装するためのツール。つまりNanoEdgeAI Studioと違い、これらのツールには機械学習作業のための機能は含まれていません。この特徴により、画像データによる判断など幅広いAIに対応可能。 | STM32マイコン ISPU付きセンサ STM32マイクロプロセッサ Stellar MCU |
この連載記事では、STM32N657X0マイコンを搭載した「STM32N6570ディスカバリ・キット」(STM32N6570-DK)を使用する予定です。STM32N657X0にはニューラル・ネットワーク推論専用のハードウェア・アクセラレータが内蔵されているので、画像データ向けの機械学習モデルの処理に適しています。また、このディスカバリ・キットにはカメラが同梱されています。
1. STM32 model zooとは?
STM32 model zoo
STM32マイコン / マイクロプロセッサで実行できるように最適化された、リファレンス機械学習モデルのコレクションです。STのgithubページに、リポジトリとして用意されています。多数の画像データ(主にパブリック公開されている画像を使用)などを使って学習させた、機械学習モデル・ファイル(具体的には、.h5や.tfliteなどのファイル)が保管されています。STM32マイコン用にAIを実装する際には、ここに置いてある.tfliteファイルなどを使って書き込用のネットワーク・ファイルを作成する必要があります。
また、STM32 model zooの中に保存されているのは機械学習モデル・ファイルのみなので、STM32に書き込んで動かすためには別途アプリケーション・コードが必要になります。実際に試すことのできるサンプル・コードは、次で説明するSTM32 model zoo servicesリポジトリからアクセスできます(本体は別の場所に置いてあります)。
| Use case | 内容 | 対応ボード | サンプル・コード |
|---|---|---|---|
| Image Classification | 画像の内容を、定義済みのクラスセットに分類 | H747-DK, H743-N, MP2, N6570-DK | 〇 |
| Object Detection | 入力画像から、定義済みの物体を検出・特定し、その確率を推定 | H747-DK, MP2, N6570-DK | 〇 |
| Face Detection | 入力画像から事前定義された顔とキーポイントを検出し、位置を特定し、発生確率を推定 | H747-DK, N6570-DK | 〇 |
| Pose Estimation | 特定のオブジェクト(人物、手、顔など)上のキーポイントを検出 | H747-DK, N6570-DK | 〇 |
| Semantic Segmentation | 画像内のすべてのピクセルにラベルを関連付け、異なるカテゴリを形成するピクセルの集合を認識 | MP2, N6570-DK | 〇 |
| Instance Segmentation | 画像内のすべてのピクセルにラベルを関連付け、異なるカテゴリを形成するピクセルの集合、または各カテゴリのインスタンスを認識 | N6570-DK | 〇 |
| Depth Estimation | 画像からオブジェクトまでの距離をピクセル単位の深度マップとして予測 | N6570-DK | × |
| Neural Style Transfer | ある画像の芸術的なスタイルを別の画像の内容に適用 | N6570-DK | × |
| Audio Event Detection | 特定のオーディオ・イベントを検出 | U585-IOT, N6570-DK | 〇 |
| Speech Enhancement | 騒音環境における音声知覚の強化 | N6570-DK | 〇 |
| Human Activity Recognition | 歩行、走行など、人間の様々な活動状態を認識 | U585I-IOT | 〇 |
| Hand Posture Recognition | 測距センサ(Time of Flight(ToF))を用いて、一連の手のポーズ・形を認識 | F401-N | 〇 |
| Arc Fault Detection | 電流信号から電気アーク障害を検出 | U585I-IOT | × |
| Re-Identification | 異なる画像やビデオ フレームにわたって人物またはオブジェクトを再識別 | N6570-DK | 〇 |
STM32 model zoo services
前述したように、STM32 model zooには何らかのデータ・セットを使って学習させた学習済みのモデルが入っています。ではユーザが自分で学習モデルを作りたい場合は、どうすればいいのでしょうか? その場合、STM32 modelzoo-services という別のリポジトリにあるスクリプトを使います。
機械学習作業を始めるにあたって、作業時に必要なPythonスクリプト・ファイルが格納されています。(つまりPythonは当然必要で、さらにTensorFlowなどのパッケージをインストールする必要があります)
また、「いきなり学習作業から始めるのではなく、実機でとりあえずAIリファレンス(サンプル・コード)の動作を見てみたい」という場合、application code からアクセスできるリポジトリを使います。現時点(2026年2月)で一部を除き、上記のモデルをほぼ網羅しています。なお、ユースケース名とフォルダ名が違っているものがいくつかあるので注意してください。binフォルダの中に実行用ファイルが入っているので、次回以降の記事で、実際に動作させるところまで試してみたいと思います。
| Use case | 保存フォルダ | Note |
|---|---|---|
| Speech Enhancement | audio | |
| Audio Event Detection | audio | |
| Face Detection | face_detection | |
| Hand Posture | hand_posture/STM32F4 | for STM32F4 |
| Image Classification | image_classification | |
| Instance Segmentation | instance_segmentation | |
| Object Detection | object_detection | |
| Pose Estimation | pose_estimation | |
| Real Time Identification | re_identification | |
| Semantic Segmentation | semantic_segmentation | |
| Audio Event Detection | sensing/STM32U5 | for U5-IOT |
| Human Activity Recognition | sensing/STM32U5 | for U5-IOT |
ちなみに、ST.comのNeural-ARTアクセラレータを搭載したSTM32N6用AIソフトウェア開発エコシステムのページからも、これらgithub内の各リポジトリページへ移動できます。
2. サンプル: 「object detection(物体検知)」について
STM32 modelzoo-servicesのページには色々な情報が載っています。ここではobject detection(物体検知)を例に、中身をチェックしていきます。
2-1. object detection
ルートリポジトリ(stm32ai-modelzoo-services)直下の各ユースケース名フォルダ内には、機械学習用のスクリプト・ファイルが保管されています。これらのフォルダ内には、STM32マイコン・ボードに直接書き込んで実行できるようなファイルは無いので注意してください。object_detectionフォルダをクリックすると、README.mdが開いて機械学習用スクリプトの説明サマリのようなものが閲覧できます。Pythonスクリプト・ファイルは、srcフォルダ下に作業内容ごと多数保管されていますが、実際に作業する際はコンフィギュレーション・ファイル(.yamlファイル)を使用して自動実行できるようになってます。docフォルダ内やその下のtutoフォルダ内に、詳しいドキュメントやチュートリアルが用意されています。ただし、分量がかなり多いです。
今回は不要なので、スキップします。
2-2. application code
STM32マイコンボードに書き込んで実行できるファイルはすべて、ルート・リポジトリ(stm32ai-modelzoo-services)直下の application code フォルダの中にあります。次回の記事でobject detectionを試す予定なので、まずはこのフォルダをクリックします。さらに、使用予定のボードはSTM32N6750-DKなので STM32N6 を選択すると、Object Detection Getting Startedといった名前のリポジトリへ移動し、README.mdページが開きます。
このページにあるキャプチャ画像を見ると、「人間を検出するデモなのかな?」と想像しますが、ページ内にはその説明がないため、現時点ではまだ不明です。
2-3. 機械学習モデル
MODELフォルダ内をチェックすると、ここに.tfliteファイルがありました。どうやらこの機械学習モデルファイルを利用しているようです。
- quantized_tiny_yolo_v2_224_.tflite: NUCLEO-N657X0用
- st_yolo_x_nano_480_1.0_0.25_3_st_int8.tflite: STM32N6750-DK用
STM32N6750-DK用としては、st_yolo_x_nano_480_1.0_0.25_3_st_int8.tflite を使用しています。
容易に想像できますが、*.tfliteファイルなどはそのままSTM32マイコンで利用することはできません。実際にSTM32に書き込むバイナリ・ファイル(ネットワーク・ファイル)生成用のシェルスクリプトが同じフォルダ内にあります。このスクリプトを使うと、*.tfliteファイルからnetwork_xxx.bin(あるいは.hex)ファイルを生成できます(このデモプロジェクト・フォルダ内では、すでに生成済みのものがSTM32N6570-DKフォルダ内にあります。*.hexファイルはアドレス情報を加えてさらにテキストデータ化しているものではありますが、データ内容としては*.binファイルと同じです)。
generate-n6-model_STM32N6570-DK.sh
#!/bin/bash
stedgeai generate --model st_yolo_x_nano_480_1.0_0.25_3_st_int8.tflite --target stm32n6 --st-neural-art default@user_neuralart_STM32N6570-DK.json --input-data-type uint8 --output-data-type int8
cp st_ai_output/network.c STM32N6570-DK/
cp st_ai_output/network_ecblobs.h STM32N6570-DK/
cp st_ai_output/network_atonbuf.xSPI2.raw STM32N6570-DK/network_data.xSPI2.bin
arm-none-eabi-objcopy -I binary STM32N6570-DK/network_data.xSPI2.bin --change-addresses 0x70380000 -O ihex STM32N6570-DK/network_data.hex
このデモで使われている.tfliteファイルに関する情報をチェックしたかったのですが、これを作成した時に使用したとされるyamlファイルを見つけられませんでした(*1)。そこで、STM32 model zoo リポジトリ の方のobject detectionフォルダ下を色々と探したところ、ここに似た名前の.tfliteファイルを見つけました。yamlファイルも同じ場所にあるのでこの中の設定情報をチェックしてみます。
*1: 機械学習作業時、スクリプトはこのyamlファイル内の設定内容に従って作業を進めます。最終的な結果が.tfliteファイル(バイナリ・ファイル)として出力されます。
st_yoloxn_d100_w025_480_config.yamlファイルを開き、datasetのところを見ると、判別クラスとして [person] だけ定義されています。当初は、色々な物体を識別するものを想像していましたが、README冒頭ページの写真にあるように、どうやら人間だけの判別デモのようです。
また、
project_name = st_yoloxn_480_1.0_0.25_3_st_official
とあります。最初にチェックした、application code→object detectionデモフォルダ内にあった機械学習モデルファイル名とかなり似てます。この設定ファイルはデモ用に使われているものと同じ、あるいは近いものと考えてよさそうです。
st_yoloxn_d100_w025_480_config.yaml
general:
project_name: st_yoloxn_480_1.0_0.25_3_st_official
logs_dir: logs
saved_models_dir: saved_models
display_figures: false
gpu_memory_limit: 24
num_threads_tflite: 24
global_seed: 127
model:
model_type: st_yoloxn
model_name: st_yoloxn_d100_w025
input_shape: (480,480,3)
pretrained: false
operation_mode: chain_tqeb
dataset:
dataset_name: custom_dataset
class_names: [person]
format: tfs
training_path: /local/data/od_st_person/train
validation_path: /local/data/od_st_person/test
test_path: /local/data/od_st_person/test
quantization_path: /local/data/od_st_person/train
quantization_split: 0.001
Yoloとは?
ここで頻繁に出てきた「st_yolo**」とは何でしょうか?
調べたところ、「Yolo xx」と呼ばれているものは、Tensorflowで実装された リアルタイム処理向けの物体検出モデル (深層学習モデル)の1つのようです。
「ST Yolo X」は、Yolo xxをST向けに最適化されたバージョンであり、Tensorflow Liteコンバータを使用してint8形式に量子化されています。
同じくobject detectionのページにある「YOLOv8n」の場合、
「第8世代のYOLO(You Only Look Once)シリーズに属する物体検出モデルの一つ。「n」は「nano(ナノ)」を意味し、非常に軽量かつ高速なモデル」
となります。
Yolo
YOLO 系(Ultralytics / ST / TAO)
yolo_v8
Ultralytics の YOLOv8
背景:
YOLO 系の中でも最新世代(v5→v8→v11…)
改良されたバックボーン、FPN、anchor-free ヘッド等を採用
特徴:高精度+リアルタイム性能
yolo_v11
Ultralytics の YOLOv11
v8 からさらに改良された世代という位置付け(SOTA に近い)
yolo_v5u
Ultralytics YOLOv5 の一種
スピードと精度のバランスの良さで有名なシリーズ
st_yolo_x
YOLOX ベースの ST カスタム版
特徴:
anchor-free 対応(アンカーによる設計が不要で簡潔)
分離ヘッド(分類と位置推定を別ヘッドで処理)
学習戦略の工夫
YAML から各種チューニングパラメータを柔軟に設定できる ST 独自拡張
st_yolo_lc_v1
Tiny YOLOv2 をベースとした「軽量版(lightweight)」ST モデル
特徴:
リソース制約の厳しい STM32 などの組み込み向けに最適化
精度よりも軽量・高速を優先する用途向け
tiny_yolo_v2
元々の Tiny YOLOv2(軽量 YOLO)
組み込み向けの定番軽量検出モデル
yolo_v4
NVIDIA TAO Toolkit の YOLOv4
バックボーン:
ResNet / MobileNet / Darknet / EfficientNet / VGG / CSPDarknet など選択肢多数
yolo_v4_tiny
TAO の YOLOv4 Tiny バージョン
CSP Darknet Tiny バックボーンを利用
Yoloの他にも、SSD*-MobileNet*といった名前のモデルが用意されていますが、こちらもリアルタイム処理向けの物体検出モデルのひとつです。
2-4. 使われているデータセット(画像データ)
何かしら大量の画像・写真データを使って学習したのだろうと推察しますが、実際にどのようなデータなのか調べてみます。これまで見てきたgithubのリポジトリ内には無いので、web上で探す必要があります。
同じくこのst_yolo_xページ読むと、「COCO-Person」(or 「ST-Person」)というデータセットが使用されていることが判ります。下の方のReference欄を見ると「“Microsoft COCO: Common Objects in Context”」のリンクがありました。一般公開されているデータで、ここからイメージデータをダウンロードできそうです。
色々とイメージファイルが用意されてますが、おそらく「Train」と書かれているものが学習用データと予想しました。STM32 model zooのobject detection下には「coco_2017_person」という名前のフォルダも存在するので、とりあえず「2017」年版?のデータをダウンロードしてみます(約18GByteもあるので、ダウンロードする場合PCの空き容量には注意しましょう)。
中身を見ると、約11万8千枚の写真が保存されていました。予想はしましたが、人間だけでなく乗り物や動物、食べ物など色々な写真があります。
ちなみに、2-3のところでチェックしたyamlファイル内では、datasetのところで、
training_path: /local/data/od_st_person/train
といったデータフォルダ用のpathが設定されていました。実際に学習した際には、人間だけの画像データを選別して使った可能性があります(全ての画像を使ってはいないと思われます)。
一応、全写真にannotation(注釈)データが用意されているので("**annotations"といった別ファイル)、どの写真に何の物体があるのか判るようになっています。
今後の予定
今回はざっくりと、object detectionを例にSTM32 model zooの概要を解説しました。
次回は、このobject detectionが動作するサンプル・ファームウェアを、STM32N6570-DKボードに書き込みして試してみたいと思います。
- ② object detectionサンプル・コードを試す
- ③ object detectionサンプル・コードを試す 別モデルをロード
- ④ 別のデータでobject detection学習作業トライ step1
- ⑤ 別のデータでobject detection学習作業トライ step2
- ⑥ 別のデータでobject detection学習作業トライ step3










