> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs-staging.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 QIM SDK 进行应用开发

> 了解 AI 应用所需的重要 QIM SDK 组件,并遵循从用例到完成应用构建的应用开发工作流。

使用 QIM SDK 开发 AI 应用包括两个步骤:了解 AI 管线的核心组件,以及遵循应用开发工作流来集成、配置和部署您的应用。

<CardGroup cols={2}>
  <Card title="重要组件" icon="cubes" href="#important-qim-sdk-components-for-an-ai-application">
    构成每条 AI 管线的四个插件,以及通常会阻碍集成的那一个。
  </Card>

  <Card title="开发工作流" icon="route" href="#application-development-workflow">
    用例 → AI Hub 模型检查 → 后处理检查 → 构建应用。
  </Card>

  <Card title="后处理模块" icon="sliders" href="#post-processing-modules-and-supported-use-cases">
    支持的用例、模型系列,以及每种模块类型生成的元数据。
  </Card>
</CardGroup>

<h2 id="important-qim-sdk-components-for-an-ai-application">
  AI 应用的重要 QIM SDK 组件
</h2>

每个 QIM SDK AI 应用都由一小组组件组装而成。其中两个组件决定了您的用例能否开箱即用:运行模型的**推理插件**,以及将原始输出张量转换为可用元数据的**后处理模块**。

