[入門]MCX N947: AI/ML画像認識サンプルコード実装

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

[入門]MCX N947: AI/ML画像認識サンプルコード実装

KeitaNaga
NXP Employee
NXP Employee
1 0 599

NXP の「MCX N947」マイコンをベースに、ハンズオン形式で、画像認識サンプルコードの実装を紹介します。

[アジェンダ]

1.ハンズオンについて

 1-1.ハンズオンの内容

 1-2.ハンズオンの動作環境

2.サンプルコードの動作確認

 2-1SDK_2_14_0_FRDM-MCXN947のダウンロード

 2-2SDKIDEにインストール

 2-3.プロジェクトのビルド、デバッグ(書き込み)、実行 → デフォルトはStopwatch画像の認識

3.新規eIQモデルの作成・変換

 3-1.モデルトレーニング用画像データのダウンロード

 3-2eIQGUIを使用してデータセットをインポート

 3-3.モデルの訓練

 3-4.モデルの訓練 (パラメータの設定)

 3-5.モデルの検証

 3-6.モデルのデプロイ (エクスポート)

 3-7.モデルをヘッダーファイルに変換

4.Daisy(ヒナギク)の画像ファイル(.jpg)をヘッダファイルに変換

 4-1Pythonのセットアップ

 4-2.画像ファイルの変換

5.Daisy画像のヘッダファイルをプロジェクトにポーティング

6.モデルの置き換え

7.ビルドと実行 (動作確認)

8.ハンズオンで使用した追加、変更したファイルについて

9.CPU(CM33)用のモデルはメモリ不足となり実行できない

10.まとめ

================================

1.ハンズオンについて

 

1-1.ハンズオンの内容

  • 最初にSDKに含まれている画像認識(ストプウォッチを認識する)のサンプルプロジェクトを評価ボード上で動かす手順を説明します。
  • 次に、eIQを使用して花の画像データを学習させ、生成したモデルをMCX NNPUで動作させるためのヘッダファイルに変換する方法を説明します。
  • 動作確認用のDaisy(ヒナギク)の画像ファイル(JPEG)をヘッダファイルに変換する方法を説明します。
  • 最初に動かしたサンプルプロジェクトにeIQで作成したモデル(ヘッダファイル)Daisyのヘッダファイルを組み込み、花の画像認識用のプログラムに変更します。
  • 最後に修正版のプロジェクトを動かしてDaisyと認識できることを確認します。

 

1-2.ハンズオンの動作環境

  • ハードウェア
  • ソフトウェア
    • MCUXpresso IDEv11.9.0
    • MCUXpresso SDKSDK_2_14_0_FRDM-MCXN947
      • サンプルコード:frdmmcxn947_tflm_label_image
    • eIQ Toolkitv1.11.4 (eIQ Portal 2.11.2)
    • PythonPython 64-bit 3.9.x**以降を推奨 (64ビットエディションが必要)

 

2.サンプルコードの動作確認

2-1SDK_2_14_0_FRDM-MCXN947のダウンロード

 KeitaNaga_0-1725242404141.png

  • mcxn947で検索し、FRDM-MCXN947を選択して、Build MCUXpressoSDKをクリック。

 KeitaNaga_1-1725242467835.png

  • Host OSeIQのチェックを確認し、DOWNLOAD SDKをクリック。

 KeitaNaga_2-1725242544793.png

  • 準備が整ったらDownload SDKをクリック。

 KeitaNaga_3-1725242617663.png

  • ライセンスアグリメントの内容を確認し、AGREEをクリックしてからファイルを保存する。

 KeitaNaga_4-1725242653142.png

 

2-2SDKIDEにインストール

  • WindowsのスタートメニュからMCUXpresso IDEを起動。
    • 参考:ワークスペースとして、MCXN9-FRDM_eIQ_HandsOnを作成。
  • ダウンロードしたSDKInstalled SDKsウィンドウにドラッグ&ドロップ。

 KeitaNaga_6-1725242848881.png

  • Import SDK example(s)…をクリック、frdmmcxn947を選択してNextをクリック。

 KeitaNaga_5-1725242761664.png

  • Examplesウィンドウで、eiq_examplestflm_label_imageを選択してFinishをクリック。

 KeitaNaga_7-1725242915733.png

  • SDKが正常にインストールできた状態。

 KeitaNaga_8-1725242956877.png

 

2-3.プロジェクトのビルド、デバッグ(書き込み)、実行

