转换
转换

- 模型来源: 从在 ONNX、Caffe 或其中一种 TensorFlow 格式等框架中开发的模型开始。
- 模型优化器: 使用模型优化器将模型转换为 OpenVINO 的中间表示 (IR),生成
.xml(配置文件)和.bin(权重文件)。 - 模型编译器: 使用模型编译器编译
.xml和.bin文件,以创建.blob文件。 - 部署: 将
.blob文件部署到 OAK 设备内的 MYRIAD-X 处理器上以进行推理。
模型来源准备
PyTorch 转 ONNX
Python
1import torch
2# 加载您的 PyTorch 模型
3your_model = Model()
4# 创建一个与模型输入形状匹配的虚拟输入张量
5dummy_input = torch.randn(1, 3, 224, 224)
6# 转换并保存为 ONNX
7torch.onnx.export(your_model, dummy_input, 'output.onnx')TFLite 转 ONNX
.tflite) 格式的模型,推荐的转换工具是 tflite2onnx。 此工具将 TFLite 模型转换为 ONNX 格式:- 首先,安装
tflite2onnx包:
Command Line
1pip install tflite2onnx- 然后可以通过命令行进行转换:
Command Line
1tflite2onnx your_model.tflite output.onnxPython
1import tflite2onnx
2tflite2onnx.convert('your_model.tflite', 'output.onnx')其他 TensorFlow 表示形式
.blob 文件。获取 Blob
.blob 文件:第一种也是最简单的方法是使用 BlobConverter,这也是推荐的方法。或者,您可以使用本地方法,该方法涉及直接使用 OpenVINO 工具。使用 BlobConverter
.blob 文件。该工具可通过 Web 界面、API 和命令行界面 (CLI) 访问。以下各节概述了使用这些工具将模型转换为 .blob 的步骤。通过 BlobConverter Web 界面进行转换
- 转到 BlobConverter 网站。
- 选择您希望使用的 OpenVINO 版本。我们将使用 BlobConverter 支持的最新版本,目前是
2022.1。对于 RAE 和其他具有 RVC3 的设备,您可以直接选择 RVC3。选择版本后,指定模型来源。在本例中是 ONNX 模型,但也可以上传 IR 格式的模型。然后单击Continue。

- 通过单击
Choose file上传 ONNX 文件。

- 此外,在继续模型转换之前,您可以通过单击
Advanced来自定义 转换参数。

