[Unity Sentis] Unity Sentis 详细步骤工作流程

文章目录

  • 1. 导入模型文件
    • 支持的模型
    • 创建运行时模型
    • 导入错误
  • 2. 为模型创建输入
    • 将数组转换为张量
    • 创建多个输入
    • 进行操作
  • 3. 创建一个引擎来运行模型
    • 创建一个Worker
    • 后端类型
  • 4. 运行模型
  • 5. 获取模型的输出
    • 获取张量输出
    • 多个输出
    • 打印输出

1. 导入模型文件

要导入 ONNX 模型文件,请将文件从计算机拖到“Project”窗口的“Assets”文件夹中。

如果您的模型有外部权重文件,请将它们放在与模型文件相同的目录中,以便 Sentis 自动导入它们。

支持的模型

您可以导入 opset 版本在 7 到 15 之间的大多数 ONNX 模型文件。低于 7 或高于 15 的版本可能仍会导入 Sentis,但您可能会得到意外结果。

Sentis 不支持以下内容:

  • 使用超过 8 个维度的张量的模型。
  • 稀疏输入张量或常数。
  • String张量。
  • 复数张量。

Sentis 还将一些张量数据类型(如布尔值)转换为浮点数或整数。这可能会增加模型使用的内存。

当您导入模型文件时,Sentis 会优化模型。有关详细信息,请参阅了解 Sentis 中的模型。

创建运行时模型

要使用导入的模型,必须使用 ModelLoader.Load 创建运行时模型对象。

using UnityEngine;
using Unity.Sentis;

public class CreateRuntimeModel : MonoBehaviour
{
    public ModelAsset modelAsset;
    Model runtimeModel;

    void Start()
    {
        runtimeModel = ModelLoader.Load(modelAsset);
    }
}

然后,您可以创建一个引擎来运行模型。

导入错误

如果“模型资源导入设置”窗口显示警告,表明您的模型包含不受支持的运算符,您可以添加自定义层来实现缺少的运算符。有关示例,请参阅示例脚本中的添加自定义层示例。

2. 为模型创建输入

要检查模型所需输入的形状和大小,请打开 ONNX 模型导入设置并检查输入部分。

将数组转换为张量

要从一维数据数组创建张量,请按照下列步骤操作:

  1. 创建一个具有每个轴长度的 TensorShape 对象。
  2. 使用 TensorShape 对象和数据数组创建一个 Tensor 对象。

例如,以下代码为采用形状为 3 × 1 × 3 的输入张量的模型创建一个张量。

using UnityEngine;
using Unity.Sentis;

public class ConvertArrayToTensor : MonoBehaviour
{
    void Start()
    {
        // 创建一个包含 9 个值的数据数组
        float[] data = new float[] { 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f };

        // 创建大小为 3 × 1 × 3 的 3D 张量形状
        TensorShape shape = new TensorShape(3, 1, 3);

        // 从数组创建一个新的张量
        TensorFloat tensor = new TensorFloat(shape, data);
    }
}

创建多个输入

如果模型需要多个输入张量,您可以创建一个包含输入的字典。例如:

Dictionary<string, Tensor> inputTensors = new Dictionary<string, Tensor>()
{
    { "x", xTensor },
    { "y", yTensor },
};

进行操作

如果需要对张量进行操作,请使用 WorkerFactory.CreateOps。有关详细信息,请参阅对张量进行运算。

3. 创建一个引擎来运行模型

要运行模型,请创建一个Worker。 Worker 是将模型分解为可执行任务并安排任务在 GPU 或 CPU 上运行的引擎。

Worker 是 IWorker 对象的实例。

创建一个Worker

使用 WorkerFactory.CreateWorker 创建Worker。您必须指定后端类型(告诉 Sentis 在哪里运行工作程序)以及运行时模型。

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

using UnityEngine;
using Unity.Sentis;

public class CreateWorker : MonoBehaviour
{
    ModelAsset modelAsset;
    Model runtimeModel;
    IWorker worker;
    
    void Start()
    {
        runtimeModel = ModelLoader.Load(modelAsset);
        worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);
    }
}

后端类型

Sentis 提供 CPU 和 GPU 后端类型。要了解 Sentis 如何使用不同后端执行操作,请参阅 Sentis 如何运行模型。

如果后端类型不支持模型中的 Sentis 层,则工作线程将回退到在该层的 CPU 上运行。有关更多信息,请参阅支持的 ONNX 运算符。

BackendType.GPUCompute、BackendType.GPUCommandBuffer 和 BackendType.CPU 是最快的后端类型,因此仅当平台不支持计算着色器时才使用 BackendType.GPUPixel。要检查您的运行时平台是否支持计算着色器,请使用 SystemInfo.supportsComputeShaders

如果将 BackendType.CPU 与 WebGL 一起使用,Burst 会编译为 WebAssembly 代码,这可能会很慢。有关详细信息,请参阅 WebGL 开发入门。

模型运行的速度取决于平台对 Burst 多线程的支持程度,或者对计算着色器的支持程度。您可以分析模型以了解模型的性能。

