# Blobconverter（旧版）

> 这是一个旧版工具。建议改用
> [HubAI 转换](https://docs.luxonis.com/cloud/hubai/model-registry/detailed-conversion.md)
> ，或按照
> [迁移指南](https://docs.luxonis.com/software-v3/ai-inference/conversion/rvc-conversion/online/hubai.md)
> 中的说明使用 Python API。

## 概述

BlobConverter 是我们的[开源工具](https://github.com/luxonis/blobconverter)，支持转换为与 RVC2 和 RVC3 Luxonis 设备兼容的 MyriadX（.blob）格式。 该工具可通过网页界面和
API 访问。 本节将引导你了解所有转换选项。

## 转换

### BlobConverter 网页界面

 * 访问 [BlobConverter 网站](https://blobconverter.luxonis.com/)。
 * 选择你希望使用的 OpenVINO 版本。我们将使用 BlobConverter 支持的最新版本，目前是 2022.1。 对于 RAE 及其他搭载 RVC3 的设备，直接选择 RVC3 即可。选择版本后， 指定模型来源。本例中为 ONNX
   模型，但也可以上传 IR 格式的模型。然后点击 Continue。

 * 点击 Choose file 上传 ONNX 文件。

 * 此外，在继续进行模型转换之前，你可以通过点击 Advanced 自定义 [转换参数](#Advanced%20Settings)。

 * 最后，点击 Convert，等待转换过程完成。

### BlobConverter Python

我们也以 Python 包的形式提供了 BlobConverter（[PyPI 链接](https://pypi.org/project/blobconverter/)）。你可以使用 pip 安装：

```bash
pip install blobconverter
```

现在，你可以使用指定的转换参数将 ONNX 模型转换为 blob。

```python
import blobconverter

blob_path = blobconverter.from_onnx(
    model="/path/to/model.onnx",
    data_type="FP16",
    shaves=6,
    version="2022.1"
)
```

你可以在[此处](https://github.com/luxonis/blobconverter/tree/master/cli#conversion-examples-python)查看更多来自不同模型来源的转换示例。

### BlobConverter API

或者，你也可以使用 BlobConverter API，这对于自动化工作流特别有用。 通过向 BlobConverter 服务发送 HTTP 请求，并附带所需的模型和参数即可完成。你可以在网站右上角点击 Use API 按钮，获取更多相关信息。

> 注意：BlobConverter 工具也可以自托管。有关此过程的指导，请参阅
> [BlobConverter 仓库](https://github.com/luxonis/blobconverter/tree/master)
> 中的说明。

## 导出示例

本指南将引导你将 ResNet18（一种广泛用于图像分类的深度神经网络）导出为 .blob 文件，以便在 OAK 设备上部署。我们将使用 torchvision 来获取模型的预训练版本。

> 如需转换 YOLO 模型，请考虑使用
> [我们专门为此任务设计的工具](https://tools.luxonis.com/)
> 。有关 YOLO 转换过程的详细指导，请访问
> [此文档页面](https://docs.luxonis.com/software-v3/ai-inference/conversion/rvc-conversion/online/yolo.md)
> 。

### 将模型导出为 ONNX

首先，我们将 ResNet18 模型从 PyTorch 导出为 ONNX 格式。

```python
import torch
import torchvision.models as models

# 加载 torchvision 中的预训练 ResNet18 模型
resnet18 = models.resnet18(pretrained=True)

# 将模型设置为评估模式
resnet18.eval()

# 创建一个与模型输入形状匹配的虚拟输入张量
dummy_input = torch.randn(1, 3, 224, 224)

# 将模型导出为 ONNX 文件
torch.onnx.export(
resnet18,
dummy_input,
'resnet18.onnx',
export_params=True,
opset_version=11,
input_names=['input'],
output_names=['output']
)
```

参数说明：

 * export_params：此标志确保训练好的参数与模型结构一起导出。
 * opset_version：指定要使用的 ONNX 版本。我们通常使用版本 11 以确保与 ResNet18 的要求兼容，但更高的版本也可能适用。
 * input_names 和 output_names：我们使用这些标志来命名模型的输入和输出节点，以便清晰明了。 在本例中，输入节点命名为 "input"，输出节点命名为 "output"。
 * 导出后，你将得到一个名为 "resnet18.onnx" 的文件，如第三个参数所定义。

### 使用 BlobConverter 将 ONNX 转换为 .blob

我们无需手动将 ONNX 文件转换为 OpenVINO IR 再编译，而是使用 BlobConverter 处理这两个步骤。

 * 访问 [BlobConverter 网站](https://blobconverter.luxonis.com/)。
 * 选择合适的 OpenVINO 版本，本例中为 2022.1。
 * 上传 .onnx 文件，并在“高级”设置中输入必要的模型优化器参数。
 * --data_type：设置为 'FP16'，以与 VPU 处理器的精度兼容。
 * --mean_values：设置为 [123.675, 116.28, 103.53]。这些值对应 ImageNet 数据集（ResNet18 的训练数据）中所有图像红色、绿色和蓝色通道的平均值。
 * --scale_values：设置为 [58.395, 57.12, 57.375]，即每个通道的标准差。此缩放确保输入图像的像素值范围与训练数据中的范围匹配，这对模型正确执行至关重要。
 * --reverse_input_channels：使用此标志将 BGR 转换为 RGB， 因为 Camera 节点输出 BGR 格式的帧，而模型需要 RGB 图像。
 * 最后，这些标志应如下所示：

```bash
--data_type=FP16 --mean_values=[123.675,116.28,103.53] --scale_values=[58.395,57.12,57.375] --reverse_input_channels
```

 * 点击 Convert 开始转换，然后等待过程完成后下载 .blob 文件。

按照这些说明操作后，你将得到一个 resnet18.blob 文件，可在 OAK 设备上进行推理。 转换后的模型将期望输入 BGR 格式、像素值范围为 0 到 255 的图像。然后这些值将被缩放到 0 到 1 的范围，并使用我们设置的标志进行归一化。
