相关教程
把AI模型放入Unity-手写数字识别【UnitySentis入门-1】_哔哩哔哩_bilibili
Sentis 是一个用于人工智能模型的本地推理引擎(神经网络推理库),它利用终端用户设备上的计算,而不是云服务器。它可以在任何可以部署 Unity 运行时的地方运行。
可以使用 Sentis 将训练有素的神经网络模型导入 Unity,然后在 Unity 支持的任何平台和编辑器中本地实时运行这些模型。您可以选择在 GPU 或 CPU 上运行模型。
它取代了 Barracuda(Unity 上一个本地神经网络库),解决了我们在 Barracuda 处于早期原型阶段时收到的许多反馈。最重要的是,Sentis 可以以游戏速度运行许多神经网络。可用于无限制的本地推理。
Sentis 有哪些功能?
Sentis 允许您将 ONNX 格式 的人工智能/ML 神经网络模型(来自 TensorFlow、PyTorch 和其他人工智能中心)导入 Unity 编辑器,然后在所有 Unity 支持平台上的用户设备上实时优化和运行推理。
Sentis 支持 opset 版本介于 7 和 15 之间的大多数 ONNX 格式模型。有关详细信息,请参阅支持的 ONNX 操作符。
您可以在 Unity 运行时(用于游戏)或 Unity 编辑器(用于游戏创建)中完成这项工作,而无需使用昂贵的 GPU 云服务器。Sentis 速度快,避免了云计算成本,并允许进行私有神经网络推断。最终,Sentis 将使 Unity 开发人员能够利用人工智能领域令人难以置信的创新,而这在以前是不可能实现的。
可能的使用案例有很多,下面列出来一些经过 Unity 开发者已经实现的,希望 Sentis 的用户可以发挥出更多的创意 :
com.unity.sentis
我们可以导入附带的Samples示例项目
使用 Sentis 在 Unity 中运行神经网络模型,通常需要如下步骤:
ONNX 是一种用于表示机器学习模型的开放格式。ONNX 定义了一组通用算子(机器学习和深度学习模型的构件)和一种通用文件格式,使人工智能开发人员能够在各种框架、工具、运行时和编译器中使用模型。ONNX 模型现已经成为一种广泛流行的开放标准格式。
ONNX 模型主要可以应用在以下方面:
Sentis 可以导入开放神经网络交换?ONNX?格式的模型文件。要加载模型,请按照以下步骤操作:
using Unity.Sentis; ..... //生成模型资源对象 ModelAsset modelAsset = Resources.Load("model-file-in-assets-folder") as ModelAsset; //创建运行时模型对象 runtimeModel = ModelLoader.Load(modelAsset); //使用张量 API 为模型创建包含数据的张量。您可以将数组或纹理转换为张量。 //获取纹理图片作为输入 Texture2D inputTexture = Resources.Load("image-file") as Texture2D; // 下面是将图片纹理转换为张量 Convert a texture to a tensor TensorFloat inputTensor = TextureConverter.ToTensor(inputTexture); //创建推理引擎(a worker): //在 Sentis 中,worker 就是推理引擎。您可以创建一个 Worker,将模型分解为可执行的任务,在 GPU 或 CPU 上运行这些任务,并输出结果 // 这条代码使用 Sentis 计算着色器创建一个在 GPU 上运行的 Worker: Worker worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel); // 运行模型 worker.Execute(inputTensor); // 使用 worker 对象的 PeekOutput()方法 获取结果,保存为张量类型 TensorFloat outputTensor = worker.PeekOutput() as TensorFloat;
扩展阅读:?一分钟快速了解张量Tensor
下面的示例对一个手写数字进行了分类。
准备工作:从 ONNX Model Zoo 下载手写识别 ONNX 模型文件,例如?MNIST 手写数字识别模型 mnist-12.onnx,并将其拖入项目窗口的 Assets 文件夹。
mnist-12.onnx gitee 替代下载链接
将以下脚本附加到场景中的一个 GameObject。
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() { // Create the runtime model runtimeModel = ModelLoader.Load(modelAsset); // Add softmax layer to end of model instead of non-softmaxed output string softmaxOutputName = "Softmax_Output"; runtimeModel.AddLayer(new Softmax(softmaxOutputName, runtimeModel.outputs[0])); runtimeModel.outputs[0] = softmaxOutputName; // Create input data as a tensor using Tensor inputTensor = TextureConverter.ToTensor(inputTexture, width: 28, height: 28, channels: 1); // Create an engine worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel); // Run the model with the input data worker.Execute(inputTensor); // Get the result using TensorFloat outputTensor = worker.PeekOutput() as TensorFloat; // Move the tensor data to the CPU before reading it outputTensor.MakeReadable(); results = outputTensor.ToReadOnlyArray(); } void OnDisable() { // Tell the GPU we're finished with the memory the engine used worker.Dispose(); } }
参考资料: