迁移学习+TfLite Android构建自己的喵咪识别APP(一)

迁移学习+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、花卉数据集下载

花卉数据集示例

image

image

下载花卉数据集

curl -LO http://download.tensorflow.org/example_images/flower_photos.tgz

喵咪数据集整理

猫咪数据集是我自己整理的,有需要的朋友可以自己下载
猫咪数据集示例

image

image

下载链接

2.2 重新训练

获得图像后,从GitHub下载示例代码,新建文件夹example_code

cd ~/example_code
curl -LO https://github.com/tensorflow/hub/raw/master/examples/image_retraining/retrain.py

image

然后重新训练
在重新训练之前,需要修改retrain.py文件中输出路径,修改为自己的文件夹(不止下图中示例的两项)
image

重新训练命令

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文件


image

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、测试结果

image

可以从检测结果看出模型训练效果

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文件夹下,可以修改一下模型的名字,方便辨认。

image

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模型,如下:

image

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 本地项目实现

  1. 打开AndroidStudio
    image

    。加载后,从弹出窗口中选择“ 打开现有的Android Studio项目”:

image

2、选择tensorflow-for-poets-2/android/tflite
打开界面如下:


image

3、连接安卓手机
参考https://jingyan.baidu.com/article/15622f24d2fcb2fdfcbea5dc.html
以我用的小米手机为例
• 首先,打开开发者模式,不同型号的手机开启方式可以百度;
• 然后,小米手机很麻烦,如果需要通过USB下载App的话,需要在在开发者选择中关闭MIUI优化,以及打开USB安装
• 连接电脑和手机就可以了
4、进行“Gradle Sync”配置,点击sync Project whit Gradle Files

在这里插入图片描述

5、然后点击run
image

image

2.7 app效果

三、问题集合

3.1 测试模型出现KeyError: "The name 'import/input' refers to an Operation not in the graph."

问题分析:

image

==解决方法:==
修改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实现模型之后,猫咪的识别率产生了断崖式的下降,后续还需要改进一下,有时间再继续写下去。

你可能感兴趣的:(迁移学习+TfLite Android构建自己的喵咪识别APP(一))