| 组件 | 插件 | 作用 | 为什么重要 |
| - | - | - | - |
| AI 预处理 | [`qtimlvconverter`](https://imsdkdocs.qualcomm.com/plugin-reference/qtimlvconverter) | 在 GPU 上执行缩放、颜色转换和张量布局转换。 | 生成模型所需的精确张量,且不会让 CPU 成为瓶颈。 |
| AI 推理 | [`qtimltflite`](https://imsdkdocs.qualcomm.com/plugin-reference/qtimltflite) · [`qtimlqnn`](https://imsdkdocs.qualcomm.com/plugin-reference/qtimlqnn) · [`qtimlsnpe`](https://imsdkdocs.qualcomm.com/plugin-reference/qtimlsnpe) | 运行模型并返回原始输出张量。 | 选择 Qualcomm 加速路径 — LiteRT/TFLite delegate、Qualcomm AI Engine Direct/QNN 或 SNPE。模型格式决定了您使用哪个插件。 |
| **后处理** | [`qtimlpostprocess`](https://imsdkdocs.qualcomm.com/plugin-reference/qtimlpostprocess) | 加载一个模块,将输出张量解码为 ML 元数据 — 标签、边界框、掩码、关键点。 | **如果没有与模型输出匹配的模块,管线将无法生成可用结果。** 这是最常见的集成障碍。 |
| 元数据使用 | [`qtivoverlay`](https://imsdkdocs.qualcomm.com/plugin-reference/qtivoverlay) · 应用逻辑 | 借助 GPU 加速在帧上绘制元数据,或将其交给您的代码处理。 | 将检测结果转化为产品的实际功能:可视化、事件、分析或控制逻辑。 |

<Warning>
  后处理是针对特定模型的,而不是针对用例通用的。两个目标检测器可能需要不同的解码逻辑。在规划构建之前,请确认存在适用于**您的具体模型输出**的模块 — 请参阅[后处理模块和支持的用例](#post-processing-modules-and-supported-use-cases)。
</Warning>

<Tip>
  要列出设备上的 QIM SDK 插件,并查看后处理模块及每个模块接受的张量形状:

  ```shell theme={null}
  gst-inspect-1.0 | grep qti
  ```

  ```shell theme={null}
  gst-inspect-1.0 qtimlpostprocess
  ```
</Tip>

<h2 id="application-development-workflow">
  应用开发工作流
</h2>

该工作流由两个决策驱动:**Qualcomm AI Hub 上是否有兼容的模型**,以及**现有后处理模块是否支持该模型的输出**。如果两者都支持,可直接进入应用开发。否则,请先集成您自己的模型和/或添加自定义后处理模块。

```mermaid theme={null}
%%{init: {"themeVariables": {"fontSize": "13px"}, "flowchart": {"htmlLabels": true, "nodeSpacing": 18, "rankSpacing": 30, "curve": "basis", "padding": 6}}}%%
flowchart LR
    UC["1 · 选择<br/>用例"]
    Q1{"2 · AI Hub 上<br/>有模型?"}
    BYOM["2a · 使用<br/>自己的模型"]
    Q2{"3 · 后处理<br/>受支持?"}
    ADD["3a · 添加后处理<br/>模块"]
    BUILD["4 · 构建<br/>应用"]

    UC --> Q1
    Q1 -->|"是"| Q2
    Q1 -->|"否"| BYOM --> Q2
    Q2 -->|"是"| BUILD
    Q2 -->|"否"| ADD --> BUILD

    classDef step fill:#31017D,stroke:#31017D,color:#ffffff;
    classDef fork fill:#3253DC,stroke:#3253DC,color:#ffffff;
    classDef decision fill:#ffffff,stroke:#31017D,color:#31017D;
    class UC,BUILD step;
    class BYOM,ADD fork;
    class Q1,Q2 decision;
```

| 步骤 | 操作内容 | 前往位置 |
| - | - | - |
| 1 | **选择用例。** 确定应用必须检测、分类、分割或增强的内容,并记录所需的分辨率和帧率。 | [支持的用例](#post-processing-modules-and-supported-use-cases) |
| 2 | **检查 Qualcomm AI Hub 上是否有可用模型。** 如果存在合适的预优化模型,请针对您的设备和运行时下载该模型。 | [Qualcomm AI Hub](../topic/ai-hub) |
| 2a | **使用您自己的模型** — 仅在没有合适的 AI Hub 模型时。训练或获取模型,然后针对目标平台进行编译和量化。 | [集成自定义 AI 模型](../topic/integrate-custom-model) |
| 3 | **检查 QIM SDK 是否支持后处理。** 将模型的输出张量与可用的 `qtimlpostprocess` 模块进行比较。 | [后处理模块](#post-processing-modules-and-supported-use-cases) |
| 3a | **添加后处理支持** — 仅在没有匹配的模块时。编写、构建并部署自定义模块。 | [添加后处理支持](../topic/add-postprocessing-support-custom-model) |
| 4 | **构建应用。** 选择开发路径,验证管线,然后使用 GStreamer、C++ 或 Python App Builder 进行构建。 | [构建应用](../topic/imsdk-build-application) |

<Note>
  步骤 2a 和 3a 是可选的。当有合适的 AI Hub 模型和兼容的后处理模块时,您可以从定义用例直接进入应用构建。
</Note>

<h2 id="post-processing-modules-and-supported-use-cases">
  后处理模块和支持的用例
</h2>

`qtimlpostprocess` 插件将原始模型输出张量转换为结构化元数据,供管线的其余部分使用。使用 `module` 属性配置所需的后处理模块,并提供该模块所需的任何模型特定的 `labels` 或 `settings`。**选择与模型输出匹配的模块,是决定管线能否生成可用结果的最重要决策。**

| 模块类型 | 示例模型系列 | 原始模型输出 | 为下游阶段生成的元数据 |
| - | - | - | - |
| `image-classification` | MobileNet 及类似分类器 | 每个类别的置信度分数 | 按置信度阈值过滤后的最高标签和分数 |
| `object-detection` | SSD-MobileNet、YOLOv5、YOLO-NAS、YOLOv8 | 边界框坐标、类别 ID、分数 | 解码后的边界框、映射后的标签以及过滤后的置信度分数 |
| `image-segmentation` | DeepLabV3、FFNet | 像素级类别图或深度张量 | 与源帧对齐的分割掩码 |
| `pose-estimation` | PoseNet MobileNet 及类似关键点模型 | 关键点坐标和置信度 | 关键点及其之间的连接,可直接用于渲染或跟踪 |
| `super-resolution` | QuickSRNet、XLSR | 增强后的图像张量 | 供输出阶段使用的更高分辨率帧或张量 |
| `audio-classification` | YAMNet 及类似音频模型 | 音频类别概率 | 类别标签和置信度分数 |
| 原始张量或自定义输出 | 任何没有匹配模块的模型 | 模型特定的张量数据 | **无,直到您提供匹配的模块** — 请参阅[添加后处理支持](../topic/add-postprocessing-support-custom-model) |

<Note>
  所列示例是具有代表性的模型系列,而不是详尽的列表。由于后处理模块通常基于输出张量格式,许多兼容的模型可以复用同一个模块。在确定需要自定义模块之前,请将模型的输出张量与 `gst-inspect-1.0 qtimlpostprocess` 报告的支持格式进行核对。
</Note>

<Warning>
  如果您的模型属于**原始张量或自定义输出**这一行,那么在存在匹配模块之前,管线将无法生成可用的元数据。请在集成之前而不是在启动调试期间为此做好规划。
</Warning>

## 后续步骤

选择与您在工作流中所处阶段相符的卡片。

<CardGroup cols={3}>
  <Card title="使用自己的模型" icon="puzzle-piece" href="../topic/integrate-custom-model">
    **步骤 2a** — 没有合适的 AI Hub 模型,因此需要针对目标平台编译和量化您自己的模型。
  </Card>

  <Card title="添加后处理支持" icon="sliders" href="../topic/add-postprocessing-support-custom-model">
    **步骤 3a** — 没有与输出匹配的内置模块,因此需要编写并部署自定义模块。
  </Card>

  <Card title="构建应用" icon="hammer" href="../topic/imsdk-build-application">
    **步骤 4** — 模型和模块已就绪,因此请选择路径并进行构建。
  </Card>
</CardGroup>

<Tip>
  在投入模块开发之前,请先执行后处理检查(步骤 3)。如果现有模块已经能接受您模型的输出张量,您就可以完全跳过步骤 3a。
</Tip>

## 相关信息

* [Qualcomm AI Hub](../topic/ai-hub) — 下载经过预训练和优化的模型,以在这些管线中使用。
* [插件参考](https://imsdkdocs.qualcomm.com/plugin-reference/introduction) — 所有 QIM SDK 插件及其属性和 caps。
* [示例管线](https://imsdkdocs.qualcomm.com/sample-pipelines/aipipelines) — 适用于各个用例的即用型管线。
