英文原文:https://docs.unity3d.com/Packages/com.unity.sentis@1.3/manual/understand-sentis-workflow.html
要在 Unity 中使用 Sentis 运行神经网络,请按照以下步骤操作:
- 使用 Unity.Sentis 命名空间。
- 加载神经网络模型文件。
- 为模型创建输入。
- 创建一个推理引擎(一个工作线程)。
- 使用输入运行模型以推断结果。
- 得到结果。
使用 Unity.Sentis 命名空间
将以下内容添加到脚本顶部:
using Unity.Sentis;
加载模型
Sentis 可以导入开放神经网络交换 (ONNX) 格式的模型文件。要加载模型,请按照下列步骤操作:
- 从机器学习框架将模型导出为 ONNX 格式,或从互联网下载 ONNX 模型。
- 将模型文件添加到 “Project” 窗口的 “Assets” 文件夹中。
- 在脚本中创建运行时模型。
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;
有关详细信息,请参阅从模型获取输出。
示例
以下示例对手写数字进行分类。
请按照以下步骤操作:
- 将以下脚本附加到场景中的游戏对象。
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();
}
}
-
下载手写识别 ONNX 模型文件,例如从 ONNX Model Zoo 中下载 MNIST 手写数字识别模型 mnist-8.onnx,并将其拖到项目窗口的 Assets 文件夹中。
-
将模型资源拖动到 GameObject 的 Inspector 窗口中的 modelAsset 字段中。
-
下载下面的 digit.png 图像并将其拖到项目窗口的Assets文件夹中。在导入设置中将“Non-Power of 2”设置为“None”,然后单击“Apply”。
-
将数字资源拖到 GameObject 的 Inspector 窗口中的 inputTexture 字段中。
-
单击“Play”。在游戏对象的检查器窗口中,结果数组的每一项显示模型预测图像是数字的程度。例如,数组的第 0 项表示模型预测图像是手写零的程度。