近年来,在深度学习的支持下,计算机视觉识别技术取得了极大的进展。现在,移动应用中大多数的机器学习都是通过将数据传输到云服务进行处理,然后再将返回的结果提供给用户。这就意味着在数据中心需要使用非常强大的计算机,还要减轻智能手机处理信息的负担。另外,这种方法延迟高,而且对隐私的保障性不好。

作者:温利武    班级:1402019      学号:14020199041

TensorFlow概述&模型制做(MobileNet)#

因此谷歌为帮助智能手机更好的识别图像,而不需要大量的消耗,向开发者推出了
MobileNets,谷歌称通过处理用户智能手机上的数据,可以快速返回结果。

【嵌牛导读】:近年来,深入学习推动了计算机视觉领域的巨大进步,神经网络反复推动了视觉识别技术的发展。虽然通过Cloud
Vision

移动端##

前面是介绍 核心在 步骤与操作指令

MobileNets 是一系列用于 TensorFlow
中的高效、小尺寸的移动端优先计算机视觉模型,它们的设计目标是在手持或嵌入式设备有限的资源下高效地运行,并提供尽可能高的准确率。MobileNet
是小型、低延迟、低功耗的参数化模型,它为多种不同使用场景下的有限资源做了针对性的参数优化。它们可以像其他流行的大规模模型(如
Inception)一样用于分类、识别、嵌入和分割任务等。

API为互联网连接的设备提供诸如对象,地标,标志和文本识别等许多技术,但我们相信移动设备的日益增长的计算能力可以使这些技术交付到手中的用户,随时随地,无论互联网连接。然而,设备和嵌入式应用程序的视觉识别带来许多挑战

模型必须在资源有限的环境中以高精度快速运行,利用有限的计算,功率和空间。

【嵌牛鼻子】:MobileNets 模型

【嵌牛提问】:如何实现低延迟、低功耗、小型化

【嵌牛正文】:017年6约14日(今天),我们很高兴地宣布发布MobileNets,这是一款用于TensorFlow的移动终端计算机视觉模型系列,旨在有效地最大限度地提高准确性,同时注意设备或嵌入式应用程序的受限资源。MobileNets是小型,低延迟,低功耗模型参数化,以满足各种用例的资源限制。它们可以建立在分类,检测,嵌入和分段上,类似于其他流行的大型模型,如初始化。

澳门新葡萄京官网注册 1

示例用例包括检测,细粒度分类,属性和地理定位。

澳门新葡萄京官网注册 2

此版本包含使用TF-Slim的TensorFlow中的MobileNets的模型定义,以及用于各种尺寸的移动项目的16个预训练的ImageNet分类检查点。这些型号可以使用TensorFlow
Mobile在移动设备上高效运行。(在Github直接下载)

澳门新葡萄京官网注册 3

选择正确的MobileNet模型,以适应您的延迟和大小预算。内存和磁盘上网络的大小与参数数量成正比。网络的等待时间和功率使用量与测量融合乘法和加法运算次数的乘法累加量(MAC)数量相称。前1和前5个准确度在ILSVRC数据集上测量。

以下是如何下载MobileNet_v1_1.0_224检查点的示例:

澳门新葡萄京官网注册 4

概述##澳门新葡萄京官网注册

目前,我们有两种在移动和嵌入式设备上部署机器学习应用程序的解决方案:TensorFlow
for Mobile和TensorFlow Lite。

一个不错的视频介绍

差异

  • TensorFlow Lite是TensorFlow
    Mobile的发展。在大多数情况下,使用TensorFlow
    Lite开发的应用程序将具有更小的二进制大小,更少的依赖性和更好的性能。

  • TensorFlow
    Lite在开发者预览版中,所以并没有涵盖所有用例。我们希望您使用TensorFlow
    Mobile来覆盖生产案例。

  • TensorFlow
    Lite仅支持一组有限的运算符,因此默认情况下并不是所有的模型都可以运行。TensorFlow
    for Mobile具有更全面的支持功能。

澳门新葡萄京官网注册 5

移动优化的基准模型##

什么是基准模型:用于检测图像中存在的主要对象

基准模型已经存在很多种类 Inception MobileNets等等

其中MobileNets是一系列移动优先计算机视觉模型,旨在有效提高准确性,同时注意设备或嵌入式应用的受限资源。它们是参数化的小型低延迟低功耗模型,可以满足各种用例的资源限制。它们可以建立在分类,检测,嵌入和分割之上。MobileNet模型
比Inception V3 更小但精度更低。

