【Unity智能模型系列】Unity-Sentis实现加载各种ONNX模型本地部署运行

目录

一、Sentis 介绍

1、Sentis 概述

2、支持的平台

3、支持的模型类型

二、Sentis 接入流程

1、安装 Sentis

2、Sentis 工作流程

a、加载模型

b、为模型创建输入

c、创建推理引擎(Worker) 

d、Schedule模型

e、获取模型输出 

f、解析模型数据


一、Sentis 介绍

1、Sentis 概述

        Sentis 是 Unity 的一个神经网络推理库。该软件包目前处于“发布”状态,所有 Unity 用户均可通过软件包管理器获取。您可以使用 Sentis 将训练好的神经网络模型导入 Unity,然后实时运行它们。Sentis 利用最终用户的设备计算能力(GPU 或 CPU),并且可以运行任何支持的 Unity 运行时平台。
接入运行模型流程:

部分描述
开始安装 Sentis,查找并使用示例项目,并了解 Sentis 工作流程。
创建模型通过导入 ONNX 模型文件或使用 Sentis 模型 API 来创建运行时模型。
运行模型为模型创建输入数据,创建引擎来运行模型并获取输出。
使用张量获取、设置和修改输入和输出数据。
分析模型使用 Unity 工具来分析模型的速度和性能。

2、支持的平台

Sentis 适用于所有 Unity 运行时平台。

性能可能会有所不同,取决于:

  • 模型运算符和复杂性。
  • 最终用户硬件和软件平台的限制。
  • 所用引擎的类型。有关更多信息,请参阅模型和创建引擎。

3、支持的模型类型

Sentis 支持大多数开放神经网络交换 (ONNX) 格式的模型,其opset 版本在 7 到 15 之间。

二、Sentis 接入流程

1、安装 Sentis

Sentis 包可从 Unity 包管理器获取。Sentis 2.0.0 与 Unity 2023.2(或更高版本)兼容。可以根据编辑器版本选择对应的Sentis版本。

要将 Sentis 包添加到 Unity 项目:

  1. 创建一个新的 Unity 项目或打开一个现有项目。
  2. 要打开包管理器,请导航至窗口>包管理器
  3. 单击+并选择按名称添加包...。
  4. 进入com.unity.sentis
  5. 单击“添加”将包添加到您的项目中。

2、Sentis 工作流程

要使用 Sentis 在 Unity 中运行神经网络,请按照以下步骤操作:

  1. 使用Unity.Sentis命名空间。
  2. 加载神经网络模型文件。
  3. 为模型创建输入。
  4. 创建一个推理引擎(一个工作者)。
  5. 使用输入运行模型来计算结果(推理)。
  6. 得到结果。

a、加载模型

Sentis 可以导入开放神经网络交换(ONNX) 格式的模型文件。要加载模型,请按照以下步骤操作:

  1. 从机器学习框架将模型导出为 ONNX 格式或从互联网下载 ONNX 模型。

  2. 将模型文件添加到ProjectAssets窗口的文件夹中。

  3. 在脚本中创建运行时模型:
    你也可以public ModelAsset modelAsset在 GameObjects 中添加一个公共变量。在这种情况下,需要手动指定模型。

    ModelAsset modelAsset = Resources.Load("model-file-in-assets-folder") as ModelAsset;
    var runtimeModel = ModelLoader.Load(modelAsset);

b、为模型创建输入

使用Tensor API 为模型创建包含数据的张量。您可以将数组或纹理转换为张量。例如:

// Convert a texture to a tensor
Texture2D inputTexture = Resources.Load("image-file") as Texture2D;
Tensor<float> inputTensor = TextureConverter.ToTensor(inputTexture);
// Convert an array to a tensor
int[] array = new int[] {1,2,3,4};
Tensor<int> inputTensor = new Tensor<int>(new TensorShape(4), array);

c、创建推理引擎(Worker) 

在 Sentis 中,Worker 是推理引擎。您可以创建一个 Worker,将模型分解为可执行任务,在 GPU 或 CPU 上运行这些任务,并检索结果。例如,下面创建一个使用 Sentis 计算着色器在 GPU 上运行的工作器:

Worker worker = new Worker(runtimeModel, BackendType.GPUCompute);

d、Schedule模型

要运行模型,请使用Schedule带有输入张量的 worker 对象的方法。Sentis 在给定的后端调度模型层。执行是异步的,因此调用此方法后,张量操作可能仍处于待处理状态。

worker.Schedule(inputTensor);

e、获取模型输出 

您可以使用诸如以下方法PeekOutput从模型中获取输出数据。例如:

Tensor<float> outputTensor = worker.PeekOutput() as Tensor<float>;

f、解析模型数据

具体模型需要具体分析,可参考之后的案例。