基于Flutter 的视障人群辅助APPWord格式.docx
《基于Flutter 的视障人群辅助APPWord格式.docx》由会员分享,可在线阅读,更多相关《基于Flutter 的视障人群辅助APPWord格式.docx(23页珍藏版)》请在冰豆网上搜索。
本系统采用深度学习中的目标检测及跨平台开发框架Flutter为视障者们开发一个有好的、高效的视障辅助APP,让每一个人都能享受AI技术带来的便利。
第二章研究现状与分析
二.1.跨平台开发框架研究现状及分析
近年来,消费者们已经从PC转向移动端来进行上网的操作,跨平台开发框架大多数应用在移动设备上,所以显得至关重要。
跨平台开发技术可以增加代码的复用,降低开发时间于成本,实现一套代码,多个平台部署,在移动终端设备上也有许多框架大展身手例如Futter、ReactNative等,这些跨平台的开技术有的时候甚至超过了平台的原生语言
ReactNative是Facebook开发的框架如图2.1.1,是使用JavaScript开发IOS和Android的前端样式,最初ReactNatives是用来开发IOS系统的,最近也支持了Android系统。
该库现在可以为两个平台呈现移动UI。
每当使用Swift/Objective-C或Java编写的应用程序有更新时,都需要重新编译整个应用程序,并且必须将新版本再次分发到AppStore。
根据AppStore的审查程序,所有这一切可能需要几个星期。
为了避免这种麻烦,ReactNative应用程序以不同的方式工作,本机应用程序能够找到特定的JavaScript代码,然后在实际设备上启动该应用程序时下载并编译该JavaScript代码。
这样,可以立即完成应用程序更新,而无需一次又一次地向AppStore提交新版本。
图2.1.1RN框架图
Flutter是一个非常新的平台,该平台框架如图2.1.2所示但是它是一个很有发展的平台,已经吸引了已经发布了应用程序的大公司的关注。
例如阿里巴巴开发的闲鱼,腾讯开发的Now直播等。
与开发Web应用程序相比,它比较简单,并且与本地的应用程序相比,它具有开发快部署快的特点。
Flutter的高性能和高生产率是通过以下几种技术实现的。
与许多其他流行的移动平台不同,Flutter完全不使用JavaScript。
Dart是编程语言。
它可以编译为二进制代码,这就是为什么它以Objective-C,Swift,Java或Kotlin的本机性能运行的原因。
Flutter不使用本机UI组件。
起初听起来很尴尬。
但是,由于组件是在Flutter本身中实现的,因此视图和的代码之间没有通信层。
因此,游戏在智能手机中以最快的速度获得其图形效果。
因此,按钮,文本,媒体元素,背景都由Flutter的图形引擎绘制。
顺便说一句,Flutter的“Hello,World”应用程序的捆绑包非常小:
iOS≈2.5Mb和Android≈4Mb。
Flutter在ReactWeb框架的启发下使用了一种声明式方法,基于小部件(在网络世界中称为“组件”)构建其UI。
为了从小部件中获取更多信息,通常仅在必要时才渲染它们,通常是当它们的状态已更改时。
该框架还集成了Hot-reload,这对于Web来说很典型,但在本机平台上仍然缺少。
这使Flutter框架可以自动重建窗口小部件树,从而可以快速查看更改的效果。
图2.1.1Flutter框架图
二.2.目标检测研究现状及分析
二.2.1.卷积网络
卷积神经网络是一种特殊的神经网络,用于处理具有已知网格状拓扑的数据。
包括时间序列数据(可以认为是以规则的时间间隔采样的1D网格)和图像数据(可以认为是像素的2D网格)。
卷积网络在实际应用中已经取得了巨大的成功。
“卷积神经网络”表示该网络采用称为卷积的数学运算。
卷积是一种特殊的线性运算。
卷积与普通的神经网络非常相似-它们由具有可学习的权重和偏见的神经元组成。
每个神经元接收一些输入,执行点积,并可选地跟随其非线性。
卷积神经网络的起源是根据哺乳动物使用大脑中神经元的分层结构在视觉上感知周围世界的方式,这反过来又激发了工程师尝试在计算机视觉中开发类似的模式识别机制。
在他们的假设中,在视觉皮层中,“复杂细胞”产生的复杂功能反应是由“简单细胞”产生的更为简单的反应构建而成的。
例如,简单单元将对定向边缘等做出响应,而复杂单元也将对定向边缘做出响应,但具有一定程度的空间不变性。
卷积神经网络可以描述人类如何识别物体和场景的图像、人类如何看待和识别物体,类似神经元的的感受野,其中一个细胞对来自其他局部细胞的输入总和做出响应,深度卷积神经网络的架构受到上述思想的启发。
卷及网络还有空间不变性,我们大多数人可以在各种条件下识别特定的面孔,因为我们学习了抽象。
因此,这些抽象对于大小,对比度,旋转,方向都是不变的。
以汽车为例。
人们如何识别它是汽车?
我们基本上是在寻找汽车特有的特征。
我们寻找车轮,前大灯,门,后行李箱,玻璃窗,引擎盖和其他与其他运输方式不同的功能。
同样,在识别车轮的同时,我们寻找位于汽车主体下方的圆形物体,其颜色相对较暗,且质地粗糙。
我们考虑了所有的小细节,它们共同构成了一些基本信息。
这些小信息聚集在一起,形成了我们正在识别的对象所特有的特定特征。
卷积网络分为三个结构:
卷积层、连接层、池化层。
卷积层:
该卷积层与特征提取。
这是使用一个矩阵(通常是滤波器矩阵)应用于特定矩阵(通常是图像矩阵)的特殊操作。
该操作涉及将对应于图像矩阵的特定行和列的单元格的值与滤波器矩阵中相应单元格的值相乘。
我们对滤波器矩阵范围内的所有单元格的值执行此操作,并将它们加在一起以形成输出。
池化层:
该层包括执行从一组值中提取特定值的过程,通常是所有值的最大值或平均值。
这减小了输出矩阵的大小。
例如,对于MAX-POOLING,我们取矩阵的2X2部分的所有值中的最大值。
因此,我们实际上是采用表示该图像的该部分中存在特征的值。
通过这种方式,我们摆脱了关于图像特定部分中特征存在的不想要的信息,而仅考虑需要知道的内容。
通常在CNN体系结构中的连续卷积块之间定期插入池化层。
它的功能是逐渐减小表示的空间大小,以减少网络中的参数和计算量。
全连接层:
该层构成卷积神经网络体系结构的最后一块,与分类任务有关。
这实际上是一个完全连接的简单神经网络,由两个或三个隐藏层以及一个通常使用“Softmax回归”实现的输出层组成,该输出层可在众多类别中执行分类工作。
二.2.2.目标检测
目标检测是一种与计算机视觉和图像处理相关的计算机技术,用于检测数字图像和视频中某一类语义对象(如人、建筑物或汽车)的实例。
早期工作是基于模板匹配技术和简单的基于零件的模型。
后来,基于统计分类器的方法,例如神经网络,SVM,Adaboost,贝叶斯等。
最初成功的目标检测器系列(均基于统计分类器)为以下大多数研究奠定了基础,这些研究在训练和评估以及分类技术方面均得到了发展。
大多数对象检测系统都考虑相同的基本方案,通常称为滑动窗口,这是一种为了检测图像中不同比例和位置出现的窗口,它会进行详尽的搜索。
该搜索利用了分类器(检测器的核心部分),该分类器指示给定的图像斑块是否与对象相对应。
假设分类器基本上在给定的比例和补丁大小下工作,则输入图像的多个版本将以不同的比例生成,并且分类器用于对图像的每个缩小版本对给定大小的所有可能的补丁进行分类。
目标检测在计算机视觉的许多领域都有应用,包括图像检索和视频监控。
它广泛应用于图像标注、活动识别、人脸检测、人脸识别、视频对象共分割等计算机视觉任务中。
它还用于跟踪对象,例如在足球比赛中跟踪球、或在视频中跟踪人等任务。
二.3.SSD-MobileNet介绍
SSD-Mobilenet是一种目标检测的神经网络。
如图2.3.1中从上到下分别是MobileNetv1模型(统一输入大小为300x300)、chuanqi305的Mobilenet-SSD网络、VGG16-SSD网络。
且默认都是用3x3大小的卷积核,除了MobileNet-SSD的Conv14_1、Conv15_1、Conv16_1、Conv17_1和VGG16-SSD的Conv8_1、Conv9_1、Conv10_1、Conv11_1用的是1x1大小的卷积核。
图2.3.1
二.4.同类产品研究现状及分析
盲人出行途径有四个,分别是盲道、盲杖、明眼人的陪伴、导盲犬,下面我将分别介绍这四种。
盲道是属于公共设施,他是靠地上的花纹提示盲人能不能行走,属于盲人主要的出行工具,盲道是非常重要的。
但是设计时、使用时、会出现有固定或者非固定的东西被随意占用,各种电动车、私家车、杂物随意堆放,这种情况在现实生活中很常见。
盲杖,盲杖就是盲人前行的第三只眼,可探索前方是否有障碍物,是否被物体阻挡。
这种只能判断很近的物体,前方有无障碍物。
明眼人的陪伴,对于有明眼人的陪伴,自然不需以上的辅助工具。
导盲犬,导盲犬在当下必定还属奢侈存在,不是每一个盲人都能申请到导盲犬,申请导盲犬有着种种条件的限制。
以上总结,各种设施有利有弊,但是当下互联网时代的盲人出行工具还没有。
第三章实验环境搭建
三.1.安装CUDA和Cudnn
CUDA是Nvidia创建的并行计算平台和应用程序编程接口(API)模型。
它允许软件开发人员和软件工程师使用具有CUDA功能的图形处理单元进行通用处理—一种称为GPGPU(图形处理单元上的通用计算)的方法。
在NVIDIACUDA深层神经网络库(cuDNN)是深层神经网络的GPU加速的库。
cuDNN为标准例程提供了高度优化的实现,例如向前和向后卷积,池化,规范化和激活层。
cuDNN是NVIDIADeepLearningSDK的一部分。
下载安装文件。
首先去英伟达官网下载cuda安装包(图3.1.1):
图3.1.1cuda
下载runfile(后缀为.run)文件来安装。
安装cuda,cuda中含有nvidia的显卡驱动一般为专用的驱动非消费者级别的驱动,下载后点击安装即可。
根据显卡的配置来进行下载
三.2.安装Anaconda
Conda是一个在windows等系统上运行的包管理系统和环境管理系统,利用他可以进行多个环境之间的切换。
Conda的安装也很简单只需要执行官网的脚本即可,他可以在不同环境之间进行包的预下载等操作,其中python是conda包管理系统的主要语言。
从其官方网站下载最新版本的Anaconda安装程序bash脚本(如图3.2.1)
图3.2.1Anaconda
安装完成后输入condainfo-e查看有无安装成功
新建一个环境
condacreate-ncs_tf_py36python=3.6
三.3.安装Tensorflow
TensorFlow是一个开源软件库。
他是由谷歌公司中的谷歌大脑团队进行主要开发的,用于进行机器学习、深度学习等神经网络的研究、Tensorflow适用于生产环境下的部署、并且在很多工业设备上有着成功的案例。
Tensorflow也是一个用于计算的开源库
TensorFlow根据Apache2.0开源许可证发行。
尽管可以访问基础C++API,但该API主要用于Python编程语言。
与旨在深度学习的其他数值库(例如Theano)不同,TensorFlow则用于开发和生产系统。
它可以在移动设备和数百台机器上的单个CPU系统,GPU和大规模分布式系统上运行。
TensorFlow基本上是一个使用数据流程图进行数值计算的软件库,其中包括表示图中数学运算的节点和图中边缘表示的多维数据数组(称为张量在它们之间传递)。
请注意,张量是TensorFlow中数据的中心单元。
TensorFlow提供了多个API(应用程序编程接口)。
它们可以分为两个主要类别:
低级API:
完整的编程控制,推荐给机器学习研究人员,提供对模型的精细控制,而TensorFlowCore是TensorFlow的低级API。
进阶API:
与TensorFlowCore相比,在TensorFlowCore上构建更容易学习和使用,从而使重复任务更容易且在不同用户之间更加一致。
Tf.contrib是高级API的示例。
TensorFlowLite,它运行在许多不同的硬件类型,包括移动电话,嵌入式Linux设备,以及微控制器经过专门优化过的模式。
它变换TensorFlow模型转换成一个有效的形式解释使用,可引入优化提高二进制文件的大小和性能。
TensorFlow精简版的设计,可以很容易地在设备上的网络“边缘”的执行机器学习,而不是将数据从服务器来回。
对于开发商来说,在设备上进行机器学习可以用下面的改进有助于:
潜伏期(无往返于服务器),隐私(没有数据离开设备),连接(无互联网连接)和电源(网络连接消耗功率)。
使用模型优化工具包来减少模型的大小并提高其效率,同时将对精度的影响降到最低。
使用TensorFlowLite的工作流程要完成以下步骤:
1.选择一个模型,可以是自己的TensorFlow模型,在线查找模型,或从预训练模型中选择一个模型进行迁移学习或重新训练。
2.转换模型。
使用TensorFlowLite转换器和几行Python将其转换为TensorFlowLite格式。
3.使用TensorFlowLite解释器,使用多种语言的api,部署到设备并在设备上运行模型。
4.优化模型。
使用我们的模型优化工具包来减小模型的大小并提高其效率,同时最大程度地减少对准确性的影响。
在终端输入
Pipinstalltensorflow-gpu
三.4.安装AndroidStudio
AndroidStudio是一个集成开发环境,用于编写适用于移动终端设备的程序,基于JetBrains的IntelliJIDEA软件构建,并专门为Android开发而设计。
它可以在基于Windows,macOS和Linux的操作系统上下载。
它替代了EclipseAndroid开发工具(ADT),作为本机Android应用程序开发的主要IDE。
AndroidStudio是用于编写安卓程序的一个集成开发环境,可以用来编写手机、手表、电视等等使用安卓系统终端设备上的程序,他是从JetBrains的IntelliJIDEA来开发的可以软件,且专用于Android的开发,可以在Windows、Mac、Linux环境下来进行开发,同时也他也取代了早起安卓开发使用的Eclipse的环境,作为安卓开发者主要的集成开发环境
下载AndroidStudio在此网址上
启动AndroidStudioDMG文件。
将AndroidStudio拖放到“Applications”文件夹中,然后启动AndroidStudio。
选择是否想要导入之前的AndroidStudio设置,然后点击OK。
AndroidStudio设置向导将引导一些的设置步骤,包括下载开发所需的AndroidSDK组件等等。
三.5.安装Flutter环境
下载FlutterSDK在网址上,选择Stablechannel。
解压zip安装包
添加flutter到环境变量中exportPATH=`pwd`/flutter/bin:
$PATH
运行flutterdoctor所有检查都成功时,安装完成。
第四章详细设计与实现
四.1.训练神经网络
四.1.1.数据集
COCO数据集是微软构建的一个数据集,其包含detection,segmentation,keypoints等任务。
MSCOCO总共包含91个类别,每个类别的图片数量如下:
COCO数据集和包括了很多任务、例如目标检测、目标分割、关键点等任务,COCO数据集是微软提供的一个大型数据集,其中目标检测任务共包含了91类、每个类别的情况如图4.1.1
图4.1.1
相比于ImageNet数据集COCO的总数还是比较少,但是每个类别的数量要多很多,这样也带来了很多好处没有长尾数据的情况。
标注例子如图4.1.2
图4.1.2
四.1.2.训练模型
这里我使用了tf版本ObjectdetectionAPI,这个库包含了时下比较热门的一些网络框架,例如FasterR-CNN、R-FCN和SSD等,这个库因为在经典的沙滩图片上进行测试,以及众多模型的结果,使得目标检测技术在计算机视觉领域收到极大的关注,也带动了各种目标检测框架开始流行。
TensorFlowObjectdetectionAPI是在TensorFlow之上构建的开源框架,可轻松构建,训练和部署对象检测模型,此代码库可满足我们的计算机视觉需求,经典的沙滩图片一般作为示例(图4.1.2)。
ObjectDetection也包括了许多最新的目标检测任务的网络框架:
带有MobileNets的SSD(SingleShotMultiboxDetector)。
带有IceptionV2的SSD.
带有Resnet101的R-FCN(Region-BasedFullyConvolutionalNetworks)。
带有Resnet101的FasterRCNN。
带有Inception-Resenetv2的FasterRCNN。
等等
选用的是第一个MobileNets的SSD
首先我们需要下载完整的tensorflowObjectDetectionAPI,使用git命令下载并编译好所需环境
mvmodelsgoogle_obj_detection
cdgoogle_obj_detection/research
pythonsetup.pybuild
pythonsetup.pyinstall
cdslim
pipinstall-e.
新建一个linux脚本文件以.sh为结尾
vimenv_obj_detection.sh
添加以下内容(设置显卡以及protoc)
cd~/works/google_obj_detection/research/
protocobject_detection/protos/*.proto--python_out=.
exportPYTHONPATH=$PYTHONPATH:
pwd:
pwd/slim
exportCUDA_VISIBLE_DEVICES=0
准备训练数据
训练自己的model,下载预训练的模型权重和配置做迁移学习
将模型解压后放到research文件夹内
将模型配置文件放到任意位置(需要记住路径)
修改模型配置文件
num_classes:
2class的数量
batch_size:
8几组数据组成一个序列(根据GPUram设定)
fine_tune_checkpoint:
../../模型文件路径
train_input_reader:
{tf_record_input_reader{input_path:
../../}}路径填训练集路径
eval_input_reader:
label_map_path:
.../../标签路径
修改config后就可训练了
cdresearch
pythontrain.py--logtostderr--train_dir=training/--pipeline_config_path=paint_on_air_mobilenet/ssd_mobilenet_v2_coco.config
训练过程如图4.1.3
图4.1.3训练过程
训练结果会保存在train_dir指定的路径下
四.1.3.模型转换
TensorFlowLite转换器用于将TensorFlow模型转换为优化的FlatBuffer格式,以便TensorFlowLite解释器可以使用它们。
FlatBuffer是高效的开源跨平台序列化库。
它类似于协议缓冲区,区别在于FlatBuffer在访问数据之前不需要对辅助表示进行解析/解包步骤,从而避免了按对象分配内存。
FlatBuffers的代码占用空间比协议缓冲区小一个数量级。
TensorFlowLite转换器从TensorFlow模型生成TensorFlowLiteFlatBuffer文件(.tflite)。
TensorFlowLite是一个可以提供将tf模型到flatbuffer格式的转换工具,转换成flatbuffer格式,tflite就可以使用他们,flatbuffer是一个跨平台搞笑的序列化库,类似于协议缓冲期,但是和协议缓冲期还有缺别,他不会在访问数据之前对其进行解包的操作,从而避免了按对象分配内存,flatbuffers占用的空间也小了一个量级。
从而可以节省安卓或ios的本地资产空间,使应用程序更小,总的来说TnsorFlowLite转换器就是从从TensorFlow模型生成TensorFlowLiteFlatBuffer文件(.tflite)的一个转换工具。
主要转化过程为图4.3.1
图4.3.1主要转化过程
通过以下代码进行转换(图4.3.2)
图4.3.2
四.2.Flutter开发
四.2.1.语音播放数据准备
这里我使用了讯飞语音的api进行tts(根据文字生成语音)。
讯飞TTS的声音更接近真实人声,它们也是使用了一些深度学习的技术是语音更真实。
讯飞也是一些大型企业的合作提供商。
可以让语音技术结合AI变得更完善(如图4.2.1.1)。
注册讯