# 详细转换

## 概述

为了充分利用设备上的AI模型，必须先将它们转换为目标平台的RVC编译格式。
如果您想了解什么是转换、为什么需要转换以及涉及的一些关键概念，请参阅[转换](https://docs.luxonis.com/software-v3/ai-inference/conversion.md)部分。

虽然Hub通过快速转换工具提供了一个快速且简化的选项，但某些工作流需要更精细的控制。 详细转换工作流正是为这些高级用例设计的，提供了细粒度的配置参数和版本/变体管理。
如果您更喜欢快速一次性的转换且设置最少，请参阅[快速转换](https://docs.luxonis.com/cloud/hubai/quick-conversion.md)部分。

## 转换

> 此处假设要转换的模型已经上传到Hub。如果此步骤尚未完成，请参考
> [模型上传](https://docs.luxonis.com/cloud/hubai/model-registry/upload-download.md)
> 指南。

> 对于自定义模型，尽可能优先上传
> **ONNX NN Archive**
> 作为基础模型。 来源NN Archive作为模型张量元数据、预处理和可选后处理元数据(
> `heads`
> )的真实来源，这使得转换流程更可预测，并且通常会产生一个已准备好用于DepthAI的转换存档，无需手动编辑。 如果您改为上传原始的
> `ONNX`
> 文件，Hub可以从图中推断部分张量结构，但无法推断训练时的预处理选择或语义输出元数据（如类别名称和解析器选择）。

分步说明：

#### 打开模型变体

打开[Hub](https://hub.luxonis.com/ai)，导航到[模型](https://hub.luxonis.com/ai/models)部分，打开所需模型，滚动到模型变体，点击要导出的变体旁边的转换。

#### 选择目标平台

选择目标RVC平台。可用的目标取决于上传的基础模型格式。 实际上，基于ONNX的模型源提供了跨平台最广泛的转换支持。

#### 配置转换表单

检查预填的值并根据需要进行调整。 如果基础模型是原始的ONNX文件，请手动输入源模型输入设置。 如果基础模型是ONNX NN Archive，请将其config.json作为真实来源，仅在存档元数据不正确时才更改值。

使用下面的参考部分了解每个字段的确切含义。

#### 导出并确认结果

点击导出开始转换。 新的模型实例最初显示为待处理，当导出准备就绪时变为成功。 然后您可以下载转换后的存档，或通过DepthAI直接引用它。

## 参数参考

### 源模型输入设置

| 参数 | 类别 | 含义 |
| --- | --- | --- |
| `Shape` | 源模型 | 源模型期望的输入形状 |
| `Mean Values` | 源模型 | 从输入中减去的每个通道的值 |
| `Scale Values` | 源模型 | 减去均值后应用的每个通道除数 |
| `Encoding From` | 源模型 | 源模型期望的通道顺序 |
| `Encoding To` | 导出模型 | 转换后的模型在运行时期望的通道顺序 |

### 平台和导出设置

| 参数 | 类别 | 含义 |
| --- | --- | --- |
| `Model Instance Name` | 导出模型 | Hub中显示的转换后实例的名称 |
| `Ir version` / `Snpe version` | 转换过程 | 目标转换格式或运行时版本 |
| `Disable Onnx Simplification` | 转换过程 | 在转换过程中禁用`ONNX`图简化 |
| `Mo Args` | 转换过程 | 用于`RVC2`和`RVC3`的额外OpenVINO模型优化器参数 |
| `Compile Tool Args` | 转换过程 | 用于`RVC2`的额外OpenVINO编译工具参数 |
| `POT Target Device` | 转换过程 | 用于`RVC3`的POT目标设备 |
| `Convert to blob` | 导出模型 | 为`RVC2`导出`.blob`而不是`.superblob` |

### 量化设置

| 参数 | 类别 | 含义 |
| --- | --- | --- |
| `Quantization Data` | 转换过程 | 用于校准量化转换的数据集 |
| `Max Quantization Images` | 转换过程 | 量化过程中使用的最大图像数量 |
| `Target Precision` | 转换过程 | 精度目标，例如针对 `RVC4` 的 `FP16` 或 `INT8` |

在 Hub UI 中，你可以从以下通用数据集中选择：

 * Driving - 街道和车辆图像（OIv7 类别，如 Vehicle、Car、Traffic light 等）
 * Food - 水果、蔬菜、生食和熟食图像（OIv7 类别，如 Apple、Salad、Pizza 等）
 * General - OIv7 图像的随机子集，代表多种对象和场景
 * Indoors - 室内空间图像（OIv7 类别，如 Table、Chair、Fireplace 等）
 * Random - 随机像素图像
 * Warehouse - 仓库内部图像（叉车-1 图像的随机子集）

如果需要自定义量化数据集，请使用 [HubAI SDK](https://docs.luxonis.com/cloud/hubai/model-registry/hubai-sdk.md)。 有关更高级的转换和量化选项，请参阅
[ModelConverter](https://docs.luxonis.com/software-v3/ai-inference/conversion/rvc-conversion/offline/modelconverter.md) 文档。

> 在转换过程中，源预处理会被嵌入到导出的模型结构中。通常建议填写相关参数（
> **Scale Values**
> 、
> **Mean Values**
> 和
> **Encoding**
> ），使转换后的模型期望 BGR 输入，且无需额外的缩放或均值移位。 预处理操作的顺序为：
> 1. 反转输入通道；
> 2. 减去均值；
> 3. 除以缩放值。
> 在操作输入时请牢记这一点，例如均值和缩放应遵循模型原始颜色编码的顺序。
> 如果你的原始预处理是
> `input = (input / 255.0 - mean) / std`
> ，并且运行时输入是
> `[0,255]`
> 范围内的 8 位图像，则输入
> `Mean Values = 255 * mean`
> 和
> `Scale Values = 255 * std`
> 。 对于标准的 ImageNet RGB 归一化，这意味着
> `Mean Values = [123.675, 116.28, 103.53]`
> 和
> `Scale Values = [58.395, 57.12, 57.375]`
> 。 在
> `RGB`
> 和
> `BGR`
> 之间切换时，不要交换均值和缩放值。 只需重新排列通道以匹配原始源模型的编码。 几何预处理（如调整大小、裁剪或 letterboxing）仍由你在运行时负责，因此你的输入流水线仍需与模型的原始预处理匹配。

## 原始 ONNX 与 ONNX NN Archive 对比

| 起始点 | Hub 可以自动确定的内容 | 你仍需定义的内容 |
| --- | --- | --- |
| 原始 `ONNX` | 图结构中的张量结构 | 训练阶段的预处理选择以及语义输出元数据（如类别名称和解析器配置） |
| `ONNX` NN Archive | 张量元数据、预处理以及来自 `config.json` 的可选 `heads` 元数据 | 导出选择（如目标平台和转换特定选项） |

如果从正确定义的 ONNX NN Archive 开始，通常不需要手动编辑导出的归档文件。 导出的归档文件可能与源归档文件不同，这是预期的。 例如，模型路径从 model.onnx 更改为编译后的构件（如 .superblob、.blob 或 .dlc），并且
mean/scale 可能变为 null，因为预处理已嵌入到编译后的模型中。

## 故障排除

并非所有模型都能成功转换为目标平台。 你可以按如下方式检查失败的转换日志：

#### 打开失败的转换作业

在 Failed Conversions（失败的转换）部分找到失败的作业并打开。

#### 下载或检查日志

使用右上角的 Logs（日志）按钮下载日志，或直接检查页面上的 Conversion process logs（转换过程日志）部分。

> 如果导出失败，需要对模型或所使用的转换参数进行修正。请参考
> [转换故障排除](https://docs.luxonis.com/software-v3/ai-inference/conversion/troubleshooting.md)
> 页面获取更多信息。
