当前位置: 首页 > news >正文

[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 tensorTensorFloat inputTensor = new TensorFloat(new TensorShape(4), new[] { 2.0f, 1.0f, 3.0f, 0.0f });// Create runtime modelruntimeModel = ModelLoader.Load(modelAsset);// Create engine and executeworker = WorkerFactory.CreateWorker(BackendType.GPUCompute, runtimeModel);worker.Execute(inputTensor);// Iterate through the output layer names of the model and print the output from eachforeach (var outputName in runtimeModel.outputs){TensorFloat outputTensor = worker.PeekOutput(outputName) as TensorFloat;// Make the tensor readable by downloading it to the CPUoutputTensor.MakeReadable();outputTensor.PrintDataPart(10);}}
}

打印输出

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

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

相关文章:

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

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

力扣144 二叉树的前序遍历 Java版本

文章目录 题目描述递归方法代码 非递归方法代码 题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xf…...

《Vue3 基础知识》 使用 GoGoCod 升级到Vue3+ElementPlus 适配处理

此篇为 《Vue2ElementUI 自动转 Vue3ElementPlus&#xff08;GoGoCode&#xff09;》 的扩展&#xff01; Vue3 适配 Vue3 不兼容适配 Vue 3 迁移指南 在此&#xff0c;本章只讲述项目或组件库中遇到的问题&#xff1b; Vue3 移除 o n &#xff0c; on&#xff0c; on&#…...

c#string方法对比

字符串的截取匹配操作在开发中非常常见&#xff0c;比如下面这个示例&#xff1a;我要匹配查找出来字符串数组中以“abc”开头的字符串并打印&#xff0c;我下面分别用了两种方式实现&#xff0c;代码如下&#xff1a; using System; namespace ConsoleApp23{ class Progra…...

Electron实战(一):环境搭建/Hello World/打包exe

文章目录 Electron安装Node.jsNodeJs推荐配置开始Electron项目创建index.js文件创建src目录运行打包生成exe生成安装包踩坑 下一篇Electron实战(二)&#xff1a;将Node.js和UI能力&#xff08;app/BrowserWindow/dialog)等注入html Electron Electron是一个使用JavaScript, HT…...

【C++】运算符重载详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 1. 为什么需要运算符重载 2. 运算符重载概念 3. 运算符重载示例 3.1 运算符重载 3.2 >或<运算符 4. 运算符重…...

评论区功能的简单实现思路

评论区功能是社交类项目中的核心组成部分&#xff0c;它涉及到前端的交云和后端的数据处理。基于你的技术栈&#xff08;前端 Vue3&#xff0c;后端 Java&#xff09;&#xff0c;下面是一个具体的实现思路和数据库设计建议&#xff0c;并探索一下知乎的评论系统。 数据库设计…...

Java自救手册

目录 访问地址 访问地址&#xff0c;发现不通&#xff0c;无法访问&#xff1a; 网络不通一般有两种情况&#xff1a; Maven 拿Maven 拿到Maven以后 Maven单独的报红 Git git注意&#xff1a; 目录 访问地址 访问地址&#xff0c;发现不通&#xff0c;无法访问&…...

ASM-HEMT参数提取和模型验证测试

参数提取程序 直流I-V参数提取 DC模型参数提取流程对于ASM-GaN-HEMT模型可以总结在下图中。 以下步骤描述了该流程&#xff1a; 在模型中设置物理参数&#xff0c;如L&#xff08;沟道长度&#xff09;、W&#xff08;沟道宽度&#xff09;、NF&#xff08;栅指数&#xf…...

浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?

专业视听领域尤其显示控制和坐席控制领域&#xff0c;最近几年最激动人心的技术&#xff0c;莫过于分布式了。 分布式从推出之日就备受关注&#xff1a;担心稳定性的&#xff0c;质疑同步性能的&#xff0c;怀疑画面质量的…… 诚然&#xff0c;我们在此前见多了带着马赛克的…...

2020年通信工程师初级专业实务真题

文章目录 一、第1章 现代通信网概述&#xff1a;信令网、同步网、管理网。第10章 通信业务&#xff1a;通信产业链&#xff0c;通信终端的分类&#xff0c;通信业务的定义及分类二、第3章 接入网&#xff1a;无线接入网的优点&#xff0c;接入网的接口&#xff08;UNI&#xff…...

Linux常见面试题汇总

Linux上如何查询某个端口是否被占用&#xff1f; 在Linux上&#xff0c;你可以使用以下几种方法来查询某个端口是否被占用&#xff1a; 使用netstat命令&#xff1a; netstat -tuln | grep <端口号>这个命令会列出当前正在运行的所有TCP和UDP端口&#xff0c;并过滤出指…...

C语言小游戏:贪吃蛇(游戏开发的环境和功能介绍)

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 生命不停&#xff0c;学习不止。铁汁们&#xff0c;我是大伟&#xff0c;欢迎来到大伟的游戏时间&#xff0c…...

ElementUI Form:InputNumber 计数器

ElementUI安装与使用指南 InputNumber 计数器 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue &#xff08;InputNumber 计数器&#xff09;页面效果图 项目里el-input-number.vue代码 <script> export default {name: el_input_number,data() {re…...

apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…...

响应式开发如何设置断点,小屏幕界面该如何显示(有动图)

Hi&#xff0c;我是贝格前端工场&#xff0c;本期分享响应式开发&#xff0c;如何设置屏幕断点&#xff0c;pc页面布局到了移动端之后该如何布局的问题&#xff0c;微软也提供了设置屏幕断点的动图演示&#xff0c;非常直观。 一、什么是响应式开发&#xff0c;为何要设置屏幕断…...

Java基础 集合(二)List详解

目录 简介 数组与集合的区别如下&#xff1a; 介绍 AbstractList 和 AbstractSequentialList Vector 替代方案 Stack ArrayList LinkedList 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界…...

UE4运用C++和框架开发坦克大战教程笔记(十七)(第51~54集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十七&#xff09;&#xff08;第51~54集&#xff09; 51. UI 框架介绍UE4 使用 UI 所面临的问题以及解决思路关于即将编写的 UI 框架的思维导图 52. 管理类与面板类53. 预加载与直接加载54. UI 首次进入界面 51. UI 框架介绍 U…...

GaussDB新体验,新零售选品升级注入新思路【华为云GaussDB:与数据库同行的日子】

选品思维&#xff1a;低频VS高频 一个的商超&#xff0c;假设有50个左右的品类&#xff0c;每个品类下有2到10个不等的商品。然而如此庞大的商品&#xff0c;并非所有都是高频消费品。 结合自身日常的消费习惯&#xff0c;对于高频和低频的区分并不难。一般大型家电、高端礼盒…...

C语言问题汇总

指针 #include <stdio.h>int main(void){int a[4] {1,2,3,4};int *p &a1;int *p1 a1;printf("%#x,%#x",p[-1],*p1);} 以上代码中存在错误。 int *p &a1; 错误1&#xff1a;取a数组的地址&#xff0c;然后1&#xff0c;即指针跳过int [4]大小的字节…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...