在Android上用AI识别物体

AI其中一个很重要的应用就是物体识别。 今天我们来看看如何在Android上实现这个功能。

物体识别

物体识别包括两个方面,一个是物体位置识别,划出图片中的物体在什么位置。另一个是物体识别,告诉你这是个什么物体,是人是狗,是桌子还是鸟。

SSD

目前最优秀的物体识别神经网络能够识别1900多种物体。我们把这个网络落地到Android上看看它的效果怎样。

Android导入AI框架

要在Android上使用AI网络,首先需要集成能够解读AI网络的框架。 Google的Tensorflow在Android上做了专门的框架 - Tensorflow-Lite,它能够在移动端上高性能地运算AI模型。

首先需要在app的build.gradle里引入它

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:1.10.0'
}

在Android使用tensorflow我们可以只关注它的 Interpreter 类, 这个类负责加载 AI模型,同时将图片进行运算,输出预算结果。

AI 的输入和输出

拿物体识别模型来说,这个模型能识别1000多种物体,那么它对一张图片的分析结果也会有1000多个输出对不对?

我们先简单地理解这个过程。假设这个模型能识别2种物体,分别是猫和狗,忽略物体的位置的话,那么它的输出结果应该是啥?

仔细想一下,它应该有下面三个输出

  • background, background_posibillty
  • cat, cat_posibillity
  • dog, dog_posibility

翻译一下,这三个输出分别对应

  • 没有猫狗的概率
  • 有猫的概率,猫的位置
  • 有狗的概率,狗的位置

于是我们可以构造下面的输出数据结构

float[][] labelProbArray = new float[3][1]

三个维度分别表示三种物体的概率。 注意这里没有猫狗也必须当做一种情况,不然要是图片里没有猫狗的话它就只能在猫狗里挑一个,就乱套了。

至于输入就简单了,把Camera得到的bitmap当作输入就行。

下面看看怎么使用tensorflow的Interpreter。

开始分析图片

首先需要把AI网络塞进 Interpreter。

物体识别网络通常有两个模型来构成,一个是网络,另一个是标签。

网络是用来分析图片并输出结果的, 标签是用来描述网络能识别什么内容。因为正常来说,网络只能输出一个一维数组表示每个标签的概率,它并不会输出用文字描述的物体… 细想一下要是真这样的话那就恐怖了…

在我们的app中需要先把这两个东西放进去,下面这两个就是网络和标签了

assets

lite是网络模型,txt是标签。

初始化 Interpreter 的过程比较简单,代码如下

Interpreter tflite = new Interpreter(loadModelFile(activity));

/** Memory-map the model file in Assets. */
private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
  AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(MODEL_PATH);
  FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
  FileChannel fileChannel = inputStream.getChannel();
  long startOffset = fileDescriptor.getStartOffset();
  long declaredLength = fileDescriptor.getDeclaredLength();
  return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}

分析的过程也相当简单,两行代码

tflite.run(imgData, labelProbArray);

在分析结束后,labelProbArray 就保存了对图片的分析后各个可能存在的物体的概率。

源码下载

上面的内容比较零散,我这里整理了一个可以使用的app提供下载。 需要源码的小伙伴可以在公号回复”物体识别“来获取源码回去研究。

下面是AI app的截图。

phone

laptop

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云时之间

算法导论系列:贪心算法(2)

现在我们假设景点地图如上所示,从起点到下一个点都会有具有方向路径和相应的权重,我们可以使用矩阵进行表示,如下图所示:

14810
来自专栏利炳根的专栏

学习笔记CB010:递归神经网络、LSTM、自动抓取字幕

递归神经网络(RNN),时间递归神经网络(recurrent neural network),结构递归神经网络(recursive neural network...

60540
来自专栏AI科技评论

开发 | 图片数据集太少?看我七十二变,Keras Image Data Augmentation 各参数详解

AI科技评论按,本文作者Professor ho,该文首发于知乎专栏Keras花式工具箱,AI科技评论获其授权转载。 图像深度学习任务中,面对小数据集,我们往往...

464100
来自专栏企鹅号快讯

深入机器学习系列7-Random Forest

1 Bagging   采用自助采样法()采样数据。给定包含个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时,样本仍...

51460
来自专栏CVer

OpenCV实战:人脸关键点检测(FaceMark)

Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Dat...

1.4K70
来自专栏人工智能LeadAI

简易的深度学习框架Keras代码解析与应用

总体来讲keras这个深度学习框架真的很“简易”,它体现在可参考的文档写的比较详细,不像caffe,装完以后都得靠技术博客,keras有它自己的官方文档(不过是...

75470
来自专栏机器之心

资源 | NIPS 2017 Spotlight论文Bayesian GAN的TensorFlow实现

34580
来自专栏CSDN技术头条

GAN学习指南:从原理入门到制作生成Demo

作者:何之源,复旦大学计算机科学硕士在读,研究方向为人工智能以及机器学习的应用。 生成式对抗网络(GAN)是近年来大热的深度学习模型。最近正好有空看了这方面的...

30790
来自专栏AI研习社

图片数据集太少?Keras Image Data Augmentation 各参数详解

图像深度学习任务中,面对小数据集,我们往往需要利用Image Data Augmentation图像增广技术来扩充我们的数据集,而keras的内置ImageDa...

80340
来自专栏编程

关于反向传播在Python中应用的入门教程

我来这里的目的是为了测试我对于Karpathy的博客《骇客的神经网络指导》以及Python的理解,也是为了掌握最近精读的Derek Banas的文章《令人惊奇的...

21870

扫码关注云+社区

领取腾讯云代金券