[Unity Sentis] 了解 Sentis 工作流程

英文原文:https://docs.unity3d.com/Packages/[email protected]/manual/understand-sentis-workflow.html

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

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

使用 Unity.Sentis 命名空间

将以下内容添加到脚本顶部:

using Unity.Sentis;

加载模型

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

  1. 从机器学习框架将模型导出为 ONNX 格式,或从互联网下载 ONNX 模型。
  2. 将模型文件添加到 “Project” 窗口的 “Assets” 文件夹中。
  3. 在脚本中创建运行时模型。
ModelAsset modelAsset = Resources.Load("model-file-in-assets-folder") as ModelAsset;
runtimeModel = ModelLoader.Load(modelAsset);

有关详细信息,请参阅导入模型文件。

为模型创建输入

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

// 将纹理转换为张量
Texture2D inputTexture = Resources.Load("图像文件") as Texture2D;
TensorFloat inputTensor = TextureConverter.ToTensor(inputTexture);

有关更多信息,请参阅为模型创建输入。

创建推理引擎(worker)

在 Sentis 中,worker 是推理引擎。您创建一个工作线程来将模型分解为可执行任务,在 GPU 或 CPU 上运行任务并输出结果。

例如,以下命令创建一个使用 Sentis 计算着色器在 GPU 上运行的工作线程:

IWorker worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);

有关详细信息,请参阅创建引擎。

运行模型

要运行模型,请使用 worker 对象的 Execute 方法和输入张量。例如:

worker.Execute(inputTensor);

有关更多信息,请参阅运行模型。

获取输出

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

TensorFloat outputTensor = worker.PeekOutput() as TensorFloat;

有关详细信息,请参阅从模型获取输出。

示例

以下示例对手写数字进行分类。

请按照以下步骤操作:

  1. 将以下脚本附加到场景中的游戏对象。
using UnityEngine;
using Unity.Sentis;
using Unity.Sentis.Layers;

public class ClassifyHandwrittenDigit : MonoBehaviour
{
    public Texture2D inputTexture;
    public ModelAsset modelAsset;
    Model runtimeModel;
    IWorker worker;
    public float[] results;

    void Start()
    {
        // 创建运行时模型
        runtimeModel = ModelLoader.Load(modelAsset);

        // 将 softmax 层添加到模型末尾,而不是 non-softmax 输出
        string softmaxOutputName = "Softmax_Output";
        runtimeModel.AddLayer(new Softmax(softmaxOutputName, runtimeModel.outputs[0]));
        runtimeModel.outputs[0] = softmaxOutputName;

        // 创建输入数据作为张量
        using Tensor inputTensor = TextureConverter.ToTensor(inputTexture, width: 28, height: 28, channels: 1);

        // 创建一个引擎
        worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);

        // 使用输入数据运行模型
        worker.Execute(inputTensor);

        // 得到结果
        using TensorFloat outputTensor = worker.PeekOutput() as TensorFloat;

        // 在读取之前将张量数据移动到CPU
        outputTensor.MakeReadable();

        results = outputTensor.ToReadOnlyArray();
    }

    void OnDisable()
    {
        // 告诉 GPU 我们已经完成了引擎使用的内存
        worker.Dispose();
    }
}
  1. 下载手写识别 ONNX 模型文件,例如从 ONNX Model Zoo 中下载 MNIST 手写数字识别模型 mnist-8.onnx,并将其拖到项目窗口的 Assets 文件夹中。

  2. 将模型资源拖动到 GameObject 的 Inspector 窗口中的 modelAsset 字段中。

  3. 下载下面的 digit.png 图像并将其拖到项目窗口的Assets文件夹中。在导入设置中将“Non-Power of 2”设置为“None”,然后单击“Apply”。
    在这里插入图片描述

  4. 将数字资源拖到 GameObject 的 Inspector 窗口中的 inputTexture 字段中。

  5. 单击“Play”。在游戏对象的检查器窗口中,结果数组的每一项显示模型预测图像是数字的程度。例如,数组的第 0 项表示模型预测图像是手写零的程度。

你可能感兴趣的:(Unity,人工智能,unity,人工智能)