4. 运行模型

创建工作线程后,使用 Execute 运行模型。

worker.Execute(inputTensor);

您可以在创建工作线程时启用详细模式。当您运行模型时,Sentis 将执行情况记录到控制台窗口。

worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel, verbose: true);

当您第一次在 Unity 编辑器中运行模型时,速度可能会很慢,因为 Sentis 需要编译代码和着色器。后期跑得更快。

有关示例,请参阅示例脚本中的运行模型示例。

5. 获取模型的输出

获取张量输出

使用 PeekOutput 访问张量的输出。 PeekOutput 返回一个 Tensor 对象,因此通常需要将其转换为 TensorFloat 或 TensorInt。例如:

worker.Execute(inputTensor);
TensorFloat outputTensor = worker.PeekOutput() as TensorFloat;

PeekOutput 的结果是一个浅拷贝,它指向与原始输出相同的内存,这意味着以下内容:

  • 您不需要在输出上使用 Dispose。
  • 如果更改输出或重新运行工作程序,工作程序输出和 PeekOutput 副本都会更改。
  • 如果您在工作线程上使用 Dispose,则 PeekOutput 副本也将被释放。

要获得原始张量的所有权,请执行以下任一操作:

  • 使用 PeekOutput 后​​,对张量使用 TakeOwnership。
  • 使用 FinishExecutionAndDownloadOutput 而不是 PeekOutput。 Sentis 从本机内存下载张量。

如果您使用任一方法,则必须在使用完张量后将其释放。

当您从 PeekOutput 返回的张量中读取数据时,可能会产生性能成本,因为 Sentis 会等待模型完成运行,然后将数据从 GPU 或 Burst 下载到 CPU。您可以异步读取模型的输出以避免这种成本。您还可以分析模型以了解有关模型性能的更多信息。

要从模型输出以外的层获取中间张量,请参阅从任意层获取输出。

多个输出

如果模型有多个输出,您可以使用每个输出名称作为 PeekOutput 中的参数。

例如,以下代码示例打印模型每一层的输出。

using UnityEngine;
using Unity.Sentis;

public class GetMultipleOutputs : MonoBehaviour
{
    ModelAsset modelAsset;
    Model runtimeModel;
    IWorker worker;

    void Start()
    {
        // Create an input tensor
        TensorFloat inputTensor = new TensorFloat(new TensorShape(4), new[] { 2.0f, 1.0f, 3.0f, 0.0f });

        // Create runtime model
        runtimeModel = ModelLoader.Load(modelAsset);

        // Create engine and execute
        worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);
        worker.Execute(inputTensor);

        // Iterate through the output layer names of the model and print the output from each
        foreach (var outputName in runtimeModel.outputs)
        {
            TensorFloat outputTensor = worker.PeekOutput(outputName) as TensorFloat;
            // Make the tensor readable by downloading it to the CPU
            outputTensor.MakeReadable();
            outputTensor.PrintDataPart(10);
        }
    }
}

打印输出

您可以使用以下方法将张量数据记录到控制台窗口:

  • Print
  • PrintDataPart,打印张量数据的第一个元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/369962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

加速数字化之旅:MessageBox赋能HubSpot与微信公众号的无缝整合

在数字化时代&#xff0c;企业需要整合关键平台以适应快速变化的市场。HubSpot和微信公众号的整合成为数字化营销的核心策略之一。MessageBox作为整合的关键力量&#xff0c;通过其卓越的能力&#xff0c;极大地加速了HubSpot与微信公众号的融合过程。今天运营坛将深入探讨Mess…

【OpenCV人脸检测】写了个智能锁屏小工具!人离开电脑自动锁屏

文章目录 1. 写在前面2. 设计思路3. 人脸检测4. 程序实现 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

React Hooks 学习笔记

1.useState&#xff08;&#xff09; 实现对页面数据的存储&#xff0c;当数据改变时候&#xff0c;自动触发render函数 2.useRef 用来解决两个问题&#xff1a; 1).是获取DOM元素或子组件的实例对象 2).存储渲染周期之间共享的数据 3.useEffect 4.useLayoutEffect 5…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数&#xff08;主函数&#xff09;test.cpp 测试结果 参考、格式 数据结构课本2.3节&#xff08;严蔚敏版&a…

【PLC一体机】PLC一体机中如何实现触摸屏和PC电脑的通讯

博主今天准备把之前买的PLC一体机拿出来玩一下&#xff0c;翻看以前的博文&#xff0c;发现没有记录分享PLC一体机中如何实现触摸屏程序下载的内容。 如之前博文介绍的那样&#xff0c;PLC一体机由PLC和触摸屏两部分集成的设备&#xff0c;因此设备内部已经做好了PLC和触摸屏之…

树莓派5一键安装C++版本OpenCV

