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

怎么将tflite部署在安卓上_Unity3D中使用TensorFlow.Net [零] 环境部署

b1cfd0b55ecfe9f99773e154556de2af.png

背景:目前正在学习并开发独立游戏,想使用TensorFlow来写游戏AI。而游戏的引擎使用的是unity。游戏的主要代码使用C#写的。马上就想到,如果能在C#中直接编写TensorFlow,并且能在游戏运行中就能强化学习提升游戏AI。

如果你只想了解http://tf.net方案,可以忽略前2个章节,主要讲unity官方的ml-agent

一、TensorFlowSharp方案

首先,开始搜索。得知unity 官方的ml-agent。

Unity-Technologies/ml-agents​github.com
808a11a99bad29e9704e70da3d7c1093.png

大概一天的简单了解与学习,发现ml-agent有两个阶段。

第一个阶段 v0.3版本(大概是这个版本号)。使用TensorFlowSharp(简称tf#),并且有unity插件来执行训练模型。当然,我认为ft#同样可以在项目中开发并训练模型。只是没有得道体现。

然后找到了一个unity 中AI投篮的项目。

abeisgoat/tf-jam​github.com
6176e39ef45389261faad434f7f43413.png

这里有关于项目的中文翻译写的很清楚。

CSDN-专业IT技术社区-登录​blog.csdn.net

该项目是使用TensorFlow nodejs版本建立模型。

采集命中的投篮数据进行训练。这个采集是unity Editor完成的。保存在successful_shots.csv文件中。

  1. 将使用 tensorflowjs_converter 转成keras的h5。
  2. 又从h5转成 model.pb和checkpoint。
  3. 生成在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流程:

  1. 搭建游戏逻辑场景:需要AI解决什么问题。
  2. 创建AI智能体(agent),并赋予训练模型
  3. 运行训练(挂机):游戏中一边训练一边强化学习(这就是我想要的效果)

然后,我也开始部署环境,发现一个问题。官方提供了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-詹姆斯吗 : )

abeisgoat/tf-jam​github.com
6176e39ef45389261faad434f7f43413.png

然后下载SciSharp/TensorFlow.NET 源码

SciSharp/TensorFlow.NET​github.com
ea1d1e3d53e9c5b54570119391f7f778.png

编译一下的源码,拷贝 srcTensorFlowNET.CorebinDebugnet472 (那可能路径不同)到 unity的Assets文件夹。当然,最好重命名一下文件夹,比如http://tf.net。

srcTensorFlowNET.CorebinDebugruntimes里的TensorFlow C++的库文件也需要拷贝到Unity AssetsPlugins。runtimes下的三个文件夹win-x64,osx-x64,linux-x64 的几个库文件拷贝到AssetsPluginsx86_64文件夹。

06bda16efc8b63bfeaa1a06cb38cd3a7.png

在Project Settings > configuration下,将 Allow 'unsafe' Code 打勾。

将原来ft-jam项目中的BallSpawnerController tf#的代码修改成http://tf.net。总共四处。注释的是tf#的代码。

0cda422e720401b4c2224a3a8cfdff45.png
大小写过敏

71b939ebef82cc60130ec8a8e05b6424.png
类型名也不同

461b87aeb0a78408a711d2bfaf57c270.png
加载Resources文件夹中的模型

555969898bc2f925e266a502fc3591cb.png
修改通过模型加载代码

简单补充说明:

5d536e541f59141ef762d3e6976c35bf.png
//这应该是作者之前训练获得的两个权重参数,命中率在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的源代码

songsharp/TensorFlow.Net.Unity.Demo​github.com
845329a74e3528da5cdf50035f3df5cd.png

相关文章:

  • 外卖行业现状分析_【行业资讯】国内首批外卖运营师获认证 2020外卖餐饮行业市场深度分析...
  • 后端跨域问题解决方案_打破ajax 跨域问题,游刃有余的解决方案,大神就是这样操作的...
  • 对某列进行操作_使用pandas替代Excel中的繁琐操作-条件判别和loc函数使用
  • 中object转为list集合_快速带你梳理Java单列集合之Collection
  • 代码回到之前版本_代码版本控制及托管:我的最佳实践
  • springboot处理参数再转发请求_springBoot PUT请求接收不了参数的解决办法
  • 如何在EDUIS中导出ETL字幕模板_教大家Edius如何设置导出mp4格式视频
  • r语言和metawin_【R语言】关于ggcor包消息的更新
  • git maven 一键部署_Docker+Jenkins+Git+Maven实现Springboot项目自动化部署
  • 添加删除元素_蔡司:CALYPSO高级应用 | 指数交换与添加删除循环
  • 初中物理凸透镜成像动态图_只要看一眼,就能立刻知道凸透镜成像特点,中考物理必考送分题...
  • html5窗口最顶层_快速开发基于 HTML5 网络拓扑图应用——入门篇(一)
  • mime插件 node_【Node.js基础篇】(五)使用mime模块来响应css、js文件的请求
  • react前端封装接口弹出错误_在react项目中用es6封装ajax请求,组件中调用总是报错,求解?...
  • mysql5.7不能存储中文_解决Mysql5.7中文乱码的问题
  • php的引用
  • PHP面试之三:MySQL数据库
  • sessionStorage和localStorage
  • Vue.js源码(2):初探List Rendering
  • webpack入门学习手记(二)
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​业务双活的数据切换思路设计(下)
  • #define用法
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (2)STL算法之元素计数
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (一)appium-desktop定位元素原理
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net Redis的秒杀Dome和异步执行
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET使用存储过程实现对数据库的增删改查
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /3GB和/USERVA开关
  • ??eclipse的安装配置问题!??
  • []error LNK2001: unresolved external symbol _m
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Angular] 笔记 7:模块
  • [C语言]一维数组二维数组的大小
  • [dart学习]第四篇:函数
  • [HarmonyOS]第一课:从简单的页面开始
  • [IDF]聪明的小羊
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup
  • [LeetBook]【学习日记】数组内乘积
  • [LeetCode 127] - 单词梯(Word Ladder)
  • [LuoguP1141]01迷宫
  • [oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux
  • [React源码解析] Fiber (二)
  • [SpringDataMongodb开发游戏服务器实战]
  • [sqlmap]学习笔记#1