TensorFlow Mobile for Android

TF标准模型TensorFlow Mobile for Android

本文链接:https://blog.csdn.net/leifengpeng/article/details/78754405

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

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

如何使用现有的网络模型训练自己可用的模型? 
这里使用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个物体类别,性能表现良好,因此选择该模型进行“迁移学习“

现在开始准备我们需要让网络识别的物体数据,如做人脸识别,可以事先采取人脸数据,每个人脸数据图片不得少于 20 张图片,格式为jpg或者png。这里准备乔布斯照片20张 
这里写图片描述

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

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

如果有兴趣可以把可视化日子保存下来,如上图的 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 (存放需要训练图片的文件夹地址)

综上可写入一个批处理文件中 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识别人口) 
这里写图片描述

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章