ARCore之路-计算机视觉之实例(四)

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/86099620

  在前面的学习中,我们自己编写了一个神经网络,并用这个神经网络进行了AR开发应用,效果很好。但在机器学习领域,我们没必要重复去发明轮子,因为现在已经有很多成熟的机器学习、神经网络框架,如Caffe、Tensorflow、Kears等等。站在前人的肩膀上会使我们看得更远。接下来我们将使用TensorFlow来实现物体识别的功能,在这之前,我们对TensorFlow和TensorFlowSharp进行简单介绍。

一、TensorFlow

DavidWang原创
  2015年11月,在DistBelief的基础上,谷歌大脑完成了对“第二代机器学习系统”TensorFlow的开发并对代码开源。TensorFlow主要用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。TensorFlow可为机器学习和深度学习提供强力支持,它是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,也因其灵活的数值计算核心广泛应用于许多其他科学领域。相比于前作,TensorFlow在性能上有显著改进,构架灵活性和可移植性也得到增强 。TensorFlow发展迅速,目前最新的稳定API版本1.12,已拥有包含各类开发和研究项目的完整生态系统。

  TensorFlow的主要概念

  • 张量(tf.Tensor)
      张量是TensorFlow的核心数据单位,在本质上是一个任意维的数组。可用的张量类型包括常数、变量、张量占位符和稀疏张量 。张量的秩是它的维数,而它的形状是一个整数元组,指定了数组中每个维度的长度 ,张量按NumPy数组的方式进行切片和重构。张量有23种数据类型,包括4类浮点实数、2类浮点复数、13类整数、逻辑、字符串和两个特殊类型,数据类型之间可以互相转换 。TensorFlow中的张量是数据流图中的单位,可以不具有值,但在图构建完毕后可以获取其中任意张量的值,该过程被称为“评估(evaluate)”。TensorFlow无法直接评估在函数内部或控制流结构内部定义的张量。如果张量取决于队列中的值,那么只有在某个项加入队列后才能评估。
  • 数据流图(tf.Graph)和会话(tf.Session)
      TensorFlow在数据流编程下运行,具体地,使用数据流图(tf.Graph)表示计算指令间的依赖关系,随后依据图创建会话(tf.Session)并运行图的各个部分 。tf.Graph包含了图结构与图集合两类相关信息,其中图结构包含图的节点(tf.Operation)和边缘(张量)对象,表示各个操作组合在一起的方式,但不规定它们的使用方式,类似于汇编代码;图集合是在tf.Graph中存储元数据集合的通用机制,即对象列表与键(tf.GraphKeys)的关联 。例如当用户创建变量时,系统将其加入变量集合,并在后续操作中使用变量集合作为默认参数 。构建tf.Graph时将节点和边缘对象加入图中不会触发计算,图构建完成后将计算部分分流给tf.Session实现计算。tf.Session拥有物理资源,通常我们将他放到using代码块中使用,在离开代码块后释放资源 ,在不使用using代码块的情况下创建tf.Session,应在完成会话时明确调用tf.Session.close结束进程,调用Session.run创建的中间张量会在调用结束时或结束之前释放。tf.Session.run是运行节点对象和评估张量的主要方式,tf.Session.run需要指定fetch并提供供给数据(feed)字典,用户也可以指定其它选项以监督会话的运行。
  • 保存和恢复
       TensorFlow的低阶API可以保存模型和学习得到的变量,对其进行恢复后可以无需初始化直接使用。对张量的保存和恢复使用tf.train.Saver 。TensorFlow保存的模型使用SavedModel文件包,该文件包是一种独立于语言(language-neutral)且可恢复的序列化格式,使较高级别的系统和工具可以创建、使用和转换 TensorFlow模型为SavedModel 。tf.saved_model API可以直接与SavedModel进行交互,tf.saved_model.simple_save用于保存模型,tf.saved_model.loader.load用于导入模型。
  • Estimators
       Estimators是TensorFlow自带的高阶神经网络API。Estimators封装了神经网络的训练、评估、预测、导出等操作。Estimators的特点是具有完整的可移植性,即同一个模型可以在各类终端、服务中运行并使用GPU或TPU加速而无需重新编码。Estimators模型提供分布式训练循环,包括构建图、初始化变量、加载数据、处理异常、创建检查点(checkpoint)并从故障中恢复、保存TensorBoard的摘要等。
  • Keras
       Keras是一个支持TensorFlow、Thenao和Microsoft-CNTK的第三方高阶神经网络API。Keras以TensorFlow的Python API为基础提供了神经网络、尤其是深度网络的构筑模块,并将神经网络开发、训练、测试的各项操作进行封装以提升可扩展性和简化使用难度,在TensorFlow下可以直接导出Keras模块使用。
  • Data
       tf.data是TensorFlow中进行数据管理的高阶API。在图像处理问题中,tf.data可以对输入图像进行组合或叠加随机扰动,增大神经网络的训练收益;在文字处理问题中,tf.data负责字符提取和嵌入(embedding),后者将文字转化为高维向量,是进行机器学习的重要步骤。tf.data包含两个类:tf.data.Dataset和tf.data.Iterator,Dataset自身是一系列由张量构成的组元,并包含缓存(cache)、交错读取(interleave)、预读取(prefetch)、洗牌(shuffle)、投影(map)、重复(repeat)等数据预处理方法、Iterator迭代循环器,是从Dataset中提取组元的有效方式。tf.data支持从NumPy数组和TFRecord中导入数据,在字符数据处理时时,tf.data.TextLineDataset可以直接输入ASCII编码文件。

