こんにちは、NXPサポートチームの皆さん、
私たちはNeutron SDK v3.1.3を用いてFRDM i.MX95プラットフォーム上の物体検出を評価していますまた、NPU互換モデルを生成できません。Neutronコンバータはモデルを正常にロードしますが、 Neutron NPUに割り当てられたオペレーターは0個と報告します。
対象ボード:FRDM i.MX95
Neutron SDK: 3.1.3
Ultralytics: YOLO11とYOLOv8の両方でテスト済み
eIQツールキット:ONNXからTFLiteへの変換に使用
モデル:カスタムの単一クラスペグ検出器
$ yolo detect train \ model=yolov11n.pt \ data=/visual_inspect_yolo/dataset/dataset.yaml \ imgsz=640 \ epochs=100 \ batch=16 \ project=モデル \ name=peg_detector_v8
$ yolo export \ model=models/peg_detector_v84/weights/best.pt \ format=tflite \ int8=True \ data=/visual_inspect_yolo/dataset/dataset.yaml
また、別のワークフローもテストしました。
PyTorchをエクスポート → ONNX
NXP eIQツールキットを使用してONNXをINT8 TFLiteに変換する
Neutron SDKでコンパイルした場合、両方のワークフローは同じ結果を生み出しました。
~/Downloads/eiq-neutron-sdk-linux-3.1.3/bin/neutron-converter--target imx95 --input best_int8.tflite --output my_model_int8_npu.tflite
コンバーターは次のように報告しています:
インポート後のオペレーター数:341
最適化後の演算子数:367
変換された演算子: 0
オペレーター変換率:0 / 367
Number of Neutron graphs: 0
警告:
以下のケースでも同様の挙動が観察されました。
YOLO11
YOLOv8
ダイレクトUltralytics TFLiteエクスポート
ONNX → eIQ ツールキット → INT8 TFLite
生成されたすべてのTFLiteモデルは、Neutronコンパイラによって 0演算子をマッピング します。
YOLOv8またはYOLO11のオブジェクト検出モデルは、i.MX95用のNeutronコンパイラで公式にサポートされているのでしょうか?
i.MX95 NPUをターゲットにしたYOLOモデル向けの推奨エクスポートパイプラインはありますか?
現在のNeutron SDK(v3.1.3)には既知の制限はありますか?YOLO検出ヘッドに関してですか?
NXPはi.MX95 NPU向けに正常にコンパイルできるリファレンスYOLOv8/YOLO11モデルを提供していますか?
演算子マッピングを有効にするために、追加のコンパイラオプションや前処理手順が必要ですか?
i.MX95 Neutron NPUで動作することが知られているガイダンス、推奨ワークフロー、または参照モデルがあればぜひ教えていただけるとありがたいです。
よろしくお願いします。
そして、あなたの人生を本当に大切にしてください。
もし本当に 、私がこのゲームを望むなら、私はこのゲームを L に x x 95 でイノシシd.
私たちは今、AR A2 を手に入れたので、そのキャパビリのつながりと 、あなたたちの兄弟の絆を活用します。 私たちはNXで実際にデモを作ったことがあるし、あなたはこのマットで最初に知られるだろうと、もっと早くアプリに報告されるだろう.
あなたの LPに感謝します。
eIQ Model zooのyolo8mモデルをimx95ボードで試し、LF 2026年Q2リリースイメージを使いました。カーネルバージョンはNeutron SDK 3.1.2を使用して6.18.2です。うまくいく。
まずは以下から試してみることもできます:
wget https://huggingface.co/EdgeFirst/yolov8-det/resolve/main/imx95/yolov8n-det-int8-smart.imx95.tflite
root@imx95evk:/usr/bin/tensorflow-lite-2.19.0/examples# ./benchmark_model--graph=yolov8n-det-int8-Smart.imx95.tflite --external_delegate_path=/USR/LIB/libneutron_delegate.so
詳細はREADMEのeiq-model-zoo/tasks/ビジョン/object-detection/yolov8を参照してください。NXP/eiq-model-zoo
さらに、モデルやコンプリエーションの詳細なログを添付することもできます。
コンバーターログに基づくと、最初に解決すべき問題は、生成されたTFLiteモデルに依然としてFLOAT演算子が含まれていることです。
警告:グラフにはサポートされていない浮動小数点演算子が含まれています!
i.MX95 Neutronの場合、ニュートロンコンバータへの入力は、演算子と量子化フォーマットがNeutronコンパイラと互換性のあるTFLiteモデルでなければなりません。特に、i.MX95中性子流は量子化されたTFLiteと対称int8重みを期待しています。UltralyticsエクスポートやONNXからTFLiteへの変換後もモデルにFLOAT演算子/テンソルが残っている場合、コンバーターは報告された結果と整合するNeutron互換の部分グラフを作成できない可能性があります。
変換された演算子: 0
中性子グラフの数:0
YOLOv8はi.MX95上で一部のフローにおいて評価されていますが、任意のUltralyticsエクスポートにおいて、エンドツーエンドのYOLOv8/YOLO11オフロードが完全に実現されるとは限りません。エクスポートされたTFLiteグラフによっては、モデルの一部のみがNeutronGraphに変換され、サポートされていない演算子はCPU上に残ります。したがって、次の推奨ステップは生成されたTFLiteモデルを検査・プロファイリングし、以下のことを確認することです:
また、Neutron-Converter版とボード上のNeutronランタイム/ファームウェア/デリゲートが同じ互換性のあるSDK/BSPリリースから来ていることも確認してください。
推奨される手順として、NXP/eIQ変換パスをお試しください。
PyTorch -> 静的入力形状のONNX -> 代表的な較正データを用いたNXP/eIQ量子化 ->量子化されたTFLite -> Neutron-converter --ターゲットIMX95
モデルにuint8の入力/出力テンソルがある場合は、以下もテストしてください:
--入力値をuint8からint8に変換
--出力をuint8からint8に変換
FLOAT演算子を削除した後も変換結果にマッピングされた演算子が0と表示される場合は、以下の情報を共有してください。
- 詳細/プロファイリング出力を含む完全な中性子変換ログ
- TFLiteオペレーターリスト、
- テンソルデータ型と量子化パラメータ、
- FRDM i.MX95ボード上のBSP/実行時Neutronデリゲート/ファームウェアバージョンの正確なバージョン、
- YOLO検出ヘッドにNMSやその他の後処理が含まれているかどうか。
私のテストでは、 自分でトレーニングもエクスポートもしていません。eIQ Model Zooのプリ生成されたYOLOv8モデルを使い、i.MX95プラットフォームで動作することを確認しました。
私が実際に使用したコマンドはこれだけです。
./benchmark_model \
--graph=yolov8n-det-int8-smart.imx95.tflite \
--external_delegate_path=/usr/lib/libneutron_delegate.so
「
モデルでは:
wget https://huggingface.co/EdgeFirst/yolov8-det/resolve/main/imx95/yolov8n-det-int8-smart.imx95.tflite
カスタムモデルの場合、推奨されるNXPフローは以下の通りです:
PyTorch
↓
ONNX(静的入力形状)
↓
eIQツールキット ONNX2Quant
↓
eIQツールキット ONNX2TFLite
↓
量子化されたTFLite
↓
Neutron-converter --ターゲットIMX95
あなたのモデルが報告しているので:
プレーンテキスト
変換された演算子: 0
Number of Neutron graphs: 0
警告:グラフにはサポートされていない浮動小数点演算子が含まれています!
あなたの生成されたTFLiteグラフは、eIQ Model Zooの参照モデルとは構造的に異なるのではないかと推測しています。まず最初におすすめしたいのは、以下の2つのモデルを比較することです:
推奨されるエンドツーエンドのワークフロー
お好みのフレームワークを使用してトレーニングしてください。
物体検出に関しては、NXPはすでにeIQモデルズーでYOLO参照レシピを提供しており、YOLOv8オブジェクト検出モデルも含まれています。[github.com] 、[github.com]
例:
シェル
YOLO検出トレーニング
model=yolov8n.pt \
data=dataset.yaml \
imgsz=640 \
エポック数=100
`
NXPは一般的に、量子化および展開の前に、交換フォーマットとしてONNXを使用することを推奨しています。
YOLOエクスポート
model=best.pt \
フォーマット=onnx
Neutron イネーブルメントのプレゼンテーションは、以下に基づくフローを明示的に記述しています:
プレーンテキスト
PyTorch
↓
ONNX
↓
量子化
↓
TFLite
↓
Neutron コンバータ
訓練アーティファクトから直接展開を狙うのではなく、
Neutronのワークフロードキュメントでは、eIQ Toolkitの量子化ユーティリティの使用を推奨しています:
python -m onnx2quant \
model.onnx \
-o model_quant.onnx \
-c input::
「
に続く:
python -m onnx2tflite \
model_quant.onnx \
-o model_int8.tflite
もっと行を表示
この流れはi.MX95 Neutron イネーブルメント材料に明示的に記録されています。
Neutron-converter \
--ターゲット imx95 \
--input model_int8.tflite \
--出力 model_neutron.tflite
ニュートロンコンバーターは、NPUにオフロードできるNeutron特有のグラフパーティションを作成します。
NPUのデプロイが成功すると、以下のようなレポートが表示されます。
変換されたオペレーターの数 > 0
Number of Neutron graphs > 0
次のような場合:
変換された演算子: 0
Number of Neutron graphs: 0
この場合、モデルはNPUによって加速されていません。
あなたの抱えている問題は、このカテゴリーに該当します。
TensorFlow LiteでNeutronデリゲートを使い実行します:
./benchmark_model \
--graph=model_neutron.tflite \
--external_delegate_path=/usr/lib/libneutron_delegate.so
「
または
./label_image \
--external_delegate_path=/usr/lib/libneutron_delegate.so
i.MX Machine Learning User Guideでは、 Neutron Delegate がi.MX95 TensorFlow Liteモデルの加速機構として特定されています。
yolov8m_full_integer_quant.tfliteをどのように変換してIMX95のNPUで動作させたのか教えてもらえますか?
手順に従って環境設定データ(HOST)を経て...私たちにとって大いに助けになるでしょう。
こんにちは
私はUbuntu 24.04を使用していますが、eiq_toolkitは20.04.03でのみ利用可能です。
eiqToolkitとeIQ Toolkitを使った量子化の使い方
eIQ ToolkitはUbuntu 20.04で検証済みであるため、最も安全な方法は以下のとおりです。
Docker
Ubuntu 24.04ホスト上でUbuntu 20.04コンテナを実行します。
docker run -it --name eiq \
ubuntu:20.04 /bin/bash
次に、コンテナ内に必要な依存関係とeIQ Toolkitをインストールします。
eIQ Toolkit(onnx2quant)を使ってカスタムYOLOv8 ONNXモデルを変換する際に信頼度を維持できない
こんにちは、NXPチームの皆さん、
私はfdm i.MX95上でeIQ Toolkitを使ってカスタムYOLOv8単一クラスオブジェクト検出モデルを展開しようとしています。
変換パイプライン全体は正常に実行されますが、onnx2quant の後、信頼度出力がすべてゼロになり、バウンディングボックス出力は有効なままです。
- Ubuntu 24.04
- Python 3.10
- eIQ ONNX2TFLite 0.9.0
- ONNX ランタイム 1.21.1
- テンソルフロー 2.21
- Neutron-コンバータ 3.1.3
- ターゲット:FRDM i.MX95(tflite_runtime 2.19+Neutronデリゲート)
1. 列車
Yolo Detect Train Model=yolov8N.pt data=dataset.yaml imgsz=640 epochs=50
2. ONNXのエクスポート
Yolo export model=best.pt format=onnx opset=13
3. ONNXの検証
入力:(1,3,640,640)
出力:(1,5,8400)
ONNXランタイム推論:
信頼チャネル最大値 = 0.773
4. キャリブレーションデータセットの生成
形状:(1,3,640,640)
dtype : float32
範囲:0.0 - 1.0
5. 量子化
onnx2quant best.onnx -c "images;キャリブレーション/画像」 -o best_quant.onnx
また、以下の項目もテストしました。
onnx2quant best.onnx -u
どちらも同じ結果を生み出す。
6. 量子化されたONNXの検証
出力:(1,5,8400)
バウンディングボックスチャネルは有効のままです。
自信:
最小値 = 0
最大値 = 0
平均 = 0
デコードされた検出数 = 0
7. TFLite形式に変換する
onnx2tflite best_quant.onnx -o best.tflite
8. Compile for Neutron
Neutron-converter --ターゲット IMX95 --入力 best.tflite --出力 best_neutron.tflite
コンパイルに成功しました。
オペレーター変換率:278 / 325 (85.5%)
検証済み:
• PyTorchモデルの動作
• ONNX輸出作品
• ONNXランタイム推論の動作
• キャリブレーションデータセットは正確です
• 実数およびランダムキャリブレーションで同一の結果が得られます
• TFLiteは量子化されたONNX出力を再現します
• NeutronはTFLite出力を再現します
この問題は以下以下に初めて現れます:
ONNX
↓
onnx2quant
↓
量子化されたONNX(信頼度がゼロになる)
NXPの参照モデル:
入力:(1,640,640,3) INT8
出力:(1,84,8400)INT8
私の改造モデル:
入力:(1,3,640,640) FLOAT32
出力:(1,5,8400) FLOAT32
カスタムYOLOv8モデルの信頼度を保つ推奨されるエクスポートや量子化のワークフローはありますか?
これは、(1,5,8400)出力を持つモデルのonnx2quantの制限やバグでしょうか?
AEチームと話し合っています。
Ara240のエンドツーエンド評価は実施されましたか?データシートには、シグモイドやNMSなどの後処理操作を実行できる2つのベクターコアが記載されています。コンパイラはNMSの操作をベクターコアにマッピングできますか?
YOLOv8の出力テンソルに適用される完全なINT8量子化( inference_output_type=tf.int8 )の根本的な制限により、信頼度出力が失われます。
YOLOv8 は、境界ボックスの座標と信頼度スコアを(1, 5, 8400)の形状の単一の出力テンソルにパックします。bboxの値は広いダイナミックレンジ(約640ピクセル)を持ち、信頼度スコアは約0から1の範囲にあります。出力テンソル全体が単一の量子化スケールを共有する場合、そのスケールは大きなbbox値(約640)によって支配され、信頼区間全体(約1)を表すために1つの整数レベルのごく一部しか残されません。その結果、INT8量子化後、すべての信頼度値は実質的にゼロに丸められます。
推奨される解決策
onnx2quantを通す代わりに、Ultralyticsを使って訓練した .pt モデルからINT8 TFLiteを直接エクスポートし、それを neutron-converterに入力します:
# INT8 TFLite 直接エクスポート(キャリブレーションはトレーニングデータセットを使用)
yolo export model=best.pt \
format=litert \
imgsz=640 \
quantize=8 \
data=dataset.yaml \
fraction=0.1
# ニュートロン 用 にコンパイル(変更なし)
ニュートロンコンバーター --target imx95 --input best_int8.tflite --output best_neutron.tflite
入力および出力データの型は、np.int8であることを確認してください。
interp = tf.lite.Interpreter(model_path=TFLITE_INT8) interp.allocate_tensors()inp_d = interp.get_input_details()[0]out_ds = interp.get_output_details()inp_scale、inp_zp = inp_d[ "quantization" ] out_d = out_ds[0] out_scale、out_zp = out_d[ "quantization" ] print(f " 入力 dtype={inp_d['dtype']} shape={inp_d['shape'].tolist()}" f " quant=(scale={inp_scale:.6f}, zp={inp_zp})" ) print(f " 出力 dtype={out_d['dtype']} shape={out_d['shape'].tolist()}" f " quant=(scale={out_scale:.6f}, zp={out_zp})" )# 形状から入力フォーマットを決定します in_shape = inp_d[ "shape" ].tolist()# [1,3,640,640] または [1,640,640,3] in_shape[1] == 3 の場合: #NCHW src=img_nchw それ以外: #NHWC src=img_nhwcif inp_d[ "dtype" ] == np.int8: src_int8 = np.clip(np.round(src/ inp_scale + inp_zp), -128, 127).astype(np.int8) interp.set_tensor(inp_d[ "インデックス" ],src_int8) それ以外: interp.set_tensor(inp_d[ "インデックス" ],src.astype(np.float32))interp.invoke()raw_out = interp.get_tensor(out_d[ "index" ])# int8 または float32 の可能性があります if out_d[ "dtype" ] == np.int8: dq_out = (raw_out.astype(np.float32) - out_zp) * out_scale それ以外: dq_out = raw_out.astype(np.float32)dq_out= dq_out[0] # (5, 8400) 正規化 # 表示用にバウンディングボックスをピクセル座標に再スケーリング BBOX_SCALE = 640.0tfl_bbox = dq_out[:4] * BBOX_SCALE # (4, 8400) tfl_conf = dq_out[4] # (8400,)
遅れてごめんなさい。変換ワークフローを再現しようとしています。
今のところ一つ質問ですが、なぜ変換されたモデルのデータ型がFLOAT32なのか?INT8形式への変換を試してみましたか?ニュートロンNPUはINT8型を入力データとして必要とします。他のモデルの変換でも似たエラーに遭遇しましたが、根本原因はデータ型にあります。
こんにちは、あなたが共有してくれたコマンドを試しました...
しかしNeutron変換器はモデルの変換に失敗している...
参照用に添付のログをご覧ください
ログを提供してください。