TF标准模型TensorFlow Mobile for Android

在推出Tensorflow(一下简称TF)时同时推出了TensorFlow Mobile(手机版和标准电脑版有区别,一下简称TFM)对于移动设备上使用深度学习网络仍是有相对的限制,主要是计算性能没法达到。近期google推出了专门针对移动设备上可运行的深度网络模型简单版(Tensorflow Lite,一下简称TFT),查看其demo效果识别速度确实比较快,可是也有不少限制目前而言,区别以下: 
1 TFT是TFM的进化版,在大多数状况下使用TFT来开发能够减小不少空间,其网络模型要比TFM要小的多。 
2 TFT目前为开发预览版本,没有涵盖全部用例,若是有需求仍是推荐使用TFM。 
3 TFT目前只支持一组有限的运算符,所以默认状况下并非全部TF网络模型均可以运行。而TFM具备更全面的支持功能。java

整个过程可分为3个步骤: 
1 使用现有优秀的网络模型训练本身的模型 
2 模型转换成TFM可识别使用的模型文件 
3 在AndroidStudio进行构建node

如何使用现有的网络模型训练本身可用的模型? 
这里使用google训练好的模型inception-2015-12-05.tgz(该模型在ImageNet比赛中得到No.1) 
https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip 
模型下载须要穿墙。下载好之后新建文件夹retrain存放如新建inception_model 文件夹,这里手动解压,正常应该会有这些文件:(文件夹名称随意) 
这里写图片描述 
该模型能识别1000个物体类别,性能表现良好,所以选择该模型进行“迁移学习“python

如今开始准备咱们须要让网络识别的物体数据,如作人脸识别,能够事先采起人脸数据,每一个人脸数据图片不得少于 20 张图片,格式为jpg或者png。这里准备乔布斯照片20张 
这里写图片描述android

重点来了,整个文件结构是固定的,有点蛋疼,新建目录data ,在该文件夹下面在新疆 train 文件夹,在train文件夹下面新建某个具体人脸的文件夹 xxxface,而后具体的人脸数据放在对应的文件夹下面,以下: 
这里写图片描述 
注意:在train下面一级的文件夹名称必须小写,不能有中文,文件夹名称至关于类别标签。git

数据准备完毕后,在retrain文件夹下面新建一个文件夹 bottleneck 该文件夹名称固定(这里是因为网络模型内部结构致使必须如此)api

若是有兴趣能够把可视化日子保存下来,如上图的 summaries文件夹就是用来存放日志的网络

以上都准备完毕后开始准备重建本身的网络模型,首先打开cmd命令行窗口,找到在git上clone下来的Tensorflow项目,找到项目中的 ..\ tensorflow\tensorflow\examples\image_retraining\retrain.py 文件,复制该文件路径到cmd中(这是python脚本所以须要python方式运行),在路径后面追加参数, 
参数1:–bottleneck_dir ..\ inception_model\retrain\bottleneck (这里是刚刚新建的空文件夹) 
参数2:–how_many_training_steps 100 (这里表示训练次数) 
参数3:–model_dir ..\inception_model (这个表示下载下来的模型存放的文件夹) 
参数4:–summaries_dir ..\inception_model\retrain\summaries (存放可视化模型日志文件夹) 
参数5:–output_graph ..\inception_model\retrain\myoutput_graph.pb (输出模型的位置) 
参数6:–output_labels ..\ inception_model\retrain\myoutput_lables.txt (输出类别标签位置) 
参数7:–image_dir .. \inception_model\retrain\data\train (存放须要训练图片的文件夹地址)app

综上可写入一个批处理文件中 retarin.bat:工具

python E:\openSource\Deeplearning\TensorFlow\tensorflow\tensorflow\examples\image_retraining\retrain.py ^
--bottleneck_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\bottleneck ^
--how_many_training_steps 100 ^
--model_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model ^
--summaries_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\summaries ^
--output_graph E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\myoutput_graph.pb ^
--output_labels E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\myoutput_lables.txt ^
--image_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\data\train ^
pause

执行以上语句,训练完成后会在指定位置生产适用本身数据的网络模型 myoutput_graph.pb和myoutput_lables.txt 标签文件.性能

能够先在电脑上测试下模型是否正确识别训练的图片。

至此学习模型准备完毕。

模型转换

在电脑上训练的网络模型,有些运算在TFM上可能不支持,须要作一些处理,处理步骤以下: 
打开cmd,找到tensorflow项目中的strip_unused.py 脚本文件(..\ tensorflow\tensorflow\python\tools\strip_unused.py),复制该路径到cmd中,该脚本须要几个参数。 
参数1:–input_graph=..\inception_model\retrain\myoutput_graph.pb (须要转换的模型) 
参数2:–output_graph= ..\inception_model\retrain\ my_tfm_output_graph.pb (转换后存放) 
参数3:–input_node_names=”Mul” (输入节点的名称,固定) 
参数4:–output_node_names=”final_result” (输出节点名称,固定) 
参数5:–input_binary=true (输入二进制数据)

执行完以上脚本语句便可进行转换。

最后构建App应用

打开Android Studio 导入项目 ..\ tensorflow\tensorflow\examples\android 
导入后他会自动进行构建,构建过程会去下载一些数据,若是没穿墙可能会fail 下载的数据能够在download-models.gradle 文件中看到: 
这里写图片描述 
若是不须要下载这些模型数据能够找到build.gradle文件把 
apply from: “download-models.gradle” 注释便可。

修改编译模式,在build.gradle文件中默认编译工具为bazel ,若是选择bazel须要先安装这个构建工具,这里选择cmake方式构建jni文件,修改:

def nativeBuildSystem = 'cmake'
  • 1

接下来把刚刚转换好的模型和标签文件放入 项目 assets 文件夹下面:

这里写图片描述

修改org.tensorflow.demo. ClassifierActivity.java页面(demo识别人口) 
这里写图片描述

把这些属性修改为以上值,在进行构建,构建成功后可直接运行到移动设备上。 
效果: 
这里写图片描述