APP下载

基于Android平台的图像识别设计方法与实现

2021-03-07兰宁

电子技术与软件工程 2021年19期
关键词:图像识别调用神经网络

兰宁

(中国石油西南油气田分公司川中油气矿 四川省遂宁市 629000)

1 绪论

1.1 研究背景、目的及意义

TensorFlow是具有Google自主产权的开放源代码深度学习平台,且完全免费。对比以前的平台,它可以更好地支持卷积神经网络的操作和训练。研究人员利用谷歌提供的TensorFlow平台,在人工智能的一系列研究领域中获得了重大的研究突破,如机器视觉、语义识别、目标检测等。

而谷歌提出的Android TensorFlow Lite更是为移动式平台实现人工智能应用的落地助推。

在另一方面,随着近年来人工智能技术的发展,相关的研究成果如雨后春笋般出现,给各行各业的发展带来了新的变革。在这其中,有一些本难以实现的需求,也因为有了人工智能技术的进步而变得不再困难。

(1)在图像识别领域,卷积神经网络的模型性能变得越来越好,使得图像识别神经网络模型的效率也变得越来越快。用通俗点的话说,就是图像识别的效率越来越高,耗能也越来越低,能够支持的平台也变得越来越多。

(2)随着科技的发展,研究人员对底层硬件的研究也获得了新的突破,这让手机性能变得越来越强大。

(3)软件和硬件的发展,让图像识别的本地化成为了可能。图像识别达到本地化的目的后,可以弥补需要将图像上传到服务器数据库才可以达到图像识别的遗憾。

综上所述,业界大多数的本地图像识别系统软件都还处在设想或者实验的阶段。所以本文将对本地图像识别系统进行实践开发和研究,为未来的业界开发做一些微小的工作。

2 主要技术分析

2.1 TensorFlow神经网络框架

对于人工智能技术来说,最重要的就是神经网络模型的训练了。近年来,随着人工智技术的快速发展,涌现了许多强大的模型训练框架。其中由Google推出的TensorFlow神经网络框架在开发社区中的呼声最高。

2.1.1 TensorFlow框架简介

TensorFlow是Google Brain团队根据第一代学习程序DistBelief开发的通用计算机框架。在DistBelief的基础上,TensorFlow还提高了灵活性和程序性能。它可以使模型计算跨多个平台,并且更快,更稳定。

TensorFlow是基于数据流图(Graph)的计算机程序。TensorFlow的工作空间被称为Tensor。在一个流程中,第一个节点(会话)计算将完成数据初始化和图形加载,并且输入和输出端将用于表示下一个节点的输入和输出。这一整个工作过程称为Flow。整个TensorFlow的计算过程是一个闭环过程,其中Tensor根据Session中的图表执行数值和传递计算。每种类型的图都可以具有多个张量,并且每种张量是不同类型的矩阵。这种数据结构最能代表神经网络的形成。

TensorFlow可以轻松支持多种神经网络。基于此,大量具有特定功能的神经网络被传输到TensorFlow平台上进行训练。

2.1.2 Android端的运行TensorFlow框架

Google在2017年推出TensorFlowLite之后,在移动端使用TensorFlow变得更加简单。TensorFlowLite是Goole针对移动嵌入式设备的TensorFlowMobile框架的后续更新版本。有了TensorFlowLite之后,应用程序开发人员可以更加轻松地将人工智能模型部署到移动设备中。

2.2 Keras人工神经网络库

Keras本质上是一个由Python编写的第三方库,它完全开源且编写了很多神经网络相关的代码。它已经完全适用于Microsoft-CNTK、Theano和TensorFlow等高级工具或框架,以设计,调试,测试,实施和查看深度学习模型。

Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型。

在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为TensorFlow、Microsoft-CNTK等系统下的组件。

2.3 图像识别和神经网络

在计算机视觉领域,图像识别和图像认知与基础技术一样受到关注,并且它们的发展同样日新月异。从视觉识别的角度来看,视觉技术的发展已经从字符识别转变为数字图像识别。从开发指标的角度来看,识别精度不断提高,逐渐突破了限制条件,从而图像复杂度也进一步提高。从识别技术的角度来看,传统的SVM已经非常成熟,并且以数据为驱动的机器学习为人工智能打开了大门。

3 本地图像识别系统的设计

3.1 功能需求

3.1.1 基本功能需求

为实现方便易操作的本地图像识别系统,该系统应当实现以下功能:

(1)系统要求用户给予ROOT权限和摄像头调用权限后才能进入系统。

