深度学习利器:TensorFlow在智能终端中的应用——智能边缘计算,云端生成模型给移动端下载,然后用该模型进行预测

简介:

前言

深度学习在图像处理、语音识别、自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算。如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有在设备处于良好的网络连接环境下才行,这就需要把深度学习模型迁移到智能终端。

由于智能终端CPU和内存资源有限,为了提高运算性能和内存利用率,需要对服务器端的模型进行量化处理并支持低精度算法。TensorFlow版本增加了对Android、iOS和Raspberry Pi硬件平台的支持,允许它在这些设备上执行图像分类等操作。这样就可以创建在智能手机上工作并且不需要云端每时每刻都支持的机器学习模型,带来了新的APP。

本文主要基于看花识名APP应用,讲解TensorFlow模型如何应用于Android系统;在服务器端训练TensorFlow模型,并把模型文件迁移到智能终端;TensorFlow Android开发环境构建以及应用开发API。

看花识名APP

使用AlexNet模型、Flowers数据以及Android平台构建了“看花识名”APP。TensorFlow模型对五种类型的花数据进行训练。如下图所示:

Daisy:雏菊

(点击放大图像)

Dandelion:蒲公英

(点击放大图像)

Roses:玫瑰

(点击放大图像)

Sunflowers:向日葵

(点击放大图像)

Tulips:郁金香

(点击放大图像)

在服务器上把模型训练好后,把模型文件迁移到Android平台,在手机上安装APP。使用效果如下图所示,界面上端显示的是模型识别的置信度,界面中间是要识别的花:

(点击放大图像)

TensorFlow模型如何应用于看花识名APP中,主要包括以下几个关键步骤:模型选择和应用、模型文件转换以及Android开发。如下图所示:

(点击放大图像)

(点击放大图像)

模型训练及模型文件

本章采用AlexNet模型对Flowers数据进行训练。AlexNet在2012取得了ImageNet最好成绩,top 5准确率达到80.2%。这对于传统的机器学习分类算法而言,已经相当出色。模型结构如下:

(点击放大图像)

