需要指导:NNStreamer (i.MX8MP) 上的 YOLOv8 输出形状不匹配 + 管道设计问题(微型 硬件和软件详情 i.mx8mPlus 和 Linux 电路板支持包 LF6.12.34_2.1.0 目标 我正在i.MX8MP 上构建一个命令行流水线(无图形用户界面),其中推理、叠加和显示均在 GStreamer 和 NNStreamer 中运行。 当前实验(命令行) 我试过这个管道: gst_debug=gstreamer: 4、tensor_filter: 6、tensor_transform: 6、tensor_decoder: 7\ gst-launch-1.0--no-position\ v4l2src 设备=/dev/video4 num-buffers=200!\ video/x-raw,width=1920,height=1080,format=NV12,framerate=30/1 !\ imxvideoconvert_g2d !\ video/x-raw,width=320,height=320,format=RGBA !\ videoconvert !\ video/x-raw,width=320,height=320,format=BGR !\ tensor_converter !\ tensor_transform mode=arithmetic option=typecast:int8,add:-128 !\ tensor_filter framework=tensorflow-lite model=${MODEL}custom=Delegate:External,ExtDelegateLib:${VX_LIB}!\ tensor_transform mode=arithmetic option=typecast:float32,add:128.0,mul:0.004982381127774715!\ tensor_transform mode=transpose option=1:0:2 !\ tensor_decoder mode=bounding_boxes option1=yolov8 option2=${LABELS}option3=0 option4=1920:1080 option5=320:320 !\ cairooverlay name=overlay !\ videoconvert !\ autovideosink log file link LINK ❗ 问题 我的 YOLOv8 TFLite 模型输出(1、7、2100),但 i.MX8MP 上的 NNStreamer 却显示7 × 2100 × 1。 我收到了这样的解释: YOLOv8 TFLite 型号的输出为(1,7,2100),而 NNStreamer 的 i.MX8MP YOLOv8 解码器的输出为 7×2100×1。此电路板支持包版本仅支持对四维张量进行转置,因此模型输出需要去量化,重塑为 (1,7,2100,1),然后进行转置。 输入: int8 [1, 320, 320, 3] 输出:int8 [1, 7, 2100] 刻度/零点 输出正确包含 3 个类别 + 4 个 bbox 值 ⚙️ 当前(缓慢)的方法 现在的申请流程是 GStreamer → BGR → OpenCV NPU 推断 OpenCV 后处理 返回 RTSP 管道 这会导致多个软件视频转换,在理想条件下,我们只能达到约 20 FPS,尽管模型本身可以运行 60 多 FPS。 🔄 建议的新方法 我想把管道分开: 路径 A - 推断 仅在此处转换 NV12 → BGR 运行 NNStreamer 路径 B - 叠加 + 显示 保留原始 NV12/YUY2 框架 直接在 NV12 上绘制边界框(最好使用硬件) → 将 NV12 送入编码器/RTSP → 完全避免软件视频转换 我首先想使用纯粹的 gst-launch 来制作这个原型,然后在 Python 中应用这种方法(可能使用 OpenGL 来实现 NV12 叠加层)。 🙏 我需要帮助 如何在 i.MX8MP 上将(1,7,2100) TFLite 输出重塑/转换为 NNStreamer 的 YOLOv8 解码器所需的格式 有只使用张量滤波器/变换/解码器的工作示例吗? 有没有解决三维输出问题的方法? 在 NV12/YUY2 上叠加的最佳做法 有什么 NNStreamer 友好的方法可以直接在 NV12 上绘制方框吗? 推荐元素(NV12 上的 cairooverlay?OpenGL?v4l2convert?imxvideoconvert_g2d 重叠?) 一般建议:在 i.MX8MP 上,分割管道(BGR 上的推理,NV12 上的叠加)是合理的架构方向吗? i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Re: Need guidance: YOLOv8 output shape mismatch on NNStreamer (i.MX8MP) + pipeline design question ( 感谢您的快速回复,我之前曾尝试在 tensor_transform 中使用重塑,但返回错误。 root@imx8mpevk:~# export MODEL=/root/rtsp/testing1/saved_model_Triding_320.tflite root@imx8mpevk:~# export LABELS=/root/rtsp/testing1/labels.txt root@imx8mpevk:~# gst-用上市-1.0 --no-position v4l2src 设备=/dev/video4!video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 !imxvideoconvert_g2d !video/x-raw,width=320,height=320,format=RGBA !视频转换 !video/x-raw,width=320,height=320,format=BGR !张量转换器 !tensor_transform mode=arithmetic option=typecast:int8,add:-128 !tensor_filter framework=tensorflow-lite model=${MODEL} !tensor_transform mode=arithmetic option=typecast:float32,add:128.0,mul:0.004982381!tensor_transform mode=reshape option=1:7:2100:1 !tensor_transform mode=transpose option=1:0:2:3 !tensor_decoder mode=bounding_boxes option1=yolov8 option2=${LABELS} option3=0 option4=1920:1080 option5=320:320 !cairooverlay name=overlay !视频转换 !autovideosink ** 消息:14:56:17.877:accl = cpu **(gst-launch-1.0:1335):CRITICAL **:14:56:17.931:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32' 失败 ** (gst-launch-1.0:1335):CRITICAL **:14:56:17.931:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32' 失败 ** (gst-launch-1.0:1335):CRITICAL **:14:56:17.931:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32' 失败 ** (gst-launch-1.0:1335):CRITICAL **:14:56:17.935:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32' 失败 ** (gst-launch-1.0:1335):CRITICAL **:14:56:17.938:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32' 失败 ** (gst-launch-1.0:1335):CRITICAL **:14:56:17.939:bb_getOutCaps: assertion 'config->info.info[0].type== _NNS_FLOAT32'失败 警告:流水线错误:无法在元素"tensor_transform" 中设置属性"mode" ,以"重塑" root@imx8mpevk:~# 您能否建议修改流水线,以符合预期格式,并覆盖到 nv12 上。 或者我需要降级或升级我的 linux 电路板支持包 版本才能匹配它们。 如果可能,请测试管道并提供反馈。 感谢并问候 S Vishnu Re: Need guidance: YOLOv8 output shape mismatch on NNStreamer (i.MX8MP) + pipeline design question ( 你好
问题源于您的 YOLOv8 TFLite 模型输出形状(1,7,2100)与 i.MX8MP 上 NNStreamer 的 YOLOv8 解码器所期望的格式(7×2100×1)不匹配。出现这种情况的原因是: 1.您当前的电路板支持包版本 (LF6.12.34_2.1.0)仅支持 4D 张量的转置操作 2.模型输出需要重塑和转置,以符合解码器的预期 ## Recommended Solution For the tensor transformation, you need to apply: 1. Dequantization (if using quantized model) 2. Reshape the output from (1,7,2100) to (1,7,2100,1) 3. Transpose the tensor to the required format (7×2100×1) ## 管道优化 您建议的架构(拆分管道)是一种合理的方法: - 仅为推理转换 NV12 → BGR - 保留原始 NV12/YUY2 帧用于显示/编码 - 使用硬件加速直接在 NV12 上叠加检测结果 这将消除软件视频转换操作,实现更好的性能。 ## NV12 管道的推荐要素 在 NV12 上直接绘制边界框: - 使用具有叠加功能的 `imxvideoconvert_g2d` - 替代方法: `cairooverlay` 可与 NV12 配合使用,但可能需要格式调整 管道结构示例: ``` v4l2src → NV12 → tee → branch1:转换为 BGR → 推理 → 检测结果 branch2:原始 NV12 → imxvideoconvert_g2d(带叠加) → 编码器/显示器 ``` 通过消除不必要的格式转换,利用 NPU 60+ FPS 的能力,这种方法应能显著提高性能,超过当前约 20 FPS 的限制。
此致 Re: Need guidance: YOLOv8 output shape mismatch on NNStreamer (i.MX8MP) + pipeline design question ( 您好,
是的,你需要降级 Linux 电路板支持包。我想这应该能行,因为我们还没有在 Yolov8 中测试过管道。
此致 Re: Need guidance: YOLOv8 output shape mismatch on NNStreamer (i.MX8MP) + pipeline design question ( 我有一个更新,我在张量_变换元素中使用了模式维度变化(dimchg),以符合张量解码器的预期。 .... tensor_filter framework=tensorflow-lite model=../../vaishnavi/model_calibrated_int8_og_320.tflite custom=Delegate:External,ExtDelegateLib:libvx_delegate.so !tensor_transform mode=arithmetic option=typecast:float32,add:128.0,mul:0.004982381!tensor_transform mode=dimchg option=0:1 !tensor_decoder mode=bounding_boxes option1=yolov8 option2=labels_over.txt option3=0 option4=1920:1080 option5=320:320 !...... 感谢您的回复。 感谢和问候 Siddavatam Vishnu
查看全文