转换

- 模型来源: 从使用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格式的模型。然后点击继续。

- 点击
选择文件上传ONNX文件。

- 此外,在进行模型转换之前,你可以通过点击
高级自定义 转换参数。

- 最后,点击
转换并等待过程完成。
使用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 等工具完成此过程。模型优化器
.bin 和 .xml)。这种标准化模型格式可以部署在各种 Intel 设备上,包括 VPU。此外,您可以通过指定各种标志来自定义转换过程,我们将在 后续章节 中对此进行说明。要执行转换,请确保已安装 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]编译工具
.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 支持的算子列表
高级设置
模型优化器标志
数据类型
--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 之间,使用 mean=0 和 scale=255,计算公式为
([0,255] - 0) / 255 = [0,1]。 - 若要求输入值在 -1 到 1 之间,使用 mean=127.5 和 scale=127.5,计算公式为
([0,255] - 127.5) / 127.5 = [-1,1]。 - 若要求输入值在 -0.5 到 0.5 之间,使用 mean=127.5 和 scale=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,如 余弦距离模型示例 所示。SHAVE 核心
导出示例
.blob 文件,以便在 OAK 设备上部署。我们将使用 torchvision 获取预训练版本的模型。首先,我们将 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文件,并在“高级”设置中输入必要的 Model Optimizer 参数。 --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 的范围,并使用我们设置的标志进行归一化。