安装环境 本人当前的安装环境&#xff1a; 树莓派5Raspberry Pi os (64-bit) Debian12 Bookworm 镜像下载地址 我这里是将镜像安装好后直接安装opencv&#xff0c;如果不是刚安装好的镜像需要注意是否有openCV的python之类的安装过&#xff0c;不然可能出现编译错误 一、扩展内…

HubSpot营销自动化如何优化营销流程?

HubSpot营销自动化在优化营销流程、减少手动工作以及提高效率方面发挥着关键作用。以下是一些具体的方法和策略&#xff1a; 1. 自动化电子邮件营销&#xff1a; 利用HubSpot的电子邮件自动化功能&#xff0c;设置触发条件&#xff0c;使邮件发送根据用户行为或阶段自动进行。…

Java 数据结构 二叉树(一)二叉查询树

目录 树的种类 二叉树 二叉查找树 满二叉树 ​编辑 完全二叉树 二叉树的数据存储 链式存储 数组存储 寻址方式&#xff1a; 二叉树的遍历&#xff08;了解即可&#xff09; ​编辑 二叉查询树缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满…

Web项目利用OSS进行图像存储服务

一、OSS介绍 在Web项目中&#xff0c;一些常见的功能&#xff0c;比如展示图片&#xff0c;修改头像等&#xff0c;都需要进行图片的上传操作&#xff0c;但是如果是存储在Web服务器中&#xff0c;在读取图片的时候会占用比较多的资源&#xff0c;影响服务器的性能。 常…

EasyCVR智能视频监控平台云台降低延迟小tips

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

零基础爬什么值得买的榜单——爬虫练习题目一(答三)

一步一步似爪牙&#xff0c;先给爷爬一个! 引言分析数据上一节代码运行 工具&#xff1a;JSON 在线解析使用实操 获取其中一个数据添加代码知识点 结尾 引言 我也太能拖了 这个假期前确实有点懒惰 加上这个周末连班 不能去打篮球 腿没有得到充分的运动 像是千万只蚂蚁在爬一样…

AI Infra论文阅读之将流水线并行气泡几乎降到零(附基于Meagtron-LM的ZB-H1开源代码实现解读)

0x0. 前言 这篇论文对应的链接为&#xff1a;https://openreview.net/pdf?idtuzTN0eIO5 &#xff0c;最近被ICLR 2024接收&#xff0c;但不少AI Infra的同行已经发现了这个工作的价值&#xff0c;并且已经开源在 https://github.com/sail-sg/zero-bubble-pipeline-parallelis…

编写程序实现二叉树的创建,三种遍历自己销毁

#include <myhead.h>// 定义二叉树节点结构体 struct tree {char value; //二叉树的值struct tree* left; //左子树struct tree* right; //右子树 };// 创建节点 struct tree* create_node(int value) {//申请空间struct tree* new (struct tree*)malloc(sizeof(st…

[Python] opencv - 什么是直方图?如何绘制图像的直方图?

什么是直方图&#xff1f; 直方图是一种统计图&#xff0c;用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分&#xff0c;然后计算在每个区间或组内的数据频数或频率&#xff08;即数据出现的次数或占比&#xff09;&#xff0c;然后用矩形或者柱形图的形式将这…

学成在线:媒体资源管理系统(MAM)

媒体资源管理系统(MAM) 媒体资源管理系统(Media Asset Management)是建立在多媒体、网络、数据库和数字存储等先进技术基础上的一个对各种媒体及内容进行数字化存储、管理以及应用的总体解决方案,可以满足媒体资源拥有者收集、保存、查找、编辑、发布各种信息的要求,为媒体资源…

Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1

目录 【问题描述】maven环境报错 Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1 【解决办法】 检查maven路径是否一致 路径一致的话&#xff0c;更改配置文件settings.xml的镜像源。 添加代码到 <mirrors> <!-- 阿里镜像 --> &l…

Security ❀ TCP异常报文详解

文章目录 1. TCP Out-Of-Order2. TCP Previous Segment Lost3. TCP Retransmission4. TCP Dup Ack XXX#X5. TCP Windows Update6. TCP Previous segment not captured7. 异常案例分析 TCP协议中seq和ack seq的联系&#xff1a; id4的http请求报文由客户端发向服务器&#xff0…

Transformer实战-系列教程1:Transformer算法解读1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 现在最火的AI内容&#xff0c;chatGPT、视觉大模…

初识webpack(一)概念、入口配置、输出配置、loader等

目录 (一)概念 webpack的依赖图 (二)webpack的基本使用 (三)webpack的配置文件 1.入口(entry)配置 2.输出(output)配置 (三)loader 1.css文件处理 (1)安装css-loader和style-loader (2)在webpack.config.js中配置loader 2.less文件处理 3.postcss的使用 (1)安装…

mysql索引有哪些,如何分类

前言 按数据结构分类可分为&#xff1a;Btree索引、Hash索引、Full-text索引。 按物理存储分类可分为&#xff1a;聚簇索引、二级索引&#xff08;辅助索引&#xff09;。 按字段特性分类可分为&#xff1a;主键索引、普通索引、前缀索引。 按字段个数分类可分为&#xff1…
最新文章