<本プロジェクトのデフォルトの動作は、Stopwatch画像を認識する>

  • Buildアイコンをクリックしてプロジェクトをビルド。

 KeitaNaga_23-1725246816700.png

  • 正常にビルドが終了した画面。

 KeitaNaga_11-1725243033557.png

  • ホストPCFRDM-MCXN947J17(MCU-LINK)USBで接続。

 KeitaNaga_12-1725243057783.png

  • Debugアイコンをクリックしてコードをフラッシュに書き込む。

 KeitaNaga_13-1725243085287.png

  • 正常に書き込め、デバッガが起動した状態。

 KeitaNaga_14-1725243124193.png

TeraTermなどのターミナルソフトを起動。 115200, 8bit, none, 1bit, noneに設定。

 KeitaNaga_15-1725243156910.png

  • Resumeアイコンをクリックしてプログラムを実行。

 KeitaNaga_1-1725243385024.png

  • ターミナル画面で結果を確認。 (Detected: stopwatchと表示される)

 KeitaNaga_2-1725243400383.png

 

3.新規eIQモデルの作成・変換

3-1.モデルトレーニング用画像データのダウンロード

  • eIQプロジェクトにデータをインポートする方法は4つあります。

1eIQポータルのGUIを使用する。

2DeepView Importerコマンドラインツールを使用しVOC形式のデータセットをインポートする。

3Pythonスクリプトを使用してフォルダ構造に基づいた画像をインポートする。

4Pythonスクリプトを使用してTensorFlowから事前に作成されたデータセットをインポートする。

  • 今回は3番のフォルダ構造を用いた花の画像をインポートする。
  • 以下のURLからモデル作成用の花のデータセットをダウンロード。
    • http://download.tensorflow.org/example_images/flower_photos.tgz
      • 参考:ドキュメントフォルダにダウンロードし、解凍する。
    • 解凍したフォルダ内のLICENSE.txtを消去。
    • Pythonスクリプトが必要とするイメージのフォルダ構造(testtrainvalidate)に手動で変更する。

 KeitaNaga_4-1725243484708.png

3-2eIQGUIを使用してデータセットをインポート

  • WindowsのスタートメニュからeIQ Toolkit内のeIQ Portalを起動。

KeitaNaga_5-1725243515559.png

  • SETTINGメニューより、Neutron converterMCUXpresso SDK 2.14.0を選択。 (使用するSDKのバージョンを選択する)

 KeitaNaga_6-1725243530148.png

  • CREAT PROJECT Import datasetをクリック。

 KeitaNaga_7-1725243545458.png

Structured foldersを選択。

 KeitaNaga_8-1725243580730.png

SELECT DATA FOLDERをクリックし、ダウンロードした花のデータセットのフォルダflower_photosを選択。

 KeitaNaga_9-1725243601484.png

IMPORTをクリックし、ファイル名を指定して保存。

  • 参考:ドキュメントフォルダの下に、eiq-project_HandsOn_2112.eiqpを作成。

 KeitaNaga_10-1725243625537.png

  • インポート完了時の画面

 KeitaNaga_11-1725243638431.png

 

3-3.モデルの訓練

  • SELECT MODELをクリック。

 KeitaNaga_12-1725243716370.png

  • Classification Performance NPUの順にクリック。

 KeitaNaga_13-1725243742997.png

 

3-4.モデルの訓練 (パラメータの設定)

  • 各パラメータの設定内容
    • Input Size            128,128,3
    • Learning Rate      0.01
    • Epochs To Train   Infinity
    • Enable QAT         有効
  • START TRAININGをクリック。

 KeitaNaga_14-1725243782051.png

  • モデルの訓練が終了した状態。

 KeitaNaga_15-1725243809579.png

 

3-5.モデルの検証

  • VALIDATEをクリック。

 KeitaNaga_16-1725243865378.png

  • Use Quantized Modelを有効して、VALIDATEをクリック。

 KeitaNaga_17-1725243892290.png

  • モデルの検証が終了した状態。

 KeitaNaga_18-1725243904086.png

 

3-6.モデルのデプロイ (エクスポート)

  • DEPLOYをクリック。

 KeitaNaga_19-1725243974713.png

  • Export File TypeTensorFlow LiteExport Quantized Modelを有効にして、EXPORT MODELをクリック。

 KeitaNaga_20-1725243994477.png

  • ファイル名を指定して保存をクリック。
    • 参考:eiq-project_HandsOn_flower_2112.tfliteとする。

 KeitaNaga_21-1725244015313.png

  • ドキュメントフォルダにeiq-project_HandsOn_flower_2112.tfliteが生成される。

 KeitaNaga_22-1725244029837.png

 

