基于 Verdin i.MX95 的单目深度估计
在 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开发板、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:ONNX 导出与 TFLite 转换。将适配后的 PyTorch 模型导出为 ONNX(opset 17,静态形状)。随后通过 ONNX-TF 桥接器将 ONNX 模型转换为采用 NHWC 输入的 TFLite float32 格式。
- 步骤 2:性能分析与 INT8 量化。 “neutron-profiler”工具在标定数据集(采用ImageNet归一化的COCO图像)上运行float32模型,以收集各张量的激活直方图。这些直方图驱动neutron-quantizer,后者对每个张量应用完整的INT8训练后量化。
- 步骤 3:NPU 编译。neutron-converter 工具将 INT8 模型编译为包含嵌入式 Neutron 微代码的 TFLite 文件。此步骤执行图级优化、Neutron 子图提取、平铺调度、TCM(紧耦合内存)分配以及微代码生成。
NPU 编译结果
Neutron 编译器实现了 99.45% 的算子转换率:182 个算子中有 181 个在 NPU 上原生运行,并被封装为单个整体的 Neutron 子图。 这意味着 NPU 将整个推理图作为一次连续的内核调用执行,从而最大限度地减少了 CPU 与 NPU 之间的数据传输开销。
| 指标 | 值 |
| 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 系统采用三层架构:
- GStreamer/NNStreamer 预处理:摄像头采集(USB 或 CSI),通过 GPU 2D 引擎进行硬件加速的色彩空间转换,缩放至 256×256,并通过 NNStreamer 进行 ImageNet 归一化及 INT8 量化。
- Python 推理线程:将预处理后的 INT8 张量从 GStreamer appsink 拉入专用推理线程,该线程运行 Neutron 加速的 tflite 解释器。
- 后处理与输出:原始 INT8 深度张量经过去量化,通过时间 EMA(α=0.4)进行平滑处理,滤波,使用百分比截断(值为 5,以消除由异常值引起的抖动)进行归一化,并使用 inferno 颜色映射进行着色。 输出接收器包括 MJPEG HTTP 服务器、Wayland 显示器,以及通过 VPU 硬件编码器进行的 MP4 录制。
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 上部署深度估计模型并开箱即用。本项目总结出以下几点经验:
-
- 算子兼容性是模型适配的关键。若存在单个不支持的算子(如双线性插值),将导致大量任务被迫回退至 CPU 处理。
- 校准归一化必须与推理归一化完全一致。虽然事后看来这显而易见,但归一化不匹配正是开发过程中导致深度图错误的三个缺陷之一。
- 使用 Neutron 委托的 NNStreamer 产生了错误结果,需要采用基于 Python 的推理绕行方案。必须进行硬件级的调试。
- 目标是实现单子图 NPU 执行模式。通过单个 Neutron 子图实现 99.45% 的算子转换率,可消除推理过程中的 CPU-NPU 传输开销。
- 全栈至关重要。若缺乏配套的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 解决方案的信息,包括成功案例。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐





所有评论(0)