在 Verdin i.MX95 上部署单目深度估计以实现边缘 AI:模型适配、INT8 量化以及完整的嵌入式软件栈,支持通过单个 RGB 摄像头以 30 FPS 进行实时深度推理。

边缘计算中的计算机视觉

单目深度估计是指根据 RGB 摄像头捕获的单帧图像重建深度图。 本文演示了在 NXP i.MX95 处理器上部署 MiDaS 深度估计模型,将性能从 CPU 上的 7 FPS 提升至 Neutron NPU 上的 30 FPS,从而在 Toradex Verdin iMX95 计算机模块上实现实时推理。 我们涵盖了完整的工程路径,从为 NPU 兼容性进行的模型适配,到训练后量化、NPU 编译、GStreamer  pipeline 集成以及 Yocto 镜像构建。

该演示于2026年嵌入式世界大会(Embedded World 2026)上发布,旨在彰显Savoir-faire Linux 的边缘 AI 工程服务,并展示我们在嵌入式软件开发领域与Toradex 的长期合作伙伴关系。

单目深度估计在 Verdin iMX95 上运行的视频演示

为何要在边缘计算中采用单目深度估计?

深度感知是机器人技术、自主导航和工业检测的基础。传统方法依赖于立体摄像头或激光雷达,这会增加成本、功耗并增加校准复杂性。单目深度估计通过从单个摄像头推断深度来消除这些问题,单摄像头传感器在大多数嵌入式平台中已经广为使用。

然而,支撑该功能的人工智能模型计算量极大。在多数边缘硬件上,使用通用  CPU 以视频帧率运行这些模型并不现实。NXP i.MX 95 中的 Neutron 引擎改变了这一局面。它在仅消耗几瓦功耗的同时,提供了模型推理所需的吞吐量。

Toradex Verdin iMX95 计算机模块(SoM)与 Verdin 生态系统引脚兼容,并可与 Verdin 开发板配合使用,为该项目提供了理想的平台。它将 2 TOPS 的 Neutron NPU 与高能效的 Cortex-A55 核心相结合。

我们的目标是证明,完整的端到端单目深度估计管道能够完全在该模块上以 30 FPS 的帧率运行。

Verdin Development Board iMX95 Camera Mounted

Verdin iMX95 System on Module

完整配置:Verdin开发板、Verdin iMX95计算机模块及 CSI 摄像头(OV5640)

选择合适的模型:MiDaS v2.1 Small

我们从英特尔 ISL MiDaS 系列中选用了 AI 模型 MiDaS v2.1 256。该模型采用 EfficientNet-Lite3 编码器和四阶段 RefineNet 解码器,并采用扩展特征方案(64 → 128 → 256 → 512 通道)。 输入分辨率为 256×256,输出为相同分辨率的单通道逆相对深度图。

尽管该模型已针对嵌入式部署进行了优化,但仍需消耗大量计算资源,在 CPU 上运行时帧率仅为 7 FPS。这促使我们深入探索如何利用 Neutron NPU 的硬件加速能力。

将模型适配至 Neutron NPU

在专用 NPU 上部署 PyTorch 模型并非简单的格式转换。某些在 CPU 和 GPU 上运行良好的算子可能不被 NPU 硬件支持。

我们对该 AI 模型进行的适配工作,是将所有双线性插值替换为最近邻插值。若不修改这些操作,将导致 5 次运算被迫回退至 CPU 执行,从而严重影响吞吐量。

我们对比了原始(双线性)模型与适配(最近邻)模型在COCO图像上的 float32 深度图。在 1000 张图像的验证集上进行的验证显示,Pearson 相关系数最低为 0.954,平均值为 0.997。 深度图在结构上几乎完全一致。差异主要集中在物体边界处,双线性平滑会产生略微柔和的边缘,这对于实现完全 NPU 加速而言是一个可接受的权衡。

量化与 NPU 编译

我们使用 eIQ Neutron SDK v3.0.0 构建完整的转换管道。该流程针对边缘 AI 模型分为三个步骤:性能分析、量化和 NPU 编译。

  1. 步骤 1:ONNX 导出与 TFLite 转换。将适配后的 PyTorch 模型导出为 ONNX(opset 17,静态形状)。随后通过 ONNX-TF 桥接器将 ONNX 模型转换为采用 NHWC 输入的 TFLite float32 格式。
  2. 步骤 2:性能分析与 INT8 量化。 “neutron-profiler”工具在标定数据集(采用ImageNet归一化的COCO图像)上运行float32模型,以收集各张量的激活直方图。这些直方图驱动neutron-quantizer,后者对每个张量应用完整的INT8训练后量化。
  3. 步骤 3:NPU 编译。neutron-converter 工具将 INT8 模型编译为包含嵌入式 Neutron 微代码的 TFLite 文件。此步骤执行图级优化、Neutron 子图提取、平铺调度、TCM(紧耦合内存)分配以及微代码生成。

