上一篇博客中介绍了如何使用Tensorflow object detection API 搭建属于自己的物体识别模型(https://blog.csdn.net/dy_guox/article/details/79111949),由于我们的模型是基于ssd_mobilenet训练,这个模型本身是相对较为轻量级的,也可以在手机上使用,因此,这篇博客将介绍如何将Tensorflow object detection API 训练的模型迁移导入到手机中使用。
首先需要确认,已经训练好了自己的模型(以 .pb结尾)。即在object_detection\tv_vehicle_inference_graph文件夹下的 frozen_inference_graph.pb 文件。接下来将以我在视频教程中的例子(检测武大靖)进行示范。(参考之前博客教程的视频地址:https://www.bilibili.com/video/av21539370/)
首先,将 frozen_inference_graph.pb 文件重命名为 WDJ_frozen_inference_graph.pb, 这样便于跟其他模型区分开来。
我的测试将在Android系统进行,IOS系统没有测试。
运行效果视频:
https://www.bilibili.com/video/av22957279/?p=1
如果你觉得有点帮助,欢迎投币支持。
https://www.tensorflow.org/mobile/android_build
上述网址有详细的教程,考虑到国内可能被墙,继续重复一遍。
首先先根据提示把Demo跑起来,后面的工作在此基础上进行。
1)安装 Android Studio
去官网下载安装即可。
2)在Github上 clone TensorFlow
如果电脑上安装了Git,那么在特定目录下,运行git 命令
git clone https://github.com/tensorflow/tensorflow
如果连Git都没有,那就到
https://github.com/tensorflow/tensorflow
右上方绿色“clone or download”下载 zip到本地,解压。
3)搭建 Android Studio环境
打开Android Studio,选择 “Open an existing Android Studio project”,在“Open File or Project ”,选择在2)中对应的 tensorflow/examples/android 文件夹,OK。如果需要“Gradle Sync”,选择OK。第一次启动可能需要安装或更新很多模块,耐心等待。
4) 在 build.gradle 文件中(在左侧 1:Project 面板 Android 下面 Gradle Scripts ),找到 nativeBuildSystem 这个变量,设置等于 “none”:
// set to 'bazel', 'cmake', 'makefile', 'none'
def nativeBuildSystem = 'none'
5) 点击上方菜单 Run -> Run 'android' 命令, 在弹出菜单选择 右侧的 Proceed Without Instant Run。
6)同时,打开手机的开发者模式与USB调试,用USB连接电脑。不同手机方法不同,自行百度。
成功连接后运行命令时会识别对应手机型号,选择后继续,将会在手机上安装4个不同的APP,期间注意查看手机,允许安装(默认会拒绝)。
7)4个不同APP有不同的功能,大概就是深度学习的几个重要的研究方向:
TF Classify. 物体识别,识别图中有什么物体;
TF Detect. 物体检测,除了识别有什么物体,还能检测物体的位置,跟上一篇博客的目的一致,也是本博客模型迁移的目标;
TF Stylize. 实时风格变换,将摄像头拍摄到的图片自动转换成不同的风格,类似前段时间很火的模仿梵高作画;
TF Speech. 选择单词说出来,软件能识别。
Demo视频如下:
https://www.bilibili.com/video/av22957279/?p=1
1)将之前训练好的识别武大靖的模型 WDJ_frozen_inference_graph.pb 放在 Android文件夹中的 assets
文件夹下。
2)继续在当前文件夹下,能发现数个 ‘...labels.txt’ 文件,复制其中任意一个,重命名为 “WDJ_labels.txt”用于储存标签,名字随意起,只要你自己能理解就行。打开 “WDJ_labels.txt”,建议用 Sublime Text,直接用记事本打开所有标签会挤在同一行。在Sublime text中,发现第一行是“???”,不用管,后面每一行是一个标签,由于我的任务只有一个,就是“WDJ”,注意标签跟之前训练模型时候保持一致。保存退出。
3) 查找 “DetectorActivity.java”文件,用Sublime text 打开,找到 TF_OD_API_MODEL_FILE 与 TF_OD_API_LABELS_FILE 这两个变量,前一个改成自己模型的路径,如 ".../assets/WDJ_frozen_inference_graph.pb",后一个改成标签 .txt文件的路径,如 “.../assets/WDJ_labels.txt”
4 )“DetectorActivity.java” 文件中 MINIMUM_CONFIDENCE_TF_OD_API 变量,决定最低多少置信度画识别的框,如果发现移植到手机上的模型效果不理想,可以把这个值调低,就会更容易识别出物体(但是也更容易误识别),根据自己的实际运行效果测试修改。
跟第1步中一样的运行步骤,等待安装。完成后在手机上打开 TF Detect ,发现跟Demo不一样了(我们不一样!)。
具体效果视频:
https://www.bilibili.com/video/av22957279/?p=2
当然,因为之前的模型训练的效果就很一般,所以在手机上的效果也是半斤八两甚至还要差,但是至少能跑了。对比之前视频里的效果,这样的结果也在预期之内,如果想追求完美,那就多训练数据,用更好的模型,比如mobile net V2,这就有待读者自己探索了。
参考资料:
https://towardsdatascience.com/detecting-pikachu-on-android-using-tensorflow-object-detection-15464c7a60cd
https://www.tensorflow.org/mobile/android_build