TensorFlow
在本系列文章中,我们选用TensorFlow作为我们进行机器学习的基础框架,大家可以到 TensorFlow官网 查看相关资料和文档。 但是正如在上一篇文章中所说的,我们不需要你具有任何机器学习的基础,所以我们也不会在这里讲解 TensorFlow 的细节, 你只要记住,TensorFlow是一个深度学习的框架,就好像我们开发web应用时使用的Rails 一样。
心急的同学可能会说,好了, 框架已经找好了,我们马上就可以开始了, 你说的对…不过先等一下, 上面说的 TensorFlow 之于深度学习和 Rails 之于 Web 开发的比喻可能有点不恰当,因为从TensorFlow到一个完全可用的模型的距离要比Rails到一个Web网站的距离要大的多
因为 Tensorflow 只是一个很基础的库和框架, 如果你要训练一个完全可用的模型, 还需要你具有相当的深度学习知识。 如果我们把模型比作一个房子的话, 那么 Tensorflow 相当于给你一些砖和水泥,和脚手架之类,至于房子有几层, 什么朝向之类,还需要你自己来决定。 那么训练一个可用的模型就好像在这种情况下修一个好住的房子一样,需要你具有相关的知识和经验
不过这个目前不是一个问题,因为 Google 的工程师和研究人员在开源框架的同时, 也开源了他们针对各种问题进行机器学习的代码和模型(当然是基于 Tensorflow 的), 这相当于公开了房子的设计图,我们就可以从这里入手,先实现,再优化, 再创造。
找到我们的模型
我们可以在TensorFlow Models 找到很多已经设计好的模型
- official 目录里面是正式发布的模型
- research 目录里面是由谷歌的研究人员们写的模型
- tutorials 目录里面是TensorFlow教程里面用到的模型
在继续往下讲之前,我们先说一下本系列文章中模型的定义, 一个模型由两个部分组成,第一部分是用于生成或者说训练模型的代码,包含如何提取和处理输入数据的特征, 如何构建神经网络(比如神经网络有几层)等,第二部分就是通过这个代码加上大量数据训练出来的模型二进制文件,我们叫做Pre-trained model(这部分不是每一个模型都包含)。 因为我们暂时不涉及到训练自己的模型,所以我们只需要找到相应的模型的Pre-trained model就可以了
我们使用 Tensorflow Object Detection API 来进行静态图片的物体识别,我们可以在 Model Zoo里面找到我们需要的 Pre-trained model , 一共有5个
第一列为Pre-trained model的名字, 第二列为模型的识别速度, 第三列为衡量识别效果的一个指标,越高越好, 第三列为输出形式,都是输出识别物体的Box(物体在图片中的位置,矩形框)
我们使用第一个 ssd_mobilenet_v1_coco 来完成我们的功能, 它的模型二进制文件最小,识别速度最快,识别率是最低的,但是对于我们的功能是足够了。 请先下载下来备用
TensorFlow on Android
为了能在 Android 上面加载我们准备好的 model 二进制文件并 Inference(推理),我们还需要TensorFlow 的 Android 接口库,在TensorFlow Android Inference Interface 可以找到这个接口库的全部代码, 这个接口库的二进制包是一个 Android 的 AAR 文件, 接下来你有3种方法来获取这个 AAR 文件
- 下载全部代码,从头开始编译
- 通过JCenter Package获取(在工程配置文件里面添加依赖org.tensorflow:tensorflow-android)
- 从Inference interface的 CI 系统获取最新的二进制包(nightly build)
这3种方法都可以获取到我们想要的 AAR 文件,在本系列文章中我们选用第三种方式,获取 nightly build, nightly build 会包含最新的 bugfix 和 feature(当然也会有新引入的bug)就在本博客编写的时候, 在JCenter中的版本包含了一个已经被修复的bug,会导致程序无法运行, 而从源代码自己编译和 nightly build 的版本就没有这个问题了。 这里说个题外的话, 如果遇到暂时无法解决的问题,可以关注TensorFlow 相关项目的 Issue list, 来确定这个问题是否是bug, bug是否已被修复,被修复的日期,然后对比 JCenter 中包的更新时间来确定JCenter 的包是否包含相应的 bug fix,从而决定是从 JCenter 种获取, 还是自己编译或下载 nightly build 包
Inference Interface 使用 Jenkins 作为CI系统,那么我们轻车熟路的找到“最后一次的构建结果”,下载AAR包备用
Android Project
本系列文章使用 Android Studio 进行开发,相关配置如下
- Android Studio 2.3.3
- Gradle 3.3
- Compile SDK Version 25
- Build Tool 26.02
请配置好开发环境备用
回顾一下
在本课时中,我们找到可以解决的我们问题的模型,并下载了相应的Pre-trained model; 我们还下载了可以在Android上面运行Tensorflow 并 Inference的Tensorflow Android接口, 最后我们准备好了Android的开发环境,接下来就准备开工了。