作成したAIモデルをマイコンで動かす
NPUマイコンではじめるエッジAI開発
・開催日 :2025年12月4日 14:00-17:00
・使用ボード:FRDM-MCXN947(NXPセミコンダクターズ)
・講師 :笹尾 幸良氏(株式会社Acculus CEO)
申し込みページはこちら
NXPジャパン株式会社が主催の技術イベントを開催します.Edge AI,IoT機器のセキュリティ,I3Cバス,モータ制御など,最前線の技術トレンドを解説するセッションを多数開催します.アヴネットのブース(#11)では,「電源から映像まで,最新技術の集結」をテーマに展示を行います.
開発ボードのプレゼントや技術資料などの参加者限定特典もご用意しております.
・開催日:2025年12月10日(水)10:00〜16:30
・会場 :コングレスクエア日本橋
・参加費:無料
申し込みページはこちら
前回は,NXPセミコンダクターズの組込み機器向けAI開発支援ツールeIQ Toolkitを使って,新たなモデルの作成を行いました.今回は写真1に示すマイコン・ボードFRDM-MCXN947(NXPセミコンダクターズ)を使用して,作成したAIモデルを動かしてみます.
本記事で紹介する手順は,次のウェブ・ページを元にしています.
・[入門]MCX N947:AI/ML画像認識サンプルコード実装 (日本語ブログ),NXP Tech Blog
マイコンで実行するAIモデルに入力する画像をテキスト・ファイルに変換します.ここでは,daisy(ヒナギク)のデータセットの中にある次の画像を入力して,ヒナギクであると認識することを試します.
flower_photos/daisy/102841525_bd6628ae3c.jpg
Pythonを使って,JPEGファイルをC/C++言語が取り込めるテキスト・ファイルに変換します.
▼(1) 対応状況の確認
Windowsのコマンドプロンプトを開き,次のコマンドを実行して,PythonコマンドがPython3.9.x以降に対応していることを確認します.
> python -V
▼(2) Pythonのインストーラ・ツール更新
次のコマンドを実行して,Pythonのインストーラ・ツールであるpipとsetuptoolsを更新します.
> python -m pip install -U pip
> python -m pip install -U setuptools
▼(3) Pythonパッケージのインストール
次のコマンドを実行して,Pythonパッケージをインストールします.
> python -m pip install numpy scipy matplotlib ipython jupyter pandas sympy nose imageio
> python -m pip install netron seaborn west pyserial scikit-learn opencv-python pillow
▼(4) Vimのインストール
Windowsの場合は,Vim9.0をインストールします.
https://www.vim.org/download.php#pc
このパッケージに含まれるxxd.exeというバイナリ・コンバータ・プログラムが必要になります.今回はgvim_9.1.1825_x64.zipというパッケージに含まれるxxd.exeを使用しました.
▼(5) xxdの確認
xxd.exeをカレント・ディレクトリにコピーして,実行できることを確認します.次のコマンドを実行します.
> ./xxd.exe -v
▼(1) 画像ファイルの配置
ドキュメント・フォルダの下にflower_daisyフォルダを作り,この中に102841525_bd6628ae3c.jpgを入れておききます.
▼(2) Pythonの起動
次のコマンドを実行して,Pythonを起動します.
> python
▼(3) コマンドの実行
コマンドプロンプトを起動して,flower_daisyフォルダに移動します.
次のコマンドを順番に実行します.最後の4行はインデントを含めてください.
import cv2
import numpy as np
img = cv2.imread('102841525_bd6628ae3c.jpg')
img = cv2.resize(img, (128, 128))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
with open('daisy.h', 'w') as fout:
print('#define STATIC_IMAGE_NAME "daisy"', file=fout)
print('static const uint8_t image_data [] = {', file=fout)
img.tofile(fout, ', ', '0x%02X')
print('};\n', file=fout)
▼(4) ヘッダ・ファイルの確認
flower_daisyフォルダにdaysy.hが作成されていることを確認します(図12).

作成したdaysy.hをプロジェクトに取り込みます.次の手順を実行します.
(1) MCUXpresso IDEのProject Explorerウィンドウで,デフォルトのプロジェクトfrdmmcxn947_tflm_label_imageを右クリックし,コピー&ペーストしてfrdmmcxn947_tflm_label_image_2112を作る
(2) frdmmcxn947_tflm_label_image_2112プロジェクトのsource\imageフォルダにdaysy.hをドラッグ&ドロップする
(3) frdmmcxn947_tflm_label_image_2112プロジェクトの中で,image_load.cの
#include “image_data.h”
をコメントアウトし,
#include “daisy.h”
を追加する
eIQ Toolkitで作成したモデルをプロジェクトに取り込みます.
▼(1) ヘッダ・ファイルのドラッグ&ドロップ
eIQで生成した2つのヘッダ・ファイルをIDEのsource\modelフォルダにドラッグ&ドロップでコピーします.
▼(2) モデル・ファイルの変更
model.cppの27行目のヘッダ・ファイルの指定を次のように変更します.ここではNPUを使うので,eiq-project_HandsOn_flower_2112_converted.hを指定します.
#include "eiq-project_HandsOn_flower_2112_converted.h"
▼(3) model_mobilenet_ops_npu.cppのオペレータの設定を変更
NPU用ヘッダ・ファイルのeiq-project_HandsOn_flower_2112_converted.hを開き,使っている6つのオペレータ・リストを確認します.
次に,model_mobilenet_ops_npu.cppのオペレータを,先ほど確認した6つのオペレータ・リストで上書きし,<>内のオペレータの数とオペレータ変数名も変更します.model_mobilenet_ops_npu.cppの変更例を次に示します.
static tflite::MicroMutableOpResolver<6> microOpResolver;
microOpResolver.AddQuantize();
microOpResolver.AddSlice();
microOpResolver.AddReshape();
microOpResolver.AddSoftmax();
microOpResolver.AddDequantize();
microOpResolver.AddCustom(tflite::GetString_NEUTRON_GRAPH(), tflite::Register_NEUTRON_GRAPH());
return microOpResolver;
▼(4) ヘッダ・ファイルのマクロ定義変更
2つのヘッダ・ファイルのマクロ定義を,次の内容に変更します.
#ifdef __arm__
#include
#else
#define __ALIGNED(x) __attribute__((aligned(x)))
#endif
#if defined(MCXN947_cm33_core0_SERIES)
#define __PLACEMENT __attribute__((section(".model")))
#else
#define __PLACEMENT
#endif
#define MODEL_NAME "mobilenet "
#define MODEL_INPUT_MEAN 127.5f
#define MODEL_INPUT_STD 127.5f
constexpr int kTensorArenaSize = 300000;
▼(5) ラベル情報の追加
source\modelフォルダに,次の内容のflower_labels.hを作成します.
const char* labels[] = {
"daisy",
"dandelion",
"rose",
"sunflowers",
"tulips",
};
output_postproc.cppの
#include "labels.h"
をコメントアウトして,
#include "flower_labels.h"
を追加します.
図2に示す[Build]アイコンをクリックして,プロジェクトをビルドします.ビルドが正常に完了すると,図3のような画面が表示されます.


▼(1) ボードとPCを接続
図4のように,開発用PCとFRDM-MCXN947を接続します.FRDM-MCXN947のJ17(MCU-LINK)と開発用PCをUSBケーブルで接続します.

▼(2) 書き込み&デバッガ起動
図5に示す[Debug]アイコンをクリックして,プロジェクトをマイコン・ボードに書き込みます.正常に書き込みが完了すると,図6のようにデバッガが起動します.


▼(3) USB-UARTシリアル通信の設定
Tera Termなどのターミナル・ソフトウェアを使用して,FRDM-MCXN947とシリアル通信を行います.次のように設定します.Tera Termでの設定例を図7に示します.
・ボーレート:115200bps
・データ:8ビット
・パリティ:なし
・ストップ・ビット:1ビット
・フロー制御:なし

▼(4) プログラムの実行
図8に示す[Resume]アイコンをクリックして,プログラムを実行します.すると,ターミナル画面に図9のように表示されます.
入力画像が95%の確率でdaisyと推論していて,その推論時間が28msであることを示しています.


(1) [入門]MCX N947:AI/ML画像認識サンプルコード実装 (日本語ブログ),NXP Tech Blog
(2) 中森 章;特集 第4部 第1章マイコンではじめるNPUプログラミング,Interface2025年6月号,CQ出版社.
FRDM基板プレゼント(計5名様) メール・マガジン「組み込みマイコン入門講座」読者アンケートにご協力ください
2025年4月~配信しているメール・マガジン「組み込みマイコン入門講座」について読者アンケートにご協力をお願い致します.メール・マガジンのアーカイブはこちらでも確認できます.
アンケートに回答頂いた方の中から抽選で5名様に,下記のいずれかのマイコン基板をプレゼント致します.
・FRDM-MCXA153
・FRDM-RW612
・FRDM-MCXN947
当選発表,および当選ボードの種類は,プレゼントの発送を持ってかえさせて頂きます.
アンケート・ページはこちら
・組み込みマイコン入門講座
-- https://interface.cqpub.co.jp/mcu-hands-on/
・登録内容の変更,メール・マガジン配信中止はこちらからお願いします.
-- https://cc.cqpub.co.jp/system/auth/