基于 MobileNets
在移动设备上进行目标检测、细粒度分类、人脸属性和地标识别

为什么要在手机上运行TensorFlow?

通过网络连接发送设备访问的所有数据可能非常昂贵和耗时。在移动设备上运行使得App在不得不等待网络往返的情况下进行交互。所以需要把识别的工作放在本地操作。

以下是设备深度学习的一些常见用例:

  • 语音识别

有许多有趣的应用程序可以使用语音驱动的界面来构建,其中许多应用程序需要在设备上进行处理。用户大多数时间没有给出命令,因此将音频连续地传送到远程服务器将会浪费带宽,因为它主要是沉默或背景噪音。为了解决这个问题,通常在设备上运行一个小型的神经网络来监听特定的关键字。一旦发现关键字,如果需要更多的计算能力,其余的对话可以传输到服务器进行进一步处理。

  • 图像识别

移动应用程序能够理解相机图像可能非常有用。如果您的用户正在拍摄照片,那么识别其中的内容可以帮助您的相机应用程序应用适当的过滤器,或为照片添加标签以便于查找。这对于嵌入式应用程序也很重要,因为您可以使用图像传感器来检测各种有趣的情况,无论是在野外发现濒危动物,还是在
报告您的列车运行有多迟。

TensorFlow附带了几个识别图像内物体类型的例子,以及各种不同的预先训练好的模型,它们都可以在移动设备上运行。你可以尝试一下我们
的诗人Tensorflow和 Tensorflow的诗人2:优化移动
codelabs,看看如何采取预训练模式,并运行一些非常快速和轻量级的培训,教它识别特定的对象,然后优化它在移动。

  • 翻译

即使您没有网络连接,也能快速准确地从一种语言翻译到另一种语言,这是一个重要的用例。深度网络在这类任务中非常有效,您可以在文献中找到很多不同模型的描述。通常这些是序列到序列的循环模型,您可以运行单个图形来完成整个转换,而无需运行单独的分析阶段。

  • 文本分类

如果您想根据用户正在输入或阅读的内容向用户提示相关提示,那么了解文本的含义可能会非常有用。这就是文本分类的地方。文本分类是一个涵盖从情感分析到主题发现等所有内容的总称。你很可能有你自己的类别或标签,所以最好的地方是以Skip-Thoughts为例
,然后用自己的例子进行训练。

  • 语音合成

合成语音可以是给予用户反馈或辅助访问的好方法,WaveNet等最近的进展
表明,深度学习可以提供非常自然的语音。

这个 MobileNets 版本可在 TensorFlow 中使用 TF-Slim 对 MobileNet
模型进行定义,还包含 16 个训练好的 ImageNet
分类器(checkpoints),它们适用于所有不同大小的移动项目。这些模型配合 TensorFlow
Mobile 的使用可在移动设备上高效地运行。

在Android上构建TensorFlow

  1. 运行官方Demo

    打开Android Studio,然后从欢迎屏幕中选择打开一个现有的Android
    Studio项目。

    在出现的“
    打开文件”或“项目”窗口中,导航到并选择tensorflow/examples/android克隆TensorFlow
    Github库的位置。点击OK。

    如果它要求您执行Gradle同步,请单击确定。

    你可能还需要安装各种平台和工具,如果你得到像“无法找到与哈希字符串’android-23’目标和类似的错误。

    打开build.gradle文件(你可以到侧面板中的1:Project,在Android下的Gradle
    Scripts
    zippy下面找到它)。查找变量并将其设置为如果它不是已经:nativeBuildSystemnone

    // set to ‘bazel’, ‘cmake’, ‘makefile’, ‘none’

    def nativeBuildSystem = ‘none’

    点击运行按钮(绿色箭头)或使用运行 – >运行’android’从顶部菜单。

  2. 使用Android Studio将TensorFlow添加到您的应用程序

    compile ‘org.tensorflow:tensorflow-android:+’

  3. 在Android上调用引用库

例如:

// Load the model from disk.
TensorFlowInferenceInterface inferenceInterface =
new TensorFlowInferenceInterface(assetManager, modelFilename);

// Copy the input data into TensorFlow.
inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);

// Run the inference call.
inferenceInterface.run(outputNames, logStats);

