TensorFlow模型部署到Android,需要注意几点

栏目: 数据库 · 发布时间: 5年前

内容简介:在前面一篇文章《

TensorFlow模型部署到Android,需要注意几点

题图 由 Gerd Altmann Pixabay 上发布

在前面一篇文章《 从人工智能鉴黄模型,尝试TensorRT优化 》我谈到了TensorFlow模型的优化,这是针对服务器端的优化,实际上优化结果并不理想。这篇文章我将谈谈将TensorFlow模型部署到Android系统上需要注意的几点。

TensorFlow针对移动和IoT设备推出了TensorFlow Lite,根据TensorFlow Lite的官方文档,TensorFlow Lite应用的开发步骤如下:

TensorFlow模型部署到Android,需要注意几点

第一步,我们选择的是open_nsfw鉴黄模型的tensorflow版本,不用多说。

接下来第二步将TensorFlow模型转化为TensorFlow Lite模型,借助于TensorFlow提供的编程接口,只需几行代码就可以做到:

converter = tf.lite.TFLiteConverter.from_session(sess, [model.input], [model.predictions])
    tflite_model = converter.convert()

    with open(export_path, "wb") as f:
        f.write(tflite_model)

当然你也可以使用TensorFlow提供的 工具 转换。

接下来第三步将模型部署到Android应用,可参考https://github.com/tensorflow/examples/ 里面的图片分类示例,也不难。但完成这一步之后,发现在Android系统上的推理精度和PC上的差别很大,为什么会存在这样的差别呢?虽然说TensorFlow模型经过压缩,会损失一定的精度,但差别不会太大,出现较大的差距,一定是哪里处理存在问题。经过一番调查研究,发现在图片预处理方面有几点需要注意。

在深度学习中,模型的图片输入尺寸只接受给定的大小和格式,所以不管是训练还是推理,对图片进行预处理是必不可少的,在这次部署TensorFlow模型到Android应用的过程中,发现以往没有注意到的几点:

  • 图片缩放算法

在Android中,针对Bitmap有一个缩放函数: Bitmap.createScaledBitmap ,但是我们读tensorflow-open_nsfw的图片预处理代码,就会发现塔的处理过程是先缩放到256x256,然后再裁剪成 224x224,至于为什么这样处理,根据 Tensorflow image loader image would cause different result #2 这个里面的讨论,采用不同的image_loader,其结果有些差异,这也是为什么作者在脚本中提供了两种image loader的原因。回到Android系统上,我们也尽可能的保持相同的缩放方式。另外不同的处理库,对于JPEG解码、图片缩放也有一些差异,我们可以尝试用OpenCV进行处理,然后选择最优结果。

  • BGR和RGB

在Android系统中,图像通常采用RGB进行表示和处理,但open_nsfw模型有些特殊,因为是从Caffe模型转化而来,所以内部采用的是BGR排列方式。因为我们平常处理图片、模型都采用RGB,很容易忽略这一点,所以在处理图片前,需要先确认一下是RGB还是BGR。

  • 正归化(Regularization)

正规化是提高模型泛化能力的常用手段,通常我们将输入值归一化到0 ~ 1区间的值。然而在图像处理领域,更有效的方法是RGB每个通道减去一个均值(Mean Value),这个均值是在训练过程中计算出来的。从tensorflow example复制代码过来时,其均值使用了一个固定值,计算方法为:

private static final float IMAGE_MEAN = 127.5f;
private static final float IMAGE_STD = 127.5f;

(pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD;

而在 python 脚本中,我们可以看到其处理方法为:

VGG_MEAN = [104, 117, 123]
image -= np.array(VGG_MEAN, dtype=np.float32)

有两个区别,一是每个通道上的均值是不同的,而是并没有归一化到-1 ~ +1 这个区间。这里需要将Android代码修改为一样。

最后一个步骤是优化,发现这里面也存在一定的陷阱。

TensorFlow Lite模型最常见的优化手段是量化(Quantize),将32位的浮点采用8位的整型表示。经过这一转化,模型的大小得到了 大幅缩减 ,从原来的23M减小到6M。但经过在我的HUAWEI Mate 20 pro上测试,推理速度却有小幅下降,精度也有所降低。采用浮点模型 + GPU进行推理,也并没有如想象中的能够提升推理速度。是否需要采用量化模型,需要根据实际部署系统的测试情况以及是否接受推理速度和精度下降这两个不利因素。

因此,在实际部署TensorFlow模型时,不要想当然的认为别人的优化方法在自己的环境中一定有效,必须亲自验证才能确定,在这之前,编写一些简单的benchmar工具进行评估是必要的。

经过这次的部署测试,发现tensorflow-open_nsfw模型在我的手机上推理速度能达到100ms左右,精度能达到90%,基本上能够满足需求。

项目的完整代码可以参考:https://github.com/mogoweb/tensorflow-open_nsfw ,欢迎大家一起交流。

你还可以看:

Android上的TensorFlow Lite,了解一下?

如何将自己开发的模型转换为TensorFlow Lite可用模型


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Docker开发指南

Docker开发指南

[英] Adrian Mouat / 黄彦邦 / 人民邮电出版社 / 2017-4 / 79.00元

Docker容器轻量和可移植的特性尤其适用于动态和分布式的环境,它的兴起给软件开发流程带来了一场革命。本书对Docker进行了全面讲解,包括开发、生产以至维护的整个软件生命周期,并对其中可能出现的一些问题进行了探讨,如软件版本差异、开发环境与生产环境的差异、系统安全问题,等等。一起来看看 《Docker开发指南》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具