本文采用TensorFlow官方Slim(https://github.com/tensorflow/models/tree/master/slim)AlexNet模型进行训练。

  • 首先下载Flowers数据,并转换为TFRecord格式:
    DATA_DIR=/tmp/data/flowers
    python download_and_convert_data.py --dataset_name=flowers
     --dataset_dir="${DATA_DIR}"
  • 执行模型训练,经过36618次迭代后,模型精度达到85%
    TRAIN_DIR=/tmp/data/train
    python train_image_classifier.py --train_dir=${TRAIN_DIR} 
    --dataset_dir=${DATASET_DIR} --dataset_name=flowers  
    --dataset_split_name=train  --model_name=alexnet_v2 
     --preprocessing_name=vgg
  • 生成Inference Graph的PB文件
    python export_inference_graph.py  --alsologtostderr  
    --model_name=alexnet_v2  --dataset_name=flowers --dataset_dir=${DATASET_DIR} 
     --output_file=alexnet_v2_inf_graph.pb
  • 结合CheckPoint文件和Inference GraphPB文件,生成Freeze Graph的PB文件
    python freeze_graph.py  --input_graph=alexnet_v2_inf_graph.pb 
    --input_checkpoint= ${TRAIN_DIR}/model.ckpt-36618  --input_binary=true 
    --output_graph=frozen_alexnet_v2.pb --output_node_names=alexnet_v2/fc8/squeezed
  • 对Freeze Graph的PB文件进行数据量化处理,减少模型文件的大小,生成的quantized_alexnet_v2_graph.pb为智能终端中应用的模型文件
    bazel-bin/tensorflow/tools/graph_transforms/transform_graph  
    --in_graph=frozen_alexnet_v2.pb  --outputs="alexnet_v2/fc8/squeezed" 
    --out_graph=quantized_alexnet_v2_graph.pb --transforms='add_default_attributes
     strip_unused_nodes(type=float, shape="1,224,224,3")  remove_nodes(op=Identity, 
    op=CheckNumerics) fold_constants(ignore_errors=true)  fold_batch_norms 
    fold_old_batch_norms quantize_weights quantize_nodes 
     strip_unused_nodes sort_by_execution_order'

为了减少智能终端上模型文件的大小,TensorFlow中常用的方法是对模型文件进行量化处理,本文对AlexNet CheckPoint文件进行Freeze和Quantized处理后的文件大小变化如下图所示:

(点击放大图像)

量化操作的主要思想是在模型的Inference阶段采用等价的8位整数操作代替32位的浮点数操作,替换的操作包括:卷积操作、矩阵相乘、激活函数、池化操作等。量化节点的输入、输出为浮点数,但是内部运算会通过量化计算转换为8位整数(范围为0到255)的运算,浮点数和8位量化整数的对应关系示例如下图所示:

(点击放大图像)

量化Relu操作的基本思想如下图所示:

(点击放大图像)

TensorFlow Android应用开发环境构建

在Android系统上使用TensorFlow模型做Inference依赖于两个文件libtensorflow_inference.so和libandroid_tensorflow_inference_java.jar。这两个文件可以通过下载TensorFlow源代码后,采用bazel编译出来,如下所示:

  • 下载TensorFlow源代码

    git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

  • 下载安装Android NDK
  • 下载安装Android SDK
  • 配置tensorflow/WORKSPACE中android开发工具路径
    android_sdk_repository(name = "androidsdk", api_level = 23, build_tools_version = "25.0.2", path = "/opt/android",)
    android_ndk_repository(name="androidndk",  path="/opt/android/android-ndk-r12b",  api_level=14)
  • 编译libtensorflow_inference.so
    bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so  
      --crosstool_top=//external:android/crosstool --host_crosstool_top=
    @bazel_tools//tools/cpp:toolchain --cpu=armeabi-v7a
  • 编译libandroid_tensorflow_inference_java.jar
    bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

TensorFlow提供了Android开发的示例框架,下面基于AlexNet模型的看花识名APP做一些相应源码的修改,并编译生成Android的安装包:

  • 基于AlexNet模型,修改Inference的输入、输出的Tensor名称
    private static final String INPUT_NAME = "input";
    private static final String OUTPUT_NAME = "alexnet_v2/fc8/squeezed";
  • 放置quantized_alexnet_v2_graph.pb和对应的labels.txt文件到assets目录下,并修改Android文件路径
    private static final String MODEL_FILE = "file:///android_asset/quantized_alexnet_v2_graph.pb";
    private static final String LABEL_FILE = "file:///android_asset/labels.txt";
  • 编译生成安装包
    bazel build -c opt //tensorflow/examples/android:tensorflow_demo
  • 拷贝tensorflow_demo.apk到手机上,并执行安装,太阳花识别效果如下图所示:

    (点击放大图像)

TensorFlow移动端应用开发API

在Android系统中执行TensorFlow Inference操作,需要调用libandroid_tensorflow_inference_java.jar中的JNI接口,主要接口如下:

  • 构建TensorFlow Inference对象,构建该对象时候会加载TensorFlow动态链接库libtensorflow_inference.so到系统中;参数assetManager为android asset管理器;参数modelFilename为TensorFlow模型文件在android_asset中的路径。
    TensorFlowInferenceInterface inferenceInterface = new 
    TensorFlowInferenceInterface(assetManager, modelFilename);
  • 向TensorFlow图中加载输入数据,本App中输入数据为摄像头截取到的图片;参数inputName为TensorFlow Inference中的输入数据Tensor的名称;参数floatValues为输入图片的像素数据,进行预处理后的浮点值;[1,inputSize,inputSize,3]为裁剪后图片的大小,比如1张224*224*3的RGB图片。
    inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);
  • 执行模型推理; outputNames为TensorFlow Inference模型中要运算Tensor的名称,本APP中为分类的Logist值。
    inferenceInterface.run(outputNames);
  • 获取模型Inference的运算结果,其中outputName为Tensor名称,参数outputs存储Tensor的运算结果。本APP中,outputs为计算得到的Logist浮点数组。
    inferenceInterface.fetch(outputName, outputs);

总结

本文基于看花识名APP,讲解了TensorFlow在Android智能终端中的应用技术。首先回顾了AlexNet模型结构,基于AlexNet的slim模型对Flowers数据进行训练;对训练后的CheckPoint数据,进行Freeze和Quantized处理,生成智能终端要用的Inference模型。然后介绍了TensorFlow Android应用开发环境的构建,编译生成TensorFlow在Android上的动态链接库以及java开发包;文章最后介绍了Inference API的使用方式。

