Tensorflow Lite之图片识别研究

2019-06-05 17:55:04 浏览数 (1)

TensorFlow lite的介绍

有关TensorFlow的介绍建议看官网,如果懒的话可以直接看我上篇文章。官方告诉我们,入门TensorFlow lite的最好姿势是学习他的demo,这里从第一个例子,图片识别开始。

环境搭建,建议在Android上尝试,因为ios安装真机需要证书或者越狱
  1. 安装Android studio 这里假设你已经安装好了Android studio了,官方建议版本3.2以上,这里如果不是最好更新一下咯。
  2. git clone https://github.com/tensorflow/examples.git
  3. 图片识别的Android工程源码放在examples/lite/examples这里了,使用Android studio打开已存在的项目。
跑起来之后,直接接可以识别了
已经有了结果了,当然是要纠结一下它是怎么run起来的了。

图像识别,很显然需要用到相机,这里,对于Android平台,demo中处理了一下权限的问题,还有cameracamera2的一些api的兼容问题,这些过程都不是很重要,重要的是,我们拿到图片流之后的处理:我们随便拿一个,比如camera 方式的回调

这里拿到图片之后,主要进行了一个convertYUV420SPToARGB8888的转换,因为camera拿到的字节是YUV格式的,而后面模型处理算法是RGB方式,因此需要转换一下。

好,接着进入processImage环节

同样,代码没有多么难以理解,拿到刚刚捕获的RGB字节,将他写入rgbFrameBitmap中,然后将其转换一下,放到一个新的croppedBitmap中,然后直接就使用分类器来识别图片了,看起来就一句代码实现了这个图像识别。

那么这个classfier是在哪里创建的呢?

创建的代码在此处,这里传入的参数有model,设备,线程数,对应于一下ui界面这里的设置。

那么,分类器具体是如何构造的呢?

构造一份分类器,需要用到模型文件,需要制定是使用CPU,还是NNAPI(Android Neural Networks API (NNAPI) 是一个 Android C API,专门为在移动设备上对机器学习运行计算密集型运算而设计),还是GPU,然后需要把要识别的结果标签加载到内存中,使用不同的模型,构造器的具体实现类还不一样。

具体的分类器的实现类有两个,比如我们就看ClassifierQuantizedMobileNet这个分类器的实现。

分类器构造好之后,就该了解具体是如何做识别的了

说到底这里也是一句代码的调用,然后使用优先队列来做了一个排序,个人感觉有点多次一句,直接Arrays.sort()不就搞定了,还需要用什么优先队列先塞一下,在取了在塞,浪费。

最后跟一下runInference这个方法,是一个抽象方法,前面说了,根据模型不同,由具体分类器自己实现,我们姑且看ClassifierQuantizedMobileNet这个,以为是价值一个亿的代码,结果就这么简简单单的一行而已,不过看了下label列表,大概有1000行,估摸着这样排序会快一些,相当于做了一个堆排序。

也就是说tflite会根据此时的imgData来生成一个labelProbArray,然后具体哪个label的可能性如何就可以直接取了。

总结

整个过程就分析完了,实际上有一个可用的模型的化,就很好办了,客户端写下套路代码就ok,应用这个模型就可以给出推断结果,那么,毫无疑问,模型是如何训练呢?欲知后事如何,请听下文分解。

0 人点赞