NPU 编译结果

Neutron 编译器实现了 99.45% 的算子转换率:182 个算子中有 181 个在 NPU 上原生运行,并被封装为单个整体的 Neutron 子图。 这意味着 NPU 将整个推理图作为一次连续的内核调用执行,从而最大限度地减少了 CPU 与 NPU 之间的数据传输开销。

CPU NPU Data Transfer

指标
AI 模型的算子 182
NPU 上的算子 181
CPU 上的算子(回退) 1
转换率 99.45%
Neutron 子图 1
估计延迟(@ 1 GHz) 11.58 毫秒

MiDaS v2.1 Small 256 的 NPU 编译结果

唯一未转换的操作是输出边界处的一个简单重塑,每次推理会增加几微秒的 CPU 开销。

阶段 格式 大小
TFLite float32 FP32 64 MB
TFLite INT8(量化) INT8 17 MB
TFLite + Neutron(NPU 编译) INT8 + 微代码 17 MB

编译后的模型内存大小

量化步骤使模型大小较 float32 格式的 TFLite 减少了 3.8 倍。Neutron 编译对文件大小的影响不大,因为 NPU 微代码和权重缓冲区所占空间与原始 INT8 数据相当。

构建实时管道

仅在 NPU 上独立运行的边缘 AI 模型并非最终产品。我们构建了一个完整的 GStreamer pipeline,以处理从摄像头捕获到视觉输出的完整数据路径。

pipeline 架构

该边缘 AI 系统采用三层架构:

  1. GStreamer/NNStreamer 预处理:摄像头采集(USB 或 CSI),通过 GPU 2D 引擎进行硬件加速的色彩空间转换,缩放至 256×256,并通过 NNStreamer 进行 ImageNet 归一化及 INT8 量化。
  2. Python 推理线程:将预处理后的 INT8 张量从 GStreamer appsink 拉入专用推理线程,该线程运行 Neutron 加速的 tflite 解释器。
  3. 后处理与输出:原始 INT8 深度张量经过去量化,通过时间 EMA(α=0.4)进行平滑处理,滤波,使用百分比截断(值为 5,以消除由异常值引起的抖动)进行归一化,并使用 inferno 颜色映射进行着色。 输出接收器包括 MJPEG HTTP 服务器、Wayland 显示器,以及通过 VPU 硬件编码器进行的 MP4 录制。

Edge AI System Pipeline Architecture

pipeline 架构

阶段 硬件
摄像头采集 USB (V4L2 UVC ) / MIPI CSI-2 (ISI + DMA)
颜色转换 + 缩放 GPU 2D 引擎
张量预处理 CPU(NNStreamer)
深度推理 Neutron NPU
后处理 CPU(NumPy + OpenCV)
视频编码(录制模式) VPU(H.265)

使用的硬件组件

Yocto 集成:从模型到可刷写镜像

整个软件栈最初是通过 Yocto Project(Walnascar 版本)结合 kas 构建,利用自定义 meta-layer 封装项目特定配置,组装成可刷写 Linux 镜像的。 此后,官方资源已发布:我们强烈建议读者现在参考《Toradex i.MX 95 模块上的 AI、计算机视觉和机器学习》。

为获取 TFLite 2.19 和 Neutron 加速,我们有选择地仅包含 "meta-imx-ml",同时排除 "meta-imx-bsp" 以避免与 Toradex 自身的 BSP 层发生冲突。 “meta-imx-bsp”是 NXP 的参考 BSP 层。当其处于活动状态时,它会无条件地设置全局映射,将“virtual/kernel”重定向至 NXP 自己的内核分支,并将“virtual/bootloader”重定向至 NXP 自己的 U-Boot 分支。 相反,Toradex 的层(“meta-toradex-nxp”、“meta-toradex-bsp-common”)提供了各自的分支,其中包含 Verdin 专有的补丁、载板设备树以及 模块初始化序列。 最后,“meta-imx-ml”仅包含 TFLite 2.19 以及 Neutron / Ethos-U / VX 代理等 ML 库 recipe,完全不包含内核、引导加载程序或机器配置。 由于其唯一的层依赖项仅为“core”和“freescale-layer”,因此可以无冲突地叠加在任何 BSP 之上。

