找回密码
 立即注册
查看: 589|回复: 3

Unity3D中使用TensorFlow.Net [零] 环境部署

[复制链接]
发表于 2021-11-19 13:15 | 显示全部楼层 |阅读模式
背景:目前正在学习并开发独立游戏,想使用TensorFlow来写游戏AI。而游戏的引擎使用的是unity。游戏的主要代码使用C#写的。马上就想到,如果能在C#中直接编写TensorFlow,并且能在游戏运行中就能强化学习提升游戏AI。
如果你只想了解http://tf.net方案,可以忽略前2个章节,主要讲unity官方的ml-agent
一、TensorFlowSharp方案

首先,开始搜索。得知unity 官方的ml-agent。
大概一天的简单了解与学习,发现ml-agent有两个阶段。
第一个阶段 v0.3版本(大概是这个版本号)。使用TensorFlowSharp(简称tf#),并且有unity插件来执行训练模型。当然,我认为ft#同样可以在项目中开发并训练模型。只是没有得道体现。
然后找到了一个unity 中AI投篮的项目。
这里有关于项目的中文翻译写的很清楚。
该项目是使用TensorFlow nodejs版本建立模型。
采集命中的投篮数据进行训练。这个采集是unity Editor完成的。保存在successful_shots.csv文件中。
    将使用 tensorflowjs_converter 转成keras的h5。又从h5转成 model.pb和checkpoint。生成在tf#支持的frozen.pb.bytes模型文件。
使用tf#加载模型,获得投篮距离推算投篮力度。
这个圈子绕的很大,unity采集数据 -> tfjs建立模型并训练 -> keras模型转换, -> unity 中tf#运行模型。
当然,还有一条路径。那就是tf#直接在unity中完成。这个就是我的目标。
二、Unity ml-agent方案

想更多了解的朋友直接去官方github阅读。因为才了解一天时间,不是很到位,欢迎指正。
v 0.3 版本之后,ml-agent已经不使用tf#作为模型加载和处理数据的工具。而是使用自家的Unity Barracuda,轻量级跨平台的inference library。将tf的模型转换成ml-agent支持的模型。
ml-agent流程:
    搭建游戏逻辑场景:需要AI解决什么问题。创建AI智能体(agent),并赋予训练模型运行训练(挂机):游戏中一边训练一边强化学习(这就是我想要的效果)
然后,我也开始部署环境,发现一个问题。官方提供了Proximal Policy Optimization(PPO),Soft Actor-Critic(SAC)两个强化学习的模型。
那我想要更多的第三方tf模型或自己开发训练tf模型该怎么办?
通过查看github 上的issues,有开发者想将TensorFlow的稍微复杂的模型转换成ml-agent支持的模型并没有成功。可见目前版本的Unity Barracuda这个模型转换工具是有限的,不一定能将复杂的tf模型转换成功。
ml-agent 有try-tf 2.1 的分支。可见,官方也在尝试更好的兼容tf2.x。
三、使用http://TensorFlow.Net方案
本来我想用TensorFlowSharp(tf#),将AI投篮项目修改一下。但tf#官方的github表示,这是一个擅长运行模型的runtime,没有实现更高级别的操作。建议使用http://TensorFlow.Net(简称http://tf.net)。既然如此,那就听作者的吧!
首先,下载AI投篮的源代码ft-jam (tf-詹姆斯吗 : )
然后下载SciSharp/TensorFlow.NET 源码
编译一下的源码,拷贝 src\TensorFlowNET.Core\bin\Debug\net472 (那可能路径不同)到 unity的Assets文件夹。当然,最好重命名一下文件夹,比如http://tf.net。
src\TensorFlowNET.Core\bin\Debug\runtimes里的TensorFlow C++的库文件也需要拷贝到Unity Assets\Plugins。runtimes下的三个文件夹win-x64,osx-x64,linux-x64 的几个库文件拷贝到Assets\Plugins\x86_64文件夹。


在Project Settings > configuration下,将 Allow 'unsafe' Code 打勾。
将原来ft-jam项目中的BallSpawnerController tf#的代码修改成http://tf.net。总共四处。注释的是tf#的代码。



大小写过敏



类型名也不同



加载Resources文件夹中的模型



修改通过模型加载代码

简单补充说明:


//这应该是作者之前训练获得的两个权重参数,命中率在60%。可以加快训练。
float GetForceFromMagicFormula(float distance)
{
        var variance = Random.Range(1f, maxVariance);
        return (0.125f) + (0.0317f * distance * variance);
}
到此,就结束了使用http://tf.net调用tf模型进行投篮的工作。但这并不是我的目标。
接下来,就是准备直接使用http://Tensorflow.Net实现在C#编写tf模型,在游戏中一边训练,一边应用tf进行投篮的工作。
这是Demo的源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-11-19 13:25 | 显示全部楼层
为何不用FSM实现AI
发表于 2021-11-19 13:34 | 显示全部楼层
有一个问题,http://TensorFlow.Net怎么使用tflite文件?
发表于 2021-11-19 13:43 | 显示全部楼层
http://tf.net是自带numpy的,还不如在nuget上 下载包 然后把dll拖到unity中
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 12:52 , Processed in 0.097715 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表