3-7.モデルをヘッダーファイルに変換

  • eIQ Portalのトップ画面から、MODEL TOOLをクリック。 トップ画面にはWORKSPACESメニュー → Homeで戻れます。

 KeitaNaga_25-1725244135412.png

  • Open Model...をクリック。

 KeitaNaga_24-1725244119913.png

  • 保存しておいたeiq-project_HandsOn_flower_2112.tfliteを開く。

 KeitaNaga_26-1725244159324.png

  • メニューから、Convert TensorFlow Lite for Neutron (.tflite)を選択。

 KeitaNaga_27-1725244181244.png

  • Conversion Optionsを次のように設定し、Convertをクリック。

    dump-header-file; dump-header-file-input

 KeitaNaga_28-1725244208816.png

備考:Custom optionsの設定でターゲットとなるプロセッサが異なります。

             NPU向け:  dump-header-file

             CPU向け:   dump-header-file-input

              (MCX Nシリーズの場合CPUCortex-M33になります)

 

今回のハンズオンでは、例としてNPU用とCPU用の両方のヘッダーファイルを生成していますが、実際の開発時には使用するプロセッサのものだけ生成すればよいです。 例えば、NPUを使用する場合はCustom optionsdump-header-fileだけ記述してください。

 

  • ファイル名を確認して、Exportをクリック。 (NPU用の場合は、ファイル名にconvertedが追加される)

 KeitaNaga_29-1725244266876.png

  • CLOSEをクリックして変換終了。

 KeitaNaga_30-1725244278317.png

  • 変換結果を確認。
    • NPU(eiq-project_HandsOn_flower_2112_converted.tflite)ではNeutronGraph関数が使用されている)

 KeitaNaga_31-1725244305793.png

  • 次の2つの.tfliteファイルに対して各々ヘッダファイル(.h)が生成される。

 KeitaNaga_32-1725244326403.png

  • NPU用のファイル名にはconvertedが含まれるので、CPU用と区別がつきます。

 

 

4Daisy(ヒナギク)の画像ファイル(.jpg)をヘッダファイルに変換

  • モデルトレーニング用画像データにある次のJPEGファイルをヘッダファイルに変換する。
    • flower_photos/daisy/102841525_bd6628ae3c.jpg

 

4-1Pythonのセットアップ

① Windowsのコマンドプロンプトを開き、PythonコマンドがPython 3.9.xに対応していることを確認する。

 python -V

Pythonインストーラツールを更新する:

 python -m pip install -U pip

 python -m pip install -U setuptools

③ 以下のPythonパッケージをインストールする。これらのすべてがこのラボで使用されるわけではありませんが、他のeIQデモやスクリプトに役立つ。

  • python -m pip install numpy scipy matplotlib ipython jupyter pandas sympy nose imageio
  • python -m pip install netron seaborn west pyserial sklearn opencv-python pillow

Windowsの場合、Vim 9.0をインストールします。

Windowsコマンドプロンプトを開き、コマンドプロンプトに“xxd -v”と入力して、PATHが正しく設定されていることを確認する。

 

4-2.画像ファイルの変換

① ドキュメントフォルダの下にflower_daisyフォルダを作り、この中に102841525_bd6628ae3c.jpgを入れておく。

② コマンドプロンプトを開き、flower_daisyフォルダに移動する。

③ Pythonを起動する。

 KeitaNaga_1-1725245193173.png

④ 以下の6つのコマンドを順番に実行する。 (最後の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)

⑤ 以下のようにヘッダファイル(daisy.h)が生成される。

 KeitaNaga_2-1725245210919.png

 

 

5Daisy画像のヘッダファイルをプロジェクトにポーティング

  • IDEProject Explorerウィンドウでデフォルトのプロジェクトfrdmmcxn947_tflm_label_imageを右クリックし、Copy Pastしてfrdmmcxn947_tflm_label_image_2112を作る。
  • daisy.hを新しいプロジェクトのsource\imageフォルダにドラッグ&ドロップでコピー。

 KeitaNaga_3-1725245266826.png

  • image_load.c#include “image_data.h”をコメントアウトし、#include “daisy.h”を追加。

 KeitaNaga_4-1725245289451.png

 

 

6.モデルの置き換え

  • eIQで生成した2つのヘッダファイルをIDEsource\modelフォルダにドラッグ&ドロップでコピー。

 KeitaNaga_5-1725245320374.png

  • モデルファイルの変換
    • model.cpp27行目のヘッダファイルの指定を次のように変更する。 (NPUを使う場合の設定)

  #include "eiq-project_HandsOn_flower_2112_converted.h"

 KeitaNaga_6-1725245333178.png

  • model_mobilenet_ops_npu.cppのオペレータの設定を変更。
    • eiq-project_HandsOn_flower_2112_converted.h (NPU用のヘッダファイル)を開き、使用している6つのオペレータのリストを確認。

 KeitaNaga_7-1725245368762.png

 - model_mobilenet_ops_npu.cppのオペレータを上記リストで上書きしたら、<>内のオペレータの数とオペレータ変数名(s_microOpResolver microOpResolver)も変更。

 

  NPUを使う場合の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;

 KeitaNaga_8-1725245512728.png

