前言
前篇:使用 Unity Sentis 和 Compute Shader,2d106det.onnx 进行高效人脸网格标记-CSDN博客
模型分析:
这个模型比较简单,输入值为一张96*96*3的图片,输出值为(1,3),分别为女性概率,男性概率,年龄;
示例代码:
using System.Collections;
using System.Collections.Generic;
using Unity.Sentis;
using UnityEngine;
public class Attribute : MonoBehaviour
{
public ModelAsset modelAsset;
public Model model;
private IWorker worker;
private GPUComputeBackend gpu;
//处理图片
public Texture2D t2d;
public Material landMarkMat;
private void Start()
{
model = ModelLoader.Load(modelAsset);
gpu = new GPUComputeBackend();
var model2 = Functional.Compile(input =>
{
var output = model.Forward(input)[0];
var gender = Functional.ArgMax(output[0][..2]);
var age = Functional.Round(output[0][2] * 100);
return (gender, age);
}, InputDef.FromModel(model)[0]
);
worker = WorkerFactory.CreateWorker(BackendType.GPUCompute, model2);
Get(t2d);
}
public RenderTexture rt1;
public int gender;
public int age;
public void Get(Texture2D source)
{
rt1 = RenderTexture.GetTemporary(96,96,0);
landMarkMat.SetTexture("_MainTex",source);
Graphics.Blit(source,rt1,landMarkMat,0);
using (var input = TextureConverter.ToTensor(rt1, 96, 96, 3))
{
TensorFloat _255 = new TensorFloat(new TensorShape(1), new float[] {255});
TensorFloat newInput = TensorFloat.AllocNoData(new TensorShape(1, 3, 96,96));
gpu.Mul(input,_255,newInput);
worker.Execute(newInput);
}
using var output_1 = worker.PeekOutput("output_0") as TensorInt;
using var output_2 = worker.PeekOutput("output_1") as TensorFloat;
output_1.CompleteOperationsAndDownload();
output_2.CompleteOperationsAndDownload();
gender = output_1[0];
age= (int) output_2[0];
}
}