介绍目录:
一、深度学习简介及开发环境搭建
二、深度可分离卷积MobileNets模型
三、VGG与MobileNets计算复杂度对比
四、实验结果及讨论
1.1 Anaconda的搭建
Anaconda是Python的一个科学计算发行版,内置了上千个Python经常会用到的库,包括Scikit-learn、NumPy、SciPy、Pandas等。官网下载网址:https://www.anaconda.com/download/如果下载缓慢则可使用清华镜像网站:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,下载成功后安装Anconda。
1.2 Tensorflow的搭建
TensorFlow是一种基于数据流编程的符号数学系统,它在各种机器学习算法的编程实现中被广泛应用。谷歌神经网络算法库disdeblief是它的前身。Tensorflow具有多级结构,可以部署在各种服务器、PC终端和web页面上。支持GPU和TPU高性能数值计算。广泛应用于谷歌内部产品开发和各个领域的科研。
Tensorflow有两种安装方式,第一种为打开cmd,使用终端命令pip install tensorflow == XXX(XXX为自己选择版本)。如果网速太慢则使用豆瓣镜像网站进行下载pip install tensorboard==2.1.0 -i https://pypi.douban.com/simple。第二种方式为使用pycharm设置下载。打开设置,在资源库中搜索Tensorflow并且添加进入资源库。(本文使用tensorflow 2.1.0)验证自己安装的Tensorflow是否成功:打开终端。输入:python,输入:import tensorflow as tf,输入:tf.__version__。若现实结果为tensorflow的版本号则说明安装成功如图2.2所示为成功安装结果。
1.3 Android studio的搭建
Android Studio。Google在5月15日的I/O大会推出的一款Android APP开发软件,公开推出此软件大有使用它取代Eclipse+ADT的开发方式。下面结合我的使用&理解给大家介绍一个简单的使用,通过此说明一般的应用是可以平滑过渡到使用Android Studio开发的。说明包裹一下几个部分,安装、首页简介、部分配置项说明、项目创建、项目导入、lib库管理、library项目导入。
Android Studio Google在5月15日的I/O大会上发布了一款Android应用程序,它可以取代Eclipse+ADT。这就说明使用Android Studio可以顺利开发通用的应用程序。说明包多个部分,安装,主页介绍,部分配置项说明,项目创建,项目导入,库库管理,库项目导入。
下载地址为:http://developer.android.com/sdk/installing/studio.html.根据自己所用的设备来完成下载。本项目的使用系统为MAC,安装Android Studio时需要安装jdk,本次项目主要为python项目,本机安装过jdk,直接继续安装Android Studio就可以。输入。java -version。就可以判断电脑是否安装了JDK
2.1深度可分离卷积MobileNets模型
MobileNet是google提出的新一代移动端卷积神经网络(Convolutional Neural Network, CNN)]模型。该模型结构简单,兼顾了性能和流畅性,非常适合手机等硬件配置低、计算能力差的移动平台。可分离卷积(Depthwise Separable Convolution,DSC)是MobileNet的基本单元,利用卷积的改进逐步取代了经典的三维卷积,减少了卷积核的冗余表达式,大大减少了计算量。此次项目中的主要思想为将一个标准的卷积分解成为两个卷积,从而达到降低计算量。首先分为深度卷积(depthwise convolution),这个卷积应用在每一个输入通道上;另一个是1×11×1的逐点卷积(pointwise convolution),这个卷积合并每一个深度卷积的输出。
2.2MobileNets分解
DW卷积(Depthwise Conv):在这个卷积当中,每一个卷积核只负责与输入特征矩阵的一个channel进行卷积运算得到相应的一个特征矩阵的一个channel。所以我们采用卷积核的个数与我们输入数据的channel相同,确保一个卷积核对应一个channel。当每一个输入特征矩阵的channel与一个特征值运算得到一个输出特征的channel,所以输出矩阵的channel与卷积核的个数相同时与输入特征矩阵的channel相同。可得到如下两点:(1)卷积核channel=1;(2)输入特征矩阵channel=卷积核个数=输出特征举证channel。
PW卷积(Pointwise Conv):与传统的卷积相同,其中卷积核大小为1,有三个channel。输出特征矩阵的channel与卷积核的个数相同。通常PW与DW放在一起共同使用。
两个超参数是宽度因子和分辨因子。虽然标准的MobileNet在计算和模型大小方面有显著的优势,但在速度或内存要求非常高的情况下,需要更小、更快的模型,可以改变宽度因子和分辨率因子来实现更小、更快的结果,而无需重新设计模型。宽度因子GRP是一个介于(0,1)和连接到网络的通道数之间的数字。简单地说,新网络中每个模块使用的卷积核的数量与标准的MobileNet成正比。
通过参数α将计算量和参数个数减少到约为α的平方是非常有效的。由表可以看出,ImageNet在利用α系数降低网络参数时,准确率可以为精度、参数个数和计算量之间的平衡提供了参考(每一项的第一个数字代表α的值)。我们可以看到,当α取值发生变化时,准确率的影响不是特别的大,而模型参数却可以减少很多。这就使得模型更小更快。
分辨率因子β的取值范围为(0,1]之间,做为作用于各模块输入大小的约化因子。简而言之,每个模块的输入数据和生成的feature map都被简化了。为使用不同的β系数作用于标准MobileNet时,对精度和计算量以的影响(α固定)。可以看出由224减小到128它的准确率减少的很少,但是它的模型计算量减少来很多
3.1 VGG与MobileNets计算复杂度对比
当利用传统卷积过程中若M为输入的通道数,Dk为卷积核的宽和高,Df为输入特征矩阵的宽和高,N为输出特征矩阵的深度。利用一个与输入数据的通道数一样的卷积核再把它进行逐个通道卷积求和,就可以得到一个有着具体数值的答案作为结果。计算量为公式为公式3.4所示。一个卷积核处理数据时的计算公式为3.5所示。若在某一层使用N个卷积核(默认步长为1)公式3.6所示。在使用深度可分离卷积时,DW的卷积计算复杂度为公式3.7所示。PW的卷积计算复杂度为公式3.8所示。(因为卷积大小为1,DW输出的特征矩阵的channel与PW的输入特征矩阵的channel相同所以为M)
当传统卷积与深度可分离卷积计算复杂度对比时就可以得到。因为通常卷积核使用3x3的卷积核,所以可得,深度可分离卷积理论上大学是是传统卷积计算复杂度的1/9。这样就可以大幅度减少运算所占用的体积。
4.1 Tensorflow Lite的应用
在此次的项目中我们将使用转移学习,我们将从已经针对另一个问题进行过训练的模型开始。然后,我们将在类似的问题上对其进行重新培训。如果从头开始进行深度学习可能需要几天时间,但是迁移学习可以在很短的时间内完成。在此过程中我们将利用Tensorflow Lite重新训练和模型转换。将已经备好的数据集图片进行训练,并且通过Android Studio来完成模拟器的创建和对花图片的识别。
此次使用的硬件环境为:电脑:MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports),处理器为2.3 GHz Intel Core i5,内存为:8 GB 2133 MHz LPDDR3,图形卡为:Intel Iris Plus Graphics 655 1536 MB,照相机为型号ID:UVC Camera VendorID_1452 ProductID_34068
我们将对MobileNet进行再训练。MobileNet是一个小型高效的卷积神经网络。“卷积”仅表示在图像中的每个位置执行相同的计算。可通过以下两种方式配置MobileNet:输入图像分辨率:128,160,192或224px。毫不奇怪,输入更高分辨率的图像会花费更多的处理时间,但会带来更好的分类精度。模型的相对大小,以最大的MobileNet的一部分表示:1.0、0.75、0.50或0.25。对于此代码,我们将使用224,0.5。
重新训练模型时,本台电脑使用python为3.5,所以代码使用了python3。一些主要的参数为训练的步骤为500步,模型所输出的位置。输出的文件主要分为两类。第一类为retrained_graph.pb。一类为output_labels。
当训练完成时可以在tf_files文件中得到如图所示的文件。得到了两个models,一个为retrained_graph.pb文件。一个为retrained_labels.txt文件。labels文件主要保存了五种花的名称。Graph.pb主要保存了它的图和一些参数。training_summaries主要保存了训练时的一些日志的输出。
4.2 Tensorflow Lite的模型转化
在flower_photos中选取一张图片用来测试识别图片的准确率。命名为test.jpg
通过终端进行测试。通过刚才已经训练完成的retrained_graph.pb文件。labels里边是五种花的标签。如图所示。从图中可以看出通过这一个分类器daisy的准确率为96%左右。符合前期的设想。而使用的test.jpg就是一张雏菊的图像。说明我们的训练是正确的。
如上图所示是测试时所使用的测试图片。
生成完刚才的模型并且通过验证以后,来做一个模型转化的步骤,也就是说,我们通过Tensorflow Lite convert来把一个Tensorflow的模型转化为Tensorflow Lite的模型。
4.3试验结果
可以看出原来的文件有87.5MB而转化以后文件大小为5.3MB,接下来就是把Tensorflow Lite的模型放入Android项目中。
首先在Android文件中打开Android APP的project。这时我们需要Android Studio。我们需要将这个project导入到Android Studio中,当成功导入完成后将如图。
Open File打开Android/tflite/。创建一个新的project。如图
配置AVD Manage如图4.14所示。选择一个模拟器。注意创建模拟器时需要注意API的level大于21,并且容许模拟器使用摄像头。打开虚拟机。
在手机上找到要识别花的图片放在摄像头前进行识别,观察识别情况。
此次项目完成。