作成したAIモデルをマイコンで動かす


写真1 NPU内蔵マイコンを搭載する開発ボードFRDM-MCXN947

インターフェース編集部 編

★オンライン無料聴講の申し込み受付中★
NPUマイコンではじめるエッジAI開発
・開催日  :2025年12月4日 14:00-17:00
・使用ボード:FRDM-MCXN947(NXPセミコンダクターズ)
・講師   :笹尾 幸良氏(株式会社Acculus CEO)
申し込みページはこちら

<PR>NXP Technology Days 2025 Tokyo開催
 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

■[3] 画像をテキスト・ファイルに変換

 マイコンで実行するAIモデルに入力する画像をテキスト・ファイルに変換します.ここでは,daisy(ヒナギク)のデータセットの中にある次の画像を入力して,ヒナギクであると認識することを試します.

flower_photos/daisy/102841525_bd6628ae3c.jpg

 Pythonを使って,JPEGファイルをC/C++言語が取り込めるテキスト・ファイルに変換します.

●手順1…Pythonのセットアップ

▼(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

●手順2…画像ファイルの変換

▼(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).


図1 JPEG形式の画像ファイルをテキスト形式のヘッダ・ファイルに変換する

■[4] 画像のヘッダ・ファイルをポーティングする

 作成した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”
を追加する

■[5] モデルの置き換え

 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"
を追加します.

■[3] プロジェクトのビルドと書き込み

●手順1…ビルド

 図2に示す[Build]アイコンをクリックして,プロジェクトをビルドします.ビルドが正常に完了すると,図3のような画面が表示されます.


図2 プロジェクトのビルド


図3 ビルドが正常に完了した様子


●手順2…書き込み

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


図4 開発用PCとマイコン・ボードFRDM-MCXN947の接続

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


図5 デバッガを起動する[Debug]アイコン


図6 書き込みが正常に完了しデバッガが起動した様子


▼(3) USB-UARTシリアル通信の設定
 Tera Termなどのターミナル・ソフトウェアを使用して,FRDM-MCXN947とシリアル通信を行います.次のように設定します.Tera Termでの設定例を図7に示します.

・ボーレート:115200bps
・データ:8ビット
・パリティ:なし
・ストップ・ビット:1ビット
・フロー制御:なし


図7 シリアル通信の設定内容


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


図8 デバッガでプログラムの実行を開始する[Resume]アイコン


図9 サンプル・プログラムを実行したときのターミナル(Tera Term)画面


◆参考文献◆

(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/


Interface 表紙

CQ出版社オフィシャルウェブサイトはこちらからどうぞ

CQ出版の雑誌・書籍のご購入は、ウェブショップで!


CQ出版社 新刊情報



別冊CQ ham radio QEX Japan No.57

巻頭企画 ベランダに設置したシンプルなHF帯3バンド垂直アンテナ

CQ ham radio 2025年12月号

現代版アマチュア無線の楽しみ方

POWER ELECTRONICSシリーズ

力率改善 PFCによるACパワーの有効活用技術

ボード・コンピュータ・シリーズ

Linuxコマンド&シェル・スクリプト入門

トライアルシリーズ

NanoVNA測定で電子回路マスタ