(2)系统应提供给用户在屏幕上拍摄图画的功能。

(3)系统提供给用户对所画图画能实时预测反馈的功能。

(4)系统提供给用户能返回主界面的功能。

3.2 系统框架

图1为系统功能架构图,本地图像识别系统功能分为三个主要模块:模型训练模块、图像摄取模块以及图像识别模块。

图1:系统功能架构图

3.3 性能需求

此系统为方便用户在本地对其所绘制的图像进行识别而开发,为了安全性考虑,未设置登陆选项与网络互联权限,以达到保护用户隐私的目的。

3.4 模块设计

本地图像识别系统中有许多不同的模块,每个模块独自完成各自的任务,同时,各种模块之间又存在着一些耦合,这使得它们组合在一起可以构成一个完整的系统,具备较完整的功能,能完成其相关的各种操作。系统模块图如图2所示。

图2:系统模块图

4 图像识别模型模块的实现

4.1 图像预处理和数据收集

本文将使用谷歌提供的“猜画小歌”数据集进行训练,该数据集由“猜画小歌”游戏的玩家提供,现在谷歌将其开源[19]。

本文使用的数据集,每种类型的手绘图有4千张,每张图的分辨率为28*28,并把数据集按照80%和20%的比例进行图像的切分。本文使用tf-keras建立模型。根据数据集的格式,编写载入数据集的函数。该函数会根据传入的参数Max_items_per_class确定载入的每种数据集图片数量,并将其按照随机抽取的方式进行抽取,再将抽取的图片进行分类,分类为训练集和测试集两种。函数返回5个变量,分别是训练图像数据、测试图像数据、所有标签名、测试标签、训练标签。编写调用图像的函数,获取数据集和测试集的数据,同时定义图像参数。输出数据集数量,初步判断是否成功载入数据集。

我们随即从训练集里抽取一张图片来进行测试,执行程序,查看输出。如图3所示,图中紫色的部分的实际像素值是0,其余部分则为有值的部分。

图3:图像处理结果输出

继续处理数据集,把所有的图像数据集的像素值都除以一个std值,这个值通常是255[11]。同时使用Keras的one-hot方式将标签数组与所有标签对应,形成标签矩阵。

4.2 CNN的训练

使用tf-keras定义CNN模型。在使用该方法定义模型时是只需要调用对应API填入模型各层的参数即可,keras会自动生成训练模型层。本文使用模型的核心为3层卷积池化组合,1层展平和2层全连接。定义优度并启动tf-keras模型,将损失函数设置为“多个对数损失函数”,然后通过性能测试函数来计算top-k准确率,也就是说,当索引类位于预定义值的第一个k值时,检测到预测即是准确的[12]。

调用Tf-keras的训练方法,设置验证比例为10%,每次训练512张图片,输出模式为每个epoch输出一行记录,训练1000轮(每轮会训练完整的数据集)。为了更加直观的查看训练的结果,随机取验证集中的图片进行预测。

执行程序,如图4,查看预测的结果

图4:预测结果输出

4.3 模型导出

在本节中先前训练的神经网络模型模型已经能在电脑上用于图像处理。但是,如果需要在Android端使用该模型,则需要解决两个问题。

(1)模型的迁出。

(2)TensorFlow 框架在移动端的运行。

接下来,将对这两个问题进行详细阐述。

4.3.1 模型的迁出

成功在开发环境下将模型训练完毕后,接下去要做的事情就是将其移植到生产环境。

为了使用方便,在导出模型之前,先把标签数组导出成txt文件。如果需要将模型导出,那就需要调用TF-keras所提供的模型处理方法。完整地执行一遍程序,等待训练结束后,会在目录下生成名为class_names.txt的标签集文件和Sketcher.h5的模型文件。

Google面向Android的开发者提供了2种TensorFlow的调用方式,一种是TensorFlow Moblie,另一种是TensorFlow Lite。前者需要调用PB格式的静态模型文件进行预测,而后者需要调用TFLite格式的静态模型文件。

在前面的步骤中,本文使用的是Tf-keras模型,导出的为H5类型的静态模型文件,因此需要对模型文件进行一次转换,即将H5类型的模型文件转换成PB或者TFLite格式的文件。

Keras本体库中提供了一种方法,可以获取到当前执行的TensorFlow Session,以此为桥梁,可以PB的格式冻结并导出TensorFlow模型。开源社区Github中的作者Amir-abdi基于此开发出了一个名叫keras_to_tensorflow.py的转换工具。

