在Android上使用Tensorflow
来源:互联网 发布:php代替session 编辑:程序博客网 时间:2024/06/05 17:03
在安卓平台使用tensorflow
项目github
最近更新 2017.6.7
添加了app预览如下,更详细请到github
分类预览1:
拍照分类:
程序启动:
自动分类为相册:
最近更新 2017.3.7
注意
最近有几个小伙伴询问移动端平台怎样使用自己的模型以及其他相关问题,我对部分问题做了总结,相关的内容在另外一篇博客中,点这里查看。另外大家要使用自己的模型请直接到上述博客中查看,本博客的所用的tf版本太旧,移植自己的模型可能会出现问题。
另外我做的用0.12版本tf做了一个图片分类相册应用(Android),tf部分已经可以正常使用了,大家可以到我的github查看
前言
最近在android平台上需要用到图片分类的技术,tensorflow是谷歌发布的一个开源的机器学习的框架,可以在pc端以及移动端使用。虽然官方提供了一个Android的demo我也成功安装到手机上运行了,但是对于之前没有接触过安卓开发的我来说,将tensorflow移植到我的项目并且在android studio上继续开发仍然很困难…。走了好多条弯路后,我终于成功将它运行到我写的app上了,下面分享一下怎样将tensorflow移植到android上。
开始
首先我们先从github克隆tensorflow的demo,需要注意的是这个demo不是官方的demo,而且也不是基于最新的0.12版本,只是0.10版本。克隆这个的原因是这个项目已经将官方的demo移植android studio上了,不用我再配置编译。克隆后从studio打开,建立虚拟机模拟运行
问题1:
无法运行报错:INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113
原因是安卓模拟器是x86构架的,然而这个项目中使用的tensorflow的动态链接库是arm的,因此无法在这个模拟机中模拟。首先我想到该怎样编译一个x86的动态链接库,然而不好意思,我折腾了一天也没成功。后来用在studio中新建了一款arm的模拟器,虽然能跑了,但是实在是太慢了,可是我又没有android手机,所以只能这样用了。不过虽然这个虚拟机在开机的时候需要将近10分钟,但是开机之后速度会快一点,虽然赶不上x86的模拟器,但是对于小任务量的任务也能凑合用
解决方案:新建一个arm的模拟器,开机时间很长,开机后速度还能忍;有能力的可以自行编译x86的动态链接库
分析源码
在Android中 native修饰的就是使用动态链接库中的接口,对于这个图片分类的demo,看了这写Java代码,我们可以找到tensorflow的3个接口如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
因此我们只需要学会使用这三个函数就能够将tensorflow移植我们的项目中了,对了,下面这条语句是载入动态链接库
- 1
- 2
- 3
- 1
- 2
- 3
我们到TensorFlowImageListener中找到了这几个函数的使用,因此,在使用时我们首先需要创建TensorFlowClassifier对象
- 1
- 1
然后我们需要载入tensorflow模型,载入时需要以下几个参数,注意我在TensorFlowImageClassifier中已经将我暂时不需要的参数删除了
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
不要忘了载入模型的第一个参数是assetManager,这个参数表示模型训练的数据结果(pb&&txt)文件的位置,如果为空的话会报出异常,上面的几个参数,基本看一下名字就知道是啥了,比如输入的名,图片的大小224*224等。模型初始化完成后就要对图片分类了,我们可以使用private native String classifyImageBmp(Bitmap bitmap);直接传入图片的bitmap位图,并且将图片大小调整为INPUT_SIZE即可
问题2:
应用在载入模型过程中闪退
看看你的assets目录位置对吗,也就是第一个参数,这个错了是无法载入模型的哦
在项目中使用ternsorflow
我直接将上面的demo中的主Activity清空,重新写了一个Activity,这个应用打开手机相册中的一张照片,然后将图片显示在界面上并且在最上面显示这个物品最可能的名字(使用谷歌的训练数据),这个项目依赖上面demo中的TensorflowClassifier类
主Activity代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
布局
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
其他
如果仅仅使用tensorflow进行图片分类,那个现在这3个借口基本就可以满足你的需要,建议在模拟时使用真机模拟,因为arm模拟器太慢。以后我会介绍怎样用tensorflow训练自己的数据集,并且根据自己的需求来识别图片类别。
- 在Android上使用Tensorflow
- 在Android上使用Tensorflow
- 在Android上使用Tensorflow资料汇总
- 使用TensorFlow在Android上进行物体检测
- 在Android设备上配置TensorFlow(四)无法使用TensorFlow训练新model
- 在Android上跑TensorFlow之接入TensorFlow
- 在Android设备上配置TensorFlow(二)使用Android Studio调用TF
- Tensorflow模型Android上的使用
- 在移动平台上使用tensorflow图片分类 (android and ios)
- 在iOS平台上使用TensorFlow教程(上)
- TensorFlow 在android上的Demo(1)
- Ubuntu 16.05LTS 环境下TensorFlow在android上运行
- 编译tensorflow并在Android上运行图像分类
- Tensorflow在Android上的应用(Windows、Mac、Linux)
- 在android上编译和运行python版的tensorflow
- 建造第一个Tensorflow在Android上的用例
- tensorflow在mnist集上的使用示例(一)
- tensorflow在mnist集上的使用示例(二)
- 生成式对抗网络 NIPS 2016 课程 第 4 节
- JAVA 常用算法学习记录(穷举算法)
- CSS小记
- JAVA attach source not find
- Geometry cannot have Z values /the geometry has no z values的问题
- 在Android上使用Tensorflow
- 无锁编程的原理及应用
- 如何用css3实现半像素边框
- hive优化(一)
- SSL/TLS 协议分析
- 《软件工程——实践者的研究方法》重难点复习笔记(第七章——指导实践的原则)
- 【Kotlin从入门到深坑】之类的属性和字段
- 快速排序(java)
- Swift 设置 tabbar 字体颜色和字体大小