- 最后,单击
Convert并等待过程完成。
Use API 按钮找到有关如何执行此操作的更多信息。注意:BlobConverter 工具也可以自托管。有关此过程的指导,请参阅我们 BlobConverter 存储库 中提供的说明。
通过 BlobConverter CLI 进行转换
- 首先,安装 BlobConverter CLI:
Command Line
1python3 -m pip install blobconverter- 使用该软件包,您可以直接从命令行和 Python 脚本转换模型:
Command Line
1python3 -m blobconverter --onnx-model /path/to/model.onnx --shaves 6Python
1import blobconverter
2
3blob_path = blobconverter.from_onnx(
4 model="/path/to/model.onnx",
5 data_type="FP16",
6 shaves=6,
7)本地转换
.blob 文件。在互联网访问受限的环境中,或者将转换集成到您的工作流程中时,它特别有用。接下来的步骤将指导您完成使用 OpenVINO 的 Model Optimizer 和 Compile Tool 等工具完成此过程。Model Optimizer
.bin 和 .xml)。这种标准化的模型格式可以在各种 Intel 设备上部署,包括 VPU。此外,您可以通过指定各种标志来自定义转换过程,我们将在 [后续章节](scroll-to://Model Optimizer Flags) 中进行解释。要执行转换,请确保已安装 OpenVINO-dev。请注意,此方法支持 OpenVINO 版本 2022.1,不包括对更高版本的支持:Command Line
1pip install openvino-dev==2022.1Command Line
1mo --input_model path/to/model.onnx --data_type=FP16 --mean_values=[0,0,0] --scale_values=[255,255,255]Compile Tool
.blob 文件,然后该文件即可用于设备部署。- Compile Tool 是 OpenVINO 工具包的一部分。其位置将取决于您的安装路径。通常,它位于 OpenVINO 安装的
.../tools/compile_tool目录中:
Command Line
1cd .../tools/compile_tool- 使用以下命令格式将您的 IR 模型编译为 .blob 文件:
Command Line
1./compile_tool -m path_to_model/model_name.xml -d MYRIAD值得一提的是,虽然我们的平台支持广泛的模型,但某些自定义或独特的模型可能需要额外的步骤才能完美运行,这可能是由于某些算子限制。为了获得顺畅的体验,请查看 OpenVINO 支持的算子 列表。
高级设置
Model Optimizer Flags
数据类型
--data_type=FP16。对于 OpenVINO 版本 2022.3 及更高版本,应改用参数 --compress_to_fp16。您可以在 此处 找到更多详细信息。均值和缩放值
--mean_values 和 --scale_values 实现。默认情况下,来自 ColorCamera/MonoCamera 的帧是 U8 数据类型,范围为 [0,255]。然而,模型通常使用归一化到 [-1,1] 或 [0,1] 范围内的帧进行训练。为确保准确的推理结果,需要提前对帧进行归一化。虽然创建一个在推理前归一化帧的自定义模型是一种选择(示例在此),但更有效的方法是在模型优化器步骤中使用标志将此归一化直接包含在模型本身中。以下是一些常见的归一化选项(假设初始输入范围为 [0,255]):- 对于值在 0 到 1 之间的必需输入,使用均值=0 和缩放=255,计算方式为
([0,255] - 0) / 255 = [0,1]。 - 对于值在 -1 到 1 之间的必需输入,使用均值=127.5 和缩放=127.5,计算方式为
([0,255] - 127.5) / 127.5 = [-1,1]。 - 对于值在 -0.5 到 0.5 之间的必需输入,使用均值=127.5 和缩放=255,计算方式为
([0,255] - 127.5) / 255 = [-0.5,0.5]。
模型布局
--layout 参数定义。例如:Command Line
1--layout NCHW- N - 批次大小
- C - 通道数
- H - 高度
- W - 宽度
[NeuralNetwork(0)] [warning] Input image (416x416) does not match NN (3x416)需要注意的是,ColorCamera 节点通常默认输出交错/HWC 布局的 preview 帧,这与 OpenCV 原生格式一致。 但是,您可以通过 API 选择将其切换到平面/CHW 布局:Python
1import depthai as dai
2pipeline = dai.Pipeline()
3colorCam = pipeline.createColorCamera()
4colorCam.setInterleaved(False) # False = 平面布局颜色顺序
--reverse_input_channels 标志。此外,还可以通过 API 将摄像头输出切换到 RGB,从而无需使用该标志:Python
1import depthai as dai
2pipeline = dai.Pipeline()
3colorCam = pipeline.createColorCamera()
4colorCam.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB) # RGB 颜色顺序,默认为 BGR模型编译器标志
输入层精度
-ip U8 将在模型的所有输入层中添加一个 U8->FP16 的转换层,这通常是所需的配置。但是,在特定场景下,例如处理非帧数据时,直接使用 FP16 精度是必要的。在这种情况下,您可以选择 -ip FP16,如 余弦距离模型示例 所示。Shaves
导出示例
.blob 文件,以便在 OAK 设备上部署的过程。我们将使用 torchvision 来访问模型的预训练版本。对于转换 YOLO 模型,请考虑使用我们专为此任务设计的工具。有关 YOLO 转换过程的详细指南,请访问此文档页面。
首先,我们将把 ResNet18 模型从 PyTorch 导出为 ONNX 格式。参数说明:
Python
1import torch
2import torchvision.models as models
3
4# 从 torchvision 加载预训练的 ResNet18 模型
5resnet18 = models.resnet18(pretrained=True)
6
7# 将模型设置为评估模式
8resnet18.eval()
9
10# 创建一个与模型输入形状匹配的虚拟输入张量
11dummy_input = torch.randn(1, 3, 224, 224)
12
13# 将模型导出为 ONNX 文件
14torch.onnx.export(
15 resnet18,
16 dummy_input,
17 'resnet18.onnx',
18 export_params=True,
19 opset_version=11,
20 input_names=['input'],
21 output_names=['output']
22)export_params:此标志确保训练好的参数与模型结构一起导出。opset_version:指定要使用的 ONNX 版本。虽然我们通常使用版本 11 来确保与 ResNet18 的要求兼容,但更高版本也可能适用。input_names和output_names:我们使用这些标志来命名模型的输入和输出节点,以便清晰明了。在我们的示例中,输入节点名为“input”,输出节点名为“output”。- 导出后,您将获得一 个名为“resnet18.onnx”的文件,如第三个参数所示。
我们不手动将 ONNX 文件转换为 OpenVINO IR,然后再进行编译,而是使用 BlobConverter 来处理这两个步骤。
- 转到 BlobConverter 网站。
- 选择合适的 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,因为 ColorCamera 节点以 BGR 格式输出帧,而模型需要 RGB 图像。- 因此,最终的标志应如下所示:
Command Line
1--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 的范围,并使用我们设置的标志进行归一化。