迁移学习+TfLite Android构建自己的喵咪识别APP(一)
博客链接:https://blog.csdn.net/weixin_42042397/article/details/98081911
本教程是我自己实践过程的记录,具体的理论细节请参照其他博客
一、基础知识
- 官方实践教程一: 迁移学习实现图像分类器
https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html#1 - 官方实践教程二: 利用Android Studio 实现识别程序
https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/#0
- 项目实践参考博客:https://www.cnblogs.com/hutao722/p/9603113.html
- 数据集整理参考教程:https://cloud.tencent.com/developer/article/1039872
- Android studio安装参考教程:https://blog.csdn.net/qq_22169787/article/details/90106330
项目开始之前,请确保已经安装PIP包tensorflow-hub以及最新版本的TensorFlow,tensorflow-hub的安装说明
二、项目实践
首先,建议新建立一个文件夹,我自己建立了一个的文件夹命名为app
然后, 在终端执行进入该文件夹的命令
第一次实践我是使用的教程中的提供的花卉的数据集,第二次实践的数据集是自己整理的一些猫咪的图片
2.1 准备数据集
1、花卉数据集下载
花卉数据集示例
下载花卉数据集
curl -LO http://download.tensorflow.org/example_images/flower_photos.tgz
喵咪数据集整理
猫咪数据集是我自己整理的,有需要的朋友可以自己下载
猫咪数据集示例
下载链接
2.2 重新训练
获得图像后,从GitHub下载示例代码,新建文件夹example_code
cd ~/example_code
curl -LO https://github.com/tensorflow/hub/raw/master/examples/image_retraining/retrain.py
然后重新训练
在重新训练之前,需要修改retrain.py文件中输出路径,修改为自己的文件夹(不止下图中示例的两项)
重新训练命令
python retrain.py --image_dir D:/z_personal_file/APP/cats_photos
--image_dir 表示训练用到的图片路径,修改为自己的训练图片的路径
默认情况下,使用 具有在ImageNet上训练的Inception V3架构的图像特征提取模块,该脚本执行4000个训练步骤,训练时间不到一个小时就可以完成。
其他参数代表的意义如下
--architecture 为架构类型,支持mobilenet和Inception_v3两种
--output_labels 最后训练生成模型的标签,由于花图片集合已经按照子目录进行了分类,故retrained_labels.txt最后包含了上述五种花的分类名称
--output_graph 最后训练生成的模型
--model_dir 命令启动后,预编译模型的下载地址
--how_many_training_steps 训练步数,不指定的话默认为4000
--bottleneck_dir用来把top层的训练数据缓存成文件
--learning_rate 学习率
此外,还有些参数可以根据需要进行调整:
> --testing_percentage 把图片按多少比例划分出来当做test数据,默认为10
--validation_percentage 把图片按多少比例划分出来当做validation数据,默认为10,这两个值设置完后,training数据占比80%
--eval_step_interval 多少步训练后进行一次评估,默认为10
--train_batch_size 一次训练的图片数,默认为100
--validation_batch_size 一次验证的图片数,默认为100
--random_scale 给定一个比例值,然后随机扩大训练图片的大小,默认为0
--random_brightness 给定一个比例值,然后随机增强或减弱训练图片的明亮程度,默认为0
--random_crop 给定一个比例值,然后随机裁剪训练图片的边缘值,默认为0
训练结束后得到模型.pd文件以及.txt文件
2、3 检验训练效果
1、下载测试代码
curl -LO https://github.com/tensorflow/tensorflow/raw/master/tensorflow/examples/label_image/label_image.py
2、 测试命令
python label_image.py --image=D:/z_personal_file/APP/cats_photos
/American_Shorthair/ia_1500000012.jpg --input_layer=Placeholder --output_layer=final_result --graph=D:/z_personal_file/APP/example_code/tmp/output_graph.pb --labels=D:/z_personal_file/APP/example_code/tmp/output_labels.txt
3、测试结果
可以从检测结果看出模型训练效果
american shorthair 0.9833292
canadian hairless 0.007974292
british shorthair cat 0.007008963
siamese 0.0012834456
persian cat 0.00026851168
2.4 转换模型格式
1.模型训练成功后,将.pd的模型转化为.tlite模型,用于接下来的Android Tflite
我们在这里使用TFlite转换器
2.下载官方代码
git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
cd tensorflow-for-poets-2
3.将已经训练好的的outpt_graph.pd以及output_labels.txt移动到~\tensorflow-for-poets-2\tf_files文件夹下,可以修改一下模型的名字,方便辨认。
4.模型转化命令
cd /d D:\z_personal_file\APP\tensorflow-for-poets-2
tflite_convert --graph_def_file=tf_files/cats_graph.pb --output_file=tf_files/optimized_cat_graph.lite --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --input_shape=1,299,299,3 --input_array=Placeholder --output_array=final_result --inference_type=FLOAT --input_data_type=FLOAT
得到lite模型,如下:
2.5 下载Android studio
注意Android studio的安装好像需要翻墙,国内安装参考开头的博客链接
下载安装
细节参照点此
1、官网下载最新版本 https://developer.android.google.cn/studio
2、下载安装包后,点击进行安装
3、更改安装路径
4、安装之后,进行配置,点击DO not import settings
5、为了省事我选择的选择自定义安装,然后是选择主题风格,按个人喜欢自行选择
6、安装成功后,配置SDK和NDK
选择configure-->settings--> system settings-->android SDK
选择SDK platforms下载与你手机对应的android版本的android系统环境
选择SDK tools下载NDK,NDK版本要大于14.(图片来自其他博客)
安装结束。
2.6 AndroidStudio 本地项目实现
- 打开AndroidStudio
。加载后,从弹出窗口中选择“ 打开现有的Android Studio项目”:
2、选择tensorflow-for-poets-2/android/tflite
打开界面如下:
3、连接安卓手机
参考https://jingyan.baidu.com/article/15622f24d2fcb2fdfcbea5dc.html
以我用的小米手机为例
• 首先,打开开发者模式,不同型号的手机开启方式可以百度;
• 然后,小米手机很麻烦,如果需要通过USB下载App的话,需要在在开发者选择中关闭MIUI优化,以及打开USB安装;
• 连接电脑和手机就可以了
4、进行“Gradle Sync”配置,点击sync Project whit Gradle Files
5、然后点击run
2.7 app效果
三、问题集合
3.1 测试模型出现KeyError: "The name 'import/input' refers to an Operation not in the graph."
问题分析:
==解决方法:==
修改label_image.py中的
input_height = 299
input_width = 299
同时测试命令行增加
--input_layer=Placeholder
3.2 安装Android Studio出现Gradle sync failed: Failed to find target with hash string 'android-26' in: D:\app2\Android\SDK (2 m 55 s 917 ms)
解决方法:File—>Project Structure
修改Properties的Compile Sdk Version
Flavors 的target SDK version
3.3 Android Studio连接成功后出现错误error: resource android:style/TextAppearance.Material not found.
分析地址:https://blog.csdn.net/caojengineer/article/details/83651916
==解决方法:==
修改build.gradle文件:
compileSdkVersion 修改成25
buildToolsVersion 修改成25.4.0,implementation 'com.android.support:appcompat-v7:25.2.1'
3.4 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
我用的小米手机,所以这里应该是小米手机才会出现的问题
==解决方法:==
1:检查Android Studio的设置
File->Settings->Build,Execuion,Deployment->Instant Run
然后把Enable Instant Run to...那一项的勾去掉就好了
2:检查小米手机的是否启用MIUI优化
3:因为本人一般测试机不用Sim卡,所以会造成升级的时候关闭USB安装这个选项,开启这俩个选项就好了,其他的手机应该也是差不多的套路
3.5 建立自己数据集加载时出现InvalidArgumentError (see above for traceback): Expected image (JPEG, PNG, or GIF), got unknown format starting with 'BM^6\016\000\000\000\000\0006\000\000\000(\000'[[node DecodeJpeg (defined at retrain.py:936) ]]
==解决方法:== 不知名原因,我直接删除错误图片,没有问题。
四、总结与改进
转化为app实现模型之后,猫咪的识别率产生了断崖式的下降,后续还需要改进一下,有时间再继续写下去。