二、TensorFlowSharp

   TensorFlowSharp是为.net方便使用TensorFlow而对TensorFlow API进行的封装,将C接口的API处理成强类型的.net接口以更C# 和 F#调用。TensorFlowSharp对整个TensorFlow低级别的API都进行了封装,但是目前还没有像python那样包含高级API,所以对于那些高级操作来说使用还有一些麻烦。
   支持的平台
   原生TensorFlow运行时支持windows(X64)、Mac(X64)和Linux(X64)操作系统平台。所以如果我们想在其他平台中运行tensorflowSharp,如Android平台,则需要下载适合平台的TensorFlow动态库并将这个库放置在与tensorflowSharp.dll同一个文件夹中,如要在Android平台使用,则需要下载TensorFlow.Android.dll。
   安装
   最简单的安装方法是使用Nuget安装TensorFlowSharp,它既包含.net的API,也包含64位Linux、Mac和Windows的本地库。使用Nuget的命令是:

    nuget install TensorFlowSharp

  也可以从Visual Studio上的Nuget Packages UI中选择安装。需要注意的是,在Visual Studio 中,确保项目属性里的 targeting 为 .net 4.6.1或更高版本,因为这个包使用了一些更新的.net特性,否则,将不会添加包。这也要求我们安装 .net Framework 4.6.1或以上版本。
   使用简介
  TensorFlowSharp API的设计风格与java接口相似,使用显式TensorFlow graphs和sessions。通常,我们需要创建一个graph (TFGraph)并在那里进行设置操作,然后从graph 创建一个session(Tfsession),然后使用session runner设置输入和输出并执行管线流程。典型的示例如下:

using(var graph = new TFGraph ())
{
    graph.Import (File.ReadAllBytes ("MyModel"));
    var session = new TFSession (graph);
    var runner = session.GetRunner ();
    runner.AddInput (graph ["input"] [0], tensor);
    runner.Fetch (graph ["output"] [0]);
    var output = runner.Run ();
    // Fetch the results from output:
    TFTensor result = output [0];
}

   在不需要独立设置graph的情况下,也可以从session创建一个。下面的示例说明如用TensorFlow计算两个数字的加法:

using (var session = new TFSession())
{
    var graph = session.Graph;

    var a = graph.Const(2);
    var b = graph.Const(3);
    Console.WriteLine("a=2 b=3");

    // Add two constants
    var addingResults = session.GetRunner().Run(graph.Add(a, b));
    var addingResultValue = addingResults.GetValue();
    Console.WriteLine("a+b={0}", addingResultValue);

    // Multiply two constants
    var multiplyResults = session.GetRunner().Run(graph.Mul(a, b));
    var multiplyResultValue = multiplyResults.GetValue();
    Console.WriteLine("a*b={0}", multiplyResultValue);
}

三、Unity使用TensorFlowSharp的基本需求

(一)、操作系统
   目前可在以下平台下使用Unity TensorFlowSharp:

  • Linux 64 bits
  • Mac OS X 64 bits
  • Windows 64 bits
  • iOS
  • Android

(二)、其它需求

  • Unity 2017.4 及以上
  • Unity TensorFlow Plugin
  • .net framework 4.6.1以上
  • Visual Studio 2017以上

   Unity TensorFlow Plugin这个插件件可以在这里下载
  1、0.3版本(https://s3.amazonaws.com/unity-ml-agents/0.3/TFSharpPlugin.unitypackage),
   2、0.4版本(https://s3.amazonaws.com/unity-ml-agents/0.4/TFSharpPlugin.unitypackage,
   3、 0.5版本(https://s3.amazonaws.com/unity-ml-agents/0.5/TFSharpPlugin.unitypackage)。

(三)、模型
   物体分类及物体识别都可以使用google的训练模型,但训练模型的版本很重要,如果使用0.3版本的Unity TensorFlow Plugin,则要求模型必须是使用TensorFlow 1.4训练后的模型;如果使用0.4版本的Unity TensorFlow Plugin,则要求模型必须是使用TensorFlow 1.7.1训练后的模型,并且还需要将TensorFlow训练后的模型后缀从 .pb 改为.bytes。

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/86099620