NXP の「MCX N947」マイコンをベースに、ハンズオン形式で、画像認識サンプルコードの実装を紹介します。
1-1.ハンズオンの内容
1-2.ハンズオンの動作環境
2-1.SDK_2_14_0_FRDM-MCXN947のダウンロード
2-2.SDKをIDEにインストール
2-3.プロジェクトのビルド、デバッグ(書き込み)、実行 → デフォルトはStopwatch画像の認識
3-1.モデルトレーニング用画像データのダウンロード
3-2.eIQのGUIを使用してデータセットをインポート
3-3.モデルの訓練
3-4.モデルの訓練 (パラメータの設定)
3-5.モデルの検証
3-6.モデルのデプロイ (エクスポート)
3-7.モデルをヘッダーファイルに変換
4.Daisy(ヒナギク)の画像ファイル(.jpg)をヘッダファイルに変換
4-1.Pythonのセットアップ
4-2.画像ファイルの変換
5.Daisy画像のヘッダファイルをプロジェクトにポーティング
9.CPU(CM33)用のモデルはメモリ不足となり実行できない
================================
2-1.SDK_2_14_0_FRDM-MCXN947のダウンロード
2-2.SDKをIDEにインストール
2-3.プロジェクトのビルド、デバッグ(書き込み)、実行
<本プロジェクトのデフォルトの動作は、Stopwatch画像を認識する>
TeraTermなどのターミナルソフトを起動。 115200, 8bit, none, 1bit, noneに設定。
3.新規eIQモデルの作成・変換
3-1.モデルトレーニング用画像データのダウンロード
1.eIQポータルのGUIを使用する。
2.DeepView Importerコマンドラインツールを使用しVOC形式のデータセットをインポートする。
3.Pythonスクリプトを使用してフォルダ構造に基づいた画像をインポートする。
4.Pythonスクリプトを使用してTensorFlowから事前に作成されたデータセットをインポートする。
3-2.eIQのGUIを使用してデータセットをインポート
① Structured foldersを選択。
② SELECT DATA FOLDERをクリックし、ダウンロードした花のデータセットのフォルダflower_photosを選択。
③ IMPORTをクリックし、ファイル名を指定して保存。
3-3.モデルの訓練
3-4.モデルの訓練 (パラメータの設定)
3-5.モデルの検証
3-6.モデルのデプロイ (エクスポート)
3-7.モデルをヘッダーファイルに変換
dump-header-file; dump-header-file-input
備考:Custom optionsの設定でターゲットとなるプロセッサが異なります。
NPU向け: dump-header-file
CPU向け: dump-header-file-input
(MCX Nシリーズの場合CPUはCortex-M33になります)
今回のハンズオンでは、例としてNPU用とCPU用の両方のヘッダーファイルを生成していますが、実際の開発時には使用するプロセッサのものだけ生成すればよいです。 例えば、NPUを使用する場合はCustom optionsにdump-header-fileだけ記述してください。
4.Daisy(ヒナギク)の画像ファイル(.jpg)をヘッダファイルに変換
4-1.Pythonのセットアップ
① Windowsのコマンドプロンプトを開き、PythonコマンドがPython 3.9.xに対応していることを確認する。
python -V
② Pythonインストーラツールを更新する:
python -m pip install -U pip
python -m pip install -U setuptools
③ 以下のPythonパッケージをインストールする。これらのすべてがこのラボで使用されるわけではありませんが、他のeIQデモやスクリプトに役立つ。
④ Windowsの場合、Vim 9.0をインストールします。
⑤ Windowsコマンドプロンプトを開き、コマンドプロンプトに“xxd -v”と入力して、PATHが正しく設定されていることを確認する。
4-2.画像ファイルの変換
① ドキュメントフォルダの下にflower_daisyフォルダを作り、この中に102841525_bd6628ae3c.jpgを入れておく。
② コマンドプロンプトを開き、flower_daisyフォルダに移動する。
③ Pythonを起動する。
④ 以下の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)が生成される。
5.Daisy画像のヘッダファイルをプロジェクトにポーティング
6.モデルの置き換え
#include "eiq-project_HandsOn_flower_2112_converted.h"
- 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;
備考:eiq-project_HandsOn_flower_2112.h (CPU用のヘッダファイル)を使うときにも、同様の処理が必要で、CPU用に使用しているオペレータのリストをmodel_mobilenet_ops_npu.cppにコピーすること。
#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;
備考:プロジェクトを実行したときにFailed to resize buffer.が発生する場合は、次のようにサイズを300000に増やす。
constexpr int kTensorArenaSize = 300000;
const char* labels[] = {
"daisy",
"dandelion",
"rose",
"sunflowers",
"tulips",
};
#include "flower_labels.h"を追加。
7.ビルドと実行 (動作確認)
8.ハンズオンで使用した追加、変更したファイルについて
9.CPU(CM33)用のモデルはメモリ不足となり実行できない
// #include "eiq-project_HandsOn_flower_converted.h" // NPU
#include "eiq-project_HandsOn_flower.h" // CPU
10.まとめ
ポイント
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には、NXP代理店、もしくはNXPまでお問い合わせください。
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。