// Copy the output Tensor back into the output array.
inferenceInterface.fetch(outputName, outputs);

澳门新葡萄京官网注册 6

步骤与操作指令(重要)

https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/index.html?hl=zh-cn#0

理解一些图像处理的知识

均值反映了图像的亮度,均值越大说明图像亮度越大,反之越小

标准差反映了图像像素值与均值的离散程度,标准差越大说明图像的质量越好

overfitting的介绍(不要训练过头 训练过多 测试精度会降低)

過度學習
並非資料太多,而是過度擬和曲線,造成整個模型,把每個data的微小差異都給記下來,等於是直接把訓練資料給背起來一樣所致
解决方式 降低学习的次数 一般500多差不多了

(一)生成model

在ubuntu环境下

Ubuntu的一些配置比如文件拷贝设置代理等不再说明 自行百度

  • 克隆代码库

All the code used in this codelab is contained in this git repository.
Clone the repository and cd into it. This is where we will be working.

git clone https://github.com/googlecodelabs/tensorflow-for-poets-2

cd tensorflow-for-poets-2
  • 下载图片(可以自行copy到某个目录)

例如

xhl@xhl:~/tensorflow-for-poets-2/tf_files/my_pics$ ls
草  狗  花  树
  • 训练图片(可反复训练)

步骤

1.Configure your MobileNet
//图片分辨率128,160,192, or 224px一般都选择224
模型相对大小:1.0,0.75,0.50或0.25。推荐0.50作为初始设置也可以后期设置成1.0来提高精度
(实践表明1.0似乎更优秀)
IMAGE_SIZE=224
ARCHITECTURE="mobilenet_1.0_${IMAGE_SIZE}"

2.启动TensorBoard
在开始训练之前,tensorboard在后台启动。TensorBoard是一种包含在tensorflow中的监测和检测工具。您将使用它来监视培训进度。

tensorboard --logdir tf_files/training_summaries &

如果已经运行了一个TB,使用pkill -f "tensorboard"杀死原先的TB

打开ubuntu的浏览器 http://127.0.0.1:6006/可以观察训练结果

3.开始训练
//注意:图片的文件夹名称不能包含中文,分类脚本使用文件夹名称作为标签名
//参数  
        how_many_training_steps:训练次数,不设置这句话默认4K次 这里设置500次 次数越大文件的训练时间越长,精度越高 但实际上500次以后已经很难有多少改变
        model_dir:基准模型的存放目录 这里用mobileNet
        summaries_dir:训练总结目录 这里是tf_files/training_summaries
        output_graph:输出文件 这里是tf_files/retrained_graph.pb可以修改
        output_labels:输出文件的标签,这里是tf_files/retrained_labels.txt可以修改
        architecture:构建方式 引用步骤1的路径
        image_dir:要训练的图片存放目录 这里用tf_files/flower_photos
        final_tensor_name="output"  default 默认值是 "final_result"
        random_crop 随机裁剪图片的百分比 (value*100%) 0~100之间
        random_scale 缩放
        random_brightness 明亮度
python -m scripts.retrain 
  --bottleneck_dir=tf_files/bottlenecks 
  --how_many_training_steps=500 
  --model_dir=tf_files/models/ 
  --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" 
  --output_graph=tf_files/retrained_graph.pb 
  --output_labels=tf_files/retrained_labels.txt 
  --architecture="${ARCHITECTURE}" 
  --image_dir=tf_files/flower_photos

直接调用共享磁盘的图片文件夹以及输出结果到共享磁盘(最有效省力的指令 推荐)

python -m scripts.retrain 
  --bottleneck_dir=tf_files/bottlenecks 
  --model_dir=tf_files/models/ 
  --how_many_training_steps=500 
  --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" 
  --output_graph=/media/sf_ShareFile/trained_0206_mobilenet.pb 
  --output_labels=/media/sf_ShareFile/trained_0206_mobilenet_labels.txt 
  --architecture="${ARCHITECTURE}" 
  --image_dir=/media/sf_ShareFile/0206

根据help文件显示 还可以一些图片操作的参数

python -m scripts.retrain 
  --bottleneck_dir=tf_files/bottlenecks 
  --model_dir=tf_files/models/ 
  --how_many_training_steps=500 
  --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" 
  --output_graph=tf_files/0205v2.pb
  --output_labels=tf_files/0205v2_labels.txt 
  --random_crop=10 
  --random_scale=10 
  --random_brightness=10 
  --architecture="${ARCHITECTURE}" 
  --image_dir=tf_files/0205 

