在推出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'
接下来把刚刚转换好的模型和标签文件放入 项目 assets 文件夹下面:
修改org.tensorflow.demo. ClassifierActivity.java页面(demo识别人口)
把这些属性修改为以上值,在进行构建,构建成功后可直接运行到移动设备上。
效果: