環境
|コンポーネント |詳細 |
|-----------|--------|
|ボード|i.MX 95 |
|BSP |lf-6.12.49-2.2.0 |
|カーネル |Linux...6.12.49-lts-next-gbf3cf0324593 #1 SMP PREEMPT 2026年6月16日火曜日 03:46:26 UTC aarch64 |
|NNStreamer |2.4.2 |
|テンソルフローライト |2.19.0 |
|Neutron Delegate |libneutron_delegate.so レポート v1.0.0-f24d08e5、non-zerocp、2025年11月12日ビルド |
|nnstreamer-examples |v1.6(SRCREV 062ebd1)およびv1.9(SRCREV 37d3d86)— 同じ動作 |
|カメラ |OV5640 MIPIをlibcamera経由で取得(imx8-isi)、camera ID: /base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c |
meta-nxp-demo-experience/recipes-examples/imx-nnstreamer-examples/imx-nnstreamer-examples.bb のバイナリが /opt/gopoint-apps/scripts/machine_learning/nnstreamer/ にインストールされます。
モデル
すべてのモデルはYocto gopoint-base-appsのレシピ(downloads.json、lf-6.12.49_2.2.0 ブランチ)、ホスト先:
https://github.com/nxp-imx-support/nxp-demo-experience-assets/raw/lf-6.12.49_2.2.0/models/
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/downloads/models/ のターゲットモデル:
|課題|CPUモデル |NPUモデル|
|------|-----------|-----------|
|顔検出 |顔検出/ultraface_slim_uint8_float32.tflite |顔検出/ultraface_slim_uint8_float32_neutron.tflite |
|物体検出 |オブジェクト検出/ssdlite_mobilenet_v2_coco_quant_uint8_float32_no_postprocess.tflite |オブジェクト検出/ssdlite_mobilenet_v2_coco_quant_uint8_float32_no_postprocess_neutron.tflite |
|分類|分類/mobilenet_v1_1.0_224_quant_uint8_float32.tflite |分類/mobilenet_v1_1.0_224_quant_uint8_float32_neutron.tflite |
同じソースからのメタデータ: labels_mobilenet_quant_v1_224.txt、coco_labels_list.txt、box_priors.txt
必須環境変数
i.MX 95 上の OV5640 には libcamera ISI が必要です。
export CAMERA_BACKEND=libcamera
export LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c'---
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/face_detection/example_face_detection_tflite \
--バックエンドNPU \
--model_pathダウンロード/モデル/顔検出/ultraface_slim_uint8_float32_neutron.tflite \
――display_perf時間
パイプラインログ:
情報:アプリを起動します...
デバッグ: libcamerasrc name=cam_src camera-name=/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c \
!video/x-raw、幅=640、高さ=480、フレームレート=30/1、フォーマット=YUY2 !列 !ティー名=t \
t. !キュー名=Thread-nn 最大サイズバッファ=2 リーキー=2 \
!imxvideoconvert_g2d name=scale_csc_g2d_0 !video/x-raw,width=320,height=240,format=RGB \
!tensor_converter !tensor_filter レイテンシ=1 framework=tensorflow-lite \
モデル=downloads/モデルs/face-detection/ultraface_slim_uint8_float32_neutron.tflite \
custom=Delegate:External,ExtDelegateLib:libneutron_delegate.SO name=face_filter \
!tensor_sink name=tsink_fd \
t. !キュー名=thread-img max-size-buffers=2 leaky=2 !cairooverlay name=cairooverlay \
!fpsdisplaysink name=img_tensor text-overlay=false video-sink=waylandsink
INFO: NeutronDelegate デリゲート: 49 ノードのうち 2 ノードが委任され、2 つのパーティションがあります。
情報:Neutron Delegate バージョン:v1.0.0-f24d08e5、zerocp なし。
[libcamera v0.0.0+6194-lf-6.12.49-2.2.0]
[ov5640 パイプライン: ov5640 -> csidev-4ad30000.csi -> formatter@20 -> crossbar]
カメラ camera.cpp:1215ストリームの設定: (0) 640x480-YUYV/未設定
デバッグ: パイプラインの状態がNULLからREADYに変更されました。
デバッグ: パイプラインの状態がREADYからPAUSEDに変更されました。
デバッグ: パイプラインの状態が「一時停止」から「再生中」に変更されました。
結果:バウンディングボックスが文字化けした。
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/face_detection/example_face_detection_tflite \
--バックエンド CPU \
--model_pathダウンロード/モデル/顔検出/ultraface_slim_uint8_float32.tflite \
――display_perf時間
ログ:
情報:アプリを起動します...
情報: CPU 用の TensorFlow Lite XNNPACK デリゲートを作成しました。
デバッグ: [同じカメラパイプライン、同じimxvideoconvert_g2d]
... tensor_converter !tensor_filter レイテンシ=1 framework=tensorflow-lite \
モデル=downloads/モデル/face-detection/ultraface_slim_uint8_float32.tflite \
custom=Delegate:XNNPACK,NumThreads:6 ...
DEBUG: パイプライン状態が変更...遊んでる。
結果:
同じパイプライン、同じカメラ、同じimxvideoconvert_g2d YUY2→RGB変換。唯一の違い:量子化された.tflite+ XNNPACK 対 _neutron.tflite + Neutron デリゲート。
---
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/object_detection/example_detection_mobilenet_ssd_v2_tflite \
--バックエンドNPU \
--model_pathダウンロード/モデル/オブジェクト検出/ssdlite_mobilenet_v2_coco_quant_uint8_float32_no_postprocess_neutron.tflite \
--labels_pathダウンロード/モデル/オブジェクト検出/coco_labels_list.txt \
--boxes_pathダウンロード/モデル/オブジェクト検出/box_priors.txt \
――display_perf時間
パイプラインログ:
情報:アプリを起動します...
デバッグ: libcamerasrc name=cam_src camera-name=/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c \
!video/x-raw、幅=640、高さ=480、フレームレート=30/1、フォーマット=YUY2 !列 !ティー名=t \
t. !キュー名=Thread-nn 最大サイズバッファ=2 リーキー=2 \
!imxvideoconvert_g2d name=scale_csc_g2d_0 !video/x-raw,width=300,height=300,format=RGB \
!tensor_converter !tensor_filter レイテンシ=1 framework=tensorflow-lite \
モデル=downloads/モデル/object-detection/ssdlite_mobilenet_v2_coco_quant_uint8_float32_no_postprocess_neutron.tflite \
custom=Delegate:External,ExtDelegateLib:libneutron_delegate.so name=detection_filter \
!tensor_decoder name=tensor_decode_bounding_boxes_1 mode=bounding_boxes option1=mobilenet-ssd \
オプション2=ダウンロード/モデル/オブジェクト検出/coco_labels_list.txt \
Option3=downloads/models/object-detection/box_priors.txt \
Option4=640:480 option5=300:300 !imxvideoconvert_g2d !mix.sink_0 \
t. !キュー名=thread-img max-size-buffers=2 leaky=2 !mix.sink_1 \
imxcompositor_g2d name=mix sink_0::zorder=2 sink_1::zorder=1 latency=200000000 min-upstream-latency=200000000 \
!cairooverlay name=perf !fpsdisplaysink name=img_tensor text-overlay=false video-sink=waylandsink
INFO: NeutronDelegate デリゲート: 26 ノードのうち 1 ノードが委任され、1 つのパーティションがあります。
情報:Neutron Delegate バージョン:v1.0.0-f24d08e5、zerocp なし。
カメラ camera.cpp:1215ストリームの設定: (0) 640x480-YUYV/未設定
デバッグ: パイプラインの状態が変更されました...再生中。
結果:カメラの映像エリアが完全に真っ黒になった。バウンディングボックスの精度が低い。
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/object_detection/example_detection_mobilenet_ssd_v2_tflite \
--バックエンド CPU \
--model_path ダウンロード/モデル/オブジェクト検出/ssdlite_mobilenet_v2_coco_quant_uint8_float32_no_postprocess.tflite \
--labels_pathダウンロード/モデル/オブジェクト検出/coco_labels_list.txt \
--boxes_pathダウンロード/モデル/オブジェクト検出/box_priors.txt \
――display_perf時間
ログ:
情報:アプリを起動します...
情報: CPU 用の TensorFlow Lite XNNPACK デリゲートを作成しました。
デバッグ: [同じパイプライン、同じimxvideoconvert_g2d、同じimxcompositor_g2d、XNNPACKデリゲート]
デバッグ: パイプラインの状態が変更されました...再生中。
結果:カメラの映像領域は依然として完全に真っ黒です(NPUと同じ)。バウンディングボックスは正しい。
CPUとNPUの両方で画面が真っ暗になります。顔検出および分類(imxcompositor_g2dを使用しない場合)では、通常のカメラ映像が表示されます。
---
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/classification/example_classification_mobilenet_v1_tflite \
--バックエンドNPU \
--model_path downloads/models/classification/mobilenet_v1_1.0_224_quant_uint8_float32_neutron.tflite \
--labels_pathダウンロード/モデル/分類/labels_mobilenet_quant_v1_224.txt \
――display_perf時間
パイプラインログ:
情報:アプリを起動します...
デバッグ: libcamerasrc name=cam_src camera-name=/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c \
!video/x-raw、幅=640、高さ=480、フレームレート=30/1、フォーマット=YUY2 !列 !ティー名=t \
t. !キュー名=Thread-nn 最大サイズバッファ=2 リーキー=2 \
!imxvideoconvert_g2d name=scale_csc_g2d_0 !video/x-raw,width=224,height=224,format=RGB \
!tensor_converter !tensor_filter latency=1 framework=tensorflow-lite \
model=downloads/models/classification/mobilenet_v1_1.0_224_quant_uint8_float32_neutron.tflite \
custom=Delegate:External,ExtDelegateLib:libneutron_delegate.so name=classification_filter \
!tensor_decoder name=tensor_decode_labeling_1 mode=image_labeling \
オプション1=ダウンロード数/モデル/分類/labels_mobilenet_quant_v1_224.txt!オーバーレイテキストシンク\
t. !キュー名=Thread-img 最大サイズバッファ=2 リーキー=2 \
!textoverlay name=overlay font-desc="Sans, 24" valignment=baseline halignment=center \
!imxvideoconvert_g2d !cairooverlay name=perf \
!fpsdisplaysink name=img_tensor text-overlay=false video-sink=waylandsink
INFO: NeutronDelegate デリゲート: 4 つのノードのうち 1 つのノードが委任され、1 つのパーティションがあります。
情報:Neutron Delegate バージョン:v1.0.0-f24d08e5、zerocp なし。
カメラ camera.cpp:1215ストリームの設定: (0) 640x480-YUYV/未設定
デバッグ: パイプラインの状態が変更されました...再生中。
結果:カメラ映像は正常です。ラベルを一貫して間違えてつけること。
CAMERA_BACKEND=libcamera \
LIBCAMERA_CAM_DEVICE='/base/soc/bus@42000000/i2c@42530000/ov5640_mipi@3c' \
/opt/gopoint-apps/scripts/machine_learning/nnstreamer/classification/example_classification_mobilenet_v1_tflite \
--バックエンド CPU \
--model_path downloads/models/classification/mobilenet_v1_1.0_224_quant_uint8_float32.tflite \
--labels_pathダウンロード/モデル/分類/labels_mobilenet_quant_v1_224.txt \
――display_perf時間
ログ:
情報:アプリを起動します...
情報: CPU 用の TensorFlow Lite XNNPACK デリゲートを作成しました。
デバッグ: [同じパイプライン、同じimxvideoconvert_g2d、XNNPACKデリゲート]
デバッグ: パイプラインの状態が変更されました...再生中。
結果:
---
概要
3つのデモすべてにおいて、CPUとNPUは同じカメラパイプライン、同じimxvideoconvert_g2d YUY2→RGB変換、同じGStreamerパイプライン構造を使用します。唯一の違いは:
|変数 |CPUテスト|NPUテスト|
|----------|----------|----------|
|モデル |*.tflite (量子化) |*_neutron.tflite |
|代表 |XNNPACK (Delegate:XNNPACK) |neutron(Delegate:External, ExtDelegateLib:libneutron_delegate.so)|
結果:
| デモ | CPU (量子化された .tflite)+ XNNPACK) |NPU(_neutron.tflite + Neutron) |
|------|:---:|:---:|
|顔検出 — バウンディングボックス |
| 物体検出 — バウンディングボックス |
|分類 — ラベル |
物体検出では、CPUとNPUの両方でカメラ映像が黒く表示されることも確認されています。このデモでは、表示にimxcompositor_g2dを使用しています。顔検出と分類にはcairooverlay/textoverlayを使用し、通常どおり表示します。
こんにちは @Chavira:
ボードサポートパッケージ(BSP)のバージョンは 6.12.49です。Yocto経由で nxp-nnstreamer-example(SRCREV: 062ebd1)を別々に作成し、コンパイルしたdebsをターゲットボードにデプロイしました。GoPointアプリからデモを起動する代わりに、付属のdownloads.jsonに従って手動でモデルファイルをダウンロードしました そして、前述のコマンドを使用してプログラムを実行した。
こんにちは、 @BIG_FLY さん、
GoPointのデモに関する情報、ありがとうございました。
デモをどのように運営しているのか、詳しく教えていただけますか?
GoPointアプリケーションで直接実行していますか?それとも自分でクロスコンパイルしましたか?
デモの実行方法をステップバイステップで説明していただけますか?
BSPバージョン6.12.49を使っていますか?
どのボードを使っていますか?
この情報は、お客様のシステム構成をより深く理解し、潜在的な問題点を特定するのに役立ちます。
よろしくお願いします、
チャビラ