执行转换文件后可在同目录下看到生成的sketcher.h5.pb文件。在以前,手机可以使用Android TensorFlow的方式调用PB文件执行预测,但TensorFlow在未来将弃用该方法,改用TFLite的方案。因此,如果想要在Android中开发图像识别技术,需要将PB文件转换为TFLite文件。在目录下创建名为transform.ipynb的Python3文件,执行该程序,如果没有出现错误提示,即可在同一目录下看到生成名为retrained_graph.tflite的TFLite格式的模型文件。

5 图像识别系统应用模块的实现

本章将根据本地图像识别系统的设计,对系统的具体实现进行阐述。将对本地图像识别软件系统进行阐述。

5.1 软件功能模块的实现

本节将概述特定模块的业务能力的实现。在模块之间,核心模块处理用户交互,因此其大部分业务是可视化工作。子模块为主要模块可视化业务提供服务,并且主要提供服务功能,但是某些功能本身也需要视觉逻辑,因此它们也可以参与视图功能。

5.1.1 图像拍摄模块的的功能实现

该模块需要调用手机摄像头来进行用户拍摄。同时,手机屏幕上显示的内容与返回值有关,如果要指定的内容,只要更改返回值即可。

该模块功能的实现需要涉及到两个文件的组装。分别是摄像头调用文件、图像识别文件。

5.1.2 图像识别模块的功能实现

图像识别模块是没有UI功能的高效模块。神经网络文件通过加载Android TensorFlowLite框架以实现图像识别功能,并最后将结果进行上传。而将Android TensorFlowLite框架上传到Android是一个利用JNI调用的过程。

TensorFlow库的实现需要Classify模块进行初始化,在 Classify模块中,Android应用程序提供的System.LoadLibrary()程序会和Tensorflowlite的So库文件一起进行加载。

随后,通过注入Config的方式,Tenorflowlite会对神经网络文件进行加载。

最后,存储在Asserts文件夹中的标签文件和用于图像分割的节点文件(pb)神经网络用于初始化Java端Tensorflow框架的接口interfaceInterface。使用此接口,可以消除图形的Tensorflow图的操作。

ModuleInstance的最重要使用方法是图像识别(位图),这是图像识别模块的关键功能。在此过程中,Bitmap使用Turalor网络进行Tensorflow图像识别,以获取前三个标签和系统置信度以进行相位判断。这个过程很耗时,需要通过调用在Android端运行的JNI TensorflowLite链接来查看相关功能,因此最好放一个单独的线程调用过程,以避免程序无响应和阻塞。

在图像识别子模块中,用于调用神经网络模型和执行图像识别的特定代码如图5所示。

图5:代码图

其中,Track部分是Android系统提供的工具包,可帮助开发人员进行调试。它可以查看开始时间以及使用其周围的代码优化功能和优化性能的时间。它实际上是一个infentialInterface对象,可用于图像识别。该项目是Tensorflow神经网络的基础。接受矩阵的正常像素并输出图像判断结果。

6 结语

本文对本地化Android系统的图像识别软件有了一个较好的实现。实现的同时也有着很多的纰漏,比如,Android软件部分的优化不够,设备性能相对较弱。在功能丰富性和性能优化方面,该应用程序仍有很大的改进空间。此外,可以在IOS端执行相关的应用程序设计和移植。综上,对该应用程序的未来发展总结为下:

(1)最突出的问题是图像识别的过度使用。大量使用内存和CPU会导致应用软件崩溃、闪退,这需要后续处理和优化。

(2)图像识别的准确性仍有待提高。由于模型的模型训练集是基于Google提供的基础图像,因此它与现实的复杂领域有很大不同。因此,该模型应提高图像识别本身的准确性。

(3)软件表现得性能有待提高。尽管该程序是实验性的,但该软件仍具有一些功能出错的问题。同时,程序UI设计也不够友好。

如果将来需要进一步改进,则需要添加更多的数据集用于模型的训练,并且需要强大的人机交互设计来改善用户体验。

猜你喜欢

图像识别调用神经网络
核电项目物项调用管理的应用研究
神经网络抑制无线通信干扰探究
基于Resnet-50的猫狗图像识别
高速公路图像识别技术应用探讨
LabWindows/CVI下基于ActiveX技术的Excel调用
图像识别在物联网上的应用
图像识别在水质检测中的应用
基于系统调用的恶意软件检测技术研究
基于神经网络的拉矫机控制模型建立
复数神经网络在基于WiFi的室内LBS应用