Barracuda官方文档
https://docs.unity3d.com/Packages/[email protected]/manual/index.html
表情识别算法来源
https://github.com/WuJie1010/Facial-Expression-Recognition.Pytorch
Unity资源商店Moodme免费版(三种表情识别)
https://assetstore.unity.com/packages/add-ons/machinelearning/moodme-emotions-barracuda-sdk-191930
第一步:跑通表情识别算法
输入处理:
第二步:将神经网络模型输出成.onnx文件
第三步:Unity下载Moodme,把表情识别部分改成自己的网络
最终运行效果
第一步:跑通表情识别算法
下载Github上的代码,按照其指引跑通visualize.py(环境配置、创建image文件夹等,略)
用其他算法也同理,稍微看懂它输入输出的大小、处理过程就ok。
#Input image
raw_img = io.imread('images/1.jpg')
"521x425"
gray = rgb2gray(raw_img)
"resize成48x48"
gray = resize(gray, (48,48), mode='symmetric').astype(np.uint8)
img = gray[:, :, np.newaxis]
"数组连接,48x48x3"
img = np.concatenate((img, img, img), axis=2)
img = Image.fromarray(img)
"(四角+中心)*2(水平翻转)切出10张44x44的照片,10,3,44,44"
inputs = transform_test(img)
可以看出,输入图片应为48x48,然后切成44x44,再输入到神经网络。
outputs_avg = outputs.view(ncrops, -1).mean(0) # avg over crops
score = F.softmax(outputs_avg)
_, predicted = torch.max(outputs_avg.data, 0)
神经网络outputs为10x7
先求10张图片结果的均值outputs_avg(1x7)
用softmax函数归一化
7个数值中最大的为预测结果
第二步:将神经网络模型输出成.onnx文件
visualize.py添加代码
torch.onnx.export(net,inputs,"face_emotions_model.onnx",output_names={"outputs"},verbose=True)
然后就能在项目文件夹找到相应的文件了。
第三步:Unity下载Moodme,把表情识别部分改成自己的网络
它有面部检测,只是表情识别阉割成了3种,我懒得自己搞了(●'◡'●)
把刚才导出的onnx文件存到Network文件夹,赋值给NetworkAgent>ManageEmotionNetwork脚本>Emotions N Network
ImageNetworkWidth&Height改成44,Channel改成3
重点就改ManageEmotionNetwork脚本:仿照原.py对输入输出进行处理
面部图片48x48:previewTexture
//脸部图像处理成10x44x44x3,这里没弄水平翻转,懒
Texture2D[] ComputeInputTensor(Texture2D source)
Texture2D texture0, texture1, texture2, texture3, texture4, texture5, texture6, texture7, texture8, texture9, texture10;
texture0 = new Texture2D(44, 44, TextureFormat.R8, false);
texture1 = new Texture2D(44, 44, TextureFormat.R8, false);
texture2 = new Texture2D(44, 44, TextureFormat.R8, false);
texture3 = new Texture2D(44, 44, TextureFormat.R8, false);
texture4 = new Texture2D(44, 44, TextureFormat.R8, false);
texture5 = new Texture2D(44, 44, TextureFormat.R8, false);
texture6 = new Texture2D(44, 44, TextureFormat.R8, false);
texture7 = new Texture2D(44, 44, TextureFormat.R8, false);
texture8 = new Texture2D(44, 44, TextureFormat.R8 false);
texture9 = new Texture2D(44, 44, TextureFormat.R8, false);
Color[] pix = source.GetPixels(0, 0, 44, 44);
texture0.SetPixels(pix);
texture0.Apply();
texture5.SetPixels(pix);
texture5.Apply();
pix = source.GetPixels(0, 4, 44, 44);
texture1.SetPixels(pix);
texture1.Apply();
texture6.SetPixels(pix);
texture6.Apply();
pix = source.GetPixels(4, 0, 44, 44);
texture2.SetPixels(pix);
texture2.Apply();
texture7.SetPixels(pix);
texture7.Apply();
pix = source.GetPixels(4, 4, 44, 44);
texture3.SetPixels(pix);
texture3.Apply();
texture8.SetPixels(pix);
texture8.Apply();
pix = source.GetPixels(2, 2, 44, 44);
texture4.SetPixels(pix);
texture4.Apply();
texture9.SetPixels(pix);
texture9.Apply();
var textures = new[] { texture0, texture1, texture2, texture3, texture4, texture5, texture6, texture7, texture8, texture9 };
return textures;
//仅摘录核心部分
var textures = ComputeInputTensor(previewTexture);
tensor = new Tensor(textures, ChannelCount);
output = engine.ExecuteAndWaitForCompletion(tensor);
float[] results = output.data.Download(output.shape);
float[] results_avg=new float[7];
Debug.Log("Result:" + EmotionsLabel[findMax(results_avg)]);
最终运行效果
对不起了德善(●'◡'●)
再来个特写
项目代码下载(等我整理好了再上传)
Unity_Detection2AR
一种将对象定位合并到常规计算机视觉对象检测算法中的简单解决方案。
想法:没有太多的开源实时3D对象检测。 这是一个使用“更流行”的2D对象检测,然后使用几个特征点对其进行本地化的示例。 它使用最近发布的进行对象检测,并使用ARFoundation进行AR。 它可以在iOS和Android设备上使用。
目前支持微小的Yolo2和3。
"com.unity.barracuda": "1.0.3",
"com.unity.xr.arfoundation": "4.0.8",
"com.unity.xr.arkit": "4.0.8",
"com.unity.xr.arcore": "4.0.8"
它是在Unity 2020.2.1中开发的,需要具有更新的AR包的产品就绪的梭子鱼。 梭子鱼的预览版似乎不稳定,可能无法正常工作。
在Unity
这是在Unity应用程序中使用经过TensorFlow或ONNX训练的模型进行图像分类和对象检测的示例。 它使用-请注意,梭子鱼仍处于开发预览阶段,并且经常更改。
在我的更多详细信息。
分类结果:
检测结果:
如果您正在寻找类似的示例,但使用TensorflowSharp插件而不是梭子鱼,请参阅我 。
您需要Unity 2019.3或更高版本。 2019.2.x版本似乎在WebCamTexture和Vulkan中存在一个错误,导致内存泄漏。
在Unity中打开项目。
从Window -> Package Maanger安装Barracuda 0.4.0-preview
从字面意思来理解:就是图片和文字混合在一起。不知道这样的的定义是否正确,起码我是这样理解的,在游戏开发过程中,如果单单从业务逻辑去看的话,图文混排算是比较复杂的。个人感觉也是必须会的技能。
我们期待在文本的合适地方插入我们需要显示的表情。所以我们要取插入表情的位置,但是一条聊天的信息是一段文本的字符串,是一个整体,每一个字符都不是单个对象,所以要在文本字符串中取合适的位置就不能用平...
最近面临一个问题,需要在unity3D中将手绘的指令识别出来,目前就很简单的三个指令,顺时针旋转,逆时针旋转,和箭头。
我就想到了使用深度学习来给这三个指令分类,这其中要用到python的pytorch。
在两个程序如何通信的问题上,有个朋友告诉我可以用socket使两个程序通信,好就用socket
最后的效果就是这样的
unity C#脚本代码如下(写的很粗糙,主要是实现功能(~ ̄(OO) ̄)ブ
using System.Collections;
using System.Collections.Ge
Unity-梭子鱼-MobileNet-WebGL-样本
Unity Barracudaを用いてMobileNet(画像クラス分类)をWebGL上で推论するサンプルです。现时点(2021/02/09)で
UnityのWebGLはCPU推论のみのサポートです。 GPU推论と比较しパフしパーマンスは出ません。GPU推论やAndroid上での実行时の参考FPSを后述しています。
动作确认用ページは以下。 MobileNetV1のデモです。
FPS(参考値)
WebCamController.cs成为Update()成为呼び出し周期し计测したものです。以下のように动作は基本的に非同时处理のため,FPSは见かけ上のFPSであり,推论自体のFPSではありません。 CSharpBurst:非同期CSharpRef:同时ComputePrecompiled:非同期
MobileNetV1
unity默认无法安装preview版本的安装包,要自己手动开启,新版unity要这样开启
project tiny 不知为何被unity官网从包管理中给移除了,但是可以add package from git url 继续使用;
在url中填写 com.unity.tiny.all即可下载
稍微有点延迟后开始下载
安装Barracuda
https://docs.unity3d.com/Packages/com.unity.barracuda@1.0/manual/Installing.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Barracuda;
public class inference1 : MonoBehaviour
public NNMod.
我的模型是从paddle-detection导出并使用paddle-onnx转换的
先用https://netron.app/找出带split的节点
点击查看,找到split属性
如果没有就按output的个数构造,比如下面这个有4个输出就是[1,1,1,1]
然后下载https://github.com/Unity-Technologies/barracuda-release/issues/138里面维护者的代码:
https://github.com/Unity-Technologies/barrac
Unity使用Kinect FaceBasics表情识别API在使用Unity结合Kinect2时遇到了表情是别的问题。Kinect2是自带了表情识别功能的 这个在他的官方SDK里面有, 关于Kinect在Unity中使用的资料仍然很少。 参考了微软kinect官方论坛中的代码,加以整理,做记录使用。侵删!!!注意事项:
请务必确保你的Unity中导入了Kinect v2 with MS-SDK