Skip to main content
Qualcomm AI Hub 包含大量经过优化、可在 Dragonwing 硬件上运行的预训练 AI 模型。

端到端示例

以下是实现了 AI Hub 模型、可直接在 Dragonwing 开发板 NPU 上运行的示例应用程序(Python)列表: 要运行其他模型,请继续阅读!

查找支持的模型

AI Hub 中的模型按支持的 Qualcomm 芯片组分类。要查看可在您的开发套件上运行的模型:
1

进入模型列表

进入模型列表
2

选择您的芯片组

在 ‘Chipset’ 下选择:
  • RB3 Gen 2 Vision Kit:‘Qualcomm QCS6490 (Proxy)’
  • RUBIK Pi 3:‘Qualcomm QCS6490 (Proxy)’
  • IQ-9075 EVK:‘Qualcomm QCS9075 (Proxy)’
3

筛选量化模型

在 ‘Model precision’ 下选择:‘Quantized’。您 Dragonwing 开发板上的 NPU 仅运行量化模型。

将模型部署到 NPU(Python)

作为示例,我们来部署 Lightweight-Face-Detection 模型。

运行示例仓库

所有 AI Hub 模型都附带一个示例仓库。这是一个很好的起点,因为它准确展示了如何运行该模型。它展示了神经网络的输入应该是什么样子,以及如何解释输出(在这里,是将输出张量映射为边界框)。示例仓库尚未在 NPU 或 GPU 上运行——它们在没有加速的情况下运行。在将这个模型迁移到 NPU 之前,先看看我们的输入/输出应该是什么样子。 Lightweight-Face-Detection 的 AI Hub 页面上,点击 “Model repository”。这会跳转到一个 README 文件,其中包含运行示例仓库的说明。 要部署此模型,请打开开发板上的终端,或与开发板建立 ssh 会话:
1

设置环境

创建一个新的 venv 并安装一些基础软件包:
2

下载测试图像

将一张包含人脸的图像(640x480 分辨率,JPG 格式)下载到您的开发板上:

包含三个人的输入图像 来源

输入分辨率: AI Hub 模型要求输入尺寸正确。您可以在 “Technical Details > Input resolution” 下找到所需分辨率(格式为 HEIGHT x WIDTH(此处 480x640 => 宽x高为 640x480));或检查 TFLite 或 ONNX 文件中输入张量的尺寸。
3

运行示例

按照 Facial Landmark Detection 模型 ‘Example & Usage’ 下的说明操作:
您可以在 out/FaceDetLitebNet_output.png 中找到输出图像。如果您是通过 ssh 连接的,可以通过以下方式将输出图像复制回您的主机:
我们已经有了一个可用的模型。作为参考,在 IQ9-EVK 上运行此模型每次推理耗时 106.86ms。

将模型移植到 NPU

现在我们有了一个可用的参考模型,接下来让它在 NPU 上运行。您需要实现三个部分:
  1. 预处理数据 — 将图像转换为可传递给神经网络的特征。
  2. 运行推理 — 将模型导出为 ONNX 或 TFLite,并通过 LiteRTONNX Runtime 运行模型。
  3. 后处理输出 — 将神经网络的输出转换为人脸边界框。
正如您在 LiteRTONNX Runtime 页面中所看到的,模型本身很简单。然而,预处理和后处理代码可能就不那么简单了……

预处理输入

对于图像模型,大多数 AI Hub 模型接受形状为 (HEIGHT, WIDTH, CHANNELS)(LiteRT)或 (CHANNELS, HEIGHT, WIDTH)(ONNX)、缩放到 0..1 范围的矩阵。如果只有 1 个通道,请先将图像转换为灰度图。如果您的模型是量化的(很可能是),您还需要读取 zero_point 和 scale,并相应地缩放像素(在 LiteRT 中这很容易,因为其中包含量化参数,但 ONNX 没有这些参数)。通常,对于量化模型,您最终会得到线性缩放到 0..255(uint8)或 -128..127(int8)的数据——所以这相对容易。下面的示例代码中有一个用 Python 演示所有这些操作的函数(def load_image_litert)。
但是…… 这并不是绝对的;这正是 AI Hub 示例代码的用武之地。每个 AI Hub 示例都包含用于缩放输入的确切代码。在我们当前的示例——Lightweight-Face-Detection 中,输入的形状为 (480, 640, 1)。然而,如果您查看预处理代码,数据并没有被转换为灰度图,而是只取了 RGB 图像的蓝色通道:
这类细节很容易出错。因此,如果您发现自己的实现与 AI Hub 示例的结果不一致:请阅读代码。对于非图像输入(例如音频)更是如此。请使用演示代码来理解模型实际期望的输入。

后处理输出

后处理也是如此。例如,没有标准的方法将神经网络的输出映射为边界框(在本例中用于检测人脸)。对于 Lightweight-Face-Detection,您可以在这里找到代码:face_det_lite/app.py#L77 如果您的目标是 Python,通常最简单的方法是将后处理代码复制到您的应用程序中;因为 AI Hub 有许多您可能不想要的依赖项。此外,后处理代码基于 PyTorch 张量运算,而您的推理在 LiteRT 或 ONNX Runtime 下运行;因此,您需要做一些小的修改。我们将在下面的端到端示例中展示这一点。

端到端示例(Python)

说明部分已经结束,让我们来看一些代码。
1

设置基础环境

在开发板上打开终端:
2

下载模型

NPU 仅支持 uint8/int8 量化模型。幸运的是,AI Hub 已经包含预量化和优化过的模型。您可以:
  • 下载本教程使用的模型(已镜像到 CDN):
  • 或者,对于其他任何模型,从 AI Hub 下载模型并推送到您的开发板:
    1. 前往 Lightweight-Face-Detection
    2. 点击 “Download model”。
    3. 运行时选择 “TFLite”,精度选择 “w8a8”。

      从 AI Hub 下载 TFLite 格式的 w8a8 量化模型

      如果您的模型仅提供 ONNX 格式,请参阅使用 ONNX Runtime 运行模型中的说明。本教程中的原则同样适用。
    4. 下载模型。
    5. 如果您不是直接在 Dragonwing 开发板上下载模型,请通过 ssh 推送模型:
3

创建推理脚本

创建一个新文件 face_detection.py。该文件包含模型调用,以及来自 AI Hub 示例的预处理和后处理代码(见内联注释)。
4

在 CPU 上运行

这已经将每次推理的时间从 106.86ms 降至 29.8ms。
5

在 NPU 上运行

通过量化此模型并将其移植到 NPU,我们将模型速度提升了 71 倍。您也不仅限于使用 Python — LiteRT 页面还提供了 C++ 示例。