这种混合需要通过 bbappend 文件、修改 ATF recipes、锁定U-Boot版本以及调整 OpenCV 的 QA 检查等针对性变通方案。该镜像 recipe 构建了一个完整的堆栈: GStreamer(base + good + bad + ugly)、NNStreamer(core + TFLite + Python3)、机器学习运行时(TFLite 2.19 + Neutron 代理)、OpenCV、Python 包、Weston 合成器,以及深度估计应用程序的脚本和模型。

结果与性能

相较于在 CPU 上受限的约 7 FPS,最终解决方案部署在配备 Verdin 开发板的 Toradex Verdin iMX95 计算机模块上,通过 Neutron NPU 实现了约 30 FPS 的端到端深度估计,同时支持 USB 和 CSI(OV5640)摄像头。

端到端帧率(FPS)的测量方法是对整个管道中生成的每一帧进行时间戳记录,涵盖摄像头捕获、GPU加速的颜色转换和缩放、张量预处理、模型推理、后处理(去量化、EMA平滑、着色)以及 Wayland 显示渲染。 CPU 基线通过NNStreamer 的 tensor_filter 配合 XNNPACK 委托器运行 INT8 量化的 MiDaS 模型,帧率约为7 FPS。 NPU 配置运行的是为 Neutron NPU 编译的相同模型,99.45% 的算子在加速器上执行,帧率达到约 30 FPS,提升了 330%。

各阶段的延迟通过 time.perf_counter() 进行分析。根据后端不同,存在两条代码路径。在 NPU 环境下,推理绕过 NNStreamer,通过 tflite_runtime 配合 Neutron 委托在 Python 中执行。 一个专用线程分别独立测量缓冲区提取、invoke()、后处理和显示操作。在 CPU 上,推理在 NNStreamer 的 tensor_filter 中以 C++ 原生方式运行。 由于该过程在 Python 回调触发前即已完成,因此推断时间估算为 capture_interval − callback_total,其中 capture_interval 是连续张量接收器之间传输的实际时间,callback_total 是测得的 Python 后处理时间。所有指标均基于 100 帧窗口进行平均,以平滑调度抖动。

测量阶段 NPU 管道 (毫秒) CPU 管道 (ms)
预处理 0.4 0.3
推理 ~10.9 ~110
后处理 8.7 7.3
显示 13.1 12.2
端到端帧率 ~30 FPS ~7 FPS

NPU 与 CPU 流水线之间的延迟测量

关键工程经验

在 NPU 上部署深度估计模型并开箱即用。本项目总结出以下几点经验:

    1. 算子兼容性是模型适配的关键。若存在单个不支持的算子(如双线性插值),将导致大量任务被迫回退至 CPU 处理。
    2. 校准归一化必须与推理归一化完全一致。虽然事后看来这显而易见,但归一化不匹配正是开发过程中导致深度图错误的三个缺陷之一。
    3. 使用 Neutron 委托的 NNStreamer 产生了错误结果,需要采用基于 Python 的推理绕行方案。必须进行硬件级的调试。
    4. 目标是实现单子图 NPU 执行模式。通过单个 Neutron 子图实现 99.45% 的算子转换率,可消除推理过程中的 CPU-NPU 传输开销。
    5. 全栈至关重要。若缺乏配套的pipeline、相机驱动程序或硬件加速预处理,模型精度便毫无意义。

结论

我们证明,在 Toradex Verdin iMX95 平台上使用 MiDaS v2.1 Small 模型,可以实现实时单目深度估计。 在低功耗硬件上进行单目深度估计,适用于那些 LiDAR 或立体视觉设备过于昂贵、笨重或易损的应用场景,例如 AMR/仓库导航、尘土飞扬或阳光直射环境下的农业避障,以及用于缺陷识别的工业检测。 其核心价值在于通过基于商用摄像头和低功耗边缘 SoC 的软件栈,替代专用深度传感器。

要将 PyTorch 模型转化为 30 FPS 的嵌入式应用,每个层级都需要精心设计:针对 NPU 算子兼容性的模型适配、通过 eIQ Neutron SDK 进行的 INT8 训练后量化、 采用硬件加速预处理的 GStreamer pipeline 设计,以及基于 Yocto 的构建系统(该系统将 Toradex BSP  layer 与 NXP ML 运行时集成)。

最终成果是一个完整且可复制的嵌入式 AI 堆栈,它能在节能的边缘平台上将单路摄像头视频流转换为实时深度图。

您可以在 Toradex 的此专题页面以及 Savoir Faire Linux 网站上,查阅更多关于边缘 AI 解决方案的信息,包括成功案例。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