[Unity Sentis] 了解 Sentis 工作流程

英文原文:https://docs.unity3d.com/Packages/com.unity.sentis@1.3/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 项表示模型预测图像是手写零的程度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值