tensorflowlite iOS集成实战全记录
首先:tensorflow官网的访问需要fanqiang,请注意。
step1 (*快*基础的体验,官网demo):
https://www.tensorflow.org/lite/demo_ios
这里主要做了哪些事呢?
1.github repo里面包含了demo工程。
2.github repo里面运行脚本可以生成所需要的模型,放到demo工程中。
3.运行pod会获取到tensorflow_lite.framework;通过pod可以很容易的集成库,全程傻瓜式。
那么发散一点,我们如果不想去下载github的完整repo,那么可以从别人那里获取到demo工程,找一个合适的.tflite模型文件,并且手动集成tensorflow_lite.framework(这里包含了头文件和执行文件),也可以把项目跑起来。
项目设置:C++11 support (or later) should be enabled by setting C++ Language Dialect to GNU++11 (or GNU++14), and C++ Standard Library to libc++.
实际测试中发现使用c++11的设置也是可以的,不一定非要选择GNU++(笔者自己的项目另外一个依赖需要使用c++11否则无法编译通过,所以需要研究这个)。
另外,还有一个路径相关的问题,只需要在demo中小小的修改:
//#include “tensorflow/lite/kernels/register.h”//#include “tensorflow/lite/model.h”#include “tensorflow/contrib/lite/kernels/register.h”#include “tensorflow/contrib/lite/model.h”
这是因为用户自己编译的路径和framework的路径有差异引起的,知道这个就很容易解决了,是google的问题。
step2(手动集成tensorflow_lite.framework):
这里主要是需要手动设置Framework Search paths 和 header search paths:把framework的对应路径填充进来,让project能够找到。
例:
Framework Search paths-> ‘${SRCROOT}/tensorflow_lite.framework’
header search paths-> ‘${SRCROOT}/tensorflow_lite.framework/Headers’
另外这个时候跑项目,会报一个错误 “ Undefined symbols “_cblas_sgemm”(google之后就会发现这是因为没有引入accelerate库(高性能数学运算库)引起的,引入之即可解决)。
step3(自己生成.a库,自己集成头文件到项目):
https://www.tensorflow.org/lite/ios
按照上面文章的building部分,应该就会很容易的生成所需要的.a库了;但问题还有头文件。
google建议我们做如下操作:
The Header Search paths needs to contain:
the root folder of tensorflow,
tensorflow/lite/downloads
tensorflow/lite/downloads/flatbuffers/include
首先这里的路径和实际路径是不一致的,我花了一会才找到实际的路径。重要的是这样做对于一个稳定的项目只是简单集成我认为是不科学的,我们需要的只是头文件而已。
所以我先做了如下尝试:
把tensorflow_lite.framework里面的头文件拿到这里来用,岂不是很完美?
理想很丰满,现实很骨感。实践表明不知道什么原因这两者之间是不能匹配的,当你解决了编译不通过的问题,跑起来的时候会crash:”+[CATransaction synchronize] called within transaction Loaded model 1resolved reporter”。
简单粗暴的理解,我认为生成.a库里面的lite文件夹下面所有的.h我们都要包含之,但lite文件夹里面有很多其他的文件,如果全部加入工程中,结果就是一大堆的报错无法编译通过。
因此,我尝试使用python脚本来解决:
#!/usr/bin/python
— coding: utf-8 —
import os
def gci(filepath):
#遍历filepath下所有文件,包括子目录
files = os.listdir(filepath)
for fi in files:
fi_d = os.path.join(filepath,fi)
if os.path.isdir(fi_d):
gci(fi_d)
else:
tempP = os.path.join(filepath,fi_d)
if os.path.splitext(tempP)[1]!=’.h’:
os.remove(tempP)
#print tempP
#递归遍历/root目录下所有文件
gci(’/Users/zhenweiguan/Desktop/lite’)
这个脚本的作用是去除所有除了.h以外的文件。
将之集成到工程中,还是会报一些错误,检查发现是因为里面有子工程工程文件夹和asset资源文件夹,手动删除之。
再次集成这些头文件,并引入path,bingo,终于跑起来了。
结语:以上是我个人的踩坑全记录,对于想要*快速集成tensorflowlite的同学来说,*好的方法应该就是下载*新的.framework文件来进行手动集成(当然了,如果项目支持pod会更简单)。