DepthAI v2 has been superseded by DepthAI v3. You are viewing legacy documentation.
此页面由 AI 自动翻译。查看英文原版

本页目录

  • 模型来源准备
  • PyTorch 转 ONNX
  • TFLite 转 ONNX
  • 其他 TensorFlow 表示形式
  • 获取 Blob
  • 使用 BlobConverter
  • 本地转换
  • 高级设置
  • Model Optimizer Flags
  • 模型编译器标志
  • 导出示例

转换

要在 OAK 设备上部署自定义模型,必须将其从初始框架(如 PyTorch、TFLite 等)转换为与 DepthAI 兼容的 MyriadX blob 格式。在本指南中,我们将介绍如何使用 BlobConverter 工具执行此操作,并演示如何执行本地转换。转换过程如下图所示:
模型编译
  1. 模型来源: 从在 ONNX、Caffe 或其中一种 TensorFlow 格式等框架中开发的模型开始。
  2. 模型优化器: 使用模型优化器将模型转换为 OpenVINO 的中间表示 (IR),生成 .xml(配置文件)和 .bin(权重文件)。
  3. 模型编译器: 使用模型编译器编译 .xml.bin 文件,以创建 .blob 文件。
  4. 部署:.blob 文件部署到 OAK 设备内的 MYRIAD-X 处理器上以进行推理。

模型来源准备

在第一步中,您将通过将其从原始框架转换为适合进一步转换的格式来准备模型,具体格式可能包括 ONNX 或其他格式,具体取决于模型的来源。

PyTorch 转 ONNX

您可以使用 PyTorch ONNX API 来转换和导出您的模型:
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

对于 TensorFlow Lite (.tflite) 格式的模型,推荐的转换工具是 tflite2onnx。 此工具将 TFLite 模型转换为 ONNX 格式:
  • 首先,安装 tflite2onnx 包:
Command Line
1pip install tflite2onnx
  • 然后可以通过命令行进行转换:
Command Line
1tflite2onnx your_model.tflite output.onnx
或者通过 Python:
Python
1import tflite2onnx
2tflite2onnx.convert('your_model.tflite', 'output.onnx')

其他 TensorFlow 表示形式

对于非 TFLite 的 TensorFlow 模型(如 SavedModel 或 Frozen Graph),转换直接涉及 OpenVINO 的模型优化器。有关详细说明,请参阅 OpenVINO 文档。在 OpenVINO 转换之后,您可以使用 BlobConverterOpenVINO 的编译工具 来获取 .blob 文件。

获取 Blob

有两种方法可以获取 .blob 文件:第一种也是最简单的方法是使用 BlobConverter,这也是推荐的方法。或者,您可以使用本地方法,该方法涉及直接使用 OpenVINO 工具。

使用 BlobConverter

BlobConverter 提供了一种简单的方法来获取 .blob 文件。该工具可通过 Web 界面、API 和命令行界面 (CLI) 访问。以下各节概述了使用这些工具将模型转换为 .blob 的步骤。

通过 BlobConverter Web 界面进行转换

  • 转到 BlobConverter 网站
  • 选择您希望使用的 OpenVINO 版本。我们将使用 BlobConverter 支持的最新版本,目前是 2022.1。对于 RAE 和其他具有 RVC3 的设备,您可以直接选择 RVC3。选择版本后,指定模型来源。在本例中是 ONNX 模型,但也可以上传 IR 格式的模型。然后单击 Continue
Blobconverter 菜单
  • 通过单击 Choose file 上传 ONNX 文件。
Blobconverter 上传
  • 此外,在继续模型转换之前,您可以通过单击 Advanced 来自定义 转换参数
Blobconverter 高级设置
  • 最后,单击 Convert 并等待过程完成。
或者,您可以使用 BlobConverter API,这对于自动化工作流特别有用。这可以通过向 BlobConverter 服务发出 HTTP 请求并提供必要的模型和参数来完成。您可以通过单击网站右上角的 Use API 按钮找到有关如何执行此操作的更多信息。

通过 BlobConverter CLI 进行转换

Command Line
1python3 -m pip install blobconverter
  • 使用该软件包,您可以直接从命令行和 Python 脚本转换模型:
Command Line
1python3 -m blobconverter --onnx-model /path/to/model.onnx --shaves 6
或者
Python
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

OpenVINO 的 Model Optimizer 将模型从其原始框架格式转换为 OpenVINO 的中间表示 (IR) 标准格式(.bin.xml)。这种标准化的模型格式可以在各种 Intel 设备上部署,包括 VPU。此外,您可以通过指定各种标志来自定义转换过程,我们将在 [后续章节](scroll-to://Model Optimizer Flags) 中进行解释。要执行转换,请确保已安装 OpenVINO-dev。请注意,此方法支持 OpenVINO 版本 2022.1,不包括对更高版本的支持:
Command Line
1pip install openvino-dev==2022.1
然后按如下方式运行命令:
Command Line
1mo --input_model path/to/model.onnx --data_type=FP16 --mean_values=[0,0,0] --scale_values=[255,255,255]

Compile Tool

一旦模型被转换为 OpenVINO 的 IR 格式,下一步就是利用 OpenVINO 的 Compile Tool。此工具用于将 IR 格式的模型编译为 .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

高级设置

Model Optimizer Flags

数据类型

由于我们正在为支持 FP16 的 VPU 进行转换,因此必须使用参数 --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]
有关更多信息,请参阅 OpenVINO 文档

模型布局

模型布局可以使用 --layout 参数定义。例如:
Command Line
1--layout NCHW
在以下配置中:
  • N - 批次大小
  • C - 通道数
  • H - 高度
  • W - 宽度
如果图像布局与模型布局不匹配,DepthAI 将显示相应的错误消息: [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 = 平面布局
您可以在 OpenVINO 文档 中找到更多详细信息。

颜色顺序

神经网络模型通常使用 RGB 颜色顺序的图像进行训练。ColorCamera 节点默认输出 BGR 格式的帧。输入帧与训练模型的颜色顺序不匹配可能导致预测不准确。为解决此问题,可以使用 --reverse_input_channels 标志。此外,还可以通过 API 将摄像头输出切换到 RGB,从而无需使用该标志:
Python
1import depthai as dai
2pipeline = dai.Pipeline()
3colorCam = pipeline.createColorCamera()
4colorCam.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB) # RGB 颜色顺序,默认为 BGR
您可以在 OpenVINO 文档 中找到更多详细信息。

模型编译器标志

输入层精度

使用 -ip U8 将在模型的所有输入层中添加一个 U8->FP16 的转换层,这通常是所需的配置。但是,在特定场景下,例如处理非帧数据时,直接使用 FP16 精度是必要的。在这种情况下,您可以选择 -ip FP16,如 余弦距离模型示例 所示。

Shaves

在编译过程中增加 SHAVE 的数量可以提高模型的速度,尽管 SHAVE 核心与性能之间的关系并非线性。固件会发出警告,建议使用最佳的 SHAVE 核心数量,通常是可用核心的一半。

导出示例

本指南将引导您完成将 ResNet18(一种广泛使用的图像分类深度神经网络)导出为 .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_namesoutput_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 转换
按照这些说明操作后,您将获得一个 resnet18.blob 文件,该文件已准备好在 OAK 设备上进行推理。转换后的模型将期望接收 BGR 格式的图像,像素值范围为 0 到 255。然后,这些值将被缩放到 0 到 1 的范围,并使用我们设置的标志进行归一化。