Michael

写写代码,说说人生

您好,我是Michael,欢迎来到我的个人家园。
代码搬运工,目前就职于XX证券,努力修行中。


H5 / Java / Objc / Swift / Vue / RN

iOS开发迎来机器学习的春天---TensorFlow

  人工智能机器学习都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 人工智能数据挖掘的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经常会听到数据科学部的同事们提到 机器学习数据挖掘 之类的词。但这些名词真的跟我们移动开发就没直接关系了吗?
  作为移动开发者来说,无时无刻不被这些名词狠狠地敲打着脆弱的内心。💢 💢 💢 何时才能够将机器学习深度学习应用在移动端,敲响移动端机器学习工业化的大门呢?

想象一下,某一天你身处一个完全陌生的环境,周围都是陌生的事物,而运行在iPhone的某个APP却对这个环境了如指掌,你要做的就是打开这个APP,输入你需要了解的事物,iPhone告诉你这个事物的信息,你也就没有了陌生事物了。世界就在眼前!

如下图:

上面物体的识别准确率还是蛮不错的,基本识别出了键盘(49%的概率)、鼠标(46%的概率)和水杯(24%的概率)。

但是在某些事物的识别准确度方便却差强人意,比如下图:

  

  iPhone 6被识别成了iPod(59%的概率),而iPod的却是不怎么敢认(10%的概率)。想想最崩溃的估计是iPhone 6了,身价直接被降了好几个等级。

  

  上面的例子来自于TensorFlow官方iOSDemo,暂且不评述TensorFlow的识别准确度如何,毕竟它还年轻,但是仅凭其识别能力的体现,也给机器学习在移动端的运用带来了无限的可能。

一、TensorFlow(简称TF)

  去年,Google资深系统专家Jeff Dean在湾区机器学习大会上隆重介绍了其第二代深度学习系统TensorFlow,一时间网络上针对TensorFlow的文章铺天盖地,揭秘TensorFlow:Google开源到底开的是什么?Google开源TensorFlow系统,这背后都有什么门道?如何评价Google发布的第二代深度学习系统TensorFlow?等等文章,TensorFlow的燎原之火一直在燃烧蔓延着,其GitHub上的开源库在此文撰写时,也已经被star:27550fork:11054了。🔥 🔥 🔥 🔥 🔥

不负众望,Google一直宣称平台移植性非常好的TensorFlow,终于在2016年6月27日,发布0.9版本,宣布移动端支持。TensorFlow v0.9 now available with improved mobile support( 有墙💢 ),同时也给出了移动端的Demo,对于代码为生的程序员,身处大数据处理为主导的TalkingData,也小试身手了一把,下载TensorFlow源码,查看编译指南,开始跳坑、填坑之路,也成就了此篇拙文的产生。

二、从TensorFlow到iOS静态库

对于iOS平台下如何使用TensorFlow,TensorFlow给出了详细的编译脚本命令,详情请查看官方文档的命令

第一步. 工具准备

工欲善其事必先利其器,在开始编译工作之前,需要准备一些编译所必须的工具:

  1. Homebrew: Mac os x 上包管理工具,具体使用方法可参考Doc
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  1. Homebrew安装好之后,依次安装三个辅助性编译工具:
$ brew install libtool   
$ brew install autoconf   
$ brew install automake   

三个工具的含义,请参考:https://en.wikipedia.org/wiki/GNU_Libtool

第二步. 克隆TensorFlow

Google以Apache 2.0开源协议将TensorFlow开源在GitHub上,我们可以直接使用TensorFlow源码。

在任意你想存放TensorFlow源码的地方(建议不要放在桌面。^_^),clone项目。

