当前位置: 首页 > 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 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...