3.1.训练脚本的帮助文档

python -m scripts.retrain -h    阅读help文件

例如,--learning_rate参数控制训练期间最后一层更新的大小。到目前为止,我们已经把它遗漏了,所以程序已经使用了默认的learning_rate值0.01。如果您指定一个小的learning_rate,如0.005,则训练将花费更长的时间,但总体精度可能会增加。learning_rate的值较高,比如1.0,可以训练得更快,但通常会降低精度,甚至会使训练不稳定。

以上是一般的训练模型,若要在移动设备上运行TensorFlow,继续~

4.图片结果验证精度
help
python -m  scripts.label_image -h

/*
As you can see, this Python program takes quite a few arguments. The defaults are all set for this project, but if you used a MobileNet architecture with a 

different image size you will need to set the --input_size argument using the variable you created earlier: --input_size=${IMAGE_SIZE}.
*/

python -m scripts.label_image 
--graph=/media/sf_ShareFile/trained_0206_mobilenet.pb 
--image=/media/sf_ShareFile/20180202180250501.jpg 
--labels=/media/sf_ShareFile/trained_0206_mobilenet_labels.txt

5.优化model

    移动设备的性能决定了要更高效的运行TensorFlow,所以要对model进行优化 TensorFlow提供了一个工具:optimize_for_inference
    //参数
        input:输入的文件名
        output:输出的文件名
    python -m tensorflow.python.tools.optimize_for_inference 
  --input=tf_files/retrained_graph.pb 
  --output=tf_files/optimized_graph.pb 
  --input_names="input" 
  --output_names="final_result"

    pkill -f tensorboard
    tensorboard --logdir tf_files/training_summaries &

    python -m scripts.graph_pb2tb tf_files/training_summaries/retrained 
      tf_files/retrained_graph.pb 

    python -m scripts.graph_pb2tb tf_files/training_summaries/optimized 
      tf_files/optimized_graph.pb 

6. 压缩model (这里有点问题 压缩似乎不成功)

    直接使用gzip得到的压缩效率并不能让人满意,所以需要找到更有效的降低文件大小的方法。

    现在使用quantize_graph脚本来应用这些更改:
    //参数
        input:经过步骤5的优化后的pb文件!
        output:经过quantize_graph脚本后的pb文件!
    python -m scripts.quantize_graph 
  --input=tf_files/optimized_graph.pb 
  --output=tf_files/rounded_graph.pb 
  --output_node_names=final_result 
  --mode=weights_rounded

    然后再次进行gzip压缩,会发现压缩了70%以上

    gzip -c tf_files/rounded_graph.pb > tf_files/rounded_graph.pb.gz

    gzip -l tf_files/rounded_graph.pb.gz

7. 生成的文件放到App中运行

    演示项目被配置为搜索目录中的文件rounded_graph.pb和retrained_labels.txt文件android/assets
    rounded_graph.pb是经过优化和压缩后生成的那个pb文件 labels是一开始训练得到的txt

    改变ClassifierActivity.java中的output_name

    该应用程序目前已设置运行基线MobileNet。我们模型的输出节点具有不同的名称。打开ClassifierActivity.java并更新OUTPUT_NAME变量。

    private static final String INPUT_NAME = "input";
    private static final String OUTPUT_NAME = "final_result";

如上图所示,需要根据自己的延迟和项目大小需求选取合适的模型。网络模型在内存和磁盘中所占的空间大小和网络中参数的数量成正比。用
MACs
值(Multiply-Accumulates,累积乘法量,用来衡量乘法、加法融合计算的数量)可以估计网络的延迟和能源消耗。Top-1
和 Top-5 准确率是通过 ILSVRC 数据库测试得出的。

开发者现可使用 TensorFlow Mobile
部署模型,TensorFlow Mobile
旨在帮助您将模型部署到 Android,iOS 和 Raspberry Pi 上。

有关 MobileNets
的更多信息请点此参阅

更详细的内容请参阅谷歌的论文

此前,谷歌在 I/O 大会上公布了专门针对移动设备而优化的 Tensorflow 新版本
—— Tensorflow Lite,再到现在的
MobileNets,可以看到谷歌在移动优先的战略上又迈了一大步。

(文/开源中国)