$ git clone https://github.com/tensorflow/tensorflow 
第三步. 编译前准备

  在TensorFlow的tensorflow/contrib/makefile/目录下,有很多可使用的编译脚本,其中build_all_ios.sh脚本专门用来一键编译TensorFlow iOS静态库。虽然可以直接使用此脚本进行一键编译,但是因为有墙,某些依赖需要提前做处理。

  1. 下载protobuf

    protobuf 是编译前唯一需要特殊处理的依赖库,点击下载,下载protobuf之后,解压,备用。

  2. 下载googlemock

    虽然protobuf编译脚本autogen.sh中的googlemock链接地址https://googlemock.googlecode.com/files/gmock-1.7.0.zip无法直接下载到,但是细心的人会发现,在浏览器中输入https://googlemock.googlecode.com/地址后,会跳转到https://github.com/google/googlemock地址,google在GiHub上的仓库地址。而GitHub上的仓库,我们可以直接的下载,克隆等。

    我们直接在GitHub上下载googlemock(点击下载),下载完成后,修改压缩包名字为gmock-1.7.0.zip,修改后将此压缩包移至上一步protobuf文件夹目录下,备用。

  3. 修改下载依赖脚本,移除protobuf的下载

    tensorflow/contrib/makefile/目录下,download_dependencies.sh脚本用来下载相关依赖,打开此脚本文件,注释掉或者直接删掉git clone https://github.com/google/protobuf.git ${DOWNLOADS_DIR}/protobuf部分,目的是不让脚本去下载protobuf。

    上面三步准备好后,接下来就进入静态库编译了。

第四步. 一键编译

  前面已经知道在TensorFlow文件夹tensorflow/contrib/makefile/目录下的build_all_ios.sh脚本是用来编译iOS静态库的脚本,因此可以直接执行此脚本,开始静态库的编译工作了。

  但是有一个问题大家可能会发现,由于编译TensorFlow需要用到protobuf,但是protobuf使我们自己手动下载的,该怎么让手动下载的protobuf能够直接让build_all_ios.sh脚本使用呢?

  答案是复制、粘贴。可能有些low,但是有效。执行命令 build_all_ios.sh之后,立即把之前手动下载的protobuf文件夹拷贝进tensorflow/contrib/makefile/downloads目录。(放心,你拷贝的速度会很快,不会影响编译的执行的。^_^)

$ build_all_ios.sh    

  一切准备就绪,接下来就是静静的等待编译完成了。在Mac编译的过程中,建议插上电源,最好不要让设备休眠断电,也最好不要去干别的东西,出去溜达一圈,回来后就看到战果了。

编译完成之后,会在tensorflow/contrib/makefile/gen/目录下看到编译的结果,关于这些静态库该如何使用,自己的项目如何应用,请参考TensorFlow iOS Examples

三、遇到的问题

1、googlecode.com被墙了,需要翻墙!(目前测试挂了VPN也没用),这也是上面编译前准备为什么要那么做的原因。

curl: (7) Failed to connect to googlemock.googlecode.com port 443: Operation timed out

解决: 请参考 『第三步. 编译前准备』。

2、没有Xcode。

xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: SDK "iphoneos" cannot be located
xcrun: error: unable to lookup item 'PlatformPath' in SDK 'iphoneos'
+ IPHONEOS_PLATFORM=

解决:安装Xcode,从上面报错的命令中可以看到,在编译静态库的过程中使用了xcrun,而此命令是xCode本身具有的能力。

3、你的Xcode版本不是7.3或以后,或者你有多个Xcode,而默认的安装路径版本不是7.3或以后。

error: Xcode 7.3.0 or later is required.
+ exit 1

解决:更新Xcode至最新版本,并且保证默认路径下是最新/版本。

如果Xcode是7.3,并且没有条件更新Xcode,你可以修改tensorflow/contrib/makefile/compile_ios_tensorflow.sh 里的REQUIRED_XCODE_VERSION=7.3.0,为REQUIRED_XCODE_VERSION=7.3。(这样修改,目前还不确定会不会带来一些其他影响,最好是升级你的Xcode)

四、参考链接


转载请注明:Michael的博客 » 点击阅读原文

最近的文章

Git教程

介绍  Git是做项目的版本管理,你也可以称它们为版本管理工具。假如现在你有一个文件夹,里面可以是项目,也可以是你的个人笔记(如我这个博客),或者是你的简历、毕业设计等等,都可以使用git来管理。  目前常用的版本控制器有Git和SVN,即使这两个你没有全用过,至少也会听过,我这里以Git为例,个人比较喜欢Git,你也可以看看这篇文章:为什么Git比SVN好。我使用的是Mac,Mac上没自带Git环境,但是作为iOS开发者,我安装Xcode的时候,Xcode里是有自带Git的,所以我不需要...…

项目管理-SVN与GIT继续阅读
更早的文章

机器学习入门(名词科普)

通用名词ML  名词解释: 机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。  它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。DL  名词解释: 深度学习(Deep Learning)是机器学习拉出的分支,它试图使用包含复杂结构或由多重...…

机器学习继续阅读