備考:eiq-project_HandsOn_flower_2112.h (CPU用のヘッダファイル)を使うときにも、同様の処理が必要で、CPU用に使用しているオペレータのリストをmodel_mobilenet_ops_npu.cppにコピーすること。

 

  • 2つのヘッダファイル(eiq-project_HandsOn_flower_2112_converted.heiq-project_HandsOn_flower_2112.h)のマクロ定義を以下の内容に変更。

#ifdef __arm__

#include <cmsis_compiler.h>

#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;

 KeitaNaga_9-1725245613802.png

備考:プロジェクトを実行したときにFailed to resize buffer.が発生する場合は、次のようにサイズを300000に増やす。

constexpr int kTensorArenaSize = 300000;

 KeitaNaga_10-1725245664061.png

  • ラベル情報の追加
    •  source\modelフォルダに次の内容のflower_labels.hを作成。

const char* labels[] = {

                      "daisy",

                      "dandelion",

                      "rose",

                      "sunflowers",

                      "tulips",

};

 KeitaNaga_11-1725245703979.png

  • output_postproc.cpp#include "labels.h"をコメントアウトし、

#include "flower_labels.h"を追加。

KeitaNaga_12-1725245726032.png

 

 

7.ビルドと実行 (動作確認)

  • Buildアイコンをクリックしてプロジェクトをビルド。

 KeitaNaga_13-1725245747197.png

  • 正常にビルドが終了した画面。

 KeitaNaga_14-1725245761542.png

  • ホストPCFRDM-MCXN947J17(MCU-LINK)USBで接続。

 KeitaNaga_15-1725245786125.png

  • Debugアイコンをクリックしてコードをフラッシュに書き込む。

 KeitaNaga_16-1725245796856.png

  • 正常に書き込め、デバッガが起動した状態。

 KeitaNaga_18-1725245842681.png

 

  • TeraTermなどのターミナルソフトを起動。 115200, 8bit, none, 1bit, noneに設定。

 KeitaNaga_19-1725245854395.png

  • Resumeアイコンをクリックしてプログラムを実行。

 KeitaNaga_20-1725245866642.png

  • ターミナル画面で結果を確認。 (Detected: daisyと表示される)

 KeitaNaga_21-1725245884775.png

 

 

8.ハンズオンで使用した追加、変更したファイルについて

  • インポートする必要があるファイル
    • daisy.h                                                                    (Daisyのヘッダファイル)
    • eiq-project_HandsOn_flower_2112_converted.h    (モデルのヘッダファイル:NPU)
    • eiq-project_HandsOn_flower_2112.h                     (モデルのヘッダファイル:CPU)
    • flower_labels.h                                                        (Flowerモデル用のラベルファイル)

 

  • 修正する必要があるファイル
    • image_load.c
    • model.cpp
    • model_mobilenet_ops_npu.cpp
    • eiq-project_HandsOn_flower_2112_converted.h
    • eiq-project_HandsOn_flower_2112.h
    • flower_labels.h
    • output_postproc.cpp

 

 

9CPU(CM33)用のモデルはメモリ不足となり実行できない

  • model.cppCPU用のモデルを選択した場合、SRAM不足となり実行ができない。
    • MCX N947SRAM384KB

// #include "eiq-project_HandsOn_flower_converted.h" // NPU

#include "eiq-project_HandsOn_flower.h"  // CPU

 KeitaNaga_22-1725245994987.png

 

 

10.まとめ

  • 画像認識を利用してサンプルのOK/NG判定をするアプリケーションを想定したときの、eIQIDEを使用した開発手順を説明していますので参考にしてください。

ポイント

  • eIQのデータセットにStructured foldersを使用し、Pythonスクリプトが必要とするイメージのフォルダ構造(testtrainvalidate)にデータを用意する。
  • eIQでモデルの訓練、検証、デプロイを行い、マイコン用のコード(ヘッダファイル)を生成する。
  • MCUXpresso IDEにコードを取り込み実行する。

 

=========================

本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。

お手数をおかけしますが、お問い合わせの際には、NXP代理店、もしくはNXPまでお問い合わせください。

FRDM-MCXN947 MCX-N94X-N54X