参考文献

  1. http://www.tensorflow.org
  2. 深度学习利器:分布式TensorFlow及实例分析
  3. 深度学习利器:TensorFlow使用实战
  4. 深度学习利器:TensorFlow系统架构与高性能程序设计
  5. 深度学习利器:TensorFlow与深度卷积神经网络
  6. 深度学习利器:TensorFlow与NLP模型
















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/8317909.html,如需转载请自行联系原作者


相关文章
|
1天前
|
机器学习/深度学习 人工智能 监控
探索深度学习在图像识别中的应用
本文旨在探讨深度学习技术如何革新图像识别领域,通过分析深度学习模型的工作原理及其在图像处理中的具体应用案例,揭示这一技术如何提高识别精确度并解决传统方法难以克服的问题。文章将详细讨论卷积神经网络(CNN)的结构优势、训练技巧以及在实际场景中的应用效果,同时指出当前面临的挑战和未来的发展方向。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用与挑战
随着人工智能技术的飞速发展,深度学习已成为自然语言处理(NLP)领域的核心技术之一。本文将探讨深度学习在NLP中的应用场景,分析其带来的变革及面临的主要挑战。我们将通过具体的案例和数据,展示深度学习如何推动语言理解、机器翻译、情感分析等领域的进步,并讨论模型泛化、数据偏见和资源消耗等问题。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用与挑战
深度学习技术,作为人工智能领域的重要分支,近年来在自然语言处理(NLP)领域取得了显著的进展。通过模拟人脑处理语言的方式,深度学习模型能够理解和生成人类语言,从而在机器翻译、情感分析、文本分类等任务中展现出卓越的性能。然而,尽管取得了巨大成就,深度学习在NLP中的应用仍面临着数据偏差、模型可解释性不足以及跨语言泛化能力有限等挑战。本文将深入探讨深度学习在自然语言处理中的应用现状及其面临的主要挑战,并提出未来研究的可能方向。
|
1天前
|
机器学习/深度学习 存储 人工智能
深度学习在医疗影像诊断中的应用与挑战
随着人工智能的飞速发展,深度学习技术已广泛应用于医疗影像诊断领域,展现出强大的图像处理和模式识别能力。本文将探讨深度学习在医疗影像中的具体应用实例,分析其面临的技术挑战和未来发展方向。
4 0
|
1天前
|
机器学习/深度学习 人工智能 监控
深度学习在图像识别中的应用与挑战
随着科技的飞速发展,深度学习已成为人工智能领域的核心技术之一。特别是在图像识别领域,深度学习技术取得了显著的成果。然而,尽管深度学习在图像识别方面展现出了强大的能力,但仍然面临着一些挑战和问题。本文将探讨深度学习在图像识别中的应用以及面临的挑战,并提出一些可能的解决方案。
4 0
|
1月前
|
机器学习/深度学习 TensorFlow API
TensorFlow与Keras实战:构建深度学习模型
本文探讨了TensorFlow和其高级API Keras在深度学习中的应用。TensorFlow是Google开发的高性能开源框架,支持分布式计算,而Keras以其用户友好和模块化设计简化了神经网络构建。通过一个手写数字识别的实战案例,展示了如何使用Keras加载MNIST数据集、构建CNN模型、训练及评估模型,并进行预测。案例详述了数据预处理、模型构建、训练过程和预测新图像的步骤,为读者提供TensorFlow和Keras的基础实践指导。
169 59
|
1月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
122 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
26天前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
36 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
1月前
|
机器学习/深度学习 人工智能 TensorFlow
TensorFlow 是一个由 Google 开发的开源深度学习框架
TensorFlow 是一个由 Google 开发的开源深度学习框架
28 3
|
1月前
|
机器学习/深度学习 自然语言处理 TensorFlow
TensorFlow:深度学习框架的领航者
**TensorFlow**是谷歌开源的机器学习框架,用于深度学习和大规模数据处理。它以数据流图为基础,支持分布式计算,提供高效、灵活且可扩展的环境。自2015年以来,经过多次升级,包括引入Eager Execution,提升了开发效率。TensorFlow广泛应用于图像识别、自然语言处理、推荐系统和语音识别等领域,其丰富的API和工具简化了模型构建,促进了深度学习的发展。【6月更文挑战第5天】
61 9

热门文章

最新文章